NullLabTests/archiscape
GitHub: NullLabTests/archiscape
一款将 Python 代码库逆向工程为交互式架构知识图谱的静态分析框架,结合 AST 提取、图论指标与可选 LLM 语义分类实现可度量的架构智能分析。
Stars: 1 | Forks: 0
# Archiscape
**借助 AI 驱动的分层分类、社区发现和耦合分析,将任何 Python 代码库逆向工程为交互式架构知识图谱。**
Archiscape 是一个用于**实证软件工程研究**的静态分析框架。它在 AST 级别读取 Python 源代码,并重建其隐式架构——模块、类、函数及其依赖关系和语义角色——然后将其渲染为可探索的产出物:交互式 D3.js 力导向图、结构化的 Markdown 文档以及机器可读的 JSON。
传统的文档工具需要人工维护,而 UML 逆向工程器只能生成静态图表。与此不同,Archiscape 将架构视为一个**一阶分析对象**:可度量、可跨版本比较,并且适用于统计和图论分析。
## 研究应用
Archiscape 旨在支持以下几个研究方向:
- **架构演进追踪** — 跨 git 历史快照运行 Archiscape,以量化耦合、模块化和层次结构随时间的变化。
- **实证代码库比较** — 跨项目、团队或组织比较架构指标(密度、枢纽分布、社区结构、层级比例)。
- **设计模式挖掘** — 使用增强图(装饰器、继承、命名规范)来检测并对重复出现的架构模式进行分类。
- **技术债量化** — 将具有高扇入(传入耦合)和低文档覆盖率的枢纽组件识别为结构性技术债候选者。
- **新手入门与认知** — 为程序理解研究生成分层架构图;衡量自动检测到的层次与开发人员心智模型的匹配程度。
- **LLM 作为评判者的架构分类** — 本仓库包含一个可选的基于 LLM 的层次分类器,它使用 GPT-4o-mini 对组件进行语义标记,为研究 LLM 能在多大程度上从代码中恢复架构意图提供了一种可复现的方法。
## 功能
| 功能 | 实现 |
|---|---|
| **AST 提取** | 完整的 Python AST 遍历 — 模块、类、函数、async def、装饰器、类属性、import 语句(标准库 vs 第三方) |
| **依赖图** | 带有类型化边(`imports`,`contains`)的 NetworkX `DiGraph` |
| **层次检测(启发式)** | 基于组件名称 + 文件路径关键字评分的 8 层本体 |
| **层次检测 (LLM)** | 通过兼容 OpenAI 的 API 使用可选的 GPT-4o-mini 分类器;设置 `ARCHISCAPE_LLM_KEY` 或传递 `--llm-key` |
| **社区发现** | 在无向投影图上进行贪婪模块度优化 |
| **耦合指标** | 每个组件的扇入、扇出、度中心性;整体图密度 |
| **枢纽识别** | 按总连接度排名的 Top-N 组件 |
| **交互式可视化** | 独立的 HTML(D3.js 力导向图、侧边栏详情面板、实时搜索、缩放/平移/拖拽) |
| **动态文档** | 包含层次表、耦合矩阵、枢纽列表和组件树的 `ARCHITECTURE.md` |
| **机器可读导出** | JSON 导出,用于在 notebook 或自动化 pipeline 中进行下游分析 |
## 快速入门
```
pip install -e /path/to/archiscape
# 快速摘要
archiscape summary /path/to/project
# 完整报告(Markdown + 交互式 HTML)
archiscape doc /path/to/project
# 使用基于 LLM 的层分类
ARCHISCAPE_LLM_KEY="sk-..." archiscape doc /path/to/project --llm-model gpt-4o-mini
# 原始数据导出
archiscape scan /path/to/project -o architecture.json
```
### 解读输出结果
- **`ARCHITECTURE.md`** — 层次分布显示了每个架构层级中组件的比例。枢纽表标识了耦合度最高的模块(高维护风险)。耦合指标(扇入/扇出)在项目级别量化了传入与传出耦合。
- **`architecture.html`** — 按层次进行颜色编码。较大的节点代表模块。点击任意节点查看详情。搜索可过滤图表。侧边栏显示社区计数和枢纽排名。
- **`architecture.json`** — 包含每个节点的 import、装饰器、属性和层次分配的完整实体树。
## 示例:自我分析
在其自身的代码库上运行 `archiscape doc`:
```
╭──────────────────────────────────────────────────────────────────────────────╮
│ Archiscape v0.1.0 — Architecture Report │
│ /home/user/archiscape │
│ │
│ Components: 34 Dependencies: 28 Density: 0.025 Communities: 3 │
╰──────────────────────────────────────────────────────────────────────────────╯
Architectural Layers
Layer Components Proportion
───────────────────────────────────────
Analysis 21 62%
Rendering 6 18%
Presentation 6 18%
Other 1 3%
Most Connected Components (Hubs)
archiscape.analyzer 13 edges fan-in:3 fan-out:10 analysis
archiscape.cli 10 edges fan-in:0 fan-out:10 presentation
archiscape.graph 5 edges fan-in:2 fan-out:3 analysis
```
## 工作原理
```
Source code (*.py)
│
▼
┌─────────────────────┐
│ AST Walker │ Python ast module → CodeEntity tree
│ (analyzer.py) │ (modules, classes, functions, imports,
└─────────┬───────────┘ decorators, attributes, docstrings)
│
▼
┌─────────────────────┐
│ Graph Constructor │ NetworkX DiGraph
│ (graph.py) │ • typed edges (imports / contains)
└─────────┬───────────┘ • layer detection (heuristic + optional LLM)
│ • community detection (greedy modularity)
│ • coupling metrics (fan-in/out, density, hubs)
│
▼
┌─────────────────────┐
│ Renderers │
│ • markdown.py │ → ARCHITECTURE.md
│ • html.py │ → architecture.html (D3.js)
│ • CLI (json dump) │ → architecture.json
└─────────────────────┘
```
### 层次本体(启发式)
| 层级 | 关键字 |
|---|---|
| 表现层 (Presentation) | cli, ui, view, controller, handler, routes, web, app |
| 应用层 (Application) | service, use_case, orchestrator, manager, pipeline, workflow |
| 领域层 (Domain) | model, entity, domain, core, engine, schema |
| 基础设施层 (Infrastructure) | db, repository, storage, cache, queue, io, network |
| 分析层 (Analysis) | parser, analyzer, scanner, extractor, graph, visitor |
| 渲染层 (Rendering) | renderer, template, html, markdown, format, serialize |
| 配置层 (Config) | config, settings, constants, env, flags |
| 工具层 (Utility) | util, helper, tool, common, base, mixin |
当提供 `--llm-key` 时,只要 LLM 返回标签,启发式分类就会被 GPT-4o-mini 的判断所取代,从而将关键字匹配的速度与语言模型的语义灵活性结合起来。
## 项目结构
```
archiscape/
├── archiscape/
│ ├── __init__.py
│ ├── __main__.py
│ ├── analyzer.py # AST walker → CodeEntity tree
│ ├── graph.py # graph construction, metrics, LLM classifier
│ ├── cli.py # typer CLI (scan / doc / summary)
│ └── renderers/
│ ├── __init__.py
│ ├── templates/
│ │ └── architecture.html.j2 # Jinja2 template
│ ├── html.py # D3.js visualization generator
│ └── markdown.py # Markdown doc generator
├── examples/ # sample output from real codebases
├── pyproject.toml
├── CITATION.cff
├── LICENSE
└── README.md
```
## 与相关工具的比较
| 工具 | 侧重点 | 代码库依赖 | 图表可视化 | 层次检测 | 社区发现 | 耦合指标 | LLM 增强 |
|---|---|---|---|---|---|---|---|
| **Archiscape** | 架构智能 | 静态 (AST) | 交互式 D3.js | 启发式 + 可选 LLM | 是 | 扇入/出、密度、枢纽 | 是 |
| pydeps | 依赖可视化 | 静态 (import) | 静态 dot 图 | 否 | 否 | 否 | 否 |
| pyreverse (pylint) | UML 类图 | 静态 | 静态 dot/plantuml | 否 | 否 | 否 | 否 |
| code2flow | 调用图 | 静态/动态 | 静态图 | 否 | 否 | 否 | 否 |
| deply | 架构验证 | 静态 | 基于规则 | 手动标记 | 否 | 否 | 否 |
| Structure101 | 架构分析 | 静态 | 分层 | 手动 | 否 | 是 | 否 |
Archiscape 的独特之处在于,它在一个专为开发工作流和软件工程研究设计的开源工具中,结合了 **AST 级别的提取**、**可选的基于 LLM 的语义分类**、**图论指标**以及**交互式可视化**。
## 环境要求
- Python ≥ 3.10
- typer, rich, networkx, jinja2(可通过 pip 安装)
## 引用
如果您在研究中使用 Archiscape,请引用:
```
@software{archiscape2026,
author = {NullLabTests},
title = {Archiscape: AI-Powered Codebase Architecture Intelligence},
year = {2026},
url = {https://github.com/NullLabTests/archiscape}
}
```
仓库中包含一个 `CITATION.cff` 文件。
## 局限性与未来工作
- **仅支持 Python** — 当前的 AST 解析主要针对 Python 3.10+。要支持多语言,需要为每个目标语言提供解析器后端。
- **仅支持静态分析** — 没有运行时追踪数据。动态调用信息可以通过执行频率加权的边来丰富该图谱。
- **import 解析** — 目前能解析项目内部的 import;标记了第三方和标准库的边,但未对其进行遍历。计划在未来实现完整的依赖解析(包括传递性依赖)。
- **层次本体** — 启发式关键字集以英语为中心,且偏向于 Python。欢迎社区为其他语言生态系统做出贡献。
- **LLM 分类器** — 目前使用单次 API 调用,且仅包含名称上下文。未来版本将纳入完整的 docstring 和周围的代码上下文,以实现更准确的分类。
## 许可证
MIT — 查看 [LICENSE](LICENSE)
*Architecture + landscape — 一个让您看清软件全貌的工具。*
标签:AST解析, D3.js可视化, Petitpotam, 数据管道, 架构逆向工程, 特权检测, 软件工程, 逆向工具, 错误基检测, 静态代码分析