@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
@@ -2,377 +2,83 @@
2
2
 
3
3
  Vue 3 项目专属分析规则,与 `rules/web.md` 配合使用。本文件中的规则优先于 `web.md` 中的同名字段。
4
4
 
5
- ## 分析粒度
5
+ > **编码规范**:本规则不包含编码规范内容。Phase 2.5 精炼阶段会自动加载 `web-conventions` skill 作为规范约束。
6
6
 
7
- Vue 3 项目按 SFC(Single File Component)三段式 + Composition API 分层分析:
7
+ ## 模块发现策略
8
8
 
9
- ```
10
- <template> — UI 结构层(el-* 组件引用、v-if/v-for、事件绑定)
11
- <script setup> — 逻辑层(defineProps、defineEmits、composables、生命周期)
12
- <style> — 样式层(scoped SCSS、CSS 变量、设计 Token)
13
- ```
14
-
15
- ## Vue SFC 三段式分析
16
-
17
- ### Template 段分析
18
-
19
- **扫描文件**: `src/**/*.vue` 的 `<template>` 部分
20
-
21
- **提取内容**:
22
- - 使用的 UI 库组件(如 `el-table`, `el-form`)
23
- - 条件渲染(`v-if` / `v-show` 的条件变量)
24
- - 列表渲染(`v-for` 的数据源变量)
25
- - 事件绑定(`@click`, `@change` 等关联的方法)
26
- - 动态组件(`<component :is="...">`)
27
- - 插槽使用(`<slot name="...">`)
28
-
29
- **输出示例**:
30
- ```
31
- ### UserList — Template 分析
32
- - **UI 库组件**: el-table, el-table-column, el-pagination, el-dialog, el-form
33
- - **条件渲染**:
34
- | 指令 | 条件变量 | 用途 |
35
- |------|----------|------|
36
- | v-if="loading" | loading | 显示加载遮罩 |
37
- | v-if="dialogVisible" | dialogVisible | 显示编辑弹窗 |
38
- - **列表渲染**:
39
- | 指令 | 数据源 | 迭代变量 |
40
- |------|--------|----------|
41
- | v-for="item in tableData" | tableData | item |
42
- - **事件绑定**:
43
- | 事件 | 处理方法 | 说明 |
44
- |------|----------|------|
45
- | @selection-change="handleSelectionChange" | handleSelectionChange | 多选变更 |
46
- | @size-change="handleSizeChange" | handleSizeChange | 切换每页条数 |
47
- ```
48
-
49
- ### Script Setup 段分析
50
-
51
- **扫描文件**: `src/**/*.vue` 的 `<script setup>` 部分
52
-
53
- **提取内容**:
54
- - `defineProps<T>()` — Props 类型定义
55
- - `defineEmits<T>()` — 事件定义
56
- - `ref()` / `reactive()` / `computed()` — 响应式变量
57
- - `onMounted()` / `watch()` / `watchEffect()` — 生命周期和监听
58
- - 引入的 composables(`useXxx()`)
59
- - 引入的 API 函数
60
-
61
- **输出示例**:
62
- ```
63
- ### UserForm — Script Setup 分析
64
- - **Props**:
65
- ```typescript
66
- defineProps<{
67
- visible: boolean
68
- userId?: string
69
- }>()
70
- ```
71
- - **Emits**:
72
- ```typescript
73
- defineEmits<{
74
- (e: 'update:visible', val: boolean): void
75
- (e: 'refresh'): void
76
- }>()
77
- ```
78
- - **响应式变量**:
79
- | 名称 | 类型 | 初始值 | 说明 |
80
- |------|------|--------|------|
81
- | formRef | Ref<FormInstance> | null | 表单引用 |
82
- | formData | Reactive<UserForm> | {...} | 表单数据 |
83
- | rules | Reactive<FormRules> | {...} | 校验规则 |
84
- | loading | Ref<boolean> | false | 提交加载状态 |
85
- - **生命周期**:
86
- | Hook | 行为 |
87
- |------|------|
88
- | watch(() => props.visible) | 弹窗打开时重置表单 |
89
- | watch(() => props.userId) | userId 变化时获取用户详情 |
90
- - **引入的 composables**: useDict('sys_normal_disable')
91
- - **引入的 API**: getUserDetail(), createUser(), updateUser()
92
- ```
93
-
94
- ### Style 段分析
95
-
96
- **扫描文件**: `src/**/*.vue` 的 `<style>` 部分 + 全局样式文件
97
-
98
- **提取内容**:
99
- - `scoped` / 非 scoped 标识
100
- - 使用的 CSS 预处理器(SCSS / Less)
101
- - 组件内的 CSS 变量引用
102
- - 全局样式覆盖
9
+ Vue 项目按 SFC(Single File Component)三段式 + Composition API 发现模块边界:
103
10
 
