@dtt_siye/atool 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/VERSION +1 -1
- package/hooks/doc-sync-reminder +4 -4
- package/hooks/hooks-cursor.json +20 -0
- package/hooks/hooks.json +21 -1
- package/hooks/pre-commit +191 -0
- package/hooks/prompt-guard +84 -35
- package/hooks/session-start +34 -12
- package/hooks/task-state-tracker +145 -0
- package/lib/common.sh +36 -23
- package/lib/compute-importance.sh +73 -0
- package/lib/install-cursor.sh +2 -2
- package/lib/install-hooks.sh +64 -0
- package/lib/install-skills.sh +19 -0
- package/lib/knowledge-graph.sh +483 -81
- package/lib/pre-scan.sh +81 -6
- package/package.json +1 -1
- package/skills/agent-audit/SKILL.md +180 -0
- package/skills/architecture-guard/SKILL.md +164 -0
- package/skills/architecture-guard/rules/violation-detection.md +90 -0
- package/skills/ci-feedback/SKILL.md +165 -0
- package/skills/project-analyze/SKILL.md +131 -23
- package/skills/project-analyze/phases/phase1-setup.md +15 -1
- package/skills/project-analyze/phases/phase2-understand.md +17 -2
- package/skills/project-analyze/phases/phase2.5-refine.md +293 -0
- package/skills/project-analyze/phases/phase3-graph.md +7 -1
- package/skills/project-analyze/phases/phase4-synthesize.md +117 -120
- package/skills/project-analyze/phases/phase5-export.md +117 -33
- package/skills/project-analyze/prompts/understand-agent.md +17 -0
- package/skills/project-analyze/rules/android.md +61 -260
- package/skills/project-analyze/rules/devops.md +61 -421
- package/skills/project-analyze/rules/generic.md +53 -221
- package/skills/project-analyze/rules/go.md +60 -275
- package/skills/project-analyze/rules/harmony.md +64 -237
- package/skills/project-analyze/rules/java.md +47 -485
- package/skills/project-analyze/rules/mobile-flutter.md +57 -292
- package/skills/project-analyze/rules/mobile-react-native.md +65 -262
- package/skills/project-analyze/rules/mobile-swift.md +58 -303
- package/skills/project-analyze/rules/python.md +50 -296
- package/skills/project-analyze/rules/rust-tauri.md +51 -217
- package/skills/project-analyze/rules/rust.md +50 -274
- package/skills/project-analyze/rules/web-nextjs.md +61 -335
- package/skills/project-analyze/rules/web-react.md +50 -272
- package/skills/project-analyze/rules/web-vue.md +58 -352
- package/skills/project-analyze/rules/web.md +55 -347
- package/skills/project-query/SKILL.md +681 -120
- package/skills/requirements-writer/SKILL.md +48 -1
- package/skills/software-architecture/SKILL.md +73 -3
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
> "module_count": $MODULE_COUNT,
|
|
80
80
|
> "file_count": $FILE_COUNT,
|
|
81
81
|
> "analyzed_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
82
|
-
> "analysis_version": "5.
|
|
82
|
+
> "analysis_version": "5.2.0",
|
|
83
83
|
> "atool_analysis_schema": "1.0"
|
|
84
84
|
> }
|
|
85
85
|
> EOF
|
|
@@ -101,7 +101,108 @@
|
|
|
101
101
|
> fi
|
|
102
102
|
> ```
|
|
103
103
|
|
|
104
|
-
### 5.4
|
|
104
|
+
### 5.4 生成 Cytoscape.js 可视化(可选)
|
|
105
|
+
|
|
106
|
+
**触发条件**:分析完成时,生成交互式 HTML 可视化
|
|
107
|
+
|
|
108
|
+
> **执行命令(通过 Bash 工具):**
|
|
109
|
+
> ```bash
|
|
110
|
+
> PROJECT_ROOT="$(pwd)"
|
|
111
|
+
> DOCS_DIR="$PROJECT_ROOT/.atool-docs"
|
|
112
|
+
>
|
|
113
|
+
> # 检查 knowledge-graph.json 是否存在
|
|
114
|
+
> if [ -f "$DOCS_DIR/knowledge-graph.json" ]; then
|
|
115
|
+
> # 调用 generate-visualization.sh
|
|
116
|
+
> if [ -f "$PROJECT_ROOT/lib/generate-visualization.sh" ]; then
|
|
117
|
+
> source "$PROJECT_ROOT/lib/generate-visualization.sh"
|
|
118
|
+
> generate_visualization "$DOCS_DIR"
|
|
119
|
+
> if [ -f "$DOCS_DIR/visualization/index.html" ]; then
|
|
120
|
+
> echo "✅ Visualization generated: $DOCS_DIR/visualization/index.html"
|
|
121
|
+
> du -h "$DOCS_DIR/visualization/index.html" | awk '{print "Size: " $1}'
|
|
122
|
+
> fi
|
|
123
|
+
> else
|
|
124
|
+
> echo "⚠️ lib/generate-visualization.sh not found — skipping visualization"
|
|
125
|
+
> fi
|
|
126
|
+
> else
|
|
127
|
+
> echo "⚠️ knowledge-graph.json not found — cannot generate visualization"
|
|
128
|
+
> fi
|
|
129
|
+
> ```
|
|
130
|
+
|
|
131
|
+
**输出**:
|
|
132
|
+
- `.atool-docs/visualization/index.html` — 完整交互式可视化
|
|
133
|
+
- Cytoscape.js + dagre 布局
|
|
134
|
+
- 14 节点类型着色,24 边类型线型
|
|
135
|
+
- G1-G5 缩放控件
|
|
136
|
+
- 搜索、影响分析、邻域查询
|
|
137
|
+
- 离线可打开(JS 库缓存到 `~/.atool/cache/visualization/`)
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
### 5.5 生成 EXPORT-FULL.md(可选)
|
|
142
|
+
|
|
143
|
+
**触发条件**:用户使用 `--export` 参数,或在完成摘要中选择导出。
|
|
144
|
+
|
|
145
|
+
拼接逻辑(bash):
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
OUTPUT="atool-analysis/EXPORT-FULL.md"
|
|
149
|
+
|
|
150
|
+
# 1. 标题 + 元信息
|
|
151
|
+
PROJECT_NAME=$(jq -r '.project // (.project_root | split("/") | last)' .atool-docs/analysis-state.json)
|
|
152
|
+
echo "# $PROJECT_NAME — 完整项目交付文档" > "$OUTPUT"
|
|
153
|
+
echo "" >> "$OUTPUT"
|
|
154
|
+
echo "> 自动生成于 $(date '+%Y-%m-%d %H:%M') | 单文件导出版" >> "$OUTPUT"
|
|
155
|
+
echo "" >> "$OUTPUT"
|
|
156
|
+
echo "---" >> "$OUTPUT"
|
|
157
|
+
|
|
158
|
+
# 2. 项目级文档
|
|
159
|
+
for FILE in \
|
|
160
|
+
"atool-analysis/overview/architecture.md" \
|
|
161
|
+
"atool-analysis/project/prd.md" \
|
|
162
|
+
; do
|
|
163
|
+
[ -f "$FILE" ] && { echo ""; echo "---"; echo ""; cat "$FILE"; } >> "$OUTPUT"
|
|
164
|
+
done
|
|
165
|
+
|
|
166
|
+
# 3. 模块级文档(按重要性排序)
|
|
167
|
+
for MOD in $(jq -r '.modules | sort_by(-.importance) | .[].name' .atool-docs/pre-scan/manifest.json); do
|
|
168
|
+
for DOC in prd.md dev-guide.md api.md data-model.md test-cases.md; do
|
|
169
|
+
FILE="atool-analysis/modules/$MOD/$DOC"
|
|
170
|
+
[ -f "$FILE" ] && { echo ""; echo "---"; echo ""; echo "## $MOD / $DOC"; echo ""; cat "$FILE"; } >> "$OUTPUT"
|
|
171
|
+
done
|
|
172
|
+
done
|
|
173
|
+
|
|
174
|
+
# 4. 项目级剩余文档
|
|
175
|
+
for FILE in \
|
|
176
|
+
"atool-analysis/project/deployment.md" \
|
|
177
|
+
"atool-analysis/project/testing-strategy.md" \
|
|
178
|
+
"atool-analysis/project/runbook.md" \
|
|
179
|
+
; do
|
|
180
|
+
[ -f "$FILE" ] && { echo ""; echo "---"; echo ""; cat "$FILE"; } >> "$OUTPUT"
|
|
181
|
+
done
|
|
182
|
+
|
|
183
|
+
# 5. 质量摘要(仅前 50 行 + 链接)
|
|
184
|
+
[ -f "atool-analysis/quality/code-review.md" ] && {
|
|
185
|
+
echo ""; echo "---"; echo ""
|
|
186
|
+
head -50 "atool-analysis/quality/code-review.md"
|
|
187
|
+
echo ""; echo "*完整报告见 quality/code-review.md*"
|
|
188
|
+
} >> "$OUTPUT"
|
|
189
|
+
|
|
190
|
+
# 6. 附录
|
|
191
|
+
echo ""; echo "---"; echo ""
|
|
192
|
+
echo "## 附录:精炼覆盖率报告" >> "$OUTPUT"
|
|
193
|
+
echo "" >> "$OUTPUT"
|
|
194
|
+
echo "| 模块 | PRD 覆盖率 | 架构门禁 | 状态 |" >> "$OUTPUT"
|
|
195
|
+
echo "|------|-----------|---------|------|" >> "$OUTPUT"
|
|
196
|
+
jq -r '.refine_status | to_entries[] | "| \(.key) | \(.value.prd_coverage // "N/A")% | \(.value.arch_gate // "N/A") | \(if .value.degraded then "⚠️ 降级" else "✅" end) |"' \
|
|
197
|
+
.atool-docs/analysis-state.json >> "$OUTPUT"
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
更新 state:
|
|
201
|
+
```bash
|
|
202
|
+
jq '.deliverable_status.export_single_file = "completed"' .atool-docs/analysis-state.json > tmp && mv tmp .atool-docs/analysis-state.json
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### 5.6 更新 State + 打印完成摘要
|
|
105
206
|
|
|
106
207
|
> **执行命令(必须通过 Bash 工具):**
|
|
107
208
|
> ```bash
|
|
@@ -112,50 +213,33 @@
|
|
|
112
213
|
> && mv "$DOCS_DIR/analysis-state.json.tmp" "$DOCS_DIR/analysis-state.json"
|
|
113
214
|
> ```
|
|
114
215
|
|
|
115
|
-
|
|
216
|
+
**打印完成摘要:**
|
|
116
217
|
|
|
117
218
|
```
|
|
118
|
-
✅
|
|
119
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
120
|
-
项目:{PROJECT_NAME}
|
|
121
|
-
技术栈:{STACK} | 深度:{DEPTH}
|
|
122
|
-
模块数:{MODULE_COUNT} | 文件数:{FILE_COUNT}
|
|
123
|
-
|
|
124
|
-
📁 文档目录:atool-analysis/
|
|
125
|
-
📋 overview/summary.md — 项目业务摘要
|
|
126
|
-
🏗️ overview/architecture.md — 系统架构说明
|
|
127
|
-
🚀 overview/getting-started.md — 新人上手指南
|
|
128
|
-
📦 modules/ — 模块文档(PRD/API/数据模型/测试用例/开发指引)
|
|
129
|
-
📊 quality/ — 代码质量 + 安全审计 + 性能基准
|
|
130
|
-
📐 diagrams/ — Mermaid 架构图源文件
|
|
131
|
-
📂 project/ — 项目级 PRD/部署/测试策略/运维手册
|
|
132
|
-
```
|
|
219
|
+
✅ Phase 5 EXPORT 完成
|
|
133
220
|
|
|
134
|
-
|
|
221
|
+
📦 交付物:
|
|
222
|
+
- atool-analysis/PROJECT-DELIVERABLE.md — 总览入口(文档导航 + 架构概览 + 覆盖率报告)
|
|
223
|
+
- atool-analysis/EXPORT-FULL.md — 单文件导出版(如已生成)
|
|
135
224
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
225
|
+
📊 精炼覆盖率:
|
|
226
|
+
- 精炼模块:{M}/{N}
|
|
227
|
+
- 平均 PRD 覆盖率:{avg}%
|
|
228
|
+
- 降级模块:{list}(如有)
|
|
140
229
|
|
|
141
|
-
→ 运行 /requirements-writer 可自动补齐:
|
|
142
|
-
requirements-writer 会读取本次分析结果,进入后向增强模式,
|
|
143
|
-
通过 Multi-Agent 并行为每个模块生成正式交付级 PRD。
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
**无论覆盖率如何,始终显示以下提示:**
|
|
147
|
-
|
|
148
|
-
```
|
|
149
230
|
💡 后续操作:
|
|
150
|
-
- 在 aTool Monitor → Projects 查看完整可视化(知识图谱 + Mermaid 渲染)
|
|
151
231
|
- /project-query 查询分析结果(依赖分析、影响分析等)
|
|
152
|
-
- /requirements-writer
|
|
232
|
+
- /requirements-writer 对降级模块补全 PRD
|
|
153
233
|
- /code-review 执行 8 维度深度代码审查
|
|
234
|
+
- /software-architecture 深度架构审查(如架构违反率 >30%)
|
|
154
235
|
```
|
|
155
236
|
|
|
237
|
+
其中 `{M}/{N}` 和 `{avg}` 从 `analysis-state.json` 的 `refine_status` 计算。如果 `refine_status` 不存在(旧版 state),显示 "N/A"。
|
|
238
|
+
|
|
156
239
|
## 完成条件
|
|
157
240
|
|
|
158
241
|
- `atool-analysis/manifest.json` 存在
|
|
159
242
|
- `atool-analysis/data/modules.json` 存在
|
|
243
|
+
- `atool-analysis/PROJECT-DELIVERABLE.md` 存在
|
|
160
244
|
- `phases.phase5_export = "completed"`
|
|
161
245
|
- 完成摘要已打印给用户
|
|
@@ -170,6 +170,9 @@
|
|
|
170
170
|
## 输出文件 4:atool-analysis/modules/{module_name}/dev-guide.md
|
|
171
171
|
(层2c: 开发指引 — 新开发者操作手册)
|
|
172
172
|
|
|
173
|
+
> ⚠️ 此为初稿。Phase 2.5 将由 software-architecture 追加组件设计和 ADR 章节。
|
|
174
|
+
> 初稿重点:准确描述开发操作流程和现有架构约束,不必追求架构文档的完整性。
|
|
175
|
+
|
|
173
176
|
必须包含以下 4 节:
|
|
174
177
|
|
|
175
178
|
### 如何添加新功能
|
|
@@ -192,6 +195,9 @@
|
|
|
192
195
|
## 输出文件 5:atool-analysis/modules/{module_name}/prd.md
|
|
193
196
|
(层2d: 模块级 PRD — 按钮级别功能定义)
|
|
194
197
|
|
|
198
|
+
> ⚠️ 此为初稿。Phase 2.5 将按 requirements-writer 的 8 节标准模板精炼。
|
|
199
|
+
> 初稿重点:准确提取业务逻辑和功能点,不必追求格式完美。
|
|
200
|
+
|
|
195
201
|
质量标准:开发者拿到此文档 + api.md + data-model.md,无需再问产品经理任何问题即可完成全部开发。
|
|
196
202
|
|
|
197
203
|
必须包含以下 4 节:
|
|
@@ -340,9 +346,20 @@
|
|
|
340
346
|
"gaps": ["PRD 缺失用户删除功能描述", "API 文档缺少错误码表"],
|
|
341
347
|
"inconsistencies": ["文档说支持批量删除,代码中未实现", "文档中的字段名与代码不一致:文档用 userName,代码用 username"]
|
|
342
348
|
}
|
|
349
|
+
,
|
|
350
|
+
"refine_hints": {
|
|
351
|
+
"detected_patterns": ["MVC", "CQRS", "Event-Driven"],
|
|
352
|
+
"key_decisions": ["选择 Redis 作为缓存层因为...", "使用 JWT 而非 Session 因为..."],
|
|
353
|
+
"cross_module_deps": ["依赖 user-service 的 /api/users/{id}", "消费 order-events 队列"]
|
|
354
|
+
}
|
|
343
355
|
}
|
|
344
356
|
```
|
|
345
357
|
|
|
358
|
+
**refine_hints 说明**:为 Phase 2.5 精炼提供线索,避免精炼 agent 重新读源码。
|
|
359
|
+
- `detected_patterns`: sub-agent 识别到的架构模式名称
|
|
360
|
+
- `key_decisions`: 从代码中识别的关键设计决策(原始描述,无需 ADR 格式)
|
|
361
|
+
- `cross_module_deps`: 跨模块依赖的具体描述(API 路径、事件名、共享实体)
|
|
362
|
+
|
|
346
363
|
字段说明:
|
|
347
364
|
- `layer`:架构层(从路径和类名推断)
|
|
348
365
|
- `quality_score`:0.0-1.0(从 quality_issues 的数量和严重程度计算)
|
|
@@ -1,282 +1,83 @@
|
|
|
1
1
|
# Android / Kotlin 项目分析规则
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> **编码规范**:本规则不包含编码规范内容。Phase 2.5 精炼阶段会自动加载 `android-conventions` skill 作为规范约束。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 模块发现策略
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
Application (Application 类)
|
|
9
|
-
↓
|
|
10
|
-
DI Module(依赖注入:Hilt / Koin)
|
|
11
|
-
↓
|
|
12
|
-
Navigation(导航:Jetpack Navigation / Compose Navigation)
|
|
13
|
-
↓
|
|
14
|
-
Activity / Fragment / Composable Screen
|
|
15
|
-
↓
|
|
16
|
-
ViewModel
|
|
17
|
-
↓
|
|
18
|
-
Repository
|
|
19
|
-
↓
|
|
20
|
-
Data Source(Remote: Retrofit + Local: Room / DataStore)
|
|
21
|
-
↓
|
|
22
|
-
Model / Entity(数据模型)
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## 目录扫描策略
|
|
26
|
-
|
|
27
|
-
### 1. 识别项目类型
|
|
28
|
-
|
|
29
|
-
**信号文件检测:**
|
|
30
|
-
- 单模块: `app/` 下直接包含源码
|
|
31
|
-
- 多模块: `settings.gradle` 中 `include` 列表
|
|
32
|
-
- Compose 项目: `build.gradle` 中 `compose = true`
|
|
33
|
-
- KMP 项目: `shared/` 模块 + `build.gradle.kts`
|
|
34
|
-
|
|
35
|
-
### 2. 识别架构模式
|
|
36
|
-
|
|
37
|
-
- **MVVM + Repository**: ViewModel + Repository + Room
|
|
38
|
-
- **MVI**: Intent → Reducer → State → View
|
|
39
|
-
- **Clean Architecture**: Domain / Data / Presentation 三层
|
|
40
|
-
|
|
41
|
-
### 3. 依赖提取
|
|
42
|
-
|
|
43
|
-
从 `build.gradle` / `build.gradle.kts` 提取:
|
|
44
|
-
|
|
45
|
-
| 类别 | 常见依赖 |
|
|
46
|
-
|------|----------|
|
|
47
|
-
| Compose | compose-bom, compose-ui, compose-material3 |
|
|
48
|
-
| Navigation | navigation-compose, navigation-fragment |
|
|
49
|
-
| DI | hilt-android, koin-android |
|
|
50
|
-
| 网络 | retrofit, okhttp, ktor |
|
|
51
|
-
| 图片 | coil-compose, glide |
|
|
52
|
-
| 数据库 | room-runtime, datastore-preferences |
|
|
53
|
-
| 异步 | kotlinx-coroutines, rxjava |
|
|
54
|
-
| 序列化 | kotlin-serialization, moshi, gson |
|
|
55
|
-
| DI | hilt-android-compiler, koin |
|
|
56
|
-
| 测试 | junit, mockk, turbine |
|
|
57
|
-
|
|
58
|
-
### 4. 按层扫描路径
|
|
59
|
-
|
|
60
|
-
- **UI 层**: `*/ui/`, `*/screens/`, `*/compose/`
|
|
61
|
-
- **Activity/Fragment**: `*/activities/`, `*/fragments/`
|
|
62
|
-
- **ViewModel**: `*/viewmodel/`, `*/viewmodels/`
|
|
63
|
-
- **Repository**: `*/repository/`, `*/repositories/`
|
|
64
|
-
- **数据源**: `*/data/remote/`, `*/data/local/`, `*/datasource/`
|
|
65
|
-
- **Model**: `*/model/`, `*/models/`, `*/entity/`
|
|
66
|
-
- **DI**: `*/di/`, `*/hilt/`
|
|
67
|
-
|
|
68
|
-
## 各层提取规则
|
|
7
|
+
从 Gradle 构建文件识别模块边界:
|
|
69
8
|
|
|
70
|
-
|
|
9
|
+
- `settings.gradle` / `settings.gradle.kts` → `include(":app", ":feature-home", ":core")` 列出所有模块
|
|
10
|
+
- 单模块项目:`app/src/main/java/` 下按 `feature/` 包名识别功能边界
|
|
11
|
+
- 多模块项目:每个 Gradle 子模块视为独立分析单元
|
|
12
|
+
- KMP 项目:`shared/` 模块单独分析,区分 `commonMain` / `androidMain` / `iosMain`
|
|
13
|
+
- `build.gradle.kts` 中 `compose = true` → Jetpack Compose 项目
|
|
14
|
+
- `libs.versions.toml` → Version Catalog,提取所有依赖版本
|
|
71
15
|
|
|
72
|
-
|
|
16
|
+
**不视为独立模块**:`MainActivity.kt` / `Application.kt`(入口文件)、`util/` / `helper/` / `extension/` 合并为一个模块、`*.generated.kt` / `BuildConfig` 跳过。
|
|
73
17
|
|
|
74
|
-
|
|
18
|
+
## 入口识别
|
|
75
19
|
|
|
76
|
-
|
|
77
|
-
-
|
|
78
|
-
- `
|
|
79
|
-
-
|
|
80
|
-
- 子 Composable 结构(1-2 层)
|
|
81
|
-
- `@Preview` 注解
|
|
20
|
+
- **Application 入口**:`AndroidManifest.xml` 中 `android:name=".XXXApplication"` → 继承 `Application` 的类
|
|
21
|
+
- **Activity 入口**:`<intent-filter><action android:name="android.intent.action.MAIN" /></intent-filter>` → `MainActivity`
|
|
22
|
+
- **Hilt 注入**:`@HiltAndroidApp` 注解在 Application 类上
|
|
23
|
+
- **Navigation 入口**:`NavHostFragment` + `NavGraph`(`res/navigation/*.xml`)或 `NavHost` Composable
|
|
82
24
|
|
|
83
|
-
|
|
84
|
-
```
|
|
85
|
-
### UserListScreen
|
|
86
|
-
- **路径**: `ui/screens/user/UserListScreen.kt`
|
|
87
|
-
- **签名**:
|
|
88
|
-
```kotlin
|
|
89
|
-
@Composable
|
|
90
|
-
fun UserListScreen(
|
|
91
|
-
navController: NavController,
|
|
92
|
-
viewModel: UserListViewModel = hiltViewModel()
|
|
93
|
-
)
|
|
94
|
-
```
|
|
95
|
-
- **状态收集**:
|
|
96
|
-
| State | 来源 | 用途 |
|
|
97
|
-
|-------|------|------|
|
|
98
|
-
| users | viewModel.users.collectAsState() | 用户列表 |
|
|
99
|
-
| isLoading | viewModel.isLoading.collectAsState() | 加载状态 |
|
|
100
|
-
| searchQuery | viewModel.searchQuery.collectAsState() | 搜索关键词 |
|
|
101
|
-
- **UI 结构**:
|
|
102
|
-
Scaffold(topBar = UserListTopBar(), floatingActionButton = AddUserFAB())
|
|
103
|
-
→ LazyColumn(items = users)
|
|
104
|
-
→ UserListItem(user, onClick = { nav to detail })
|
|
105
|
-
- **Modifier 链**: Modifier.fillMaxSize().padding(16.dp)
|
|
106
|
-
```
|
|
25
|
+
## 架构模式识别
|
|
107
26
|
|
|
108
|
-
|
|
27
|
+
| 架构 | 识别特征 |
|
|
28
|
+
|------|---------|
|
|
29
|
+
| MVVM + Repository | `ViewModel` + `Repository` + `Room` / `Retrofit` |
|
|
30
|
+
| MVI | `Intent` → `Reducer` → `State`(sealed class)→ View |
|
|
31
|
+
| Clean Architecture | `domain/` + `data/` + `presentation/` 三层目录 |
|
|
109
32
|
|
|
110
|
-
|
|
33
|
+
DI 框架检测:
|
|
34
|
+
- **Hilt**:`build.gradle` 中 `hilt-android` + `@HiltViewModel` / `@AndroidEntryPoint`
|
|
35
|
+
- **Koin**:`koin-android` 依赖 + `startKoin { }` + `viewModel { }` DSL
|
|
111
36
|
|
|
112
|
-
|
|
113
|
-
- Layout 层级结构
|
|
114
|
-
- include / merge 标签
|
|
115
|
-
- 自定义 View
|
|
37
|
+
UI 框架检测:`compose-bom` 依赖 → Jetpack Compose;`res/layout/*.xml` → XML Layout;两者并存 → 混合。
|
|
116
38
|
|
|
117
|
-
|
|
39
|
+
## 数据流模式
|
|
118
40
|
|
|
119
|
-
|
|
41
|
+
- **Compose + StateFlow**:`ViewModel.uiState: StateFlow<UiState>` → `collectAsState()` → Composable 重组
|
|
42
|
+
- **LiveData(旧版)**:`ViewModel.liveData.observe(viewLifecycleOwner)` → Fragment/Activity 更新 UI
|
|
43
|
+
- **MVI**:`viewModel.processIntent(intent)` → `reducer(state, intent)` → `emit(newState)` → UI 收集
|
|
44
|
+
- **Repository 数据流**:`RemoteDataSource`(Retrofit)+ `LocalDataSource`(Room)→ Repository 聚合 → ViewModel
|
|
120
45
|
|
|
121
|
-
|
|
122
|
-
- ViewModel 类名 + 构造参数(`@AssistedInject`)
|
|
123
|
-
- UI State 数据类(字段 + 类型)
|
|
124
|
-
- Action / Intent(用户操作)
|
|
125
|
-
- Effect / Event(一次性事件)
|
|
126
|
-
- 依赖的 Repository
|
|
46
|
+
## 分析关注点
|
|
127
47
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
-
|
|
132
|
-
-
|
|
133
|
-
- **
|
|
134
|
-
```kotlin
|
|
135
|
-
data class UserListState(
|
|
136
|
-
val users: List<UserVO> = emptyList(),
|
|
137
|
-
val isLoading: Boolean = false,
|
|
138
|
-
val searchQuery: String = "",
|
|
139
|
-
val error: String? = null
|
|
140
|
-
)
|
|
141
|
-
```
|
|
142
|
-
- **Actions**:
|
|
143
|
-
| Action | 参数 | 说明 |
|
|
144
|
-
|--------|------|------|
|
|
145
|
-
| loadUsers | - | 初始加载 |
|
|
146
|
-
| searchUsers | query: String | 搜索过滤 |
|
|
147
|
-
| deleteUser | userId: Long | 删除用户 |
|
|
148
|
-
| refresh | - | 下拉刷新 |
|
|
149
|
-
- **Effects**:
|
|
150
|
-
| Effect | 载荷 | 说明 |
|
|
151
|
-
|--------|------|------|
|
|
152
|
-
| NavigateToDetail | userId: Long | 导航到详情 |
|
|
153
|
-
| ShowToast | message: String | 显示提示 |
|
|
154
|
-
- **依赖**: UserRepository
|
|
155
|
-
```
|
|
48
|
+
- **Gradle 模块发现**:`settings.gradle` 是多模块项目的入口,必须先解析模块依赖关系图
|
|
49
|
+
- **Activity/Fragment 入口**:通过 `AndroidManifest.xml` 枚举所有 Activity,识别 exported 的入口点
|
|
50
|
+
- **Jetpack Compose vs XML Layout**:`build.gradle` 中 `buildFeatures { compose = true }` 是关键标志
|
|
51
|
+
- **Hilt/Dagger 注入检测**:`@Module` + `@Provides` / `@Binds` → 识别依赖注入图,影响模块耦合分析
|
|
52
|
+
- **Room 数据库**:`@Database` + `@Entity` + `@Dao` → 数据层核心,需提取 Entity 关系和 Dao 方法
|
|
53
|
+
- **Navigation Component**:`NavGraph`(XML 或 Composable)是页面跳转关系的权威来源
|
|
156
54
|
|
|
157
|
-
|
|
55
|
+
## 输出示例
|
|
158
56
|
|
|
159
|
-
**扫描文件**: `*Repository.kt`
|
|
160
|
-
|
|
161
|
-
**输出示例**:
|
|
162
|
-
```
|
|
163
|
-
### UserRepository
|
|
164
|
-
- **路径**: `data/repository/UserRepositoryImpl.kt`
|
|
165
|
-
- **接口**: `domain/repository/UserRepository.kt`
|
|
166
|
-
- **数据源**: UserRemoteDataSource, UserLocalDataSource (Room)
|
|
167
|
-
- **方法**:
|
|
168
|
-
| 方法 | 签名 | 说明 |
|
|
169
|
-
|------|------|------|
|
|
170
|
-
| getUsers | suspend () → List<User> | 先本地后远程 |
|
|
171
|
-
| getUserById | suspend (Long) → User | 查询详情 |
|
|
172
|
-
| saveUsers | suspend (List<User>) → Unit | 缓存到本地 |
|
|
173
57
|
```
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
### 层 5: DI 分析
|
|
196
|
-
|
|
197
|
-
**扫描文件**: `*Module.kt` (Hilt), `*Module.kt` (Koin)
|
|
198
|
-
|
|
199
|
-
**输出示例**:
|
|
200
|
-
```
|
|
201
|
-
### Hilt Modules
|
|
58
|
+
### 模块结构(多模块)
|
|
59
|
+
settings.gradle 模块:
|
|
60
|
+
:app → 主模块(Application + MainActivity)
|
|
61
|
+
:feature:home → 首页功能模块
|
|
62
|
+
:feature:user → 用户功能模块
|
|
63
|
+
:core:network → 网络层(Retrofit + OkHttp)
|
|
64
|
+
:core:database→ 数据库层(Room)
|
|
65
|
+
:core:common → 公共工具
|
|
66
|
+
|
|
67
|
+
模块依赖图:
|
|
68
|
+
:app → :feature:home, :feature:user
|
|
69
|
+
:feature:* → :core:network, :core:database, :core:common
|
|
70
|
+
|
|
71
|
+
### 技术栈检测
|
|
72
|
+
- UI: Jetpack Compose (compose-bom 2024.01.00)
|
|
73
|
+
- 架构: MVVM + Clean Architecture
|
|
74
|
+
- DI: Hilt (hilt-android 2.48)
|
|
75
|
+
- 数据库: Room 2.6.1
|
|
76
|
+
- 网络: Retrofit 2.9.0 + OkHttp 4.12
|
|
77
|
+
|
|
78
|
+
### DI 模块概览
|
|
202
79
|
| Module | Provides | Scope |
|
|
203
80
|
|--------|----------|-------|
|
|
204
|
-
| NetworkModule | OkHttpClient, Retrofit
|
|
205
|
-
| DatabaseModule | AppDatabase,
|
|
206
|
-
| RepositoryModule | UserRepository | Singleton |
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
### 层 6: Navigation 分析
|
|
210
|
-
|
|
211
|
-
**扫描文件**: `NavGraph.kt`, 含 `NavHost` 的文件
|
|
212
|
-
|
|
213
|
-
**输出示例**:
|
|
214
|
-
```
|
|
215
|
-
### 导航图
|
|
216
|
-
| 路由 | 目标 | 参数 | 动画 |
|
|
217
|
-
|------|------|------|------|
|
|
218
|
-
| user_list | UserListScreen | - | - |
|
|
219
|
-
| user_detail | UserDetailScreen | userId: Long | slideInRight |
|
|
220
|
-
| user_edit | UserEditScreen | userId: Long? | slideInRight |
|
|
81
|
+
| NetworkModule | OkHttpClient, Retrofit | Singleton |
|
|
82
|
+
| DatabaseModule | AppDatabase, UserDao | Singleton |
|
|
221
83
|
```
|
|
222
|
-
|
|
223
|
-
## 输出模板
|
|
224
|
-
|
|
225
|
-
### README.md 章节结构
|
|
226
|
-
|
|
227
|
-
```markdown
|
|
228
|
-
# {App 名称}
|
|
229
|
-
|
|
230
|
-
## 项目概述
|
|
231
|
-
App 功能描述
|
|
232
|
-
|
|
233
|
-
## 技术栈
|
|
234
|
-
| 技术 | 版本 | 用途 |
|
|
235
|
-
|------|------|------|
|
|
236
|
-
|
|
237
|
-
## 架构设计
|
|
238
|
-
### 架构图(ASCII)
|
|
239
|
-
### 数据流图
|
|
240
|
-
|
|
241
|
-
## 模块结构
|
|
242
|
-
Gradle 模块依赖关系
|
|
243
|
-
|
|
244
|
-
## 导航结构
|
|
245
|
-
路由表 + 参数
|
|
246
|
-
|
|
247
|
-
## 数据模型
|
|
248
|
-
Entity + DTO + UI State
|
|
249
|
-
|
|
250
|
-
## DI 配置
|
|
251
|
-
Hilt / Koin 模块
|
|
252
|
-
|
|
253
|
-
## 构建 & 部署
|
|
254
|
-
Gradle 命令 + 变体
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
## 模块边界识别
|
|
258
|
-
|
|
259
|
-
以下目录模式下的每个子目录视为独立模块(L2+ 分析时生成 MODULE-DOC.md):
|
|
260
|
-
|
|
261
|
-
| 层 | 扫描路径 | 模块判定规则 | MODULE-DOC slug 来源 |
|
|
262
|
-
|----|----------|-------------|---------------------|
|
|
263
|
-
| UI 层 | `app/src/main/java/**/ui/`, `app/src/main/java/**/screens/` | 每个子目录 | 目录名 kebab-case |
|
|
264
|
-
| Repository 层 | `app/src/main/java/**/repository/` | 每个子目录 | 目录名 kebab-case |
|
|
265
|
-
| ViewModel 层 | `app/src/main/java/**/viewmodel/` | 每个子目录 | 目录名 kebab-case |
|
|
266
|
-
| 组件层 | `app/src/main/java/**/components/` | 3+ 文件的子目录 | 目录名 kebab-case |
|
|
267
|
-
| 数据模型层 | `app/src/main/java/**/model/` | 每个文件 | 文件名去后缀 kebab-case |
|
|
268
|
-
|
|
269
|
-
**不视为独立模块的情况**:
|
|
270
|
-
- 单文件入口(如 `MainActivity.kt`, `Application.kt`)
|
|
271
|
-
- 纯导出桶文件(仅有 re-export)
|
|
272
|
-
- 工具函数目录(`util/`, `helper/`, `extension/`)— 合并为一个模块
|
|
273
|
-
- 生成文件(`*.generated.kt`, `BuildConfig`)跳过
|
|
274
|
-
|
|
275
|
-
## Token 管理
|
|
276
|
-
|
|
277
|
-
- 大模块(>20 文件)拆分为子任务
|
|
278
|
-
- 每个子任务分析 ≤10 文件
|
|
279
|
-
- `build.gradle` 依赖分析单独一个子任务
|
|
280
|
-
- layout XML / Compose 文件单独分组分析
|
|
281
|
-
- 生成文件(`*.generated.kt`, `BuildConfig`)跳过
|
|
282
|
-
- 测试文件(`androidTest/`, `test/`)单独分析
|