alexei-led/archfit

GitHub: alexei-led/archfit

archfit 是一款面向 AI agent 和 CI 的多语言架构适配度检查 CLI 工具,通过确定性门禁、平衡耦合评分和结构化修复任务防止架构侵蚀。

Stars: 0 | Forks: 0

# archfit [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/alexei-led/archfit/actions/workflows/ci.yaml) [![发布](https://static.pigsec.cn/wp-content/uploads/repos/cas/42/42ba98a60a0bb3b0ad908f024db145f9c5b831eb7df822f56ac578ee7d7215b3.svg)](https://github.com/alexei-led/archfit/actions/workflows/release.yaml) [![版本](https://img.shields.io/github/v/tag/alexei-led/archfit?label=version&sort=semver)](https://github.com/alexei-led/archfit/tags) [![GHCR](https://ghcr-badge.egpl.dev/alexei-led/archfit/latest_tag?label=ghcr.io&color=%230db7ed)](https://github.com/alexei-led/archfit/pkgs/container/archfit) [![镜像大小](https://ghcr-badge.egpl.dev/alexei-led/archfit/size?tag=latest&label=image%20size&color=%230db7ed)](https://github.com/alexei-led/archfit/pkgs/container/archfit) [![Go 参考](https://pkg.go.dev/badge/github.com/alexei-led/archfit.svg)](https://pkg.go.dev/github.com/alexei-led/archfit) [![Go Report Card](https://goreportcard.com/badge/github.com/alexei-led/archfit)](https://goreportcard.com/report/github.com/alexei-led/archfit) [![许可证](https://img.shields.io/github/license/alexei-led/archfit)](LICENSE) **面向 AI agent 和 CI 的架构适配度检查。** `archfit` 用于检查代码是否依然遵循你预期的架构。 它从语言分析器中读取代码结构事实,然后对照 `.archfit.yaml` 对其进行评估: 包含边界、层次、公开 API、循环依赖,以及 [平衡耦合](docs/guide/concepts.md)。 平衡耦合是一种判断依赖关系是健康还是存在风险的方法。它关注三个方面:依赖的强度、耦合部分之间的距离,以及它们变更的频率。 其输出专为自动化设计:确定性的门禁违规、面向 agent 的结构化修复任务,以及分段式架构评分表。架构偏移将成为你的 agent 和 CI 可以在演变为代码审查难题之前采取行动的依据。 ## 为什么需要 AI agent 擅长进行局部修改,但不擅长在上下文中统筹整个系统的设计。 这一缺陷至关重要。一个 agent 可能会做出通过测试的修改,但同时也悄悄地: - 跨越了被禁止的边界进行导入; - 绕过了模块的公开 API; - 在不同层之间添加了捷径; - 增加了依赖循环。 每一次单独的修改看起来可能都无害。但随着时间的推移,这些捷径就会变成实际的架构。耦合不断增加,bug 在相距甚远的模块中级联发生,并且未来的每一次修复都需要更多的人类上下文、更多的 agent token 以及更多的重试。 `archfit` 在这个循环中加入了架构适配度的信号: ``` flowchart LR A[Agent edits files] --> C[archfit check] C -->|clean| P([PR opened]) C -->|violation + agent_tasks| R[Agent applies the repair order] R --> C classDef ok fill:#d3f9d8,stroke:#2f9e44,color:#000; classDef gate fill:#ffe3e3,stroke:#e03131,color:#000; class P ok; class C gate; ``` 当门禁失败时,`archfit` 会发出一个 `agent_tasks` 条目。这是一道修复指令,而不是一行模糊的日志: ``` { "rule_id": "no_internal_access", "goal": "Replace the internal-API access from pkg/a/a.go to pkg/b/internal/impl.go with b's public API.", "constraints": [ "Use only the public API of module b", "public surface of \"b\": [pkg/b/api/**]" ], "files": ["pkg/a/a.go", "pkg/b/internal/impl.go"], "validation": ["archfit check -c .archfit.yaml --full"] } ``` 该任务包含了目标、限制条件、需要检查的文件,以及用于验证修复效果的命令。 ## 工作原理 `archfit` 将事实、门禁和叙述分离开来。 语言适配器负责收集代码结构事实。确定性的核心程序根据你的配置对这些事实进行评估。可选的 LLM 功能可以解释证据并对其进行优先级排序,但它们绝不会决定门禁是否通过。 ``` flowchart TB subgraph tools[External extractors] direction LR T1[go list] T2[dependency-cruiser] T3[ast-grep] T4[grimp] end CFG[".archfit.yaml"] tools -->|dependency facts| core CFG --> core subgraph core["archfit core — deterministic, no LLM"] direction LR CL[classify] --> RU[gates] CL --> ME[metrics] --> SC[score] end core --> OUT["SARIF · JSON · Markdown · text
agent_tasks · scorecard"] OUT -. off-gate · advisory only .-> LLM["review · enrich · autopilot
narrate & prioritize evidence"] classDef side fill:#f3f0ff,stroke:#7048e8,color:#000; class LLM side; style core fill:#e7f5ff,stroke:#1971c2,color:#000; ``` 对于相同的输入,门禁的输出在字节级别上是一致的。这使得它非常适用于 CI 以及对比不同的 commit。如果缺少可选的分析器,相关指标会报告为 `n/a` 并附带启用步骤,而不是假装一切正常。 ## 你能得到什么 - **确定性的门禁**,用于检测被禁止的依赖、公开 API 边界、 层级的方向、导入循环以及配置的阈值。 - **`agent_tasks` 修复块**,让 AI agent 能够直接获取修复方案,而不仅仅是错误信息。 - **分段式的 7 维度评分表**(`archfit score`):边界完整性、 耦合平衡度、依赖图健康状况、内聚性、变更局部性、 架构适配度,以及分析置信度。 - **平衡耦合报告** — 强度 × 距离 × 波动率,分组汇总展示,而不是为每一条依赖边显示单独的一行。 - **诚实客观的覆盖率** — 缺失的工具会显示为 `n/a`,而不是显示虚假的通过状态;在每种输出格式中都会报告存在的缺口。 - **基线**,确保被接受的当前技术债不会掩盖新的发现。 - **语法事实**(`tools.syntax.enabled: on`)— 针对 Go、 TypeScript、Python 和 Rust 统计声明数量、公开 API 总数,以及架构角色(handler/service/repository/domain)。支持三种新规则类型: `forbidden_role_dependency`、`public_api_max` 和 `public_api_change`。 - **门禁之外的 LLM 叙述**(`review`、`enrich`、`autopilot`)只能叙述和优先排序已收集的证据,绝不捏造门禁违规。 ## 方法论 — 平衡耦合 耦合并不总是坏事。有些部分理应共同演进。问题在于出现了对于当前设计而言强度过高、距离过远或波动太大的耦合。 `archfit` 将 Vlad Khononov 的平衡耦合模型中可检查的部分进行了实用化。它通过三个维度对跨边界关系进行评分,并解释该关系看起来是内聚的,还是存在风险的: ``` flowchart LR S["Integration strength
contract → intrusive"] --> J{coupling
verdict} D["Distance
same module → cross deploy-unit"] --> J V["Volatility
low → high change-rate"] --> J J -->|high strength · low distance| G["Cohesion
balanced — leave it"] J -->|high strength · high distance · high volatility| B["Cascading change
distributed-monolith risk"] classDef good fill:#d3f9d8,stroke:#2f9e44,color:#000; classDef risk fill:#ffe3e3,stroke:#e03131,color:#000; class G good; class B risk; ``` 它并不能取代架构审查 — 它只是使得收集可复现的证据变得低成本,并且在 CI 中运行是安全的。有关从理论到信号的映射,请参阅 [概念](docs/guide/concepts.md) 和 [指标](docs/guide/metrics.md)。 ## 对比分析 特定语言的边界 linter 依然有用。`archfit` 位于比它们更高一层的抽象级别。 那些工具提供事实。而 `archfit` 将这些事实转化为针对预期架构、平衡耦合风险、分数变动和修复任务的量化判定。 | 工具 | 语言 | 面向 agent/CI 的输出 | 耦合模型 | LLM 叙述 | | ------------------ | ---------------------------------------- | ------------------------------------ | ------------------------- | ------------- | | **archfit** | 参见 [语言支持](docs/guide/languages.md) | SARIF + JSON + `agent_tasks` + score | Balanced Coupling (S/D/V) | off-gate | | dependency-cruiser | TS/JS | JSON/HTML, 规则违规 | 基于规则 | 否 | | import-linter | Python | 文本, 契约通过/失败 | 分层契约 | 否 | | ArchUnit | Java/JVM (.NET/TS) | 构建中的测试断言 | 基于规则 | 否 | 当你想要在单一技术生态中进行构建时的细粒度断言时,请使用单语言 linter。当你需要统一的架构配置、一份机器可读的判定结果,以及专为 AI agent 修复循环设计的反馈时,请使用 `archfit`。 ## 快速开始 安装 CLI(在可复现的文档中使用特定的 release tag,而不是 `@latest`): ``` go install github.com/alexei-led/archfit/cmd/archfit@v0.6.1 ``` 或者使用包含内置工具链的 Docker 镜像运行: ``` docker run --rm -v "$(pwd):/repo" ghcr.io/alexei-led/archfit:v0.6.1 \ check --config /repo/.archfit.yaml --full ``` 在代码仓库中运行首次检查: ``` archfit doctor # check available analyzers archfit init --root . --output .archfit.yaml # generate a starter config $EDITOR .archfit.yaml archfit check --config .archfit.yaml --full # run the gates archfit score --config .archfit.yaml --full # banded scorecard ``` 如果当前的检查结果代表的是已知的技术债,可以将其接受为基线: ``` archfit baseline --full --config .archfit.yaml ``` 针对常见项目结构的入门配置位于 [`examples/`](examples/README.md)。需要 Docker、CI、可选分析器、平台 包管理器或 PATH 修复?请从 [指南](docs/guide/README.md) 和 [工具参考](docs/guide/tooling.md) 开始。 ## 核心命令 | 命令 | 用途 | | ---------------------- | --------------------------------------------------- | | `archfit doctor` | 检查本地分析器/工具的可用性。 | | `archfit init` | 生成一个入门的 `.archfit.yaml`。 | | `archfit update` | 将 `.archfit.yaml` 与当前结构同步。 | | `archfit check` | 运行架构门禁和指标检查。 | | `archfit score` | 输出分段的 7 维度评分表。 | | `archfit scan` | 生成完整的 Markdown 审计报告。 | | `archfit baseline` | 保存被接受的当前检查结果。 | | `archfit review` | 门禁之外的 LLM 证据叙述审查。 | | `archfit enrich` | 起草门禁之外的 LLM 耦合标签优化。 | | `archfit autopilot` | 通过 LLM 起草完整的 `.archfit.yaml`(仅供审查)。 | | `archfit explain ` | 通过指纹前缀解释某一个发现。 | | `archfit install` | 检查或安装常用的分析器工具。 | 请参阅 [命令指南](docs/guide/commands.md) 了解参数、格式和退出 代码。通过指定 `--root` 指向代码仓库,并将 `--config` 指向其他位置,即可在分析目录之外运行 archfit(外部 CI)。 ## 文档 - [指南](docs/guide/README.md) — 文档导航。 - [概述](docs/guide/overview.md) — 什么是 archfit 以及何时使用它。 - [为什么架构适配度很重要](docs/guide/why-architecture-fitness.md) — 架构侵蚀、AI agent 带来的风险,以及为什么这不仅仅是依赖 lint。 - [概念](docs/guide/concepts.md) — 让平衡耦合变得可执行。 - [指标](docs/guide/metrics.md) — 每一个指标及其评分方式。 - [安装](docs/guide/install.md) — 二进制文件安装、Docker 以及首次分析器检查。 - [工具](docs/guide/tooling.md) — 平台配置、包管理器、工具版本, 主页以及 PATH 检查。 - [快速开始](docs/guide/quick-start.md) — 首次实用运行。 - [语言支持](docs/guide/languages.md) — 支持的语言及相关配置。 - [配置](docs/guide/configuration.md) — `.archfit.yaml` 基础。 - [CI](docs/guide/ci.md) — pull-request 和 pipeline 配置。 - [Agent 反馈](docs/guide/agent-feedback.md) — `agent_tasks`、SARIF 和 `change_locality`。 - [LLM 增强](docs/guide/llm-enrich.md) — 经人工审查的门禁外草稿。 - [示例](examples/README.md) — `.archfit.yaml` 入门模板。 - [贡献](CONTRIBUTING.md) — 本地开发和发布说明。 ## 许可证 Apache-2.0。请参阅 [LICENSE](LICENSE)。
标签:AI智能体, EVTX分析, Go, Ruby工具, 云安全监控, 日志审计, 架构分析, 请求拦截, 静态分析