104
- ## Pinia Store 分析
11
+ - **页面模块**: `src/views/{module}/` 下每个子目录
12
+ - **组件模块**: `src/components/{name}/` 下 3+ 文件的子目录
13
+ - **状态模块**: `src/store/modules/` 或 `src/stores/` 下每个子目录
14
+ - **Composables 模块**: `src/composables/` 下每个文件
105
15
 
106
- **扫描文件**: `src/stores/**/*.ts`, `src/store/**/*.ts`
107
-
108
- **提取内容**:
109
- - `defineStore` 的 ID 和配置模式(Setup Store / Options Store)
110
- - State 完整接口(所有字段 + 类型)
111
- - Getters(名称 + 返回类型 + 计算逻辑摘要)
112
- - Actions(签名 + 内部调用的 API + 修改的 state 字段)
113
- - 跨 Store 依赖(在 Action 中调用了其他 Store 的 Action/Getter)
114
- - `persist` 插件配置(存储 key、存储位置、需要持久化的字段)
115
-
116
- **输出示例**:
117
- ```
118
- ### useUserStore(Options Store)
119
- - **文件**: `src/stores/modules/user.ts`
120
- - **Store ID**: `'user'`
121
- - **State 接口**:
122
- ```typescript
123
- interface UserState {
124
- token: string
125
- userInfo: UserInfo | null
126
- roles: string[]
127
- permissions: string[]
128
- }
129
- ```
130
- | 字段 | 类型 | 说明 |
131
- |------|------|------|
132
- | token | string | JWT token |
133
- | userInfo | UserInfo \| null | 用户详情 |
134
- | roles | string[] | 角色标识列表 |
135
- | permissions | string[] | 权限标识列表(如 ['system:user:add']) |
16
+ 不视为独立模块:单文件入口(`main.ts`, `App.vue`, `index.ts`)、纯导出桶文件、`utils/`/`helpers/` 目录。
136
17
 
137
- - **Getters**:
138
- | 名称 | 返回类型 | 计算逻辑 |
139
- |------|----------|----------|
140
- | isAdmin | boolean | roles.includes('admin') |
141
- | userName | string | userInfo?.nickname ?? '' |
18
+ ## 入口识别
142
19
 
143
- - **Actions**:
144
- | Action | 签名 | 调用 API | 修改的 State |
145
- |--------|------|----------|--------------|
146
- | login | (loginData: LoginForm) => Promise<void> | authApi.login() | token |
147
- | getInfo | () => Promise<void> | userApi.getUserInfo() | userInfo, roles, permissions |
148
- | logout | () => Promise<void> | - | 全部重置 |
20
+ - 路由配置文件: `src/router/index.ts`,识别静态路由 vs 动态路由(`router.addRoute()`)
21
+ - 组件映射: `import.meta.glob('../views/**/*.vue')` 动态路由加载模式
22
+ - 微前端检测: `main.ts` 含 `registerMicroApps`(qiankun),`vue.config.js` 含 `devServer.headers`
149
23
 
150
- - **跨 Store 依赖**:
151
- - login 成功后调用 `usePermissionStore().generateRoutes(roles)`
152
- - **持久化**: pinia-plugin-persistedstate, key: 'user', pick: ['token']
153
- ```
24
+ ## 架构模式识别
154
25
 
155
- ## Vue Router 分析
26
+ 通过文件结构判断 Vue 2 vs Vue 3 及组织模式:
156
27
 
157
- **扫描文件**: `src/router/**/*.ts`
28
+ | 特征 | 判断 |
29
+ |------|------|
30
+ | `<script setup>` + `defineProps` | Vue 3 Composition API |
31
+ | `export default { data(), methods: {} }` | Vue 2 Options API |
32
+ | `src/composables/` 目录 | Composition API 逻辑复用 |
33
+ | `src/store/modules/` | Vuex 模块化 |
34
+ | `src/stores/` + `defineStore` | Pinia |
35
+ | `src/views/` + `src/api/` + `src/store/` 三层结构 | 标准后台管理系统架构 |
158
36
 
