@dtt_siye/atool 1.3.0 → 1.3.1
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/lib/install-skills.sh +16 -0
- package/lib/knowledge-graph.sh +483 -81
- package/lib/pre-scan.sh +70 -5
- package/package.json +1 -1
- package/skills/project-analyze/SKILL.md +34 -15
- package/skills/project-analyze/phases/phase2-understand.md +7 -1
- package/skills/project-analyze/phases/phase2.5-refine.md +284 -0
- package/skills/project-analyze/phases/phase4-synthesize.md +100 -119
- package/skills/project-analyze/phases/phase5-export.md +78 -32
- 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/requirements-writer/SKILL.md +48 -1
- package/skills/software-architecture/SKILL.md +73 -3
|
@@ -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/`)单独分析
|