@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
|
@@ -1,315 +1,80 @@
|
|
|
1
1
|
# Flutter / Dart 项目分析规则
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> **编码规范**:本规则不包含编码规范内容。Phase 2.5 精炼阶段会自动加载 `flutter-conventions` skill 作为规范约束。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 模块发现策略
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
MaterialApp / runApp
|
|
9
|
-
↓
|
|
10
|
-
Navigator / GoRouter(路由)
|
|
11
|
-
↓
|
|
12
|
-
Pages / Screens(页面)
|
|
13
|
-
↓
|
|
14
|
-
Widgets(组件)
|
|
15
|
-
↓
|
|
16
|
-
ChangeNotifier / Riverpod / Bloc(状态管理)
|
|
17
|
-
↓
|
|
18
|
-
Repository / Service(数据层)
|
|
19
|
-
↓
|
|
20
|
-
Models / Entities(数据模型)
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## 目录扫描策略
|
|
24
|
-
|
|
25
|
-
### 1. 识别项目结构
|
|
26
|
-
|
|
27
|
-
**信号文件检测:**
|
|
28
|
-
- `pubspec.yaml` → Flutter/Dart 项目
|
|
29
|
-
- `lib/` → Dart 源码目录
|
|
30
|
-
- `android/`, `ios/`, `web/`, `macos/`, `linux/`, `windows/` → 平台目录
|
|
31
|
-
|
|
32
|
-
### 2. 识别状态管理方案
|
|
33
|
-
|
|
34
|
-
**从 `pubspec.yaml` 的 dependencies 检测:**
|
|
35
|
-
- Provider: `provider` 依赖
|
|
36
|
-
- Riverpod: `flutter_riverpod`, `hooks_riverpod` 依赖
|
|
37
|
-
- BLoC: `flutter_bloc`, `equatable` 依赖
|
|
38
|
-
- GetX: `get` 依赖
|
|
39
|
-
- MobX: `mobx`, `flutter_mobx` 依赖
|
|
40
|
-
|
|
41
|
-
### 3. 识别路由方案
|
|
42
|
-
|
|
43
|
-
- GoRouter: `go_router` 依赖 + `GoRouter` 配置
|
|
44
|
-
- AutoRoute: `auto_route` 依赖 + `@RoutePage()` 注解
|
|
45
|
-
- Navigator 1.0: `Navigator.push()` 调用
|
|
46
|
-
- GetX: `Get.to()` / `GetPage()` 调用
|
|
47
|
-
|
|
48
|
-
### 4. 依赖提取
|
|
49
|
-
|
|
50
|
-
从 `pubspec.yaml` 提取:
|
|
51
|
-
|
|
52
|
-
| 类别 | 常见依赖 |
|
|
53
|
-
|------|----------|
|
|
54
|
-
| 网络 | dio, http, retrofit |
|
|
55
|
-
| 状态管理 | provider, riverpod, flutter_bloc, get |
|
|
56
|
-
| 路由 | go_router, auto_route |
|
|
57
|
-
| 本地存储 | shared_preferences, hive, isar, drift |
|
|
58
|
-
| DI | get_it, injectable, riverpod |
|
|
59
|
-
| UI | cached_network_image, shimmer, lottie |
|
|
60
|
-
| 序列化 | json_serializable, freezed, dart_mappable |
|
|
61
|
-
|
|
62
|
-
### 5. 按层扫描路径
|
|
63
|
-
|
|
64
|
-
- **Pages/Screens**: `lib/screens/`, `lib/pages/`, `lib/views/`
|
|
65
|
-
- **Widgets**: `lib/widgets/`, `lib/components/`, `lib/ui/`
|
|
66
|
-
- **状态管理**: `lib/providers/`, `lib/bloc/`, `lib/cubit/`, `lib/notifiers/`
|
|
67
|
-
- **Models**: `lib/models/`, `lib/entities/`
|
|
68
|
-
- **Services**: `lib/services/`, `lib/repositories/`
|
|
69
|
-
- **Routes**: `lib/routes/`, `lib/navigation/`, `lib/app_router.dart`
|
|
70
|
-
- **Utils**: `lib/utils/`, `lib/helpers/`, `lib/constants/`
|
|
71
|
-
- **Theme**: `lib/theme/`, `lib/styles/`
|
|
72
|
-
|
|
73
|
-
## 各层提取规则
|
|
74
|
-
|
|
75
|
-
### 层 1: 路由层
|
|
76
|
-
|
|
77
|
-
**扫描文件**: `lib/app_router.dart`, `lib/routes/**/*.dart`, `lib/navigation/**/*.dart`
|
|
78
|
-
|
|
79
|
-
**提取内容**:
|
|
80
|
-
- 路由配置(路径 + 对应 Widget + 参数)
|
|
81
|
-
- 嵌套路由(ShellRoute / 子路由)
|
|
82
|
-
- 路由守卫(重定向逻辑、认证检查)
|
|
83
|
-
- Deep Link 配置
|
|
84
|
-
|
|
85
|
-
**输出示例**:
|
|
86
|
-
```
|
|
87
|
-
### 路由结构(GoRouter)
|
|
88
|
-
- **文件**: `lib/app_router.dart`
|
|
89
|
-
- **路由配置**:
|
|
90
|
-
| 路径 | 目标 Widget | 参数 | 守卫 |
|
|
91
|
-
|------|-------------|------|------|
|
|
92
|
-
| / | SplashScreen | - | - |
|
|
93
|
-
| /login | LoginPage | - | 已登录→重定向/home |
|
|
94
|
-
| /home | HomePage | - | 需认证 |
|
|
95
|
-
| /profile/:userId | ProfilePage | userId: String | 需认证 |
|
|
96
|
-
| /settings | SettingsPage | - | 需认证 |
|
|
97
|
-
- **嵌套路由**: /home 下包含 /home/feed, /home/search, /home/profile (BottomNavigation)
|
|
98
|
-
- **认证守卫**: redirect 检查 authProvider.isAuthenticated
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### 层 2: 页面层
|
|
102
|
-
|
|
103
|
-
**扫描文件**: `lib/pages/**/*.dart`, `lib/screens/**/*.dart`
|
|
104
|
-
|
|
105
|
-
**提取内容**:
|
|
106
|
-
- 页面 Widget 类名 + 路径
|
|
107
|
-
- State 管理方式(StatefulWidget / StatelessWidget + Provider)
|
|
108
|
-
- `build()` 方法中的主要子 Widget(1-2 层)
|
|
109
|
-
- 生命周期方法(initState, dispose)
|
|
110
|
-
- 使用的 Provider / Bloc
|
|
111
|
-
|
|
112
|
-
**输出示例**:
|
|
113
|
-
```
|
|
114
|
-
### HomePage
|
|
115
|
-
- **路径**: `lib/pages/home/home_page.dart`
|
|
116
|
-
- **类型**: StatefulWidget
|
|
117
|
-
- **State**: _HomePageState
|
|
118
|
-
- **build() 主要结构**:
|
|
119
|
-
Scaffold(
|
|
120
|
-
appBar: AppBar(title: Text('首页')),
|
|
121
|
-
body: _buildBody(), // TabBarView(FeedPage, SearchPage, ProfilePage)
|
|
122
|
-
bottomNavigationBar: MainBottomNavBar(onTap: _onTabTapped),
|
|
123
|
-
)
|
|
124
|
-
- **Provider 依赖**: feedProvider (Watch), authProvider (Read)
|
|
125
|
-
- **生命周期**:
|
|
126
|
-
| 方法 | 行为 |
|
|
127
|
-
|------|------|
|
|
128
|
-
| initState() | 初始化 TabController, 加载用户信息 |
|
|
129
|
-
| dispose() | 释放 TabController |
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### 层 3: Widget 层
|
|
7
|
+
从 `pubspec.yaml` 和 `lib/` 目录结构识别模块边界:
|
|
133
8
|
|
|
134
|
-
|
|
9
|
+
- `pubspec.yaml` → 解析 `dependencies` / `dev_dependencies`,识别状态管理和路由方案
|
|
10
|
+
- `lib/features/{name}/` → Feature-first 目录结构,每个 feature 子目录视为独立模块
|
|
11
|
+
- `lib/screens/` / `lib/pages/` → 每个子目录视为独立模块
|
|
12
|
+
- `lib/services/` / `lib/repositories/` → 数据层模块
|
|
13
|
+
- `lib/widgets/` / `lib/components/` → 3+ 文件的子目录视为独立组件模块
|
|
14
|
+
- 平台目录(`android/`, `ios/`, `web/`)→ 跳过,不分析原生代码
|
|
135
15
|
|
|
136
|
-
|
|
137
|
-
- Widget 类名 + 类型(StatefulWidget / StatelessWidget)
|
|
138
|
-
- 构造参数(命名参数 + 类型 + 默认值)
|
|
139
|
-
- `build()` 方法中的子 Widget
|
|
140
|
-
- 动画配置(AnimationController, Tween)
|
|
16
|
+
**不视为独立模块**:`main.dart` / `app.dart`(入口文件)、纯 re-export 桶文件、`lib/utils/` / `lib/helpers/` 合并为一个模块、`*.g.dart` / `*.freezed.dart` 生成文件跳过。
|
|
141
17
|
|
|
142
|
-
|
|
143
|
-
```
|
|
144
|
-
### UserAvatar
|
|
145
|
-
- **路径**: `lib/widgets/user_avatar.dart`
|
|
146
|
-
- **类型**: StatelessWidget
|
|
147
|
-
- **构造参数**:
|
|
148
|
-
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
149
|
-
|------|------|------|--------|------|
|
|
150
|
-
| avatarUrl | String? | No | null | 头像 URL |
|
|
151
|
-
| size | double | No | 48.0 | 头像尺寸 |
|
|
152
|
-
| name | String | Yes | - | 用于生成默认头像 |
|
|
153
|
-
- **子 Widget**: CachedNetworkImage + fallback (首字母头像)
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### 层 4: 状态管理层
|
|
157
|
-
|
|
158
|
-
#### Provider
|
|
159
|
-
|
|
160
|
-
**扫描文件**: `lib/providers/**/*.dart`
|
|
161
|
-
|
|
162
|
-
**提取内容**:
|
|
163
|
-
- Provider 名称 + 类型(ChangeNotifier / FutureProvider / StateNotifier)
|
|
164
|
-
- State 字段(名称 + 类型)
|
|
165
|
-
- 方法(签名 + 说明)
|
|
166
|
-
|
|
167
|
-
**输出示例**:
|
|
168
|
-
```
|
|
169
|
-
### AuthProvider(ChangeNotifier)
|
|
170
|
-
- **路径**: `lib/providers/auth_provider.dart`
|
|
171
|
-
- **State**:
|
|
172
|
-
| 字段 | 类型 | 说明 |
|
|
173
|
-
|------|------|------|
|
|
174
|
-
| user | User? | 当前用户 |
|
|
175
|
-
| isLoading | bool | 加载状态 |
|
|
176
|
-
| isAuthenticated | bool | 是否已认证(getter) |
|
|
177
|
-
- **方法**:
|
|
178
|
-
| 方法 | 签名 | 说明 |
|
|
179
|
-
|------|------|------|
|
|
180
|
-
| login | (String email, String password) → Future<void> | 登录 |
|
|
181
|
-
| logout | () → Future<void> | 登出 |
|
|
182
|
-
| updateProfile | (UpdateProfileDTO) → Future<void> | 更新资料 |
|
|
183
|
-
- **持久化**: SharedPreferences (token), Hive (user)
|
|
184
|
-
```
|
|
18
|
+
## 入口识别
|
|
185
19
|
|
|
186
|
-
|
|
20
|
+
- **App 入口**:`lib/main.dart` → `runApp(...)` → `MaterialApp` / `CupertinoApp` / `WidgetsApp`
|
|
21
|
+
- **路由入口**:`MaterialApp(home:)` 或 `MaterialApp.router(routerConfig:)`
|
|
22
|
+
- **GoRouter**:`app_router.dart` 中 `GoRouter(routes:)` 定义,含 `initialLocation`
|
|
23
|
+
- **AutoRoute**:`@AutoRouterConfig()` 注解 + `AppRouter.gr.dart` 生成文件
|
|
187
24
|
|
|
188
|
-
|
|
25
|
+
## 架构模式识别
|
|
189
26
|
|
|
190
|
-
|
|
191
|
-
- Bloc/Cubit 名称
|
|
192
|
-
- State 类(字段 + 类型)
|
|
193
|
-
- Event/输入(名称 + 关联字段)
|
|
194
|
-
- Emitted States(每个 Event 触发的 State 变化)
|
|
27
|
+
从 `pubspec.yaml` dependencies 检测状态管理方案:
|
|
195
28
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|-------|------|-------------------|
|
|
204
|
-
| AuthLoginRequested | email, password | status: loading → authenticated / failure |
|
|
205
|
-
| AuthLogoutRequested | - | status: authenticated → unauthenticated |
|
|
206
|
-
| AuthRefreshRequested | - | 重新获取用户信息 |
|
|
207
|
-
```
|
|
29
|
+
| 状态管理 | 识别依赖 | 目录特征 |
|
|
30
|
+
|---------|---------|---------|
|
|
31
|
+
| Provider | `provider` | `lib/providers/` |
|
|
32
|
+
| Riverpod | `flutter_riverpod` / `hooks_riverpod` | `lib/providers/` + `@riverpod` 注解 |
|
|
33
|
+
| BLoC | `flutter_bloc` + `equatable` | `lib/bloc/` / `lib/cubit/` |
|
|
34
|
+
| GetX | `get` | `lib/controllers/` + `Get.to()` |
|
|
35
|
+
| MobX | `mobx` + `flutter_mobx` | `lib/stores/` + `@observable` |
|
|
208
36
|
|
|
209
|
-
|
|
37
|
+
路由方案检测:`go_router` → GoRouter;`auto_route` → AutoRoute;`Get.to()` → GetX;无路由库 → Navigator 1.0。
|
|
210
38
|
|
|
211
|
-
|
|
39
|
+
整体架构判断:`lib/features/` 存在 → Feature-first;`lib/data/` + `lib/domain/` + `lib/presentation/` → Clean Architecture;无明显分层 → 扁平结构。
|
|
212
40
|
|
|
213
|
-
|
|
214
|
-
- 类名 + 依赖注入方式
|
|
215
|
-
- 方法签名 + API 端点映射
|
|
216
|
-
- 错误处理策略
|
|
41
|
+
## 数据流模式
|
|
217
42
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
-
|
|
222
|
-
- **依赖**: Dio (http client), UserLocalDataSource
|
|
223
|
-
- **方法**:
|
|
224
|
-
| 方法 | HTTP | 路径 | 返回类型 |
|
|
225
|
-
|------|------|------|----------|
|
|
226
|
-
| getUserProfile() | GET | /api/user/profile | Future<User> |
|
|
227
|
-
| updateProfile(data) | PUT | /api/user/profile | Future<User> |
|
|
228
|
-
| changePassword(data) | POST | /api/user/password | Future<void> |
|
|
229
|
-
```
|
|
43
|
+
- **Provider/Riverpod**:`ChangeNotifier.notifyListeners()` → `Consumer` / `ref.watch()` 重建
|
|
44
|
+
- **BLoC**:`Event` → `Bloc.add()` → `emit(State)` → `BlocBuilder` 重建
|
|
45
|
+
- **GetX**:`Rx` 变量 + `.obs` → `Obx(() => ...)` 响应式重建
|
|
46
|
+
- **数据层**:Repository 模式 → `Dio` / `http` 网络请求 → JSON 序列化(`json_serializable` / `freezed`)
|
|
230
47
|
|
|
231
|
-
|
|
48
|
+
## 分析关注点
|
|
232
49
|
|
|
233
|
-
|
|
50
|
+
- **`lib/` 目录结构**:是理解项目架构的核心,需完整列出一级和二级目录
|
|
51
|
+
- **Widget 树入口**:`runApp()` → 根 Widget → 路由配置,是所有页面的起点
|
|
52
|
+
- **`pubspec.yaml` 依赖**:完整提取 dependencies 和 dev_dependencies,识别框架版本
|
|
53
|
+
- **Flutter Bloc/Provider/Riverpod 检测**:状态管理方案决定数据流分析策略
|
|
54
|
+
- **生成文件识别**:`*.g.dart` / `*.freezed.dart` 跳过分析,但需识别其对应的源文件
|
|
55
|
+
- **平台特定代码**:`android/` / `ios/` 中的原生模块仅在有 MethodChannel 桥接时分析
|
|
234
56
|
|
|
235
|
-
|
|
236
|
-
- ThemeData 配置
|
|
237
|
-
- 颜色定义(ColorScheme)
|
|
238
|
-
- 字体配置(TextTheme)
|
|
239
|
-
- 间距系统
|
|
240
|
-
- 自定义组件主题
|
|
57
|
+
## 输出示例
|
|
241
58
|
|
|
242
|
-
**输出示例**:
|
|
243
|
-
```
|
|
244
|
-
### AppTheme
|
|
245
|
-
- **文件**: `lib/theme/app_theme.dart`
|
|
246
|
-
- **颜色**:
|
|
247
|
-
| Token | 值 | 用途 |
|
|
248
|
-
|-------|------|------|
|
|
249
|
-
| primaryColor | Color(0xFF6750A4) | 主色调 |
|
|
250
|
-
| onPrimaryColor | Color(0xFFFFFFFF) | 主色上的文字 |
|
|
251
|
-
| errorColor | Color(0xFFB3261E) | 错误色 |
|
|
252
|
-
- **字体**:
|
|
253
|
-
| 用途 | 字体族 | 字号 | 字重 |
|
|
254
|
-
|------|--------|------|------|
|
|
255
|
-
| headlineLarge | Roboto | 32sp | Bold |
|
|
256
|
-
| bodyMedium | Roboto | 14sp | Normal |
|
|
257
59
|
```
|
|
60
|
+
### 项目结构(Feature-first)
|
|
61
|
+
lib/
|
|
62
|
+
features/
|
|
63
|
+
auth/ → 认证模块(login, register, forgot_password)
|
|
64
|
+
home/ → 首页模块(feed, search)
|
|
65
|
+
profile/ → 用户模块(view, edit, settings)
|
|
66
|
+
shared/
|
|
67
|
+
widgets/ → 公共组件
|
|
68
|
+
services/ → 网络/存储服务
|
|
258
69
|
|
|
259
|
-
|
|
70
|
+
### 技术栈检测
|
|
71
|
+
- 状态管理: Riverpod (flutter_riverpod 2.4.0) + hooks_riverpod
|
|
72
|
+
- 路由: GoRouter (go_router 12.1.1), initialLocation: /splash
|
|
73
|
+
- 网络: Dio (dio 5.3.2) + Retrofit
|
|
74
|
+
- 序列化: freezed + json_serializable
|
|
260
75
|
|
|
261
|
-
###
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
## 项目概述
|
|
267
|
-
App 功能描述
|
|
268
|
-
|
|
269
|
-
## 技术栈
|
|
270
|
-
| 技术 | 版本 | 用途 |
|
|
271
|
-
|------|------|------|
|
|
272
|
-
|
|
273
|
-
## 架构设计
|
|
274
|
-
### 架构图(ASCII)
|
|
275
|
-
### 数据流图
|
|
276
|
-
|
|
277
|
-
## 路由结构
|
|
278
|
-
路由树 + 参数 + 守卫
|
|
279
|
-
|
|
280
|
-
## 状态管理
|
|
281
|
-
Provider/BLoC 关系图
|
|
282
|
-
|
|
283
|
-
## 模块详解
|
|
284
|
-
按 Feature 分组
|
|
285
|
-
|
|
286
|
-
## 依赖管理
|
|
287
|
-
pubspec.yaml 关键依赖
|
|
76
|
+
### 数据流(Riverpod)
|
|
77
|
+
用户操作 → ref.read(provider.notifier).method()
|
|
78
|
+
→ StateNotifier.state = newState
|
|
79
|
+
→ ref.watch(provider) 重建 UI
|
|
288
80
|
```
|
|
289
|
-
|
|
290
|
-
## 模块边界识别
|
|
291
|
-
|
|
292
|
-
以下目录模式下的每个子目录视为独立模块(L2+ 分析时生成 MODULE-DOC.md):
|
|
293
|
-
|
|
294
|
-
| 层 | 扫描路径 | 模块判定规则 | MODULE-DOC slug 来源 |
|
|
295
|
-
|----|----------|-------------|---------------------|
|
|
296
|
-
| 页面/视图层 | `lib/features/{name}/`, `lib/screens/` | 每个子目录 | 目录名 kebab-case |
|
|
297
|
-
| API/服务层 | `lib/services/`, `lib/repositories/` | 每个子目录或文件 | 名称 kebab-case |
|
|
298
|
-
| 状态管理层 | `lib/providers/`, `lib/notifiers/` | 每个文件 | 文件名去后缀 kebab-case |
|
|
299
|
-
| 组件层 | `lib/widgets/` | 3+ 文件的子目录 | 目录名 kebab-case |
|
|
300
|
-
| 数据模型层 | `lib/models/` | 每个文件 | 文件名去后缀 kebab-case |
|
|
301
|
-
|
|
302
|
-
**不视为独立模块的情况**:
|
|
303
|
-
- 单文件入口(如 `main.dart`, `app.dart`)
|
|
304
|
-
- 纯导出桶文件(仅有 re-export)
|
|
305
|
-
- 工具函数目录(`lib/utils/`, `lib/helpers/`)— 合并为一个模块
|
|
306
|
-
- 生成文件(`*.g.dart`, `*.freezed.dart`)跳过
|
|
307
|
-
- 平台目录(`android/`, `ios/`)跳过
|
|
308
|
-
|
|
309
|
-
## Token 管理
|
|
310
|
-
|
|
311
|
-
- 大模块(>20 文件)拆分为子任务
|
|
312
|
-
- 每个子任务分析 ≤10 文件
|
|
313
|
-
- `pubspec.yaml` 分析单独一个子任务
|
|
314
|
-
- 生成的文件(`*.g.dart`, `*.freezed.dart`)跳过或简要分析
|
|
315
|
-
- 平台目录(android/, ios/)不分析
|