159
- **提取内容**:
160
- - 静态路由 vs 动态路由(从后端获取的菜单路由)
161
- - 路由 meta 字段规范(title, icon, roles, hidden, keepAlive 等)
162
- - 路由守卫(beforeEach 链路)
163
- - 动态路由加载方式(`router.addRoute()` vs 组件映射)
164
- - keep-alive 缓存策略
37
+ **qiankun 微前端识别**:主应用 `registerMicroApps` 列表(name, entry, activeRule),子应用生命周期钩子(bootstrap/mount/unmount),共享状态方案(initGlobalState/props 传递)。
165
38
 
166
- **输出示例**:
167
- ```
168
- ### 路由配置
169
- - **模式**: createWebHistory()
170
- - **静态路由**:
171
- | 路径 | 组件 | Meta.title | Meta.hidden | 权限 |
172
- |------|------|------------|-------------|------|
173
- | /login | LoginPage | '登录' | true | 公开 |
174
- | /redirect/:path(.*) | RedirectPage | - | true | 公开 |
175
- | /404 | NotFoundPage | '404' | true | 公开 |
39
+ ## 数据流模式
176
40
 
177
- - **动态路由**: 通过 `router.addRoute()` 从后端菜单数据动态生成
178
- - 数据源: `usePermissionStore().menuRoutes`
179
- - 组件映射: `import.meta.glob('../views/**/*.vue')`
41
+ **Pinia 检测**:扫描 `src/stores/**/*.ts`,识别:
42
+ - defineStore 配置模式(Options Store / Setup Store)
43
+ - State 接口完整字段 + 类型
44
+ - Actions 调用的 API 函数
45
+ - 跨 Store 依赖(Action 中调用其他 Store)
46
+ - pinia-plugin-persistedstate 配置(key、pick 字段)
180
47
 
181
- - **路由 Meta 规范**:
182
- ```typescript
183
- interface RouteMeta {
184
- title: string // 页面标题
185
- icon?: string // 菜单图标
186
- roles?: string[] // 允许访问的角色
187
- hidden?: boolean // 是否在菜单中隐藏
188
- keepAlive?: boolean // 是否缓存
189
- affix?: boolean // 是否固定在标签栏
190
- }
191
- ```
48
+ **Vuex 检测**:扫描 `src/store/modules/**/*.ts`,识别模块命名空间、mutations/actions/getters。
192
49
 
193
- - **路由守卫链路**:
194
- beforeEachNProgress.start()
195
- 白名单检查(无需 token 的页面直接放行)
196
- token已获取用户信息?→ 放行 : 调用 getInfo()
197
- → 无 token → 白名单?→ 放行 : 跳转 /login?redirect={原路径}
198
- ```
50
+ **Vue Router 数据流**:
51
+ - 静态路由 vs 动态路由(后端菜单 `router.addRoute()`)
52
+ - 路由 meta 规范(title/icon/roles/hidden/keepAlive/affix)
53
+ - 路由守卫 beforeEach 链路(NProgress 白名单 token 检查 → 权限检查)
199
54
 
200
- ## qiankun 微前端分析(如适用)
55
+ ## 分析关注点
201
56
 
202
- **扫描文件**: 主应用 `main.ts`, 子应用 `main.ts`, `vue.config.js`
57
+ - **Vue 版本检测**: Vue 2(`vue: ^2.x`)vs Vue 3(`vue: ^3.x`),Composition API 使用比例
58
+ - **响应式系统**: `ref()` vs `reactive()` 使用模式,`computed()` 依赖关系,`watch` vs `watchEffect`
59
+ - **SFC 三段式分析**: `<template>` 中的 UI 库组件引用、`<script setup>` 中的 composables、`<style scoped>` 中的 CSS 变量引用
60
+ - **keep-alive 缓存策略**: 哪些路由/组件配置了 keepAlive,缓存边界
61
+ - **Axios 封装**: 请求/响应拦截器逻辑,token 注入方式,错误码映射
203
62
 
204
- **提取内容**:
205
- - 主应用注册的子应用列表(name + entry + activeRule)
206
- - 子应用的生命周期钩子(bootstrap, mount, unmount)
207
- - 共享状态方案(initGlobalState / props 传递)
208
- - 子应用间通信方式
63
+ ## 输出示例
209
64
 
