@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.
Files changed (47) hide show
  1. package/VERSION +1 -1
  2. package/hooks/doc-sync-reminder +4 -4
  3. package/hooks/hooks-cursor.json +20 -0
  4. package/hooks/hooks.json +21 -1
  5. package/hooks/pre-commit +191 -0
  6. package/hooks/prompt-guard +84 -35
  7. package/hooks/session-start +34 -12
  8. package/hooks/task-state-tracker +145 -0
  9. package/lib/common.sh +36 -23
  10. package/lib/compute-importance.sh +73 -0
  11. package/lib/install-cursor.sh +2 -2
  12. package/lib/install-hooks.sh +64 -0
  13. package/lib/install-skills.sh +19 -0
  14. package/lib/knowledge-graph.sh +483 -81
  15. package/lib/pre-scan.sh +81 -6
  16. package/package.json +1 -1
  17. package/skills/agent-audit/SKILL.md +180 -0
  18. package/skills/architecture-guard/SKILL.md +164 -0
  19. package/skills/architecture-guard/rules/violation-detection.md +90 -0
  20. package/skills/ci-feedback/SKILL.md +165 -0
  21. package/skills/project-analyze/SKILL.md +131 -23
  22. package/skills/project-analyze/phases/phase1-setup.md +15 -1
  23. package/skills/project-analyze/phases/phase2-understand.md +17 -2
  24. package/skills/project-analyze/phases/phase2.5-refine.md +293 -0
  25. package/skills/project-analyze/phases/phase3-graph.md +7 -1
  26. package/skills/project-analyze/phases/phase4-synthesize.md +117 -120
  27. package/skills/project-analyze/phases/phase5-export.md +117 -33
  28. package/skills/project-analyze/prompts/understand-agent.md +17 -0
  29. package/skills/project-analyze/rules/android.md +61 -260
  30. package/skills/project-analyze/rules/devops.md +61 -421
  31. package/skills/project-analyze/rules/generic.md +53 -221
  32. package/skills/project-analyze/rules/go.md +60 -275
  33. package/skills/project-analyze/rules/harmony.md +64 -237
  34. package/skills/project-analyze/rules/java.md +47 -485
  35. package/skills/project-analyze/rules/mobile-flutter.md +57 -292
  36. package/skills/project-analyze/rules/mobile-react-native.md +65 -262
  37. package/skills/project-analyze/rules/mobile-swift.md +58 -303
  38. package/skills/project-analyze/rules/python.md +50 -296
  39. package/skills/project-analyze/rules/rust-tauri.md +51 -217
  40. package/skills/project-analyze/rules/rust.md +50 -274
  41. package/skills/project-analyze/rules/web-nextjs.md +61 -335
  42. package/skills/project-analyze/rules/web-react.md +50 -272
  43. package/skills/project-analyze/rules/web-vue.md +58 -352
  44. package/skills/project-analyze/rules/web.md +55 -347
  45. package/skills/project-query/SKILL.md +681 -120
  46. package/skills/requirements-writer/SKILL.md +48 -1
  47. 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.1.0",
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 更新 State + 打印完成摘要
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
- **打印完成摘要(直接输出文本,不是 bash 命令):**
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
- **如果 Phase 4 检测到 PRD 覆盖率 < 70%(从 `analysis-state.json` 的 `prd_coverage` 读取),追加以下警告:**
221
+ 📦 交付物:
222
+ - atool-analysis/PROJECT-DELIVERABLE.md — 总览入口(文档导航 + 架构概览 + 覆盖率报告)
223
+ - atool-analysis/EXPORT-FULL.md — 单文件导出版(如已生成)
135
224
 
136
- ```
137
- ⚠️ PRD 覆盖率不足({average_score}%)
138
- 以下模块缺少按钮级定义/验收标准/字段校验:
139
- {modules_below_70 列表}
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 生成正式交付级 PRD(覆盖率检查表 + 按钮级定义)
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
- Feature Module 和 MVVM+ 分层架构进行分析。
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
- ### 1: UI
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
- #### Jetpack Compose
16
+ **不视为独立模块**:`MainActivity.kt` / `Application.kt`(入口文件)、`util/` / `helper/` / `extension/` 合并为一个模块、`*.generated.kt` / `BuildConfig` 跳过。
73
17
 
74
- **扫描文件**: `*Screen.kt`, `*Page.kt`, 含 `@Composable` 的文件
18
+ ## 入口识别
75
19
 
76
- **提取内容**:
77
- - `@Composable` 函数签名 + 参数
78
- - `Modifier`
79
- - 状态管理(`remember`, `mutableStateOf`, `collectAsState`)
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
- #### XML Layout
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
- **扫描文件**: `res/layout/*.xml`
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
- ### 层 2: ViewModel 层
39
+ ## 数据流模式
118
40
 
119
- **扫描文件**: `*ViewModel.kt`
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
- ### UserListViewModel
131
- - **路径**: `ui/screens/user/UserListViewModel.kt`
132
- - **注入**: @HiltViewModel
133
- - **UI State**:
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
- ### 层 3: Repository 层
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
- ### 层 4: Room 数据库分析
176
-
177
- **扫描文件**: `*Entity.kt`, `*Dao.kt`, `*Database.kt`
178
-
179
- **输出示例**:
180
- ```
181
- ### AppDatabase
182
- - **文件**: `data/local/AppDatabase.kt`
183
- - **版本**: 3
184
- - **Entities**: UserEntity, SettingsEntity
185
- - **Dao**:
186
- | Dao | 方法 | 返回类型 |
187
- |-----|------|----------|
188
- | UserDao | getAllUsers() | Flow<List<UserEntity>> |
189
- | UserDao | getUserById(id) | Flow<UserEntity?> |
190
- | UserDao | insertUsers(users) | List<Long> |
191
- | UserDao | deleteUser(id) | Int |
192
- - **Migration**: 2→3 (添加 avatar 字段)
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, ApiServices | Singleton |
205
- | DatabaseModule | AppDatabase, UserDAO | Singleton |
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/`)单独分析