项目理解skill-v1

This commit is contained in:
闫旭隆
2025-11-12 10:27:56 +08:00
commit ae83b9d4d8
14 changed files with 4007 additions and 0 deletions

Binary file not shown.

View File

@ -0,0 +1,204 @@
# {PROJECT_NAME} 架构分析报告
> 生成时间: {TIMESTAMP}
> 分析工具: Claude Code - Codebase Architecture Analyzer
---
## 一、项目概览
### 1.1 基本信息
- **项目类型**: {PROJECT_TYPE}
- **主要语言**: {PRIMARY_LANGUAGE} ({PRIMARY_FILE_COUNT} 个文件)
- **次要语言**: {SECONDARY_LANGUAGE} ({SECONDARY_FILE_COUNT} 个文件)
- **代码规模**: 约 {TOTAL_LINES} 行代码
### 1.2 技术栈
**后端**:
{BACKEND_STACK}
**前端**:
{FRONTEND_STACK}
**数据库**:
{DATABASE_STACK}
**基础设施**:
{INFRASTRUCTURE_STACK}
### 1.3 子系统组成
{SUBSYSTEMS_LIST}
---
## 二、系统架构
### 2.1 架构图
```mermaid
{SYSTEM_ARCHITECTURE_DIAGRAM}
```
### 2.2 子系统详情
{SUBSYSTEMS_DETAILS}
### 2.3 通信机制
{COMMUNICATION_MECHANISMS}
---
## 三、核心业务流程
### 3.1 识别的架构模式
**核心模式**: {DETECTED_PATTERN}
{PATTERN_DESCRIPTION}
### 3.2 业务流程图
```mermaid
{WORKFLOW_DIAGRAM}
```
### 3.3 执行单元清单
{EXECUTION_UNITS_LIST}
### 3.4 关键决策点
{DECISION_POINTS}
---
## 四、数据流分析
### 4.1 数据流序列图
```mermaid
{SEQUENCE_DIAGRAM}
```
### 4.2 核心数据模型
{DATA_MODELS_LIST}
### 4.3 数据转换链路
{DATA_TRANSFORMATION_CHAIN}
---
## 五、快速上手指南
### 5.1 环境要求
{ENVIRONMENT_REQUIREMENTS}
### 5.2 安装步骤
```bash
{INSTALLATION_STEPS}
```
### 5.3 启动命令
```bash
{STARTUP_COMMANDS}
```
### 5.4 核心入口文件
{ENTRY_POINTS_LIST}
---
## 六、代码位置索引
### 6.1 核心业务逻辑
{CORE_LOGIC_INDEX}
### 6.2 API 端点
{API_ENDPOINTS_INDEX}
### 6.3 数据模型定义
{DATA_MODELS_INDEX}
### 6.4 配置文件
{CONFIG_FILES_INDEX}
---
## 七、代码质量概览
### 7.1 统计指标
- 总文件数: {TOTAL_FILES}
- 代码行数: {CODE_LINES}
- 注释行数: {COMMENT_LINES}
- 空行数: {BLANK_LINES}
### 7.2 目录结构树
```
{DIRECTORY_TREE}
```
---
## 八、外部资源
### 8.1 文档链接
{DOCUMENTATION_LINKS}
### 8.2 学术论文
{PAPERS_LIST}
### 8.3 参考资料
{REFERENCES_LIST}
---
## 九、注意事项
### 9.1 已知限制
{KNOWN_LIMITATIONS}
### 9.2 待验证事项
{TODO_VERIFY}
---
## 附录
### A. 依赖清单
{DEPENDENCIES_LIST}
### B. 环境变量
{ENVIRONMENT_VARIABLES}
### C. 分析方法
本报告基于以下方法生成:
- 静态代码分析AST 解析)
- 配置文件解析
- 目录结构分析
- 模式匹配识别
所有结论均基于代码事实,标注了具体的文件位置以供验证。

View File

@ -0,0 +1,24 @@
sequenceDiagram
participant U as 用户
participant F as {FRONTEND_NAME}
participant B as {BACKEND_NAME}
participant C as {CORE_LOGIC_NAME}
participant D as {DATABASE_NAME}
U->>F: {USER_ACTION}
Note over F: {FRONTEND_PROCESSING}
F->>B: {API_REQUEST}<br/>{REQUEST_PAYLOAD}
Note over B: {BACKEND_PROCESSING}
B->>C: {CORE_INVOCATION}<br/>{INVOCATION_PARAMS}
Note over C: {CORE_PROCESSING}
C->>D: {DATA_OPERATION}
D-->>C: {DATA_RESPONSE}
C-->>B: {CORE_RESULT}
B-->>F: {API_RESPONSE}
Note over F: {FRONTEND_RENDERING}
F-->>U: {USER_RESULT}

View File