210
- **输出示例**:
211
- ```
212
- ### 微前端架构(qiankun)
213
- - **主应用**: locode-front (port: 3000)
214
- - **子应用列表**:
215
- | 名称 | 入口 | 激活规则 | 端口 |
216
- |------|------|----------|------|
217
- | sub-app-a | //localhost:3001 | /sub-a | 3001 |
218
- | sub-app-b | //localhost:3002 | /sub-b | 3002 |
219
- - **共享状态**: 主应用通过 props 传递 token、userInfo
220
- - **通信方式**: CustomEvent + initGlobalState
221
65
  ```
66
+ ### useUserStore(Pinia Options Store)
67
+ - Store ID: 'user'
68
+ - State: token (string), userInfo (UserInfo|null), roles (string[]), permissions (string[])
69
+ - Getters: isAdmin → roles.includes('admin')
70
+ - Actions: login(loginData) → authApi.login() → 修改 token;getInfo() → userApi.getUserInfo() → 修改 userInfo/roles/permissions
71
+ - 跨 Store: login 成功后调用 usePermissionStore().generateRoutes(roles)
72
+ - 持久化: pinia-plugin-persistedstate, key: 'user', pick: ['token']
222
73
 
223
- **微前端文档交叉引用提取**:
74
+ ### 路由守卫链路
75
+ beforeEach → NProgress.start() → 白名单检查(放行)
76
+ → 有 token → 已获取用户信息?→ 放行 : 调用 getInfo()
77
+ → 无 token → 白名单?→ 放行 : 跳转 /login?redirect={原路径}
224
78
 
225
- 当检测到 qiankun 微前端架构时,额外提取以下信息用于根目录文档交叉引用:
226
- - 主应用注册的每个子应用的 **docs/ 路径映射**
227
- - 子应用间的 **共享组件/工具**(标注是否重复实现)
228
- - 共享依赖 **版本对比表**
229
-
230
- 输出到 `.atool-docs/micro-frontend-map.json`:
231
- ```json
232
- {
233
- "main_app": {
234
- "name": "locode-front-master-vue3",
235
- "docs_path": "./docs/"
236
- },
237
- "sub_apps": [
238
- {
239
- "name": "system",
240
- "entry": "//localhost:10010/system/",
241
- "docs_path": "../locode-front-system-vue3/docs/",
242
- "shared_with_main": ["utils/", "hooks/", "directives/", "config/axios/"]
243
- }
244
- ],
245
- "shared_code_analysis": {
246
- "identical_dirs": ["src/utils/", "src/hooks/", "src/directives/", "src/plugins/"],
247
- "version_conflicts": {
248
- "vue": { "main": "3.4.20", "sub_apps": "3.3.8" },
249
- "element-plus": { "main": "2.5.3", "sub_apps": "2.4.2" }
250
- }
251
- }
252
- }
79
+ ### 微前端架构(qiankun,如适用)
80
+ - 主应用: locode-front (port: 3000)
81
+ - 子应用: [{ name, entry, activeRule, port }]
82
+ - 共享状态: 主应用通过 props 传递 token、userInfo
83
+ - 通信方式: CustomEvent + initGlobalState
253
84
  ```
