@deepstorm/cli 0.11.0 → 0.11.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/README.md +8 -8
- package/dist/build-registry.js +11 -5
- package/dist/cli.js +839 -585
- package/dist/mcp/code-hosting/github.json +14 -1
- package/dist/mcp/docs-reference/context7.json +1 -10
- package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-read/SKILL.md +8 -5
- package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-write/SKILL.md +10 -8
- package/dist/mcp-skills/deepstorm-mcp-figma-read/SKILL.md +21 -20
- package/dist/mcp-skills/deepstorm-mcp-github-read/SKILL.md +17 -17
- package/dist/mcp-skills/deepstorm-mcp-github-write/SKILL.md +20 -20
- package/dist/mcp-skills/deepstorm-mcp-jira-read/SKILL.md +8 -8
- package/dist/mcp-skills/deepstorm-mcp-jira-write/SKILL.md +13 -12
- package/dist/mcp-skills/deepstorm-mcp-playwright-read/SKILL.md +10 -10
- package/dist/skills/atoll-ops/SKILL.md +4 -0
- package/dist/skills/reef-commit/SKILL.md +9 -5
- package/dist/skills/reef-commit/scripts/branch-check.mjs +5 -11
- package/dist/skills/reef-commit/scripts/check-openspec-status.mjs +6 -12
- package/dist/skills/reef-commit/scripts/collect-git-context.mjs +13 -11
- package/dist/skills/reef-gen-backend/variants/java/steps.md +7 -7
- package/dist/skills/reef-gen-backend/variants/nodejs/steps.md +7 -7
- package/dist/skills/reef-gen-backend/variants/python/steps.md +7 -7
- package/dist/skills/reef-gen-frontend/variants/angular/steps.md +5 -5
- package/dist/skills/reef-gen-frontend/variants/react/steps.md +6 -6
- package/dist/skills/reef-gen-frontend/variants/vue/steps.md +6 -6
- package/dist/skills/reef-harden/EXAMPLES.md +12 -10
- package/dist/skills/reef-harden/SKILL.md +6 -0
- package/dist/skills/reef-harden/scripts/find-change-dir.mjs +13 -13
- package/dist/skills/reef-pr/SKILL.md +7 -0
- package/dist/skills/reef-pr/scripts/create-pr.mjs +31 -29
- package/dist/skills/reef-scope/SKILL.md +6 -6
- package/dist/skills/reef-start/references/jira-start-subagent.md +7 -7
- package/dist/skills/reef-start/references/risk-routing-card.md +28 -25
- package/dist/skills/reef-start/references/stage-4-implementation.md +33 -21
- package/dist/skills/reef-start/references/superpowers-gate.md +9 -9
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/structured-output.md +2 -2
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/quick-reference.md +11 -0
- package/dist/skills/reef-style-backend/fragments/java/api-spec/jackson-polymorphism.md +36 -40
- package/dist/skills/reef-style-backend/fragments/java/api-spec/quick-reference.md +11 -10
- package/dist/skills/reef-style-backend/fragments/java/db-migration/liquibase/examples/database-migration.md +7 -7
- package/dist/skills/reef-style-backend/fragments/java/dependency-management/quick-reference.md +24 -21
- package/dist/skills/reef-style-backend/fragments/java/exception-handling/examples/error-code-enum.md +7 -7
- package/dist/skills/reef-style-backend/fragments/java/exception-handling/quick-reference.md +10 -8
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/dto-mapper.md +2 -2
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/service-entity.md +5 -5
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/testing.md +1 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/quick-reference.md +12 -12
- package/dist/skills/reef-style-backend/fragments/java/orm/hibernate/quick-reference.md +13 -12
- package/dist/skills/reef-style-backend/fragments/java/security-redlines/quick-reference.md +11 -9
- package/dist/skills/reef-style-backend/fragments/java/test/data-jpa-test/quick-reference.md +7 -7
- package/dist/skills/reef-style-backend/fragments/java/test/junit5/quick-reference.md +6 -6
- package/dist/skills/reef-style-backend/fragments/java/test/spring-mvc-test/quick-reference.md +8 -8
- package/dist/skills/reef-style-backend/fragments/java/test/spring-service-test/quick-reference.md +8 -7
- package/dist/skills/reef-style-backend/fragments/nodejs/eslint-config.json +1 -4
- package/dist/skills/reef-style-backend/fragments/nodejs/nestjs-structure.md +9 -9
- package/dist/skills/reef-style-backend/fragments/python/alembic-migration/quick-reference.md +2 -1
- package/dist/skills/reef-style-backend/fragments/python/api-spec/quick-reference.md +10 -10
- package/dist/skills/reef-style-backend/fragments/python/dependency-management/quick-reference.md +24 -22
- package/dist/skills/reef-style-backend/fragments/python/exception-handling/quick-reference.md +10 -9
- package/dist/skills/reef-style-backend/fragments/python/fastapi-quick-reference/quick-reference.md +3 -0
- package/dist/skills/reef-style-backend/fragments/python/langchain/quick-reference.md +10 -7
- package/dist/skills/reef-style-backend/fragments/python/pytest-testing/quick-reference.md +2 -0
- package/dist/skills/reef-style-backend/fragments/python/ruff-mypy-toolchain/quick-reference.md +2 -0
- package/dist/skills/reef-style-backend/fragments/python/security-redlines/quick-reference.md +11 -9
- package/dist/skills/reef-style-backend/fragments/python/sqlalchemy-orm/quick-reference.md +3 -0
- package/dist/skills/reef-style-backend/variants/java/examples/code-wrapping.md +3 -4
- package/dist/skills/reef-style-backend/variants/java/quick-reference.md +31 -29
- package/dist/skills/reef-style-backend/variants/nodejs/examples/module-example.md +2 -8
- package/dist/skills/reef-style-backend/variants/nodejs/quick-reference.md +35 -36
- package/dist/skills/reef-style-backend/variants/python/quick-reference.md +32 -31
- package/dist/skills/reef-style-frontend/fragments/css/tailwind/quick-reference.md +9 -7
- package/dist/skills/reef-style-frontend/fragments/test/vitest/examples/testing.md +9 -4
- package/dist/skills/reef-style-frontend/fragments/test/vitest/quick-reference.md +4 -4
- package/dist/skills/reef-style-frontend/fragments/test/vitest-react/examples/testing.md +135 -140
- package/dist/skills/reef-style-frontend/fragments/test/vitest-react/quick-reference.md +32 -32
- package/dist/skills/reef-style-frontend/fragments/test/vitest-vue/examples/testing.md +161 -162
- package/dist/skills/reef-style-frontend/fragments/test/vitest-vue/quick-reference.md +42 -42
- package/dist/skills/reef-style-frontend/fragments/ts-config/strict/quick-reference.md +16 -10
- package/dist/skills/reef-style-frontend/fragments/ui-lib/antd/examples/ui-components.md +72 -87
- package/dist/skills/reef-style-frontend/fragments/ui-lib/antd/quick-reference.md +14 -10
- package/dist/skills/reef-style-frontend/fragments/ui-lib/antd-vue/examples/ui-components.md +93 -111
- package/dist/skills/reef-style-frontend/fragments/ui-lib/antd-vue/quick-reference.md +29 -33
- package/dist/skills/reef-style-frontend/fragments/ui-lib/primeng/examples/ui-components.md +14 -23
- package/dist/skills/reef-style-frontend/variants/angular/examples/code-wrapping.md +15 -17
- package/dist/skills/reef-style-frontend/variants/angular/examples/component-types-pipes.md +22 -5
- package/dist/skills/reef-style-frontend/variants/angular/examples/entity-types.md +52 -22
- package/dist/skills/reef-style-frontend/variants/angular/examples/forms-layer.md +17 -20
- package/dist/skills/reef-style-frontend/variants/angular/examples/service-routing.md +8 -11
- package/dist/skills/reef-style-frontend/variants/angular/quick-reference.md +27 -27
- package/dist/skills/reef-style-frontend/variants/react/examples/code-wrapping.md +14 -27
- package/dist/skills/reef-style-frontend/variants/react/examples/component-types-pipes.md +45 -52
- package/dist/skills/reef-style-frontend/variants/react/examples/entity-types.md +44 -44
- package/dist/skills/reef-style-frontend/variants/react/examples/forms-layer.md +56 -85
- package/dist/skills/reef-style-frontend/variants/react/examples/service-routing.md +114 -88
- package/dist/skills/reef-style-frontend/variants/react/quick-reference.md +48 -42
- package/dist/skills/reef-style-frontend/variants/vue/examples/code-wrapping.md +24 -43
- package/dist/skills/reef-style-frontend/variants/vue/examples/component-types-pipes.md +48 -49
- package/dist/skills/reef-style-frontend/variants/vue/examples/entity-types.md +45 -45
- package/dist/skills/reef-style-frontend/variants/vue/examples/forms-layer.md +64 -68
- package/dist/skills/reef-style-frontend/variants/vue/examples/service-routing.md +85 -84
- package/dist/skills/reef-style-frontend/variants/vue/quick-reference.md +46 -51
- package/dist/skills/reef-testcase/SKILL.md +19 -19
- package/dist/skills/reef-testcase/references/coverage-dimensions.md +8 -0
- package/dist/skills/reef-testcase/references/test-case-template.md +16 -16
- package/dist/skills/sweep-explore/SKILL.md +129 -100
- package/dist/skills/sweep-explore/references/explore-flow-template.md +9 -9
- package/dist/skills/sweep-init/SKILL.md +4 -0
- package/dist/skills/sweep-init/scripts/flow-selector.mjs +6 -11
- package/dist/skills/sweep-init/scripts/init-project.mjs +68 -51
- package/dist/skills/sweep-plan/references/test-flow-template.md +12 -6
- package/dist/skills/sweep-record/SKILL.md +38 -15
- package/dist/skills/sweep-run/SKILL.md +59 -50
- package/dist/skills/sweep-run/scripts/env-manager.mjs +4 -5
- package/dist/skills/sweep-run/scripts/flow-parser.mjs +7 -6
- package/dist/skills/sweep-run/scripts/flow-selector.mjs +4 -15
- package/dist/skills/sweep-run/scripts/generate-report.mjs +1 -2
- package/dist/skills/sweep-run/scripts/mcp-manager.mjs +107 -14
- package/dist/skills/sweep-run/scripts/spec-compiler.mjs +19 -9
- package/dist/skills/tide-discuss/references/checklists.md +32 -32
- package/dist/skills/tide-discuss/references/data-format.md +85 -77
- package/dist/skills/tide-discuss/references/prd-template.md +21 -19
- package/dist/skills/tide-discuss/references/publish-flow.md +30 -11
- package/dist/skills/tide-discuss/references/role-prompts.md +5 -5
- package/package.json +4 -3
|
@@ -14,12 +14,14 @@ deepstorm:
|
|
|
14
14
|
## 适用场景
|
|
15
15
|
|
|
16
16
|
**何时使用:**
|
|
17
|
+
|
|
17
18
|
- 已有线上运行的系统,但缺乏需求文档/PRD
|
|
18
19
|
- 想为遗留系统添加 E2E 测试覆盖
|
|
19
20
|
- 团队接手一个不熟悉的新项目,想快速理解其功能结构
|
|
20
21
|
- 需要为大型系统按模块逐步添加测试,而非一次性覆盖
|
|
21
22
|
|
|
22
23
|
**何时不使用:**
|
|
24
|
+
|
|
23
25
|
- 已有完善的需求文档 → 请使用 `/sweep-plan`(正向流程)
|
|
24
26
|
- 已有现成的 .flow.md 和测试脚本 → 无需再次生成
|
|
25
27
|
- 非主流前端框架(如 Svelte、Solid.js、Preact 等),暂不支持
|
|
@@ -46,13 +48,13 @@ flowchart LR
|
|
|
46
48
|
|
|
47
49
|
## 使用方式
|
|
48
50
|
|
|
49
|
-
| 方式
|
|
50
|
-
|
|
51
|
-
| **直接启动**
|
|
52
|
-
| **指定项目路径** | `/sweep-explore path=../my-app` → 分析指定路径的前端项目
|
|
53
|
-
| **指定框架**
|
|
54
|
-
| **指定模块**
|
|
55
|
-
| **增量模式**
|
|
51
|
+
| 方式 | 说明 |
|
|
52
|
+
| ---------------- | -------------------------------------------------------------------------- |
|
|
53
|
+
| **直接启动** | `/sweep-explore` → 自动检测框架并进入探索流程 |
|
|
54
|
+
| **指定项目路径** | `/sweep-explore path=../my-app` → 分析指定路径的前端项目 |
|
|
55
|
+
| **指定框架** | `/sweep-explore framework=react` → 跳过框架检测,按指定框架分析 |
|
|
56
|
+
| **指定模块** | `/sweep-explore module=user-management` → 跳过阶段零和一,直接分析指定模块 |
|
|
57
|
+
| **增量模式** | `/sweep-explore incremental` → 只分析新增模块 |
|
|
56
58
|
|
|
57
59
|
---
|
|
58
60
|
|
|
@@ -69,12 +71,12 @@ flowchart LR
|
|
|
69
71
|
cat package.json | grep -E '"react"|"@angular/core"|"vue"|"vue-router"|"react-router-dom"' 2>/dev/null
|
|
70
72
|
```
|
|
71
73
|
|
|
72
|
-
| 框架
|
|
73
|
-
|
|
74
|
-
| **React**
|
|
75
|
-
| **Angular** | `@angular/core` + `@angular/router`
|
|
76
|
-
| **Vue 3**
|
|
77
|
-
| **Vue 2**
|
|
74
|
+
| 框架 | 关键依赖 | 特征文件 | 路由方案 |
|
|
75
|
+
| ----------- | --------------------------------------------- | ---------------------- | ------------------ |
|
|
76
|
+
| **React** | `react` + `react-router-dom` / `react-router` | `.jsx` / `.tsx` | React Router v5/v6 |
|
|
77
|
+
| **Angular** | `@angular/core` + `@angular/router` | `@Component` 装饰器 | Angular Router |
|
|
78
|
+
| **Vue 3** | `vue` (3.x) + `vue-router` (4.x) | `.vue` Composition API | vue-router 4 |
|
|
79
|
+
| **Vue 2** | `vue` (2.x) + `vue-router` (3.x) | `.vue` Options API | vue-router 3 |
|
|
78
80
|
|
|
79
81
|
### 降级策略
|
|
80
82
|
|
|
@@ -82,9 +84,9 @@ cat package.json | grep -E '"react"|"@angular/core"|"vue"|"vue-router"|"react-ro
|
|
|
82
84
|
|
|
83
85
|
1. 扫描 `.jsx` / `.tsx` 文件 → 很可能为 React
|
|
84
86
|
2. 扫描 `.vue` 文件 → 很可能为 Vue
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
87
|
+
3. 扫描 `@Component` / `@Injectable` 装饰器 → 很可能为 Angular
|
|
88
|
+
4. 对每种可能框架都尝试分析路由,命中最多的结果作为框架推断
|
|
89
|
+
5. 输出检测结果供用户确认
|
|
88
90
|
|
|
89
91
|
```
|
|
90
92
|
🔍 框架检测结果:
|
|
@@ -121,14 +123,15 @@ flowchart TD
|
|
|
121
123
|
|
|
122
124
|
**常见配置文件:**
|
|
123
125
|
|
|
124
|
-
| 文件路径
|
|
125
|
-
|
|
126
|
-
| `src/routes.tsx` / `src/routes.ts` | v5/v6
|
|
127
|
-
| `src/router/index.tsx`
|
|
128
|
-
| `src/App.tsx`
|
|
129
|
-
| `src/config/routes.ts`
|
|
126
|
+
| 文件路径 | 路由版本 | 特征 API |
|
|
127
|
+
| ---------------------------------- | -------- | -------------------------------------------- |
|
|
128
|
+
| `src/routes.tsx` / `src/routes.ts` | v5/v6 | `<Routes>`, `<Route>`, `createBrowserRouter` |
|
|
129
|
+
| `src/router/index.tsx` | v6 | `createBrowserRouter`, `RouterProvider` |
|
|
130
|
+
| `src/App.tsx` | v5/v6 | 内联 `<Switch>` / `<Routes>` |
|
|
131
|
+
| `src/config/routes.ts` | v5 | 对象数组 + `<Route>` 渲染 |
|
|
130
132
|
|
|
131
133
|
**分析方法:**
|
|
134
|
+
|
|
132
135
|
- 提取 `<Route path="..." element={<Component />}>` 的 path 和组件名
|
|
133
136
|
- 提取 `createBrowserRouter([{ path, element }])` 的路由配置
|
|
134
137
|
- 注意 `React.lazy(() => import(...))` 懒加载模式
|
|
@@ -138,13 +141,14 @@ flowchart TD
|
|
|
138
141
|
|
|
139
142
|
**常见配置文件:**
|
|
140
143
|
|
|
141
|
-
| 文件路径
|
|
142
|
-
|
|
144
|
+
| 文件路径 | 特征 API |
|
|
145
|
+
| ------------------------------- | ------------------------------ |
|
|
143
146
|
| `src/app/app-routing.module.ts` | `RouterModule.forRoot(routes)` |
|
|
144
|
-
| `src/app/app.module.ts`
|
|
145
|
-
| `src/app/*.module.ts`
|
|
147
|
+
| `src/app/app.module.ts` | 内联路由配置 |
|
|
148
|
+
| `src/app/*.module.ts` | 各模块的路由配置 |
|
|
146
149
|
|
|
147
150
|
**分析方法:**
|
|
151
|
+
|
|
148
152
|
- 读取 `Routes` 类型数组:`{ path: 'users', component: UserListComponent }`
|
|
149
153
|
- 提取 `loadChildren: () => import('./users/users.module').then(m => m.UsersModule)` 懒加载模块
|
|
150
154
|
- 关注 `canActivate`, `canLoad` 权限守卫——这些是业务规则线索
|
|
@@ -155,12 +159,13 @@ flowchart TD
|
|
|
155
159
|
|
|
156
160
|
**常见配置文件:**
|
|
157
161
|
|
|
158
|
-
| 文件路径
|
|
159
|
-
|
|
160
|
-
| `src/router/index.ts`
|
|
161
|
-
| `src/router/routes.ts` | 单独的路由配置数组
|
|
162
|
+
| 文件路径 | 特征 API |
|
|
163
|
+
| ---------------------- | -------------------------- |
|
|
164
|
+
| `src/router/index.ts` | `createRouter({ routes })` |
|
|
165
|
+
| `src/router/routes.ts` | 单独的路由配置数组 |
|
|
162
166
|
|
|
163
167
|
**分析方法:**
|
|
168
|
+
|
|
164
169
|
- 读取 `createRouter` 的 `routes` 数组
|
|
165
170
|
- 提取 `{ path, name, component }` 配置
|
|
166
171
|
- 注意 `() => import('@/views/...')` 懒加载模式
|
|
@@ -170,12 +175,13 @@ flowchart TD
|
|
|
170
175
|
|
|
171
176
|
**常见配置文件:**
|
|
172
177
|
|
|
173
|
-
| 文件路径
|
|
174
|
-
|
|
178
|
+
| 文件路径 | 特征 API |
|
|
179
|
+
| --------------------- | --------------------------- |
|
|
175
180
|
| `src/router/index.js` | `new VueRouter({ routes })` |
|
|
176
181
|
| `src/router/index.ts` | `new VueRouter({ routes })` |
|
|
177
182
|
|
|
178
183
|
**分析方法:**
|
|
184
|
+
|
|
179
185
|
- 读取 `new VueRouter({ routes })` 配置
|
|
180
186
|
- 与 Vue 3 类似,使用 `() => import(...)` 懒加载
|
|
181
187
|
- `children` 嵌套路由表示父子模块
|
|
@@ -200,12 +206,12 @@ find src -name "*.ts" -o -name "*.js" | xargs grep -l "new VueRouter\|new Router
|
|
|
200
206
|
|
|
201
207
|
根据检测到的框架,查找对应的导航/菜单组件:
|
|
202
208
|
|
|
203
|
-
| 框架
|
|
204
|
-
|
|
205
|
-
| **React**
|
|
206
|
-
| **Angular** | Angular Material Sidenav, PrimeNG Menu
|
|
207
|
-
| **Vue 3**
|
|
208
|
-
| **Vue 2**
|
|
209
|
+
| 框架 | 常见组件/库 | 查找关键词 |
|
|
210
|
+
| ----------- | ----------------------------------------- | ----------------------------------------- |
|
|
211
|
+
| **React** | Ant Design Menu, Material UI List/Sidebar | `Menu`, `Sidebar`, `Sider`, `Nav` |
|
|
212
|
+
| **Angular** | Angular Material Sidenav, PrimeNG Menu | `mat-sidenav`, `p-menu`, `nav`, `sidebar` |
|
|
213
|
+
| **Vue 3** | Element Plus Menu, Naive UI Menu | `el-menu`, `n-menu`, `Sidebar` |
|
|
214
|
+
| **Vue 2** | Element UI NavMenu, iView Menu | `el-menu`, `i-menu`, `NavMenu` |
|
|
209
215
|
|
|
210
216
|
**分析查找:**
|
|
211
217
|
|
|
@@ -223,14 +229,15 @@ find src -name "*.vue" | xargs grep -l "el-menu\|n-menu\|sidebar\|Sidebar" 2>/de
|
|
|
223
229
|
|
|
224
230
|
**菜单组织方式:**
|
|
225
231
|
|
|
226
|
-
| 方式
|
|
227
|
-
|
|
228
|
-
| 硬编码 UI | 组件内直接写菜单项(如 `<el-menu-item>用户管理</el-menu-item>`)
|
|
229
|
-
| 配置驱动
|
|
230
|
-
| 后端返回
|
|
231
|
-
| 权限过滤
|
|
232
|
+
| 方式 | 说明 |
|
|
233
|
+
| --------- | -------------------------------------------------------------------------- |
|
|
234
|
+
| 硬编码 UI | 组件内直接写菜单项(如 `<el-menu-item>用户管理</el-menu-item>`) |
|
|
235
|
+
| 配置驱动 | 菜单数据与渲染分离,如 `menuConfig: { label: '用户管理', path: '/users' }` |
|
|
236
|
+
| 后端返回 | 菜单由 API 动态返回(`fetchMenu()` 后渲染) |
|
|
237
|
+
| 权限过滤 | 菜单项按角色/权限条件渲染 |
|
|
232
238
|
|
|
233
239
|
**分析要点:**
|
|
240
|
+
|
|
234
241
|
- 菜单项的 label 是业务模块名称的第一手来源
|
|
235
242
|
- 菜单层级组织反映模块的父子关系(如 系统管理 → 用户管理)
|
|
236
243
|
- 注意 `v-if` / `*ngIf` / 条件渲染的菜单——按角色/权限控制是重要线索
|
|
@@ -240,11 +247,11 @@ find src -name "*.vue" | xargs grep -l "el-menu\|n-menu\|sidebar\|Sidebar" 2>/de
|
|
|
240
247
|
|
|
241
248
|
当路由和菜单信息不足时,通过目录结构辅助判断。不同框架的页面目录命名习惯:
|
|
242
249
|
|
|
243
|
-
| 框架
|
|
244
|
-
|
|
245
|
-
| **React**
|
|
246
|
-
| **Angular** | `src/app/`(每个模块一个目录)
|
|
247
|
-
| **Vue**
|
|
250
|
+
| 框架 | 常见页面目录 | 页面文件扩展名 |
|
|
251
|
+
| ----------- | ----------------------------------------- | -------------------------------- |
|
|
252
|
+
| **React** | `src/pages/`, `src/views/`, `src/routes/` | `.tsx`, `.jsx` |
|
|
253
|
+
| **Angular** | `src/app/`(每个模块一个目录) | `.ts`(组件类)+ `.html`(模板) |
|
|
254
|
+
| **Vue** | `src/views/`, `src/pages/` | `.vue`(单文件组件) |
|
|
248
255
|
|
|
249
256
|
**示例——视图目录结构(React/Vue):**
|
|
250
257
|
|
|
@@ -282,6 +289,7 @@ src/app/
|
|
|
282
289
|
```
|
|
283
290
|
|
|
284
291
|
**组合推断规则:**
|
|
292
|
+
|
|
285
293
|
- 路由 path + 组件名 + 目录名 → 互相印证,取多数一致的结果
|
|
286
294
|
- 路由不足以确定模块归属时,以菜单结构为准(菜单反映业务组织)
|
|
287
295
|
- 路由和菜单都没有时,使用目录结构并标注"推测"
|
|
@@ -319,12 +327,12 @@ src/app/
|
|
|
319
327
|
|
|
320
328
|
```
|
|
321
329
|
⚠️ 系统无法自动发现功能模块。
|
|
322
|
-
|
|
330
|
+
|
|
323
331
|
可能原因:
|
|
324
332
|
- 路由配置方式非标准(如动态路由、后端下发路由)
|
|
325
333
|
- 菜单由后端动态返回,前端无静态配置
|
|
326
334
|
- 项目结构不符合常见约定
|
|
327
|
-
|
|
335
|
+
|
|
328
336
|
建议操作:
|
|
329
337
|
1. 手动输入模块名称,系统将按目录结构分析
|
|
330
338
|
2. 检查路由配置后重新运行
|
|
@@ -359,23 +367,27 @@ flowchart TD
|
|
|
359
367
|
针对选定模块的入口页面组件,按框架特性分析子组件关系。
|
|
360
368
|
|
|
361
369
|
**通用分析方法:**
|
|
370
|
+
|
|
362
371
|
1. 读取页面组件的代码
|
|
363
372
|
2. 查看 import / 引用语句,识别子组件
|
|
364
373
|
3. 跟踪子组件文件,理解其功能
|
|
365
374
|
4. 从组件命名推断业务功能
|
|
366
375
|
|
|
367
376
|
**React 组件分析:**
|
|
377
|
+
|
|
368
378
|
- 查看 JSX 中使用的子组件标签:`<UserTable>`, `<CreateUserModal>`
|
|
369
379
|
- 从 import 语句追踪组件路径:`import CreateUserModal from './modals/CreateUserModal'`
|
|
370
380
|
- 注意 `React.lazy` 和动态导入
|
|
371
381
|
|
|
372
382
|
**Angular 组件分析:**
|
|
383
|
+
|
|
373
384
|
- 查看模板(`.html`)中的选择器标签:`<app-user-table>`, `<app-create-user-modal>`
|
|
374
385
|
- 从模块装饰器 `declarations` / `imports` 中查找组件注册
|
|
375
386
|
- 注意 `@Input()` / `@Output()` 数据流接口
|
|
376
387
|
- 留意 `*ngIf`, `*ngFor` 等结构性指令中的业务逻辑
|
|
377
388
|
|
|
378
389
|
**Vue 组件分析:**
|
|
390
|
+
|
|
379
391
|
- 查看 `.vue` 文件中 `<template>` 段的子组件标签
|
|
380
392
|
- 从 `<script>` 段的 `import` / `components` 注册中追踪组件
|
|
381
393
|
- 注意 `v-if`, `v-for` 中的业务逻辑
|
|
@@ -396,34 +408,38 @@ flowchart TD
|
|
|
396
408
|
|
|
397
409
|
**组件命名约定——常见推断模式(跨框架通用):**
|
|
398
410
|
|
|
399
|
-
| 组件名模式
|
|
400
|
-
|
|
401
|
-
| `*List*`, `*Table*`, `*Grid*`
|
|
402
|
-
| `*Create*`, `*Add*`, `*New*`
|
|
403
|
-
| `*Edit*`, `*Update*`, `*Form*`
|
|
404
|
-
| `*Delete*`, `*Remove*`
|
|
405
|
-
| `*Detail*`, `*View*`
|
|
406
|
-
| `*Modal*`, `*Dialog*`, `*Drawer*`
|
|
407
|
-
| `*Import*`, `*Upload*`
|
|
408
|
-
| `*Export*`, `*Download*`
|
|
409
|
-
| `*Approve*`, `*Reject*`, `*Audit*` | 审批/审核
|
|
410
|
-
| `*Setting*`, `*Config*`
|
|
411
|
-
| `*Chart*`, `*Stat*`, `*Dashboard*` | 数据统计
|
|
411
|
+
| 组件名模式 | 推断的业务功能 |
|
|
412
|
+
| ---------------------------------- | ------------------ |
|
|
413
|
+
| `*List*`, `*Table*`, `*Grid*` | 列表查看/搜索/分页 |
|
|
414
|
+
| `*Create*`, `*Add*`, `*New*` | 新增创建 |
|
|
415
|
+
| `*Edit*`, `*Update*`, `*Form*` | 编辑修改 |
|
|
416
|
+
| `*Delete*`, `*Remove*` | 删除操作 |
|
|
417
|
+
| `*Detail*`, `*View*` | 详情查看 |
|
|
418
|
+
| `*Modal*`, `*Dialog*`, `*Drawer*` | 弹窗表单 |
|
|
419
|
+
| `*Import*`, `*Upload*` | 数据导入 |
|
|
420
|
+
| `*Export*`, `*Download*` | 数据导出 |
|
|
421
|
+
| `*Approve*`, `*Reject*`, `*Audit*` | 审批/审核 |
|
|
422
|
+
| `*Setting*`, `*Config*` | 配置管理 |
|
|
423
|
+
| `*Chart*`, `*Stat*`, `*Dashboard*` | 数据统计 |
|
|
412
424
|
|
|
413
425
|
### 2.2 识别 CRUD 流程
|
|
414
426
|
|
|
415
427
|
根据组件组合推断标准 CRUD 业务流程:
|
|
416
428
|
|
|
417
429
|
**列表流程(Read):**
|
|
430
|
+
|
|
418
431
|
- 页面进入时调用列表 API → 展示分页表格 → 搜索/筛选 → 重新查询
|
|
419
432
|
|
|
420
433
|
**创建流程(Create):**
|
|
434
|
+
|
|
421
435
|
- 点击"新增"按钮 → 打开创建弹窗/页面 → 填写表单 → 提交 → 成功后关闭/刷新列表
|
|
422
436
|
|
|
423
437
|
**编辑流程(Update):**
|
|
438
|
+
|
|
424
439
|
- 点击列表中的"编辑"操作 → 打开编辑弹窗/页面 → 预填数据 → 修改表单 → 提交 → 刷新列表
|
|
425
440
|
|
|
426
441
|
**删除流程(Delete):**
|
|
442
|
+
|
|
427
443
|
- 点击删除操作 → 弹出确认对话框 → 用户确认 → 执行删除 → 刷新列表
|
|
428
444
|
|
|
429
445
|
### 2.3 识别状态流转
|
|
@@ -431,6 +447,7 @@ flowchart TD
|
|
|
431
447
|
对于包含状态变更的业务流程(如审批、订单流转):
|
|
432
448
|
|
|
433
449
|
**查找线索:**
|
|
450
|
+
|
|
434
451
|
- 状态枚举/常量定义(`type OrderStatus = 'pending' | 'approved' | 'rejected'`)
|
|
435
452
|
- 状态机逻辑(`switch` / `if-else` 状态判断)
|
|
436
453
|
- 业务状态对应的操作按钮(条件渲染的 action)
|
|
@@ -440,10 +457,10 @@ flowchart TD
|
|
|
440
457
|
```typescript
|
|
441
458
|
// 状态枚举
|
|
442
459
|
enum OrderStatus {
|
|
443
|
-
PENDING = 'PENDING',
|
|
444
|
-
APPROVED = 'APPROVED',
|
|
445
|
-
REJECTED = 'REJECTED',
|
|
446
|
-
CANCELLED = 'CANCELLED',
|
|
460
|
+
PENDING = 'PENDING', // 待审核
|
|
461
|
+
APPROVED = 'APPROVED', // 已通过
|
|
462
|
+
REJECTED = 'REJECTED', // 已驳回
|
|
463
|
+
CANCELLED = 'CANCELLED', // 已取消
|
|
447
464
|
}
|
|
448
465
|
|
|
449
466
|
// 状态 → 可操作映射
|
|
@@ -451,16 +468,18 @@ const STATUS_ACTIONS = {
|
|
|
451
468
|
[OrderStatus.PENDING]: ['approve', 'reject'],
|
|
452
469
|
[OrderStatus.APPROVED]: ['view'],
|
|
453
470
|
[OrderStatus.REJECTED]: ['edit', 'delete'],
|
|
454
|
-
}
|
|
471
|
+
};
|
|
455
472
|
```
|
|
456
473
|
|
|
457
474
|
### 2.4 识别导入导出
|
|
458
475
|
|
|
459
476
|
**导入流程(Import/Upload):**
|
|
477
|
+
|
|
460
478
|
- 查找 `<input type="file">` 或 Upload/Dropzone 组件
|
|
461
479
|
- 关联的提交按钮和结果页面(导入进度、导入结果)
|
|
462
480
|
|
|
463
481
|
**导出流程(Export/Download):**
|
|
482
|
+
|
|
464
483
|
- 查找导出按钮(如 `<Button>导出</Button>`)
|
|
465
484
|
- 关联的文件格式选择、导出参数设置、下载处理
|
|
466
485
|
|
|
@@ -487,19 +506,19 @@ const STATUS_ACTIONS = {
|
|
|
487
506
|
|
|
488
507
|
```
|
|
489
508
|
⚠️ 系统无法自动推断 [模块名] 的业务流程。
|
|
490
|
-
|
|
509
|
+
|
|
491
510
|
可能原因:
|
|
492
511
|
- 组件命名不包含业务语义(如 GenericForm、MyTable)
|
|
493
512
|
- 业务逻辑通过配置驱动或后端下发
|
|
494
513
|
- 代码结构复杂,涉及跨模块引用
|
|
495
|
-
|
|
514
|
+
|
|
496
515
|
以下是该模块的组件目录结构:
|
|
497
516
|
src/modules/xxx/
|
|
498
517
|
├── components/
|
|
499
518
|
│ ├── GenericForm.vue ← 可能是表单组件
|
|
500
519
|
│ ├── DataTable.vue ← 可能是列表组件
|
|
501
520
|
│ └── ActionBar.vue ← 可能是操作按钮
|
|
502
|
-
|
|
521
|
+
|
|
503
522
|
请手动描述该模块包含哪些业务功能,例如:
|
|
504
523
|
- "用户列表查看 → 创建用户 → 编辑用户 → 删除用户"
|
|
505
524
|
- "订单列表 → 审核订单 → 导出订单"
|
|
@@ -519,11 +538,11 @@ const STATUS_ACTIONS = {
|
|
|
519
538
|
|
|
520
539
|
每个业务流程的 .flow.md 需要覆盖以下三类场景:
|
|
521
540
|
|
|
522
|
-
| 场景类型
|
|
523
|
-
|
|
524
|
-
| **正常流程** | 业务操作成功完成的路径
|
|
525
|
-
| **边界条件** | 输入边界值、空数据、极限情况
|
|
526
|
-
| **异常流程** | 必填校验、重复提交、网络超时等 | P1
|
|
541
|
+
| 场景类型 | 说明 | 优先级 |
|
|
542
|
+
| ------------ | ------------------------------ | ------ |
|
|
543
|
+
| **正常流程** | 业务操作成功完成的路径 | P0 |
|
|
544
|
+
| **边界条件** | 输入边界值、空数据、极限情况 | P1 |
|
|
545
|
+
| **异常流程** | 必填校验、重复提交、网络超时等 | P1 |
|
|
527
546
|
|
|
528
547
|
### 3.1 生成正常路径场景
|
|
529
548
|
|
|
@@ -535,11 +554,13 @@ const STATUS_ACTIONS = {
|
|
|
535
554
|
## Flow: L01 - 创建用户正常流程
|
|
536
555
|
|
|
537
556
|
### 前置条件
|
|
557
|
+
|
|
538
558
|
- 用户已登录系统
|
|
539
559
|
- 用户有「用户管理」权限
|
|
540
560
|
- 用户列表页面已加载
|
|
541
561
|
|
|
542
562
|
### 执行步骤
|
|
563
|
+
|
|
543
564
|
1. 点击"新增用户"按钮
|
|
544
565
|
✅ 验证点:弹出创建用户弹窗,表单包含用户名、邮箱、角色等字段
|
|
545
566
|
2. 填写必填字段(用户名:`testuser`、邮箱:`test@example.com`、角色:`普通用户`)
|
|
@@ -550,6 +571,7 @@ const STATUS_ACTIONS = {
|
|
|
550
571
|
✅ 验证点:搜索结果仅包含新创建的用户
|
|
551
572
|
|
|
552
573
|
### 环境要求
|
|
574
|
+
|
|
553
575
|
- 目标环境:test
|
|
554
576
|
- 所需账号:管理员权限账号
|
|
555
577
|
```
|
|
@@ -560,9 +582,11 @@ const STATUS_ACTIONS = {
|
|
|
560
582
|
## Flow: L02 - 创建用户边界条件
|
|
561
583
|
|
|
562
584
|
### 前置条件
|
|
585
|
+
|
|
563
586
|
- 用户已登录系统
|
|
564
587
|
|
|
565
588
|
### 执行步骤
|
|
589
|
+
|
|
566
590
|
1. 点击"新增用户"按钮,不填写任何字段,直接点击"保存"
|
|
567
591
|
✅ 验证点:表单校验提示必填字段错误,弹窗未关闭
|
|
568
592
|
2. 用户名输入超过最大长度的文本(如 50 个字符)
|
|
@@ -577,9 +601,11 @@ const STATUS_ACTIONS = {
|
|
|
577
601
|
## Flow: L03 - 创建用户异常场景
|
|
578
602
|
|
|
579
603
|
### 前置条件
|
|
604
|
+
|
|
580
605
|
- 用户已登录系统
|
|
581
606
|
|
|
582
607
|
### 执行步骤
|
|
608
|
+
|
|
583
609
|
1. 点击"新增用户"按钮,填写必填字段,提交前断网
|
|
584
610
|
2. 点击"保存"按钮
|
|
585
611
|
✅ 验证点:显示网络错误提示,弹窗未关闭,数据未提交
|
|
@@ -601,24 +627,27 @@ const STATUS_ACTIONS = {
|
|
|
601
627
|
|
|
602
628
|
## 场景清单
|
|
603
629
|
|
|
604
|
-
| ID
|
|
605
|
-
|
|
606
|
-
| L01 | 创建用户正常流程 | 正常流程 | P0
|
|
607
|
-
| L02 | 创建用户边界条件 | 边界条件 | P1
|
|
608
|
-
| L03 | 创建用户异常场景 | 异常场景 | P1
|
|
630
|
+
| ID | 场景 | 类型 | 优先级 |
|
|
631
|
+
| --- | ---------------- | -------- | ------ |
|
|
632
|
+
| L01 | 创建用户正常流程 | 正常流程 | P0 |
|
|
633
|
+
| L02 | 创建用户边界条件 | 边界条件 | P1 |
|
|
634
|
+
| L03 | 创建用户异常场景 | 异常场景 | P1 |
|
|
609
635
|
|
|
610
636
|
---
|
|
611
637
|
|
|
612
638
|
## Flow: L01 - 创建用户正常流程
|
|
613
639
|
|
|
614
640
|
### 前置条件
|
|
641
|
+
|
|
615
642
|
...
|
|
616
643
|
|
|
617
644
|
### 执行步骤
|
|
645
|
+
|
|
618
646
|
1. {操作步骤}
|
|
619
647
|
✅ 验证点:{预期结果}
|
|
620
648
|
|
|
621
649
|
### 环境要求
|
|
650
|
+
|
|
622
651
|
...
|
|
623
652
|
```
|
|
624
653
|
|
|
@@ -646,12 +675,12 @@ const STATUS_ACTIONS = {
|
|
|
646
675
|
|
|
647
676
|
### 4.1 .flow.md → Playwright 语义映射
|
|
648
677
|
|
|
649
|
-
| .flow.md 元素
|
|
650
|
-
|
|
651
|
-
| 前置条件
|
|
652
|
-
| 执行步骤 中的操作 | `page.locator().click()` / `.fill()` / `.selectOption()`
|
|
653
|
-
| ✅ 验证点
|
|
654
|
-
| 环境要求
|
|
678
|
+
| .flow.md 元素 | Playwright 代码 | 说明 |
|
|
679
|
+
| ----------------- | ------------------------------------------------------------- | ---------------- |
|
|
680
|
+
| 前置条件 | `test.beforeEach()` | 登录、导航到页面 |
|
|
681
|
+
| 执行步骤 中的操作 | `page.locator().click()` / `.fill()` / `.selectOption()` | 页面交互 |
|
|
682
|
+
| ✅ 验证点 | `expect().toBeVisible()` / `.toHaveText()` / `.toHaveValue()` | 断言 |
|
|
683
|
+
| 环境要求 | `baseURL` 配置 | 测试配置 |
|
|
655
684
|
|
|
656
685
|
### 4.2 生成脚本模板
|
|
657
686
|
|
|
@@ -772,13 +801,13 @@ test('L01 - 创建用户正常流程', async ({ page }) => {
|
|
|
772
801
|
|
|
773
802
|
### 命令速查
|
|
774
803
|
|
|
775
|
-
| 命令
|
|
776
|
-
|
|
777
|
-
| `/sweep-explore`
|
|
778
|
-
| `/sweep-explore module=<name>`
|
|
779
|
-
| `/sweep-explore framework=react\|angular\|vue3\|vue2` | 跳过框架检测,按指定框架执行
|
|
780
|
-
| `/sweep-explore path=<project-path>`
|
|
781
|
-
| `/sweep-explore incremental`
|
|
804
|
+
| 命令 | 说明 |
|
|
805
|
+
| ----------------------------------------------------- | -------------------------------- |
|
|
806
|
+
| `/sweep-explore` | 启动完整探索流程(阶段零 → 四) |
|
|
807
|
+
| `/sweep-explore module=<name>` | 跳过阶段零和一,直接分析指定模块 |
|
|
808
|
+
| `/sweep-explore framework=react\|angular\|vue3\|vue2` | 跳过框架检测,按指定框架执行 |
|
|
809
|
+
| `/sweep-explore path=<project-path>` | 分析指定路径的前端项目 |
|
|
810
|
+
| `/sweep-explore incremental` | 增量模式,只分析新增模块 |
|
|
782
811
|
|
|
783
812
|
### 源码分析优先级
|
|
784
813
|
|
|
@@ -788,8 +817,8 @@ test('L01 - 创建用户正常流程', async ({ page }) => {
|
|
|
788
817
|
|
|
789
818
|
### 场景类型覆盖
|
|
790
819
|
|
|
791
|
-
| 类型
|
|
792
|
-
|
|
793
|
-
| 正常流程 | 业务操作成功完成的路径
|
|
794
|
-
| 边界条件 | 空数据、极限值、特殊字符
|
|
795
|
-
| 异常场景 | 必填校验、重复提交、网络超时 | P1
|
|
820
|
+
| 类型 | 覆盖内容 | 优先级 |
|
|
821
|
+
| -------- | ---------------------------- | ------ |
|
|
822
|
+
| 正常流程 | 业务操作成功完成的路径 | P0 |
|
|
823
|
+
| 边界条件 | 空数据、极限值、特殊字符 | P1 |
|
|
824
|
+
| 异常场景 | 必填校验、重复提交、网络超时 | P1 |
|
|
@@ -7,21 +7,21 @@
|
|
|
7
7
|
|
|
8
8
|
## 模块信息
|
|
9
9
|
|
|
10
|
-
| 字段
|
|
11
|
-
|
|
|
12
|
-
| 模块名
|
|
13
|
-
| 源码路径 | {对应的前端源码目录}
|
|
10
|
+
| 字段 | 内容 |
|
|
11
|
+
| :------- | :--------------------- |
|
|
12
|
+
| 模块名 | {模块名,如 用户管理} |
|
|
13
|
+
| 源码路径 | {对应的前端源码目录} |
|
|
14
14
|
| 涉及页面 | {页面列表,以逗号分隔} |
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
18
|
## 场景清单
|
|
19
19
|
|
|
20
|
-
| ID
|
|
21
|
-
|
|
|
22
|
-
| L01 | {场景标题} | 正常流程 | P0
|
|
23
|
-
| L02 | {场景标题} | 边界条件 | P1
|
|
24
|
-
| L03 | {场景标题} | 异常场景 | P1
|
|
20
|
+
| ID | 场景 | 类型 | 优先级 |
|
|
21
|
+
| :-- | :--------- | :------- | :----- |
|
|
22
|
+
| L01 | {场景标题} | 正常流程 | P0 |
|
|
23
|
+
| L02 | {场景标题} | 边界条件 | P1 |
|
|
24
|
+
| L03 | {场景标题} | 异常场景 | P1 |
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
@@ -37,6 +37,7 @@ cat .deepstorm/settings.json 2>/dev/null | grep -o '"e2eFramework"[^,]*' | head
|
|
|
37
37
|
如果配置不存在或为空,使用默认值 `playwright` 并输出提示。
|
|
38
38
|
|
|
39
39
|
当前支持的框架:
|
|
40
|
+
|
|
40
41
|
- **playwright** — Microsoft Playwright(默认)
|
|
41
42
|
|
|
42
43
|
---
|
|
@@ -57,10 +58,12 @@ cat .deepstorm/settings.json 2>/dev/null | grep -o '"e2eFramework"[^,]*' | head
|
|
|
57
58
|
```
|
|
58
59
|
|
|
59
60
|
**如果选择 a(独立项目):**
|
|
61
|
+
|
|
60
62
|
- 设置 TARGET_DIR 为当前目录(`.`)
|
|
61
63
|
- 继续到步骤 1
|
|
62
64
|
|
|
63
65
|
**如果选择 b(混放项目):**
|
|
66
|
+
|
|
64
67
|
- 进一步询问子目录选择:
|
|
65
68
|
|
|
66
69
|
```
|
|
@@ -114,6 +117,7 @@ node packages/sweep/skills/sweep-init/scripts/init-project.mjs \
|
|
|
114
117
|
```
|
|
115
118
|
|
|
116
119
|
脚本会自动:
|
|
120
|
+
|
|
117
121
|
- 创建 `flows/`、`flows/reports/`、`scripts/` 目录
|
|
118
122
|
- 生成 `package.json`(含框架对应依赖)、`tsconfig.json`、`playwright.config.ts`(仅 playwright)
|
|
119
123
|
- 不覆盖已有的 `topology.yaml`
|
|
@@ -88,14 +88,10 @@ export function resolveFlowFile(modulePath, flowsDir = BASE_FLOWS_DIR) {
|
|
|
88
88
|
|
|
89
89
|
const parts = modulePath.split('/');
|
|
90
90
|
const leafName = parts[parts.length - 1];
|
|
91
|
-
const parentDir = parts.length > 1
|
|
92
|
-
? join(flowsDir, parts.slice(0, -1).join('/'))
|
|
93
|
-
: flowsDir;
|
|
91
|
+
const parentDir = parts.length > 1 ? join(flowsDir, parts.slice(0, -1).join('/')) : flowsDir;
|
|
94
92
|
if (existsSync(parentDir)) {
|
|
95
93
|
const files = readdirSync(parentDir);
|
|
96
|
-
const found = files.find(
|
|
97
|
-
(f) => f.endsWith('.flow.md') && f.toLowerCase().includes(leafName.toLowerCase())
|
|
98
|
-
);
|
|
94
|
+
const found = files.find((f) => f.endsWith('.flow.md') && f.toLowerCase().includes(leafName.toLowerCase()));
|
|
99
95
|
if (found) return join(parentDir, found);
|
|
100
96
|
}
|
|
101
97
|
|
|
@@ -187,7 +183,9 @@ export function normalizeSelection(answer) {
|
|
|
187
183
|
if (!fileMap.has(file)) fileMap.set(file, []);
|
|
188
184
|
const flows = fileMap.get(file);
|
|
189
185
|
if (!flows.includes(flowId)) flows.push(flowId);
|
|
190
|
-
} catch {
|
|
186
|
+
} catch {
|
|
187
|
+
/* ignore */
|
|
188
|
+
}
|
|
191
189
|
}
|
|
192
190
|
}
|
|
193
191
|
|
|
@@ -278,10 +276,7 @@ async function main() {
|
|
|
278
276
|
}
|
|
279
277
|
}
|
|
280
278
|
|
|
281
|
-
choices = [
|
|
282
|
-
{ name: '📋 全部执行', value: '__all__' },
|
|
283
|
-
...choices,
|
|
284
|
-
];
|
|
279
|
+
choices = [{ name: '📋 全部执行', value: '__all__' }, ...choices];
|
|
285
280
|
|
|
286
281
|
const { default: checkbox } = await import('@inquirer/checkbox');
|
|
287
282
|
const answer = await checkbox({
|