@ -0,0 +1,204 @@
# Phase 4: 数据流追踪指南
**执行时间**:约 1-2 分钟
**目标**:追踪核心数据的转换链路
---
## ⚠️ 重要约束
**在调用 Task tool 时,必须在 prompt 开头包含以下约束:**
```
⚠️ 重要约束:本次分析只返回文本结果,禁止生成任何文件(.md, .txt 等)。
所有 Mermaid 图表、数据模型清单、转换链路都应包含在你的文本回复中,不要使用 Write 或其他文件创建工具。
```
**Explore agent 只返回文本结果,不要生成任何文件。**
---
## 分析步骤
### 步骤 1: 识别核心数据模型
使用 Grep 工具搜索数据模型定义:
#### Python 项目
```bash
# Pydantic 模型
grep -r "class.*BaseModel" --include="*.py"
# Dataclass
grep -r "@dataclass" --include="*.py"
# SQLAlchemy 模型
grep -r "class.*Base" --include="*.py"
```
#### TypeScript 项目
```bash
# Interface 定义
grep -r "interface.*{" --include="*.ts"
# Type 别名
grep -r "type.*=" --include="*.ts"
# Class 定义
grep -r "export class" --include="*.ts"
```
#### Go 项目
```bash
# Struct 定义
grep -r "type.*struct" --include="*.go"
```
### 步骤 2: 追踪数据转换
1. **定位数据入口**
- 从 API 端点的请求体开始
- 识别请求参数的类型定义
2. **追踪转换链路**
- 读取每个业务函数的参数类型和返回值类型
- 记录每次类型转换的代码位置
- 识别数据验证、清洗、增强步骤
3. **标注关键转换点**
- 序列化/反序列化
- 数据库 ORM 映射
- DTOData Transfer Object转换
- 业务逻辑处理
### 步骤 3: 生成序列图
使用 `assets/sequence.mermaid` 模板生成 Mermaid 序列图。
**⚠️ sequenceDiagram 语法约束(版本 11.x**
- `alt/loop/par` 块必须正确配对 `end`
- 使用 `<br/>` 换行
---
## 预期输出格式
### 1. Mermaid 序列图
```mermaid
sequenceDiagram
participant U as 用户
participant F as Frontend
participant B as Backend
participant R as Researcher
participant W as Writer
U->>F: 输入查询 "AI 发展趋势"
F->>B: POST /api/research<br/>{query, depth: 3}
Note over B: 构造 ResearchTask
B->>R: invoke(ResearchTask)
R->>R: 搜索引擎调用
R-->>B: SearchResults (10 个文档)
B->>W: 传递 SearchResults
W->>W: GPT-4 生成报告
W-->>B: Report (2000 字)
B->>F: 返回 HTML
F->>U: 展示报告
```
### 2. 数据模型清单
列出所有核心数据模型及其位置:
```
核心数据模型:
1. ResearchTask (models/task.py:8)
- 用途: 用户查询任务
- 字段: query: str, depth: int, filters: Optional[List[str]]
2. SearchResults (models/results.py:15)
- 用途: 搜索结果集合
- 字段: documents: List[Document], total: int, timestamp: datetime
3. Report (models/report.py:22)
- 用途: 最终生成的报告
- 字段: content: str, score: float, metadata: Dict[str, Any]
```
### 3. 数据转换链路
```
数据流转路径:
用户输入 (str)
→ ResearchTask (构造于 backend/routes.py:42)
→ SearchResults (返回于 agents/researcher.py:67)
→ Report (生成于 agents/writer.py:89)
→ HTML (渲染于 backend/routes.py:58)
→ 前端展示
```
---
## 分析技巧
### 1. 类型提示追踪
Python 示例:
```python
# 从函数签名追踪类型流转
def process_query(task: ResearchTask) -> SearchResults:
# task 类型: ResearchTask
results = search_engine.search(task.query)
# results 类型: SearchResults
return results
```
TypeScript 示例:
```typescript
// 从接口定义追踪
interface ApiRequest {
query: string;
depth: number;
}
async function handleRequest(req: ApiRequest): Promise<Report> {
// req 类型: ApiRequest
const results = await research(req);
// results 类型: Report
return results;
}
```
### 2. ORM 映射识别
SQLAlchemy 示例:
```python
# 数据库模型 → Pydantic 模型
class UserDB(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
class UserSchema(BaseModel):
id: int
# 从 UserDB 转换到 UserSchema
```
### 3. DTO 转换模式
```python
# 请求 DTO → 领域对象 → 响应 DTO
RequestDTO DomainModel ResponseDTO
```
---
## 注意事项
1. **关注核心路径**:只追踪主要业务流程的数据转换,忽略辅助功能
2. **最多 5 层深度**:避免追踪过深导致图表过于复杂
3. **标注转换位置**:每次类型转换都记录文件名和行号
4. **区分同步/异步**:在序列图中用实线(同步)和虚线(异步)区分

View File

@ -0,0 +1,452 @@
# 使用示例
本文档提供实际使用场景的示例。
## 示例 1: 分析 Multi-Agent AI 项目
### 项目结构
```
ai-research-assistant/
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ └── main.tsx
│ └── package.json
├── backend/
│ ├── app/
│ │ ├── main.py
│ │ └── routes.py
│ └── requirements.txt
└── agents/
├── graph.py
└── nodes.py
```
### 用户操作
```
用户: 理解项目
```
### Skill 执行过程
#### Phase 1: 快速扫描 (30秒)
```
⏳ 正在扫描项目结构...
✓ 检测到配置文件:
- backend/requirements.txt (Python)
- frontend/package.json (JavaScript)
✓ 读取依赖:
- Python: fastapi, langgraph, openai
- JavaScript: react, typescript
✓ 扫描目录:
- frontend/ (82 个 .tsx 文件)
- backend/ (45 个 .py 文件)
- agents/ (8 个 .py 文件)
✓ 快速扫描完成
项目类型: AI 驱动的 Web 应用
主语言: Python (后端 + AI)
次要语言: TypeScript (前端)
核心框架: FastAPI + LangGraph + React
架构: 前后端分离 + Multi-Agent
```
#### Phase 2: 系统架构分析 (2分钟)
```
⏳ 调用 Explore sub-agent 分析系统架构...
[Sub-agent 执行]
- 搜索 API 端点: @app.post, @router.
- 发现端点: /api/research, /api/status
- 搜索 WebSocket: WebSocket(
- 发现: /ws 实时通信端点
- 搜索数据库: Redis, PostgreSQL
- 发现: Redis 缓存, PostgreSQL 持久化
✓ 系统架构分析完成
识别出 3 个子系统:
├─ Frontend (frontend/)
│ ├─ 技术: React 18 + TypeScript
│ └─ 入口: src/main.tsx:1
├─ Backend (backend/)
│ ├─ 技术: FastAPI + Python 3.11
│ └─ 入口: app/main.py:1
└─ Agent Layer (agents/)
├─ 技术: LangGraph 0.2.5
└─ 入口: graph.py:1
通信机制:
- Frontend → Backend: WebSocket (/ws)
- Frontend → Backend: HTTP POST (/api/research)
- Backend → Agent Layer: 直接调用 invoke()
- Agent Layer → Redis: 缓存中间结果
- Agent Layer → PostgreSQL: 持久化数据
```
**生成的架构图**:
```mermaid
graph TB
User[用户] --> Frontend[前端<br/>React + TypeScript]
Frontend -->|WebSocket /ws| Backend[后端 API<br/>FastAPI]
Frontend -->|POST /api/research| Backend
Backend -->|invoke| AgentLayer[Agent 编排层<br/>LangGraph]
AgentLayer -->|缓存| Redis[(Redis)]
AgentLayer -->|持久化| DB[(PostgreSQL)]
style AgentLayer fill:#f9f,stroke:#333,stroke-width:3px
```
**代码位置索引**:
- Frontend 入口: `frontend/src/main.tsx:1`
- Backend 入口: `backend/app/main.py:1`
- API 定义: `backend/app/routes.py:42`
- Agent 调用: `backend/app/routes.py:58`
#### Phase 3: 核心流程提取 (5分钟)
```
⏳ 检测到 agents/ 目录,正在深度分析 Multi-Agent 编排...
⏳ 调用 Explore sub-agent 提取工作流...
[Sub-agent 执行]
- 搜索 StateGraph 定义
- 发现: agents/graph.py:23
- 提取 Agent 节点:
* researcher (agents/nodes.py:45)
* writer (agents/nodes.py:78)
* reviewer (agents/nodes.py:112)
- 分析流转规则:
* researcher → writer (顺序)
* writer → reviewer (顺序)
* reviewer → researcher (条件: quality < 7)
* reviewer → END (条件: quality >= 7)
✓ Multi-Agent 编排流程解析完成
识别出 3 个 Agent:
1. Researcher (agents/nodes.py:45)
- 职责: 调用搜索 API 收集资料
- 输入: ResearchTask
- 输出: List[Document]
2. Writer (agents/nodes.py:78)
- 职责: 基于资料生成报告
- 输入: List[Document]
- 输出: Report
3. Reviewer (agents/edges.py:12)
- 职责: 评估报告质量
- 决策: quality < 7 → 返回 Researcher
quality >= 7 → 结束流程
```
**生成的流程图**:
```mermaid
stateDiagram-v2
[*] --> Researcher: 用户查询
Researcher --> Writer: 研究完成
Writer --> Reviewer: 生成草稿
Reviewer --> Researcher: 质量不足<br/>评分 < 7
Reviewer --> [*]: 质量通过
note right of Researcher
agents/nodes.py:45
调用 Tavily 搜索 API
返回 List[Document]
end note
note right of Writer
agents/nodes.py:78
基于搜索结果
调用 GPT-4 生成报告
end note
note right of Reviewer
agents/edges.py:12
评估报告质量
决定是否重新研究
end note
```
#### Phase 4: 数据流追踪 (1分钟)
```
⏳ 追踪数据流...
✓ 识别核心数据模型:
- ResearchTask (models/task.py:8)
- SearchResults (models/results.py:15)
- Report (models/report.py:22)
✓ 数据转换链路:
用户输入 (str)
→ ResearchTask (models/task.py:8)
→ SearchResults (agents/researcher.py:45)
→ Report (agents/writer.py:78)
→ HTML (backend/routes.py:65)
```
**生成的序列图**:
```mermaid
sequenceDiagram
participant U as 用户
participant F as Frontend
participant B as Backend
participant R as Researcher
participant W as Writer
U->>F: 输入查询 "AI 发展趋势"
F->>B: POST /api/research<br/>{query, depth: 3}
Note over B: 构造 ResearchTask
B->>R: invoke(ResearchTask)
R->>R: 调用搜索引擎
R-->>B: SearchResults (10 文档)
B->>W: 传递 SearchResults
W->>W: GPT-4 生成报告
W-->>B: Report (2000 字)
B->>F: 返回 HTML
F->>U: 展示报告
```
#### Phase 5: 生成报告 (30秒)
```
⏳ 生成最终报告...
✓ 分析完成!
报告已保存: PROJECT_ARCHITECTURE.md
核心发现:
- 采用 LangGraph 编排 Multi-Agent 工作流
- 支持条件路由和循环优化
- 数据流: 查询 → 搜索 → 写作 → 审核 → 报告
快速上手:
1. 安装依赖: pip install -r backend/requirements.txt
2. 配置环境: cp .env.example .env
3. 启动后端: cd backend && uvicorn app.main:app --reload
4. 启动前端: cd frontend && npm install && npm start
5. 访问: http://localhost:3000
```
---
## 示例 2: 分析微服务项目
### 项目结构
```
ecommerce-platform/
├── docker-compose.yml
├── services/
│ ├── api-gateway/
│ ├── user-service/
│ ├── order-service/
│ └── notification-service/
└── shared/
```
### 用户操作
```
用户: 分析代码库架构
```
### 执行过程(简化版)
```
[30s] ✓ 检测到 docker-compose.yml
识别为微服务架构
发现 4 个服务: api-gateway, user-service, order-service, notification-service
[2min] ✓ 服务调用拓扑图已生成
api-gateway → user-service (HTTP GET /users/:id)
api-gateway → order-service (HTTP POST /orders)
api-gateway → notification-service (HTTP POST /notify)
[5min] ✓ 报告已保存: PROJECT_ARCHITECTURE.md
```
**生成的架构图**:
```mermaid
graph TB
Client[客户端] --> Gateway[API Gateway<br/>:8000]
Gateway -->|GET /users/:id| UserSvc[User Service<br/>:8001]
Gateway -->|POST /orders| OrderSvc[Order Service<br/>:8002]
Gateway -->|POST /notify| NotifySvc[Notification Service<br/>:8003]
UserSvc --> UserDB[(User DB<br/>PostgreSQL)]
OrderSvc --> OrderDB[(Order DB<br/>PostgreSQL)]
style Gateway fill:#ff6b6b
style UserSvc fill:#4ecdc4
style OrderSvc fill:#45b7d1
style NotifySvc fill:#f9ca24
```
---
## 示例 3: 分析 ETL 数据管道
### 项目结构
```
data-pipeline/
├── pipeline.py
├── extractors/
├── transformers/
└── loaders/
```
### 执行结果
```
[30s] ✓ 检测到 ETL 模式
识别函数: extract_from_csv, transform_data, load_to_database
[3min] ✓ 数据管道流程图已生成
```
**生成的流程图**:
```mermaid
flowchart LR
CSV[CSV 文件] --> Extract[Extract<br/>提取数据]
Extract --> Clean[Clean<br/>去重]
Clean --> Enrich[Enrich<br/>添加元数据]
Enrich --> Validate[Validate<br/>校验]
Validate --> DB[(PostgreSQL)]
Validate --> S3[(S3 存储)]
```
---
## 示例 4: 只分析特定模块
### 用户操作
```
用户: 只分析 agents/ 目录的工作流编排
```
### 执行过程
```
✓ 限定分析范围: agents/
[跳过 Phase 1, Phase 2]
[3min] ✓ 深度分析 agents/ 目录完成
识别出 LangGraph 编排:
- 3 个 Agent 节点
- 2 个条件分支
- 1 个循环优化路径
流程图已生成(仅包含 agents/ 的逻辑)
```
---
## 示例 5: 更新现有分析
### 场景
项目代码已更新,需要重新分析。
### 用户操作
```
用户: 更新架构分析报告
```
### 执行过程
```
✓ 检测到已存在 PROJECT_ARCHITECTURE.md
[对比文件时间戳]
- agents/graph.py 已修改2 天前)
- backend/routes.py 未修改
⏳ 只重新分析有变更的部分...
[2min] ✓ 增量分析完成
- Agent 层新增 1 个节点: Optimizer
- 流程图已更新
✓ 报告已更新: PROJECT_ARCHITECTURE.md
```
---
## 最佳实践
### 1. 项目克隆后立即分析
```bash
git clone https://github.com/user/project.git
cd project
# 打开 Claude Code
```
```
理解项目
```
优势:快速建立项目全景认知。
### 2. 结合其他 Skills
```
理解项目,然后生成开发者入门文档
```
先分析架构,再基于分析结果生成文档。
### 3. 针对性分析
```
只分析后端的 API 路由和业务逻辑
```
节省时间,聚焦关键部分。
---
## 故障排除示例
### 问题: 无法识别自定义框架
**场景**: 公司内部自研框架
**解决方案**:
手动提示:
```
这个项目使用了内部框架 InternalFlow它的工作流定义在 workflows/ 目录,
请分析 workflows/ 中的 YAML 文件来理解流程编排。
```
---
## 更多示例
查看 `patterns.md` 了解各种架构模式的详细识别案例。

View File

@ -0,0 +1,511 @@
# 架构分析方法论
本文档提供代码库架构分析的核心方法论和最佳实践。
## 目录
- [1. 子系统边界识别](#1-子系统边界识别)
- [2. 工作流模式识别](#2-工作流模式识别)
- [3. 通信机制识别](#3-通信机制识别)
- [4. Mermaid 图表选择策略](#4-mermaid-图表选择策略)
- [5. 业务函数识别规则](#5-业务函数识别规则)
---
## 1. 子系统边界识别
### 规则 1: 目录命名模式
通过目录名称识别子系统:
| 目录模式 | 子系统类型 | 常见技术栈 |
|---------|-----------|-----------|
| `frontend/`, `ui/`, `web/`, `client/` | 前端子系统 | React, Vue, Angular |
| `backend/`, `api/`, `server/` | 后端子系统 | FastAPI, Express, Django |
| `agent/`, `agents/`, `workers/` | Agent 系统 | LangGraph, CrewAI, Celery |
| `services/` + 多个子目录 | 微服务集群 | Spring Boot, Go microservices |
| `database/`, `models/`, `schema/` | 数据层 | SQLAlchemy, Prisma |
| `shared/`, `common/`, `lib/` | 共享库 | 工具函数、类型定义 |
### 规则 2: 独立配置文件识别
每个子系统通常有独立的配置文件:
```
frontend/
├── package.json → 独立的 Node.js 项目
├── tsconfig.json
└── vite.config.js
backend/
├── requirements.txt → 独立的 Python 项目
├── pyproject.toml
└── Dockerfile
```
**识别方法**
```bash
# 查找独立的依赖文件
find . -name "package.json" -o -name "requirements.txt" -o -name "go.mod"
```
### 规则 3: Docker Compose 服务划分
分析 `docker-compose.yml` 识别服务边界:
```yaml
services:
frontend: # 前端服务
build: ./frontend
api: # API 服务
build: ./backend
worker: # 后台任务
build: ./worker
db: # 数据库
image: postgres:15
```
每个 service 通常对应一个独立的子系统。
---
## 2. 工作流模式识别
### 模式 1: Multi-Agent 编排
**特征**
- 导入 `langgraph`, `crewai`, `autogen`
- 存在 `StateGraph()`, `Crew()`, `Sequential()` 调用
- 使用 `add_node()`, `add_edge()` 方法
**提取方法**
1. **定位编排定义**
```bash
grep -r "StateGraph\|Crew\|AutoGen" --include="*.py"
```
2. **提取 Agent 节点**
```python
# 示例代码
graph = StateGraph(AgentState)
graph.add_node("researcher", research_agent) # Agent 1
graph.add_node("writer", writing_agent) # Agent 2
graph.add_node("reviewer", review_agent) # Agent 3
```
3. **分析状态流转**
```python
graph.add_edge("researcher", "writer") # 顺序流转
graph.add_conditional_edges("writer", should_revise, {
"revise": "researcher", # 条件分支
"finish": END
})
```
**生成图表类型**: `stateDiagram-v2`
---
### 模式 2: 数据管道ETL/Pipeline
**特征**
- 目录名包含 `pipeline`, `etl`, `workflow`
- 函数名包含 `extract`, `transform`, `load`
- 使用 Airflow, Prefect, Dagster 框架
**提取方法**
1. **识别管道阶段**
```python
# 示例代码
def run_pipeline(source):
raw = extract(source) # 阶段 1
clean = transform(raw) # 阶段 2
load(clean) # 阶段 3
```
2. **追踪数据转换**
- 输入CSV 文件
- → DataFrame (pandas)
- → 清洗后 DataFrame
- → PostgreSQL 表
**生成图表类型**: `flowchart LR` (从左到右)
---
### 模式 3: 事件驱动架构
**特征**
- 使用 `EventEmitter`, `event_bus`, `@subscribe`
- 发布订阅模式:`emit()`, `on()`, `subscribe()`
- 消息队列RabbitMQ, Kafka, Redis Pub/Sub
**提取方法**
1. **识别事件定义**
```python
# 发布事件
event_bus.emit("order_created", order)
```
2. **识别订阅者**
```python
@event_bus.on("order_created")
def handle_order(order):
send_confirmation(order)
@event_bus.on("order_created")
def update_inventory(order):
inventory.decrease(order.items)
```
**生成图表类型**: `graph TB` (显示发布-订阅关系)
---
### 模式 4: 微服务调用链
**特征**
- `docker-compose.yml` 中有多个 services
- 使用 `requests.get()`, `httpx.get()` 调用其他服务
- gRPC 调用:`stub.MethodCall()`
**提取方法**
1. **识别服务间调用**
```python
# api-gateway 调用其他服务
user = requests.get("http://user-service/users/{id}")
order = requests.post("http://order-service/orders", ...)
```
2. **绘制调用拓扑**
- api-gateway → user-service
- api-gateway → order-service
- order-service → payment-service
**生成图表类型**: `graph TB` (服务拓扑)
---
### 模式 5: 传统分层架构MVC
**特征**
- 目录结构:`controllers/`, `services/`, `models/`
- 装饰器:`@app.route`, `@Controller`
- ORM 使用SQLAlchemy, Sequelize
**提取方法**
1. **识别三层结构**
- Controller: 处理 HTTP 请求
- Service: 业务逻辑
- Model: 数据模型
2. **追踪调用链**
```
routes.py (@app.route)
→ UserService.create()
→ User model
→ Database
```
**生成图表类型**: `graph TD` (分层图)
---
## 3. 通信机制识别
### HTTP/REST API
**搜索关键词**
```bash
# 服务端
grep -r "@app\.(get|post|put|delete)" --include="*.py"
grep -r "router\.(get|post)" --include="*.js"
grep -r "@RestController" --include="*.java"
# 客户端
grep -r "axios\.(get|post)" --include="*.js"
grep -r "requests\.(get|post)" --include="*.py"
grep -r "fetch(" --include="*.ts"
```
### WebSocket
**搜索关键词**
```bash
grep -r "WebSocket\|socket.io\|ws://" --include="*.{py,js,ts}"
```
### 消息队列
**搜索关键词**
```bash
# RabbitMQ
grep -r "pika\|RabbitMQ" --include="*.py"
# Kafka
grep -r "kafka\|KafkaProducer" --include="*.{py,java}"
# Redis Pub/Sub
grep -r "redis.*publish\|redis.*subscribe" --include="*.py"
```
### gRPC
**搜索关键词**
```bash
grep -r "grpc\|\.proto" --include="*.{py,go,java}"
```
---
## 4. Mermaid 图表选择策略
根据识别到的模式选择合适的图表类型:
| 场景 | 图表类型 | 适用情况 |
|------|---------|---------|
| 状态转换明显Multi-Agent | `stateDiagram-v2` | 有明确的状态节点和转换条件 |
| 顺序+条件流程(业务流程) | `flowchart TD` | 顺序执行 + if/else 分支 |
| 数据管道ETL | `flowchart LR` | 线性的数据转换流程 |
| 系统拓扑(微服务) | `graph TB` | 多个系统/服务的交互关系 |
| 时序交互API 调用) | `sequenceDiagram` | 多个参与者的时序消息传递 |
| 并发任务 | `graph TB` + subgraph | 多个并行任务分组 |
### 语法注意事项
**⚠️ Mermaid 语法约束(基于版本 11.x**
- **stateDiagram-v2**: 禁用 `--` 分隔符(会报错 "No such shape: divider"
- **stateDiagram-v2**: 不支持 `<br/>` 标签
- **sequenceDiagram**: `alt/loop/par` 块必须正确配对 `end`
- **所有类型**: 避免过深嵌套的控制结构
**stateDiagram-v2 限制**
- ❌ 不支持 `<br/>` 标签,使用 `note` 块代替
- ❌ 不支持 `--` 分隔符
- ❌ 标签文本避免 `!=`, `==` 等比较运算符
- ✅ 复杂信息放在 `note right/left of NodeName` 块中
**flowchart/graph**
- ✅ 可使用 `<br/>` 换行
- ✅ 支持富文本标签
- ✅ 使用 `style` 设置节点颜色
### 示例:选择决策树
```
检测到的特征:
├─ 有状态变量 + 转换逻辑?
│ → 是:使用 stateDiagram-v2
│ → 否:继续判断
├─ 有多个参与者 + 时序消息?
│ → 是:使用 sequenceDiagram
│ → 否:继续判断
├─ 线性数据转换?
│ → 是:使用 flowchart LR
│ → 否:继续判断
└─ 默认:使用 graph TB 或 flowchart TD
```
---
## 5. 业务函数识别规则
### 排除辅助函数
**规则**:以下函数不算业务逻辑
```python
# 1. 私有函数(下划线开头)
def _internal_helper():
pass
# 2. 工具函数
def format_date(date):
pass
def validate_email(email):
pass
# 3. Getter/Setter
def get_user():
pass
def set_config():
pass
# 4. 过短的函数(< 5 行)
def simple_wrapper():
return another_function()
```
### 识别业务函数
**特征 1函数名包含业务关键词**
```python
业务动词:
- process_*, handle_*, execute_*, run_*
- create_*, update_*, delete_*
- generate_*, analyze_*, calculate_*
- search_*, fetch_*, query_*
- build_*, transform_*, convert_*
```
**特征 2处理核心数据模型**
```python
# 函数参数或返回值包含核心数据类
def process_order(order: Order) -> OrderResult: # ✓ 业务函数
...
def format_string(s: str) -> str: # ✗ 工具函数
...
```
**特征 3函数体较长> 10 行)**
通常业务逻辑较复杂,函数体较长。
**特征 4调用外部服务或数据库**
```python
def create_user(data):
user = User(**data)
db.session.add(user) # ✓ 数据库操作
db.session.commit()
send_email(user.email) # ✓ 外部服务
return user
```
---
## 6. 调用链追踪深度控制
### 最大深度策略
**问题**:递归追踪可能陷入无限循环
**解决方案**:限制最大深度
```python
MAX_DEPTH = 5 # 最多追踪 5 层
def trace_calls(func_name, current_depth=0):
if current_depth >= MAX_DEPTH:
return
calls = extract_function_calls(func_name)
for call in calls:
trace_calls(call, current_depth + 1)
```
### 广度优先 vs 深度优先
**广度优先BFS**
- 优先展示同一层级的所有函数
- 适合识别并发任务
**深度优先DFS**
- 优先追踪单一调用链
- 适合追踪数据转换流程
**推荐**:对于流程分析,使用 **广度优先**。
---
## 7. 最佳实践
### ✅ 应该做的
1. **先宽后深** - 先了解整体结构,再深入细节
2. **只读分析** - 不修改任何代码
3. **标注位置** - 所有结论都附带文件:行号
4. **可视化优先** - 用图表表达复杂关系
5. **分阶段输出** - 边分析边展示进度
### ❌ 不应该做的
1. **不要臆测** - 所有结论必须基于代码事实
2. **不要分析 node_modules/** - 跳过第三方依赖
3. **不要暴露敏感信息** - 不读取 `.env`, `secrets.yaml`
4. **不要过度深入** - 不需要分析每一个辅助函数
5. **不要修改代码** - 纯只读分析
---
## 8. 故障排除
### 问题 1: 找不到入口点
**症状**:无法识别主函数
**解决方案**
```bash
# 多种方式查找
grep -r "if __name__ == '__main__'" --include="*.py"
grep -r "@app.route\|@app.post" --include="*.py"
grep -r "func main()" --include="*.go"
ls -la | grep -i "main\|index\|app"
```
### 问题 2: 调用链太复杂
**症状**:函数调用超过 100 层
**解决方案**
- 只追踪业务函数,忽略工具函数
- 限制最大深度为 5
- 聚焦核心路径(最常用的调用链)
### 问题 3: 动态导入无法追踪
**症状**Python 的 `importlib`, JavaScript 的 `require(variable)`
**解决方案**
- 结合运行时日志分析
- 搜索字符串模式猜测可能的模块名
- 在报告中标注"动态导入,无法静态分析"
---
## 9. 工具推荐
### Python 项目
- `ast` 模块 - 解析 Python AST
- `radon` - 复杂度分析
- `pydeps` - 依赖可视化
### JavaScript/TypeScript 项目
- `@typescript-eslint/parser` - 解析 TS AST
- `madge` - 依赖关系图
- `dependency-cruiser` - 依赖验证
### Go 项目
- `go-callvis` - 调用图可视化
- `gocyclo` - 圈复杂度
### 通用工具
- `tree` - 目录结构可视化
- `tokei` - 代码统计
- `cloc` - 代码行数统计
---
## 10. 参考资源
- **C4 模型**: 系统架构可视化的四层模型
- **UML 类图**: 面向对象系统的标准表示
- **事件风暴**: 领域驱动设计的建模方法
- **架构决策记录 (ADR)**: 记录架构决策的最佳实践

View File

@ -0,0 +1,641 @@
# 常见架构模式参考
本文档提供各种架构模式的识别方法和 Mermaid 模板。
## 目录
- [1. Multi-Agent 架构](#1-multi-agent-架构)
- [2. 微服务架构](#2-微服务架构)
- [3. 事件驱动架构](#3-事件驱动架构)
- [4. 数据管道ETL](#4-数据管道etl)
- [5. 分层架构MVC](#5-分层架构mvc)
- [6. CQRS 架构](#6-cqrs-架构)
---
## 1. Multi-Agent 架构
### 模式 1.1: LangGraph 编排
**代码特征**
```python
from langgraph.graph import StateGraph, END
# 定义状态
class AgentState(TypedDict):
query: str
data: List[str]
result: str
# 创建图
graph = StateGraph(AgentState)
# 添加节点Agent
graph.add_node("researcher", research_agent)
graph.add_node("writer", writing_agent)
# 添加边(流转规则)
graph.add_edge("researcher", "writer")
graph.add_conditional_edges(
"writer",
should_continue,
{
"continue": "researcher",
"end": END
}
)
# 设置入口
graph.set_entry_point("researcher")
```
**识别方法**
1. 搜索 `from langgraph``StateGraph`
2. 提取所有 `add_node()` 调用 → Agent 清单
3. 提取所有 `add_edge()``add_conditional_edges()` → 流转规则
4. 读取每个 Agent 函数的实现
**Mermaid 模板**
```mermaid
stateDiagram-v2
[*] --> Researcher: 用户查询
Researcher --> Writer: 数据收集完成
Writer --> QualityChecker: 生成草稿
QualityChecker --> Researcher: 质量不足<br/>评分 < 7
QualityChecker --> [*]: 质量通过
note right of Researcher
文件: agents/researcher.py:45
职责: 调用搜索 API 收集资料
输入: ResearchTask
输出: List[Document]
end note
note right of Writer
文件: agents/writer.py:78
职责: 基于资料生成报告
输入: List[Document]
输出: Report
end note
```
**关键信息提取**
- Agent 名称
- 文件位置(文件:行号)
- 职责描述
- 输入/输出类型
- 条件分支逻辑
---
### 模式 1.2: CrewAI 编排
**代码特征**
```python
from crewai import Agent, Task, Crew
# 定义 Agent
researcher = Agent(
role="Researcher",
goal="Collect comprehensive information",
tools=[search_tool]
)
writer = Agent(
role="Writer",
goal="Write engaging articles",
tools=[writing_tool]
)
# 定义任务
research_task = Task(
description="Research AI trends",
agent=researcher
)
writing_task = Task(
description="Write article based on research",
agent=writer
)
# 创建 Crew
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, writing_task],
process=Process.sequential
)
```
**识别方法**
1. 搜索 `from crewai``Agent(`
2. 提取所有 `Agent()` 定义
3. 提取所有 `Task()` 定义
4. 分析 `Crew()` 的 process 类型sequential/hierarchical
**Mermaid 模板**
```mermaid
flowchart TD
Start([开始]) --> Task1[Research Task<br/>Agent: Researcher]
Task1 --> Task2[Writing Task<br/>Agent: Writer]
Task2 --> End([结束])
style Task1 fill:#e1f5ff
style Task2 fill:#fff4e1
```
---
### 模式 1.3: AutoGen 多智能体
**代码特征**
```python
from autogen import AssistantAgent, UserProxyAgent
# 定义 Agent
assistant = AssistantAgent(
name="assistant",
llm_config={"config_list": config_list}
)
user_proxy = UserProxyAgent(
name="user_proxy",
code_execution_config={"work_dir": "coding"}
)
# 发起对话
user_proxy.initiate_chat(
assistant,
message="Analyze this dataset"
)
```
**Mermaid 模板**
```mermaid
sequenceDiagram
participant User as UserProxy
participant Asst as AssistantAgent
User->>Asst: 发起任务
Asst->>Asst: 生成代码
Asst->>User: 返回代码
User->>User: 执行代码
User->>Asst: 反馈执行结果
Asst->>User: 最终答案
```
---
## 2. 微服务架构
### 模式 2.1: Docker Compose 微服务
**代码特征**
```yaml
# docker-compose.yml
services:
api-gateway:
build: ./api-gateway
ports:
- "8000:8000"
user-service:
build: ./services/user-service
environment:
- DATABASE_URL=postgres://...
order-service:
build: ./services/order-service
notification-service:
build: ./services/notification-service
```
```python
# api-gateway/routes.py
@app.post("/orders")
def create_order(order_data):
# 调用 user-service
user = requests.get(f"http://user-service:8001/users/{user_id}")
# 调用 order-service
order = requests.post("http://order-service:8002/orders", json=order_data)
# 调用 notification-service
requests.post("http://notification-service:8003/notify", json={
"user_id": user_id,
"order_id": order["id"]
})
return order
```
**识别方法**
1. 读取 `docker-compose.yml`,提取所有 services
2. 在每个服务的代码中搜索 `requests.get|post`, `httpx.`
3. 提取目标 URL识别服务间调用关系
**Mermaid 模板**
```mermaid
graph TB
Client[客户端] --> Gateway[API Gateway<br/>:8000]
Gateway -->|GET /users/:id| UserSvc[User Service<br/>:8001]
Gateway -->|POST /orders| OrderSvc[Order Service<br/>:8002]
Gateway -->|POST /notify| NotifySvc[Notification Service<br/>:8003]
UserSvc --> UserDB[(User DB<br/>PostgreSQL)]
OrderSvc --> OrderDB[(Order DB<br/>PostgreSQL)]
style Gateway fill:#ff6b6b
style UserSvc fill:#4ecdc4
style OrderSvc fill:#45b7d1
style NotifySvc fill:#f9ca24
```
**关键信息提取**
- 服务名称
- 端口号
- 服务间调用关系from → to
- 数据库连接
---
### 模式 2.2: Kubernetes 微服务
**代码特征**
```yaml
# k8s/user-service.yaml
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-service
ports:
- port: 8001
```
**识别方法**
1. 查找 `k8s/`, `kubernetes/`, `.yaml` 文件
2. 提取所有 `kind: Service` 定义
---
## 3. 事件驱动架构
### 模式 3.1: 事件总线Event Bus
**代码特征**
```python
# event_bus.py
class EventBus:
def __init__(self):
self._listeners = {}
def on(self, event_name, handler):
self._listeners.setdefault(event_name, []).append(handler)
def emit(self, event_name, data):
for handler in self._listeners.get(event_name, []):
handler(data)
# handlers.py
@event_bus.on("order_created")
def send_confirmation_email(order):
email.send(order.customer_email, ...)
@event_bus.on("order_created")
def update_inventory(order):
inventory.decrease(order.items)
@event_bus.on("order_created")
def log_order(order):
logger.info(f"Order {order.id} created")
# service.py
def create_order(order_data):
order = Order(**order_data)
db.save(order)
event_bus.emit("order_created", order) # 发布事件
```
**识别方法**
1. 搜索 `emit(`, `publish(`, `dispatch(`
2. 搜索 `@on(`, `@subscribe(`, `.on(`
3. 提取事件名称和对应的处理器
**Mermaid 模板**
```mermaid
graph TB
OrderService[Order Service] -->|emit| Event[order_created 事件]
Event --> Handler1[send_confirmation_email<br/>handlers.py:15]
Event --> Handler2[update_inventory<br/>handlers.py:28]
Event --> Handler3[log_order<br/>handlers.py:42]
Handler1 --> EmailSvc[Email Service]
Handler2 --> InventoryDB[(Inventory DB)]
Handler3 --> Logger[Logger]
style Event fill:#ffd93d,stroke:#333,stroke-width:3px
```
---
### 模式 3.2: 消息队列RabbitMQ/Kafka
**代码特征**
```python
# producer.py
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='tasks')
def publish_task(task_data):
channel.basic_publish(
exchange='',
routing_key='tasks',
body=json.dumps(task_data)
)
# consumer.py
def callback(ch, method, properties, body):
task = json.loads(body)
process_task(task)
channel.basic_consume(
queue='tasks',
on_message_callback=callback,
auto_ack=True
)
```
**Mermaid 模板**
```mermaid
graph LR
Producer[任务生产者] -->|发布| Queue[(RabbitMQ<br/>tasks 队列)]
Queue -->|消费| Consumer1[Worker 1]
Queue -->|消费| Consumer2[Worker 2]
Queue -->|消费| Consumer3[Worker 3]
style Queue fill:#ff6b6b
```
---
## 4. 数据管道ETL
### 模式 4.1: 顺序管道
**代码特征**
```python
def run_pipeline(source_file):
# Step 1: Extract
raw_data = extract_from_csv(source_file)
# Step 2: Transform
cleaned_data = remove_duplicates(raw_data)
enriched_data = add_metadata(cleaned_data)
validated_data = validate_schema(enriched_data)
# Step 3: Load
load_to_database(validated_data)
load_to_s3(validated_data)
```
**Mermaid 模板**
```mermaid
flowchart LR
CSV[CSV 文件] --> Extract[Extract<br/>提取数据]
Extract --> Clean[Clean<br/>去重]
Clean --> Enrich[Enrich<br/>添加元数据]
Enrich --> Validate[Validate<br/>校验]
Validate --> DB[(PostgreSQL)]
Validate --> S3[(S3 存储)]
style Extract fill:#e1f5ff
style Clean fill:#fff4e1
style Enrich fill:#e8f5e8
style Validate fill:#ffe1e1
```
---
### 模式 4.2: Airflow DAG
**代码特征**
```python
from airflow import DAG
from airflow.operators.python import PythonOperator
dag = DAG('data_pipeline', schedule_interval='@daily')
extract_task = PythonOperator(
task_id='extract',
python_callable=extract_data,
dag=dag
)
transform_task = PythonOperator(
task_id='transform',
python_callable=transform_data,
dag=dag
)
load_task = PythonOperator(
task_id='load',
python_callable=load_data,
dag=dag
)
extract_task >> transform_task >> load_task
```
**Mermaid 模板**
```mermaid
graph LR
Start([每日触发]) --> Extract[Extract Task]
Extract --> Transform[Transform Task]
Transform --> Load[Load Task]
Load --> End([完成])
```
---
## 5. 分层架构MVC
### 模式 5.1: 三层架构
**代码特征**
```python
# routes.py (Controller 层)
@app.route("/users", methods=["POST"])
def create_user():
data = request.json
user = UserService.create(data) # 调用 Service 层
return jsonify(user.to_dict())
# services/user_service.py (Service 层)
class UserService:
@staticmethod
def create(data):
# 业务逻辑
if not validate_email(data["email"]):
raise ValueError("Invalid email")
user = User(**data) # 使用 Model 层
db.session.add(user)
db.session.commit()
return user
# models/user.py (Model 层)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(120), unique=True)
name = db.Column(db.String(80))
```
**Mermaid 模板**
```mermaid
graph TD
Client[HTTP 客户端] -->|POST /users| Controller[Controller<br/>routes.py]
Controller --> Service[Service 层<br/>user_service.py]
Service --> Model[Model 层<br/>user.py]
Model --> DB[(Database)]
Service --> Validator[验证器<br/>validate_email]
style Controller fill:#ff6b6b
style Service fill:#4ecdc4
style Model fill:#45b7d1
```
---
## 6. CQRS 架构
### 模式 6.1: 命令查询分离
**代码特征**
```python
# commands/create_order.py (写操作)
class CreateOrderCommand:
def execute(self, order_data):
order = Order(**order_data)
write_db.save(order)
event_bus.emit("order_created", order)
# queries/get_order.py (读操作)
class GetOrderQuery:
def execute(self, order_id):
return read_db.query(Order).filter_by(id=order_id).first()
```
**Mermaid 模板**
```mermaid
graph TB
Client[客户端]
Client -->|写操作| CommandHandler[Command Handler]
CommandHandler --> WriteDB[(Write DB<br/>PostgreSQL)]
CommandHandler -->|发布事件| EventBus[Event Bus]
Client -->|读操作| QueryHandler[Query Handler]
QueryHandler --> ReadDB[(Read DB<br/>Redis/Elasticsearch)]
EventBus -->|同步| ReadDB
style CommandHandler fill:#ff6b6b
style QueryHandler fill:#4ecdc4
```
---
## 7. 混合架构识别
### 示例:微服务 + 事件驱动 + CQRS
**特征**
- 多个独立服务(微服务)
- 服务间通过事件通信(事件驱动)
- 每个服务内部 CQRS命令查询分离
**Mermaid 模板**
```mermaid
graph TB
subgraph "Order Service"
OrderCmd[Command Handler]
OrderQuery[Query Handler]
OrderWriteDB[(Write DB)]
OrderReadDB[(Read DB)]
end
subgraph "Inventory Service"
InvCmd[Command Handler]
InvQuery[Query Handler]
InvWriteDB[(Write DB)]
InvReadDB[(Read DB)]
end
EventBus[Event Bus<br/>RabbitMQ]
OrderCmd --> OrderWriteDB
OrderCmd --> EventBus
OrderQuery --> OrderReadDB
EventBus -->|order_created| InvCmd
InvCmd --> InvWriteDB
InvQuery --> InvReadDB
style EventBus fill:#ffd93d
```
---
## 8. 模式识别决策树
```
1. 检测 docker-compose.yml 或 k8s/ 目录
→ 是: 可能是微服务架构
→ 否: 继续
2. 检测 agents/ 目录 OR langgraph/crewai 导入
→ 是: Multi-Agent 架构
→ 否: 继续
3. 检测 emit/publish/subscribe
→ 是: 事件驱动架构
→ 否: 继续
4. 检测 extract/transform/load 函数
→ 是: 数据管道架构
→ 否: 继续
5. 检测 routes/ + services/ + models/
→ 是: 分层架构MVC
→ 否: 继续
6. 默认: 通用应用,分析主要调用链
```
---
## 9. 使用建议
1. **不要生搬硬套** - 并非所有项目都符合标准模式
2. **可以组合** - 一个项目可能同时使用多种模式
3. **关注核心** - 识别最重要的架构特征
4. **标注依据** - 在报告中注明识别依据(代码位置)
---
## 10. 扩展阅读
- **Martin Fowler's Architecture Patterns**: https://martinfowler.com/architecture/
- **Microservices Patterns**: https://microservices.io/patterns/
- **Event Driven Architecture**: https://martinfowler.com/articles/201701-event-driven.html

View File

@ -0,0 +1,408 @@
# 快速扫描指南
本指南提供项目快速扫描的详细步骤。
## 目标
在 30 秒内识别:
- 项目类型
- 主要编程语言
- 核心框架
- 子系统组成
---
## 步骤 1: 运行技术栈检测脚本(推荐)
**使用自动化脚本**
```bash
python ~/.claude/skills/codebase-architecture-analyzer/scripts/detect_tech_stack.py .
```
**脚本输出示例**
```json
{
"project_path": "/path/to/project",
"stacks": [
{
"language": "Python",
"frameworks": ["FastAPI", "LangGraph"],
"config_file": "pyproject.toml",
"version": "3.11"
},
{
"language": "TypeScript",
"frameworks": ["React", "Next.js"],
"version": ">=18"
}
],
"docker": {
"containerized": true,
"compose": true,
"services": ["backend", "frontend", "redis"]
}
}
```
**从输出提取信息**
- `stacks[].language` - 主要编程语言
- `stacks[].frameworks` - 核心框架列表
- `stacks[].version` - 语言/运行时版本
- `docker.services` - Docker 服务列表(如果有)
**脚本支持的语言**
- Python (FastAPI, Django, Flask, LangGraph, CrewAI)
- JavaScript/TypeScript (React, Vue, Next.js, Express, NestJS)
- Go (Gin, Gorilla Mux, Fiber)
- Rust (Actix Web, Rocket, Axum)
- Java (Spring Boot, Quarkus)
---
## 步骤 1.5: 分析依赖关系(可选,用于深度分析)
**使用依赖分析脚本**
```bash
python ~/.claude/skills/codebase-architecture-analyzer/scripts/extract_dependencies.py .
```
**脚本输出示例**
```json
{
"project_path": ".",
"analyses": [
{
"language": "Python",
"files_analyzed": 45,
"total_imports": 23,
"third_party_imports": ["fastapi", "pydantic", "langchain", "openai"],
"declared_dependencies": ["fastapi", "pydantic", "langchain", "openai", "requests"],
"undeclared_usage": [],
"unused_dependencies": ["requests"]
},
{
"language": "JavaScript/TypeScript",
"dependencies": ["react", "next", "tailwindcss"],
"dev_dependencies": ["typescript", "@types/react", "eslint"],
"total_dependencies": 6
}
]
}
```
**关键信息提取**
- `third_party_imports` - 实际使用的第三方包
- `declared_dependencies` - 在配置文件中声明的依赖
- `undeclared_usage` - **缺失的依赖**(代码中使用了,但未在 requirements.txt/pyproject.toml 中声明)
- `unused_dependencies` - **冗余的依赖**(声明了但代码中未使用)
**使用场景**
**推荐使用**(当满足以下条件时):
- 需要验证依赖完整性
- 准备部署到生产环境
- 项目有复杂的依赖关系
- 发现依赖相关的 bug
⚠️ **可跳过**(当满足以下条件时):
- 快速了解项目即可
- 项目很小(< 10 个文件
- 只关注整体架构
**输出解读**
1. **缺失依赖警告**如果 `undeclared_usage` 不为空说明需要更新 requirements.txt
2. **冗余依赖清理**如果 `unused_dependencies` 不为空可以移除不需要的依赖
3. **依赖健康度**`total_imports` vs `declared_dependencies` 的比例
---
## 步骤 2: 检测技术栈(手动方法)
如果脚本无法运行或需要更详细分析使用以下手动方法
### Python 项目
**识别文件**
```bash
# 优先级从高到低
1. pyproject.toml # 现代 Python 项目Poetry/Hatch
2. setup.py # 传统 Python 包
3. requirements.txt # 依赖清单
4. Pipfile # Pipenv 项目
5. environment.yml # Conda 项目
```
**提取信息**
```bash
# 从 pyproject.toml 提取
cat pyproject.toml | grep "python =" # Python 版本
cat pyproject.toml | grep "\[tool.poetry.dependencies\]" -A 20 # 依赖
# 从 requirements.txt 提取
cat requirements.txt | grep -E "fastapi|django|flask|langgraph"
```
---
### JavaScript/TypeScript 项目
**识别文件**
```bash
1. package.json # Node.js 项目
2. yarn.lock # Yarn 包管理
3. pnpm-lock.yaml # pnpm 包管理
4. tsconfig.json # TypeScript 配置
```
**提取信息**
```bash
# 从 package.json 提取
cat package.json | grep "\"react\"\|\"vue\"\|\"express\"\|\"next\""
```
---
### Go 项目
**识别文件**
```bash
1. go.mod # Go modules
2. go.sum # 依赖锁文件
```
**提取信息**
```bash
cat go.mod | grep "require" -A 20
```
---
### Rust 项目
**识别文件**
```bash
1. Cargo.toml # Rust 项目配置
2. Cargo.lock # 依赖锁文件
```
---
### Java 项目
**识别文件**
```bash
1. pom.xml # Maven 项目
2. build.gradle # Gradle 项目
```
---
## 步骤 3: 扫描目录结构
### 列出顶层目录
```bash
ls -d */ | head -20
```
### 识别子系统模式
| 目录名 | 子系统类型 |
|-------|-----------|
| `frontend/`, `ui/`, `web/`, `client/` | 前端 |
| `backend/`, `api/`, `server/` | 后端 |
| `agents/`, `workers/` | Agent 系统 |
| `services/` + 多个子目录 | 微服务 |
| `src/components/` | React/Vue 组件 |
| `app/` | Next.js/Django 应用 |
---
## 步骤 4: 检测关键配置文件
### Docker 相关
```bash
# docker-compose.yml → 多服务架构
cat docker-compose.yml | grep "services:" -A 50
# Dockerfile → 容器化应用
ls -la | grep Dockerfile
```
### 环境配置
```bash
# .env.example → 环境变量配置
cat .env.example | grep -E "DATABASE_URL|REDIS_URL|API_KEY"
```
---
## 步骤 5: 识别项目规模
### 统计代码文件
```bash
# 统计各语言文件数量
find . -type f -name "*.py" | wc -l
find . -type f -name "*.ts" -o -name "*.tsx" | wc -l
find . -type f -name "*.go" | wc -l
```
### 估算代码规模
```bash
# 使用 cloc如果已安装
cloc . --exclude-dir=node_modules,venv,.git
```
---
## 输出格式模板
```
✓ 项目类型: [AI 研究助手 / Web 应用 / CLI 工具 / ...]
✓ 主语言: Python 3.11 (156 个文件)
✓ 次要语言: TypeScript (89 个文件)
✓ 核心框架:
- 后端: FastAPI 0.104.1
- 前端: React 18.2.0
- AI: LangGraph 0.2.5
✓ 子系统:
- frontend/ (React + TypeScript)
- backend/ (FastAPI + Python)
- agents/ (LangGraph)
✓ 容器化: 是docker-compose.yml
✓ 代码规模: 约 12,500 行
```
---
## 常见框架识别规则
### Python Web 框架
```python
依赖中包含:
- fastapi FastAPI
- django Django
- flask Flask
- starlette Starlette
- aiohttp aiohttp
```
### Python AI 框架
```python
依赖中包含:
- langgraph LangGraph
- crewai CrewAI
- autogen AutoGen
- langchain LangChain
- transformers Hugging Face
```
### JavaScript 框架
```json
dependencies 中包含:
- "react" React
- "vue" Vue.js
- "next" Next.js
- "express" Express.js
- "nestjs" NestJS
```
---
## 快速判断项目类型
### CLI 工具
**特征**
- 存在 `cli.py`, `main.py`, `cmd/` 目录
- 依赖包含 `click`, `typer`, `argparse`
- `pyproject.toml` 中有 `[project.scripts]`
### Web 应用
**特征**
- 存在 `routes.py`, `views.py`, `app.py`
- 依赖包含 `fastapi`, `django`, `express`
- 存在 `assets/`, `static/` 目录
### AI/ML 项目
**特征**
- 存在 `models/`, `agents/`, `pipelines/`
- 依赖包含 `tensorflow`, `pytorch`, `langchain`
- 存在 `notebooks/` 目录Jupyter
### 数据工程项目
**特征**
- 存在 `etl/`, `pipelines/`, `dags/`
- 依赖包含 `airflow`, `prefect`, `dbt`
- 存在 `sql/`, `queries/` 目录
---
## 故障排除
### 问题 1: 无法识别项目类型
**解决方案**
1. 查看 README.md 的描述
2. 搜索常见入口文件`main.*`, `index.*`, `app.*`
3. 查看 git 提交历史`git log --oneline | head -20`
### 问题 2: 多语言混合项目
**解决方案**
- 统计各语言文件数量确定主次
- 识别前后端分离`frontend/` + `backend/`
---
## 完整示例
```bash
# 1. 检测配置文件
ls -la | grep -E "package.json|pyproject.toml|go.mod|Cargo.toml"
# 输出: pyproject.toml, package.json (前后端分离项目)
# 2. 读取 Python 依赖
cat pyproject.toml | grep -A 30 dependencies
# 输出: fastapi, langgraph, openai (AI Web 应用)
# 3. 读取 JS 依赖
cat package.json | grep -A 20 dependencies
# 输出: react, typescript (React 前端)
# 4. 扫描目录
ls -d */
# 输出: frontend/, backend/, agents/, docs/
# 5. 统计代码
find backend -name "*.py" | wc -l # 156 个文件
find frontend -name "*.ts*" | wc -l # 89 个文件
# 最终识别结果:
✓ 项目类型: AI 驱动的 Web 应用
✓ 主语言: Python (后端 + AI)
✓ 次要语言: TypeScript (前端)
✓ 核心框架: FastAPI + LangGraph + React
✓ 架构: 前后端分离 + Multi-Agent
```

View File

@ -0,0 +1,259 @@
# Phase 5: 报告生成指南
**执行时间**:约 30 秒
**目标**:汇总所有分析结果,生成完整的架构分析报告
---
## 生成步骤
### 步骤 1: 收集所有分析结果
从前 4 个 Phase 收集以下信息:
1. **Phase 1 - 快速扫描**
- 项目类型
- 主要编程语言
- 核心框架
- 子系统列表
- 代码规模
2. **Phase 2 - 系统架构**
- 系统架构 Mermaid 图
- 子系统清单(名称、路径、技术栈、入口文件)
- 通信关系列表
3. **Phase 3 - 核心流程**
- 工作流 Mermaid 图stateDiagram-v2 / flowchart
- 执行单元清单Agent / 服务 / 函数)
- 关键决策点
4. **Phase 4 - 数据流**
- 序列图 Mermaid
- 数据模型清单
- 数据转换链路
### 步骤 2: 使用模板生成报告
使用 `assets/report.md` 模板,将收集的信息填充到相应章节。
### 步骤 3: 添加快速上手指南
从项目文件中提取以下信息:
1. **环境要求**
- 从 README.md 或 pyproject.toml 提取
- Python/Node.js 版本要求
- 系统依赖Docker、Redis 等)
2. **安装步骤**
- 依赖安装命令
- 环境变量配置
- 数据库初始化
3. **启动命令**
- 开发环境启动命令
- 生产环境部署命令
- 测试运行命令
4. **核心入口文件**
- 主入口文件路径
- 配置文件路径
- 关键模块路径
### 步骤 4: 生成代码位置索引
汇总所有关键文件的位置:
```
代码位置索引:
├─ 入口文件
│ ├─ 后端入口: backend/app/main.py:1
│ └─ 前端入口: frontend/src/main.tsx:1
├─ 核心模块
│ ├─ Agent 编排: agents/graph.py:23
│ ├─ 研究 Agent: agents/nodes.py:45
│ └─ 写作 Agent: agents/nodes.py:78
├─ API 端点
│ ├─ 研究 API: backend/app/routes.py:42
│ └─ WebSocket: backend/app/routes.py:58
└─ 数据模型
├─ ResearchTask: models/task.py:8
└─ Report: models/report.py:22
```
### 步骤 5: 保存报告
将生成的报告保存到项目根目录:
- **保存路径**: `PROJECT_ARCHITECTURE.md`
---
## 报告结构模板
```markdown
# [项目名] 架构分析报告
> 生成时间: [YYYY-MM-DD HH:MM:SS]
> 分析工具: Claude Code - Codebase Architecture Analyzer
---
## 一、项目概览
**项目类型**: [自动推断]
**主要语言**: [Python 3.11]
**核心框架**: [FastAPI + LangGraph]
**代码规模**: [156 个 Python 文件, 89 个 TypeScript 文件]
**子系统**:
- frontend/ (React + TypeScript)
- backend/ (FastAPI + Python)
- agents/ (LangGraph)
---
## 二、系统架构
### 2.1 架构图
```mermaid
[Phase 2 生成的 Mermaid 图]
```
### 2.2 子系统详情
[Phase 2 生成的子系统清单]
### 2.3 通信机制
[Phase 2 生成的通信关系列表]
---
## 三、核心业务流程
### 3.1 流程图
```mermaid
[Phase 3 生成的 Mermaid 图]
```
### 3.2 执行单元清单
[Phase 3 生成的 Agent/服务/函数清单]
### 3.3 关键决策点
[Phase 3 识别的条件分支和路由规则]
---
## 四、数据流分析
### 4.1 序列图
```mermaid
[Phase 4 生成的 Mermaid 序列图]
```
### 4.2 数据模型清单
[Phase 4 生成的数据模型列表]
### 4.3 数据转换链路
[Phase 4 追踪的数据流转路径]
---
## 五、快速上手指南
### 5.1 环境要求
- Python 3.11+
- Node.js 18+
- Docker (可选)
### 5.2 安装步骤
```bash
# 1. 安装后端依赖
pip install -r backend/requirements.txt
# 2. 安装前端依赖
cd frontend && npm install
# 3. 配置环境变量
cp .env.example .env
```
### 5.3 启动命令
```bash
# 启动后端
cd backend && uvicorn app.main:app --reload
# 启动前端
cd frontend && npm start
```
### 5.4 核心入口文件
- 后端入口: `backend/app/main.py`
- 前端入口: `frontend/src/main.tsx`
- Agent 编排: `agents/graph.py`
---
## 六、代码位置索引
[Phase 2-4 汇总的所有关键文件位置]
---
## 附录:分析方法说明
本报告由 Claude Code 的 `codebase-architecture-analyzer` Skill 自动生成。
分析方法:
- Phase 1: 快速扫描(识别技术栈)
- Phase 2: 系统架构分析Explore sub-agent
- Phase 3: 核心流程提取(智能模式识别)
- Phase 4: 数据流追踪(类型追踪)
- Phase 5: 报告生成(本文档)
```
---
## 输出示例
执行完成后,向用户显示:
```
✓ 分析完成!
报告已保存: PROJECT_ARCHITECTURE.md
核心发现:
- 采用 LangGraph 编排 Multi-Agent 工作流
- 支持条件路由和循环优化
- 数据流: 查询 → 搜索 → 写作 → 审核 → 报告
快速上手:
1. 安装依赖: pip install -r requirements.txt
2. 配置环境: cp .env.example .env
3. 启动后端: uvicorn app.main:app --reload
4. 启动前端: cd frontend && npm start
```
---
## 注意事项
1. **Mermaid 图表检查**:确保所有 Mermaid 代码块语法正确
2. **代码位置准确性**:所有文件路径和行号必须准确
3. **快速上手可用性**:安装步骤必须可执行,不能遗漏关键步骤
4. **避免敏感信息**:不要在报告中包含 `.env` 文件内容或 API 密钥

View File

@ -0,0 +1,124 @@
# Phase 2: 系统架构分析指南
**执行时间**:约 2 分钟
**目标**:识别子系统边界和通信机制
---
## ⚠️ 重要约束
**Explore agent 只返回文本结果,不要生成任何文件。**
---
## 分析方法
使用 **Task tool** 调用内置的 **Explore sub-agent** 进行深度分析。
### 步骤 1: 启动 Task tool
指定以下参数:
- `subagent_type: Explore`
- `description: "系统架构分析"`
- `prompt`: 包含下面的详细任务
### 步骤 2: Sub-agent 任务定义
```
⚠️ 重要约束:本次分析只返回文本结果,禁止生成任何文件(.md, .txt 等)。
所有 Mermaid 图表、清单、分析结论都应包含在你的文本回复中,不要使用 Write 或其他文件创建工具。
分析项目的子系统划分和通信机制:
1. 子系统边界识别
- 扫描顶层目录,识别 frontend/, backend/, agents/ 等模式
- 查找独立配置文件package.json, requirements.txt
- 解析 docker-compose.yml 中的 services
2. API 端点定位
- 搜索:@app.(get|post|put|delete)
- 搜索:@router., app.route
- 提取端点路径和处理函数位置
3. 通信协议识别
- HTTP: requests.get/post, axios, fetch
- WebSocket: WebSocket, socket.io
- 消息队列: RabbitMQ, Kafka, Redis pub/sub
- gRPC: grpc, .proto
4. 数据库连接
- PostgreSQL: psycopg2, SQLAlchemy
- Redis: redis.Redis
- MongoDB: pymongo
输出格式:
- 子系统清单(名称、路径、技术栈、入口文件:行号)
- 通信关系from → to, 协议, 端点)
- 生成 Mermaid graph TB 架构图(使用 `<br/>` 换行)
```
### 步骤 3: 执行过程
1. **Explore sub-agent 自动执行**:使用 Glob、Grep、Read 工具搜索代码
2. **接收结果**sub-agent 返回分析报告
3. **验证结果**:检查是否包含所有子系统和通信关系
---
## 预期输出格式
### 1. Mermaid 系统架构图
```mermaid
graph TB
User[用户] --> Frontend[前端<br/>React + TypeScript]
Frontend -->|HTTP POST /api/research| Backend[后端 API<br/>FastAPI]
Frontend -->|WebSocket /ws| Backend
Backend -->|invoke| AgentLayer[Agent 编排层<br/>LangGraph]
AgentLayer -->|缓存| Redis[(Redis)]
AgentLayer -->|持久化| DB[(PostgreSQL)]
style AgentLayer fill:#f9f,stroke:#333,stroke-width:3px
```
### 2. 代码位置索引
- Frontend 入口: `frontend/src/main.tsx:1`
- Backend 入口: `backend/app/main.py:1`
- API 定义: `backend/app/routes.py:42`
- Agent 调用: `backend/app/routes.py:58`
### 3. 子系统清单
```
识别出 3 个子系统:
├─ Frontend (frontend/)
│ ├─ 技术: React 18 + TypeScript
│ └─ 入口: src/main.tsx:1
├─ Backend (backend/)
│ ├─ 技术: FastAPI + Python 3.11
│ └─ 入口: app/main.py:1
└─ Agent Layer (agents/)
├─ 技术: LangGraph 0.2.5
└─ 入口: graph.py:1
```
### 4. 通信机制
```
- Frontend → Backend: WebSocket (/ws)
- Frontend → Backend: HTTP POST (/api/research)
- Backend → Agent Layer: 直接调用 invoke()
- Agent Layer → Redis: 缓存中间结果
- Agent Layer → PostgreSQL: 持久化数据
```
---
## 注意事项
1. **配置文件优先**:优先解析 docker-compose.yml它通常包含完整的服务拓扑
2. **多种通信协议**:一个项目可能同时使用 HTTP、WebSocket、消息队列
3. **入口文件定位**:确保记录每个子系统的主入口文件和行号
4. **Mermaid 样式**:使用 `style` 语法突出显示核心子系统

View File

@ -0,0 +1,582 @@
# 工作流提取详细指南
本指南提供通用的工作流提取算法,适用于各种架构模式。
## ⚠️ 重要约束
**在调用 Task tool 时,必须在 prompt 开头包含以下约束:**
```
⚠️ 重要约束:本次分析只返回文本结果,禁止生成任何文件(.md, .txt 等)。
所有 Mermaid 图表、清单、分析结论都应包含在你的文本回复中,不要使用 Write 或其他文件创建工具。
```
**Explore agent 只返回文本结果,不要生成任何文件。**
---
## 核心思想
**不预设架构类型,而是从代码中提取执行流程特征。**
---
## 算法概览
```
1. 定位入口点CLI/Web/定时任务)
2. 提取函数调用链(递归追踪)
3. 识别业务函数(排除辅助函数)
4. 分析流程模式(顺序/分支/循环/并发)
5. 生成 Mermaid 图表
```
---
## 步骤 1: 定位入口点
### 1.1 CLI 应用
**Python**:
```bash
grep -rn "if __name__ == '__main__'" --include="*.py"
grep -rn "@click.command\|@click.group" --include="*.py"
grep -rn "argparse.ArgumentParser" --include="*.py"
```
**示例**:
```python
# main.py:45
if __name__ == "__main__":
main() # ← 入口函数
```
**Go**:
```bash
grep -rn "func main()" --include="*.go"
```
---
### 1.2 Web 应用
**FastAPI/Flask**:
```bash
grep -rn "@app\.(get|post|put|delete)" --include="*.py"
grep -rn "@router\." --include="*.py"
```
**示例**:
```python
# routes.py:42
@app.post("/api/research") # ← 入口点
def research_endpoint(query: str):
...
```
**Express.js**:
```bash
grep -rn "app\.(get|post)" --include="*.js"
grep -rn "router\." --include="*.js"
```
---
### 1.3 定时任务
**Celery**:
```bash
grep -rn "@celery.task\|@shared_task" --include="*.py"
```
**Airflow**:
```bash
grep -rn "DAG(" --include="*.py"
```
**Cron/APScheduler**:
```bash
grep -rn "@schedule\|@cron" --include="*.py"
```
---
### 1.4 消息消费者
**RabbitMQ/Kafka**:
```bash
grep -rn "basic_consume\|KafkaConsumer" --include="*.py"
```
**示例**:
```python
# consumer.py:25
def callback(ch, method, properties, body): # ← 入口点
process_message(body)
```
---
## 步骤 2: 提取函数调用链
### 2.1 读取入口函数
从步骤 1 识别的入口点开始:
```python
# 示例routes.py:42
@app.post("/api/research")
def research_endpoint(query: str):
task = create_task(query) # 调用 1
results = executor.run(task) # 调用 2
return format_response(results) # 调用 3
```
**提取调用清单**:
```
research_endpoint
├── create_task
├── executor.run
└── format_response
```
---
### 2.2 递归追踪
读取 `executor.run` 的实现:
```python
# executor.py:78
def run(self, task):
data = self.fetch_data(task) # 调用 2.1
processed = self.process(data) # 调用 2.2
return self.finalize(processed) # 调用 2.3
```
**更新调用树**:
```
research_endpoint
├── create_task
├── executor.run
│ ├── fetch_data
│ ├── process
│ └── finalize
└── format_response
```
---
### 2.3 控制递归深度
**问题**: 可能陷入无限递归
**解决方案**: 限制最大深度
```python
MAX_DEPTH = 5 # 最多追踪 5 层
def trace_calls(func_name, depth=0):
if depth >= MAX_DEPTH:
return []
calls = extract_calls_from_function(func_name)
result = []
for call in calls:
result.append(call)
result.extend(trace_calls(call, depth + 1))
return result
```
---
## 步骤 3: 识别业务函数
### 3.1 排除辅助函数
**规则**:
| 函数特征 | 是否保留 |
|---------|---------|
| 私有函数 `_helper()` | ❌ 排除 |
| 工具函数 `format_date()` | ❌ 排除 |
| Getter/Setter | ❌ 排除 |
| 函数体 < 5 | 排除 |
| 包含业务关键词 | 保留 |
| 调用数据库/外部 API | 保留 |
| 处理核心数据模型 | 保留 |
---
### 3.2 业务关键词清单
```python
BUSINESS_KEYWORDS = [
# 处理动词
"process", "handle", "execute", "run",
# CRUD 操作
"create", "update", "delete", "query", "fetch",
# 业务逻辑
"calculate", "analyze", "generate", "transform",
"search", "filter", "validate", "verify",
# 工作流
"orchestrate", "coordinate", "schedule"
]
```
**示例判断**:
```python
process_order() # 包含 "process"
create_user() # 包含 "create"
analyze_data() # 包含 "analyze"
format_string() # 工具函数
_internal_helper() # 私有函数
get_config() # Getter
```
---
### 3.3 检测数据库/API 调用
**数据库调用**:
```python
def create_user(data):
user = User(**data)
db.session.add(user) # ✅ 数据库操作
db.session.commit()
return user
```
**外部 API 调用**:
```python
def fetch_weather(city):
response = requests.get( # ✅ 外部 API
f"https://api.weather.com/{city}"
)
return response.json()
```
**搜索模式**:
```bash
# 数据库
grep -n "db\.session\|query(\|execute(" file.py
# HTTP 请求
grep -n "requests\.\|httpx\.\|fetch(" file.py
```
---
## 步骤 4: 分析流程模式
### 4.1 顺序流程
**代码特征**:
```python
def process():
step1()
step2()
step3()
```
**识别**: 连续的函数调用无分支
**生成图表**: `flowchart TD` (从上到下)
---
### 4.2 条件分支
**代码特征**:
```python
def process(data):
if validate(data):
path_a()
else:
path_b()
```
**识别**: `if/else`, `match/case`, 三元运算符
**生成图表**: `flowchart TD` (带菱形决策节点)
---
### 4.3 循环优化
**代码特征**:
```python
def optimize(data):
while not is_good_enough(data):
data = improve(data)
return data
```
**识别**: `while` + 条件判断
**生成图表**: `flowchart TD` (带循环边)
---
### 4.4 状态机
**代码特征**:
```python
state = "init"
if state == "init":
state = "processing"
elif state == "processing":
if condition:
state = "done"
else:
state = "error"
```
**识别**: 状态变量 + 状态转换逻辑
**生成图表**: `stateDiagram-v2`
---
### 4.5 并发编排
**Python asyncio**:
```python
results = await asyncio.gather(
task1(),
task2(),
task3()
)
```
**JavaScript Promise.all**:
```javascript
const results = await Promise.all([
fetchUser(),
fetchOrders(),
fetchProducts()
]);
```
**识别**: `asyncio.gather`, `Promise.all`, `WaitGroup`
**生成图表**: `graph TB` + subgraph (并行任务分组)
---
### 4.6 图编排LangGraph
**代码特征**:
```python
graph = StateGraph(State)
graph.add_node("a", func_a)
graph.add_node("b", func_b)
graph.add_edge("a", "b")
graph.add_conditional_edges("b", router, {
"continue": "a",
"end": END
})
```
**识别**: `add_node`, `add_edge`, `add_conditional_edges`
**生成图表**: `stateDiagram-v2`
---
## 步骤 5: 生成 Mermaid 图表
** Mermaid 语法约束版本 11.x**
- **stateDiagram-v2**: 禁用 `--` 分隔符不支持 `<br/>`
- **sequenceDiagram**: `alt/loop/par` 块必须正确配对 `end`
- **所有类型**: 使用 `<br/>` 换行stateDiagram-v2 除外
### 5.1 选择图表类型
```python
def select_diagram_type(flow_pattern):
if flow_pattern == "state_machine":
return "stateDiagram-v2"
elif flow_pattern == "concurrent":
return "graph TB" # 带 subgraph
elif flow_pattern == "sequential_with_conditions":
return "flowchart TD"
elif flow_pattern == "linear_pipeline":
return "flowchart LR"
else:
return "graph TB" # 默认
```
---
### 5.2 生成状态图Multi-Agent
**输入数据**:
```python
nodes = [
{"name": "researcher", "file": "agents/nodes.py", "line": 45},
{"name": "writer", "file": "agents/nodes.py", "line": 78}
]
edges = [
{"from": "researcher", "to": "writer"},
{
"from": "writer",
"to": "researcher",
"condition": "quality < 7"
}
]
```
**生成代码**:
```python
def generate_state_diagram(nodes, edges):
mermaid = "stateDiagram-v2\n"
mermaid += f" [*] --> {nodes[0]['name']}\n"
for edge in edges:
if "condition" in edge:
mermaid += f" {edge['from']} --> {edge['to']}: {edge['condition']}\n"
else:
mermaid += f" {edge['from']} --> {edge['to']}\n"
# 添加注释
for node in nodes:
mermaid += f"\n note right of {node['name']}\n"
mermaid += f" {node['file']}:{node['line']}\n"
mermaid += f" end note\n"
return mermaid
```
---
### 5.3 生成流程图(顺序+分支)
**输入数据**:
```python
steps = [
{"name": "extract", "type": "process"},
{"name": "validate", "type": "decision"},
{"name": "transform", "type": "process"},
{"name": "load", "type": "process"}
]
connections = [
{"from": "extract", "to": "validate"},
{"from": "validate", "to": "transform", "condition": "valid"},
{"from": "validate", "to": "error_handler", "condition": "invalid"}
]
```
**生成代码**:
```python
def generate_flowchart(steps, connections):
mermaid = "flowchart TD\n"
# 定义节点
for step in steps:
if step["type"] == "decision":
mermaid += f" {step['name']}{{{step['name']}}}\n" # 菱形
else:
mermaid += f" {step['name']}[{step['name']}]\n" # 矩形
# 连接
for conn in connections:
if "condition" in conn:
mermaid += f" {conn['from']} -->|{conn['condition']}| {conn['to']}\n"
else:
mermaid += f" {conn['from']} --> {conn['to']}\n"
return mermaid
```
---
## 完整示例
### 示例代码
```python
# routes.py:42
@app.post("/api/research")
def research_endpoint(query: str):
task = create_research_task(query)
results = execute_research(task)
return results
# research.py:15
def execute_research(task):
# 并发搜索
search_results = asyncio.gather(
search_google(task.query),
search_arxiv(task.query)
)
# 生成报告
if len(search_results) > 5:
report = generate_detailed_report(search_results)
else:
report = generate_summary(search_results)
return report
```
---
### 提取结果
**入口点**: `research_endpoint` (routes.py:42)
**调用链**:
```
research_endpoint
├── create_research_task
└── execute_research
├── search_google (并发)
├── search_arxiv (并发)
└── generate_detailed_report OR generate_summary (条件)
```
**流程模式**: 顺序 + 并发 + 条件分支
---
### 生成 Mermaid 图
```mermaid
flowchart TD
Start([API 请求]) --> CreateTask[创建研究任务]
CreateTask --> Concurrent{并发搜索}
Concurrent --> Google[搜索 Google]
Concurrent --> ArXiv[搜索 ArXiv]
Google --> Merge[合并结果]
ArXiv --> Merge
Merge --> Decision{结果数量}
Decision -->|> 5 篇| Detailed[生成详细报告]
Decision -->|≤ 5 篇| Summary[生成摘要]
Detailed --> End([返回结果])
Summary --> End
```
## 最佳实践
1. **先广度后深度** - 先了解整体流程
2. **限制递归深度** - 避免无限循环
3. **过滤辅助函数** - 只关注业务逻辑
4. **标注代码位置** - 便于验证
5. **可视化优先** - 图表比文字更直观

View File

@ -0,0 +1,266 @@
#!/usr/bin/env python3
"""
技术栈检测脚本
用法: python detect_tech_stack.py [项目路径]
输出: JSON 格式的技术栈信息
"""
import json
import sys
from pathlib import Path
from typing import Dict, List, Optional
def detect_python_stack(project_path: Path) -> Optional[Dict]:
"""检测 Python 技术栈"""
result = {"language": "Python", "frameworks": [], "dependencies": []}
# 查找配置文件
pyproject = project_path / "pyproject.toml"
requirements = project_path / "requirements.txt"
setup_py = project_path / "setup.py"
if pyproject.exists():
content = pyproject.read_text(encoding='utf-8')
result["config_file"] = "pyproject.toml"
# 检测 Python 版本
if 'python = "^' in content:
version = content.split('python = "^')[1].split('"')[0]
result["version"] = version
# 检测框架
if "fastapi" in content.lower():
result["frameworks"].append("FastAPI")
if "django" in content.lower():
result["frameworks"].append("Django")
if "flask" in content.lower():
result["frameworks"].append("Flask")
if "langgraph" in content.lower():
result["frameworks"].append("LangGraph")
if "crewai" in content.lower():
result["frameworks"].append("CrewAI")
elif requirements.exists():
content = requirements.read_text(encoding='utf-8')
result["config_file"] = "requirements.txt"
# 检测框架
for line in content.split('\n'):
line = line.strip().lower()
if line.startswith('fastapi'):
result["frameworks"].append("FastAPI")
elif line.startswith('django'):
result["frameworks"].append("Django")
elif line.startswith('flask'):
result["frameworks"].append("Flask")
elif line.startswith('langgraph'):
result["frameworks"].append("LangGraph")
else:
return None
return result
def detect_javascript_stack(project_path: Path) -> Optional[Dict]:
"""检测 JavaScript/TypeScript 技术栈"""
package_json = project_path / "package.json"
if not package_json.exists():
return None
result = {"language": "JavaScript/TypeScript", "frameworks": [], "dependencies": []}
try:
import json as json_module
content = json_module.loads(package_json.read_text(encoding='utf-8'))
# 检测框架
deps = {**content.get("dependencies", {}), **content.get("devDependencies", {})}
if "react" in deps:
result["frameworks"].append("React")
if "@types/react" in deps:
result["language"] = "TypeScript"
if "vue" in deps:
result["frameworks"].append("Vue.js")
if "next" in deps:
result["frameworks"].append("Next.js")
if "express" in deps:
result["frameworks"].append("Express.js")
if "@nestjs/core" in deps:
result["frameworks"].append("NestJS")
# 检测 Node 版本
if "engines" in content and "node" in content["engines"]:
result["version"] = content["engines"]["node"]
except Exception as e:
print(f"Error parsing package.json: {e}", file=sys.stderr)
return None
return result
def detect_go_stack(project_path: Path) -> Optional[Dict]:
"""检测 Go 技术栈"""
go_mod = project_path / "go.mod"
if not go_mod.exists():
return None
result = {"language": "Go", "frameworks": [], "dependencies": []}
content = go_mod.read_text(encoding='utf-8')
# 检测 Go 版本
for line in content.split('\n'):
if line.strip().startswith('go '):
result["version"] = line.strip().split()[1]
break
# 检测框架
if "gin-gonic/gin" in content:
result["frameworks"].append("Gin")
if "gorilla/mux" in content:
result["frameworks"].append("Gorilla Mux")
if "fiber" in content:
result["frameworks"].append("Fiber")
return result
def detect_rust_stack(project_path: Path) -> Optional[Dict]:
"""检测 Rust 技术栈"""
cargo_toml = project_path / "Cargo.toml"
if not cargo_toml.exists():
return None
result = {"language": "Rust", "frameworks": [], "dependencies": []}
content = cargo_toml.read_text(encoding='utf-8')
# 检测框架
if "actix-web" in content:
result["frameworks"].append("Actix Web")
if "rocket" in content:
result["frameworks"].append("Rocket")
if "axum" in content:
result["frameworks"].append("Axum")
return result
def detect_java_stack(project_path: Path) -> Optional[Dict]:
"""检测 Java 技术栈"""
pom_xml = project_path / "pom.xml"
build_gradle = project_path / "build.gradle"
if pom_xml.exists():
result = {"language": "Java", "frameworks": [], "build_tool": "Maven"}
content = pom_xml.read_text(encoding='utf-8')
# 检测框架
if "spring-boot" in content:
result["frameworks"].append("Spring Boot")
if "quarkus" in content:
result["frameworks"].append("Quarkus")
return result
elif build_gradle.exists():
result = {"language": "Java", "frameworks": [], "build_tool": "Gradle"}
content = build_gradle.read_text(encoding='utf-8')
# 检测框架
if "spring-boot" in content:
result["frameworks"].append("Spring Boot")
return result
return None
def detect_docker_usage(project_path: Path) -> Dict:
"""检测 Docker 使用情况"""
docker_compose = project_path / "docker-compose.yml"
dockerfile = project_path / "Dockerfile"
result = {"containerized": False, "services": []}
if docker_compose.exists():
result["containerized"] = True
result["compose"] = True
# 简单解析 services
content = docker_compose.read_text(encoding='utf-8')
in_services = False
for line in content.split('\n'):
if line.strip() == "services:":
in_services = True
continue
if in_services and line.startswith(' ') and ':' in line and not line.strip().startswith('#'):
service_name = line.strip().rstrip(':')
if service_name and not service_name.startswith('-'):
result["services"].append(service_name)
elif dockerfile.exists():
result["containerized"] = True
result["compose"] = False
return result
def main():
# 获取项目路径
if len(sys.argv) > 1:
project_path = Path(sys.argv[1])
else:
project_path = Path.cwd()
if not project_path.exists():
print(f"Error: Path {project_path} does not exist", file=sys.stderr)
sys.exit(1)
# 检测各种技术栈
stacks = []
python_stack = detect_python_stack(project_path)
if python_stack:
stacks.append(python_stack)
js_stack = detect_javascript_stack(project_path)
if js_stack:
stacks.append(js_stack)
go_stack = detect_go_stack(project_path)
if go_stack:
stacks.append(go_stack)
rust_stack = detect_rust_stack(project_path)
if rust_stack:
stacks.append(rust_stack)
java_stack = detect_java_stack(project_path)
if java_stack:
stacks.append(java_stack)
# 检测 Docker
docker_info = detect_docker_usage(project_path)
# 输出结果
result = {
"project_path": str(project_path),
"stacks": stacks,
"docker": docker_info
}
print(json.dumps(result, indent=2, ensure_ascii=False))
if __name__ == "__main__":
main()

View File

@ -0,0 +1,167 @@
#!/usr/bin/env python3
"""
依赖提取脚本
用法: python extract_dependencies.py [项目路径]
输出: JSON 格式的依赖信息
"""
import ast
import json
import sys
from pathlib import Path
from typing import Dict, List, Set
def extract_python_imports(file_path: Path) -> Set[str]:
"""从 Python 文件提取 import"""
imports = set()
try:
with open(file_path, 'r', encoding='utf-8') as f:
tree = ast.parse(f.read(), filename=str(file_path))
for node in ast.walk(tree):
if isinstance(node, ast.Import):
for alias in node.names:
# 只保留顶层包名
module = alias.name.split('.')[0]
imports.add(module)
elif isinstance(node, ast.ImportFrom):
if node.module:
module = node.module.split('.')[0]
imports.add(module)
except Exception as e:
print(f"Warning: Failed to parse {file_path}: {e}", file=sys.stderr)
return imports
def analyze_python_project(project_path: Path) -> Dict:
"""分析 Python 项目的依赖"""
all_imports = set()
file_count = 0
# 遍历所有 Python 文件
for py_file in project_path.rglob("*.py"):
# 跳过虚拟环境和 node_modules
if any(part in py_file.parts for part in ['venv', 'env', '.venv', 'node_modules', '__pycache__']):
continue
file_count += 1
imports = extract_python_imports(py_file)
all_imports.update(imports)
# 读取声明的依赖
declared_deps = set()
requirements_txt = project_path / "requirements.txt"
if requirements_txt.exists():
for line in requirements_txt.read_text(encoding='utf-8').split('\n'):
line = line.strip()
if line and not line.startswith('#'):
# 去掉版本号
dep = line.split('==')[0].split('>=')[0].split('~=')[0].strip()
declared_deps.add(dep)
pyproject_toml = project_path / "pyproject.toml"
if pyproject_toml.exists():
content = pyproject_toml.read_text(encoding='utf-8')
# 简单提取(不使用 toml 库)
in_deps = False
for line in content.split('\n'):
if '[tool.poetry.dependencies]' in line or '[project.dependencies]' in line:
in_deps = True
continue
if in_deps and line.strip().startswith('['):
break
if in_deps and '=' in line:
dep = line.split('=')[0].strip().strip('"')
if dep != 'python':
declared_deps.add(dep)
# Python 标准库(部分常见的)
stdlib = {
'os', 'sys', 'json', 'time', 'datetime', 'collections', 'itertools',
'functools', 'pathlib', 're', 'math', 'random', 'typing', 'abc',
'asyncio', 'logging', 'unittest', 'argparse', 'subprocess', 'io',
'copy', 'pickle', 'sqlite3', 'http', 'urllib', 'email', 'uuid'
}
# 区分第三方包和标准库
third_party = all_imports - stdlib
return {
"language": "Python",
"files_analyzed": file_count,
"total_imports": len(all_imports),
"third_party_imports": list(sorted(third_party)),
"declared_dependencies": list(sorted(declared_deps)),
"undeclared_usage": list(sorted(third_party - declared_deps)),
"unused_dependencies": list(sorted(declared_deps - third_party))
}
def analyze_javascript_project(project_path: Path) -> Dict:
"""分析 JavaScript 项目的依赖"""
package_json = project_path / "package.json"
if not package_json.exists():
return None
try:
import json as json_module
content = json_module.loads(package_json.read_text(encoding='utf-8'))
dependencies = content.get("dependencies", {})
dev_dependencies = content.get("devDependencies", {})
return {
"language": "JavaScript/TypeScript",
"dependencies": list(dependencies.keys()),
"dev_dependencies": list(dev_dependencies.keys()),
"total_dependencies": len(dependencies) + len(dev_dependencies)
}
except Exception as e:
print(f"Error parsing package.json: {e}", file=sys.stderr)
return None
def main():
# 获取项目路径
if len(sys.argv) > 1:
project_path = Path(sys.argv[1])
else:
project_path = Path.cwd()
if not project_path.exists():
print(f"Error: Path {project_path} does not exist", file=sys.stderr)
sys.exit(1)
results = []
# 分析 Python
python_result = analyze_python_project(project_path)
if python_result["files_analyzed"] > 0:
results.append(python_result)
# 分析 JavaScript
js_result = analyze_javascript_project(project_path)
if js_result:
results.append(js_result)
# 输出结果
output = {
"project_path": str(project_path),
"analyses": results
}
print(json.dumps(output, indent=2, ensure_ascii=False))
if __name__ == "__main__":
main()

View File

@ -0,0 +1,165 @@
---
name: codebase-architecture-analyzer
description: 用于理解开源项目。当用户说"理解项目"、"分析代码库"、"项目架构"、"梳理架构"时自动触发。自动识别技术栈、子系统边界、核心业务流程,生成 Mermaid 架构图和流程图。
allowed-tools: [Read, Glob, Grep, Bash, Task]
---
# 代码库架构分析 Skill
你是架构逆向工程专家,能从源代码反向推导系统架构和业务逻辑流程。
## 核心任务
- 📊 识别子系统边界frontend/backend/agent/database
- 🔄 追踪核心业务流程(工作流编排/数据管道/事件驱动)
- 📈 生成 Mermaid 架构图和流程图
- 🧠 智能模式识别Multi-Agent/微服务/分层架构)
- 📝 生成项目理解报告
---
## 执行流程
### ⚠️ 路径使用规范
所有脚本路径**必须使用波浪号 `~` 表示法**(跨平台兼容):
```bash
export PYTHONIOENCODING=utf-8 && python ~/.claude/skills/codebase-architecture-analyzer/scripts/detect_tech_stack.py .
```
**说明**
- `~/.claude/...` 在 Windows/macOS/Linux 均可正确解析
- `export PYTHONIOENCODING=utf-8` 用于处理中文/emoji 输出
---
### Phase 1: 快速扫描
**目标**:识别项目类型和主要组成
**执行步骤**
1. **运行技术栈检测脚本**
- 使用 Bash 工具执行:`export PYTHONIOENCODING=utf-8 && python ~/.claude/skills/codebase-architecture-analyzer/scripts/detect_tech_stack.py .`
- 脚本会输出 JSON 格式的技术栈信息语言、框架、Docker 配置等)
- 解析 JSON 结果获取:
- 主要编程语言Python/JavaScript/Go/Rust/Java
- 核心框架FastAPI/React/Django/LangGraph 等)
- Docker 服务配置
2. **分析依赖关系**
- 使用 Bash 工具执行:`export PYTHONIOENCODING=utf-8 && python ~/.claude/skills/codebase-architecture-analyzer/scripts/extract_dependencies.py .`
- 脚本会分析实际使用的依赖 vs 声明的依赖
- 识别:
- 第三方依赖列表
- 缺失的依赖声明(使用了但未声明)
- 未使用的依赖(声明了但未使用)
3. **扫描目录结构**
- 使用 Glob 工具识别顶层目录frontend/, backend/, agents/, services/ 等)
- 确认子系统边界
4. **统计代码规模**
- 使用 Bash 工具执行:`find . -type f -name "*.py" | wc -l`(针对主要语言)
- 估算项目规模
**详细指南**: `reference/quick-scan.md`
---
### Phase 2: 系统架构分析
**目标**:识别子系统边界和通信机制
**执行步骤**
1. **先读取详细指南**:使用 Read 工具读取 `~/.claude/skills/codebase-architecture-analyzer/reference/system-analysis.md`
2. **按照指南执行分析**:使用 Task tool 调用 Explore sub-agent 进行分析
**预期输出**
- Mermaid graph TB 系统架构图
- 子系统清单(名称、路径、技术栈、入口文件:行号)
- 通信关系列表
---
### Phase 3: 核心流程提取
**目标**:识别项目的核心业务逻辑编排
**执行步骤**
1. **先读取详细指南**:使用 Read 工具读取 `~/.claude/skills/codebase-architecture-analyzer/reference/workflow-extraction.md`
2. **智能路由策略**:根据 Phase 1 的扫描结果自动选择分析重点
- 检测到 agents/ + (langgraph/crewai/autogen) → Multi-Agent 工作流编排
- 检测到 docker-compose.yml 多服务 → 微服务调用链
- 检测到 airflow/workflow/pipeline → 数据管道流程
- 检测到 EventEmitter/event_bus → 事件驱动流程
- 其他 → 通用业务流程调用链
3. **按照指南执行分析**:使用 Task tool 调用 Explore sub-agent 进行分析
**预期输出**
- Mermaid 流程图stateDiagram-v2 / flowchart TD
- 执行单元清单Agent/服务/函数,含文件:行号、职责、输入/输出)
- 关键决策点(条件函数、分支路径)
---
### Phase 4: 数据流追踪
**目标**:追踪核心数据的转换链路
**执行步骤**
1. **先读取详细指南**:使用 Read 工具读取 `~/.claude/skills/codebase-architecture-analyzer/reference/data-flow-analysis.md`
2. **按照指南执行分析**:使用 Task tool 调用 Explore sub-agent 进行分析
**预期输出**
- Mermaid 序列图
- 数据模型清单(名称、文件:行号、用途、字段)
- 数据转换链路
---
### Phase 5: 生成最终报告
**目标**:汇总所有分析结果,生成 Markdown 报告文件
**执行步骤**
1. **先读取详细指南**:使用 Read 工具读取 `~/.claude/skills/codebase-architecture-analyzer/reference/report-generation.md`
2. **收集所有Phase的结果**:汇总 Phase 1-4 的分析数据
3. **该阶段必须生成报告文件**:在项目根目录下创建真实的 `PROJECT_ARCHITECTURE.md`文件并使用Write工具写入
**报告内容**
- 项目概览Phase 1 结果)
- 系统架构Phase 2 架构图 + 子系统详情)
- 核心业务流程Phase 3 流程图 + 执行单元清单)
- 数据流分析Phase 4 序列图 + 数据模型清单)
- 快速上手指南(环境要求、安装步骤、启动命令)
- 代码位置索引(所有关键文件清单)
**完成后告知用户**
```
✅ 分析完成!报告已保存: PROJECT_ARCHITECTURE.md
```
---
## 方法论参考
执行过程中根据需要查阅以下文档:
- **reference/knowledge.md** - 架构分析方法论子系统识别规则、通信机制识别、Mermaid 图表选择策略、业务函数识别规则)
- **reference/patterns.md** - 常见架构模式参考Multi-Agent、微服务、事件驱动、ETL、MVC、CQRS
- **reference/examples.md** - 实际使用案例5 个完整示例)
---
## 注意事项
1. **只读分析** - 本 Skill 不会修改任何代码文件
2. **敏感信息** - 不会在报告中暴露 `.env` 等敏感文件内容
3. **私有仓库** - 不会访问网络,仅分析本地代码
4. **自动跳过** - 自动跳过 node_modules, venv, .git 等常见依赖目录
---
现在开始分析当前项目。