254
-
255
- ## Axios 封装分析
256
-
257
- **扫描文件**: `src/utils/request.ts`, `src/api/**/*.ts`
258
-
259
- **提取内容**:
260
- - Axios 实例配置(baseURL, timeout, headers)
261
- - 请求拦截器(token 注入、loading 管理)
262
- - 响应拦截器(错误码映射、token 刷新、消息提示)
263
- - API 模块化组织方式
264
-
265
- **输出示例**:
266
- ```
267
- ### Axios 配置
268
- - **文件**: `src/utils/request.ts`
269
- - **baseURL**: import.meta.env.VITE_API_BASE_URL || '/api'
270
- - **timeout**: 15000ms
271
- - **请求拦截器**:
272
- 1. 从 useUserStore().token 读取 token
273
- 2. 添加 `Authorization: Bearer ${token}`
274
- 3. NProgress.start()
275
- - **响应拦截器**:
276
- | 状态码 | 处理方式 |
277
- |--------|----------|
278
- | 200 | 返回 data.data |
279
- | 401 | 调用 refreshToken() → 成功则重发请求 → 失败则跳转 /login |
280
- | 403 | ElMessage.error('没有操作权限') |
281
- | 500 | ElMessage.error('服务器内部错误') |
282
- | 默认 | ElMessage.error(msg) |
283
- ```
284
-
285
- ## Element Plus 设计 Token 提取
286
-
287
- **扫描文件**: `src/styles/**/*.scss`, `src/styles/**/*.css`, `tailwind.config.*`
288
-
289
- **提取内容**:
290
- - `:root` CSS 变量(Element Plus 主题色)
291
- - `.dark` 暗色模式覆盖变量
292
- - SCSS 变量(`$--color-primary` 等)
293
- - 布局变量(侧边栏宽度、头部高度)
294
- - Element Plus 自定义主题配置
295
-
296
- **输出示例**:
297
- ```
298
- ### Element Plus 主题 Token
299
- **来源**: `src/styles/element-variables.scss`
300
- | 变量 | 值 | 用途 |
301
- |------|------|------|
302
- | --el-color-primary | #00a3e0 | 主色调 |
303
- | --el-color-primary-light-3 | #33b7e9 | 主色浅 3 |
304
- | --el-color-primary-light-5 | #80cdef | 主色浅 5 |
305
- | --el-color-primary-light-7 | #b3e4f5 | 主色浅 7 |
306
- | --el-color-primary-light-9 | #e6f6fb | 主色浅 9 |
307
- | --el-color-success | #67c23a | 成功 |
308
- | --el-color-warning | #e6a23c | 警告 |
309
- | --el-color-danger | #f56c6c | 危险 |
310
- | --el-color-info | #909399 | 信息 |
311
- | --el-bg-color | #ffffff | 背景色 |
312
- | --el-text-color-primary | #303133 | 主文本色 |
313
-
314
- ### 布局变量
315
- **来源**: `src/styles/variables.module.scss`
316
- | 变量 | 值 | 用途 |
317
- |------|------|------|
318
- | $sideBarWidth | 210px | 侧边栏展开宽度 |
319
- | $sideBarCollapsedWidth | 64px | 侧边栏折叠宽度 |
320
- | $navbarHeight | 50px | 顶部导航栏高度 |
321
- | $tagsViewHeight | 34px | 标签栏高度 |
322
-
323
- ### 暗色模式
324
- **切换方式**: `<el-switch>` 切换 `html.dark` class
325
- **覆盖文件**: `src/styles/dark.scss`
326
- ```
327
-
328
- ## 输出模板
329
-
330
- ### COMPONENT.md 章节结构(Vue 特有)
331
-
332
- ```markdown
333
- # 组件文档
334
-
335
- ## 页面组件(Views)
336
- 按路由分组的页面组件,每个包含:
337
- - 路径 + 对应路由
338
- - Template 分析(使用的 UI 组件、条件/列表渲染)
339
- - Script Setup 分析(Props、Emits、响应式变量、生命周期)
340
- - 使用的 composables / store / API
341
-
342
- ## 通用组件(Components)
343
- 按功能分组的可复用组件
344
-
345
- ## Composables
346
- 可复用的组合式函数
347
-
348
- ## Store 详解
349
- 每个 Store 的完整文档(State/Getters/Actions/依赖关系)
350
-
351
- ## 路由详解
352
- 路由结构 + 守卫 + 动态加载机制
353
- ```
354
-
355
- ## 模块边界识别
356
-
357
- 以下目录模式下的每个子目录视为独立模块(L2+ 分析时生成 MODULE-DOC.md):
358
-
359
- | 层 | 扫描路径 | 模块判定规则 | MODULE-DOC slug 来源 |
360
- |----|----------|-------------|---------------------|
361
- | 页面/视图层 | `src/views/{module}/` | 每个子目录 | 目录名 kebab-case |
362
- | API/服务层 | `src/api/{module}/` | 每个子目录 | 目录名 kebab-case |
363
- | 状态管理层 | `src/store/modules/` | 每个子目录 | 目录名 kebab-case |
364
- | 组件层 | `src/components/{name}/` | 3+ 文件的子目录 | 目录名 kebab-case |
365
- | Composables 层 | `src/composables/` | 每个文件 | 文件名去后缀 kebab-case |
366
-
367
- **不视为独立模块的情况**:
368
- - 单文件入口(如 `main.ts`, `App.vue`, `index.ts`)
369
- - 纯导出桶文件(`index.ts` 仅有 re-export)
370
- - 工具函数目录(`utils/`, `helpers/`)— 合并为一个模块
371
-
372
- ## Token 管理
373
-
374
- - 每个子任务分析 ≤10 个 `.vue` 文件
375
- - `.vue` 文件同时分析 template + script + style 三段
376
- - Store 文件单独分组分析
377
- - API 模块单独分组分析
378
- - 样式文件单独分组分析