@modus-ai/modus 0.2.10 → 0.2.11
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/dist/commands/init.d.ts +2 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +19 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/generators/codebuddy.d.ts.map +1 -1
- package/dist/generators/codebuddy.js +10 -2
- package/dist/generators/codebuddy.js.map +1 -1
- package/dist/generators/continue.d.ts +16 -0
- package/dist/generators/continue.d.ts.map +1 -0
- package/dist/generators/continue.js +435 -0
- package/dist/generators/continue.js.map +1 -0
- package/dist/generators/cursor.d.ts.map +1 -1
- package/dist/generators/cursor.js +7 -1
- package/dist/generators/cursor.js.map +1 -1
- package/dist/generators/custom.d.ts.map +1 -1
- package/dist/generators/custom.js +8 -1
- package/dist/generators/custom.js.map +1 -1
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +4 -0
- package/dist/generators/index.js.map +1 -1
- package/dist/utils/config.d.ts +20 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/file-system.d.ts +16 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +40 -0
- package/dist/utils/file-system.js.map +1 -1
- package/package.json +1 -1
- package/templates/skills/modus-init/SKILL.md +274 -768
- package/templates/skills/modus-init/shared/frontmatter-spec.md +255 -0
- package/templates/skills/modus-init/shared/stack-detection.md +144 -0
- package/templates/skills/modus-init/shared/universal-skill-format.md +362 -0
- package/templates/skills/modus-init/strategies/fallback-init.md +150 -0
- package/templates/skills/modus-init/strategies/frontend-init.md +298 -0
- package/templates/skills/modus-init/strategies/java-init.md +278 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Frontend Strategy — React / Vue / Next / Nuxt 项目扫描与 Skill 生成
|
|
3
|
+
parent_skill: modus-init
|
|
4
|
+
load_when: "Router SKILL.md 在 Step 0.5 检测到 primaryStack=frontend-react / frontend-vue / frontend-other 时加载"
|
|
5
|
+
stack: frontend-react | frontend-vue | frontend-other
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Frontend Strategy(React / Vue / Next / Nuxt / Vite)
|
|
9
|
+
|
|
10
|
+
> 当 Router 在 Step 0.5 检测到 `primaryStack` 以 `frontend-` 开头时加载本文档。
|
|
11
|
+
> - **§3** React 子流程(`primaryStack=frontend-react`)
|
|
12
|
+
> - **§4** Vue 子流程(`primaryStack=frontend-vue`)
|
|
13
|
+
> - **§5** 其他/通用前端(`primaryStack=frontend-other`,包含 Svelte / Angular / 纯 JS 等)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## §1 适用范围
|
|
18
|
+
|
|
19
|
+
| 信号(package.json deps) | 适用子流程 |
|
|
20
|
+
|------|---------|
|
|
21
|
+
| `react` / `next` / `@remix-run/react` / `vite + react` | §3 React |
|
|
22
|
+
| `vue` / `@vue/cli` / `nuxt` / `nuxt3` | §4 Vue |
|
|
23
|
+
| `svelte` / `@angular/core` / 纯 JS / 无明显框架 | §5 其他/通用 |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## §2 5 轮扫描信号映射(前端通用)
|
|
28
|
+
|
|
29
|
+
> 与 Java 栈对应的 5 轮结构保持一致,仅替换信号词。
|
|
30
|
+
|
|
31
|
+
| 轮次 | 名称 | Java 信号 | 前端信号 |
|
|
32
|
+
|------|------|---------|-----------|
|
|
33
|
+
| 1 | 模块发现 | Maven Module / Gradle 子项目 | `package.json` workspaces / `pnpm-workspace.yaml` / `turbo.json` / `lerna.json` |
|
|
34
|
+
| 2 | 文件分类清单 | Controller/Service/Mapper/Entity | **9 类前端文件**(见下) |
|
|
35
|
+
| 3 | 域语义分析 | Service 公开方法签名 | **路由 + Page + Hook/Composable** 的语义聚类 |
|
|
36
|
+
| 4 | 跨域依赖 | `@DubboReference` / `@KafkaListener` | **跨包 import + 跨服务环境变量 + WebSocket/SSE 监听** |
|
|
37
|
+
| 5 | 资源所有权 | XML Mapper + `@TableName` | **API endpoint 所有权图谱**(哪些前端模块调哪些 endpoint) |
|
|
38
|
+
|
|
39
|
+
### 前端 9 类核心文件(轮 2 统计)
|
|
40
|
+
|
|
41
|
+
| # | 类型 | 路径模式(React) | 路径模式(Vue) | 后缀 | 角色 |
|
|
42
|
+
|---|------|-----------------|-----------------|------|------|
|
|
43
|
+
| 1 | **路由配置** | `src/router/`、`src/routes/`、`app/`(Next 14)、`pages/`(Next 旧)、根 `<Routes>` | `src/router/index.ts` | `.ts/.tsx/.js` | 入口(≈ Controller 路径表) |
|
|
44
|
+
| 2 | **Page / View** | `src/pages/`、`app/**/page.tsx`、`src/views/` | `src/views/`、`pages/`(Nuxt) | `.tsx/.vue` | 业务编排(≈ Controller) |
|
|
45
|
+
| 3 | **Component** | `src/components/`、`src/ui/` | `src/components/` | `.tsx/.vue` | UI 组合 |
|
|
46
|
+
| 4 | **Hook / Composable** | `src/hooks/`、`use*.ts` | `src/composables/`、`useXxx.ts` | `.ts` | 业务逻辑(≈ Service) |
|
|
47
|
+
| 5 | **Store** | `src/store/`、`src/redux/`、`src/zustand/` | `src/stores/`(Pinia)、`src/vuex/` | `.ts` | 全局状态 |
|
|
48
|
+
| 6 | **API / Service** | `src/api/`、`src/services/`、`src/lib/api/` | `src/api/`、`src/services/` | `.ts` | 后端调用(≈ Mapper) |
|
|
49
|
+
| 7 | **Type / Schema** | `src/types/`、`src/models/`、`src/schemas/` | 同 | `.ts` | 数据模型(≈ Domain) |
|
|
50
|
+
| 8 | **Constant / Enum** | `src/constants/`、`src/enums/` | 同 | `.ts` | 常量 |
|
|
51
|
+
| 9 | **Util / Helper** | `src/utils/`、`src/helpers/`、`src/lib/` | 同 | `.ts` | 工具方法 |
|
|
52
|
+
|
|
53
|
+
### scanRules 默认值(前端栈)
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
默认 include_extensions: [.ts, .tsx, .js, .jsx, .mjs, .cjs, .vue, .svelte, .astro]
|
|
57
|
+
默认 exclude_patterns:
|
|
58
|
+
node_modules/**, dist/**, build/**, .next/**, .nuxt/**, .vite/**,
|
|
59
|
+
coverage/**, storybook-static/**, .turbo/**, .git/**,
|
|
60
|
+
**/*.test.{ts,tsx}, **/*.spec.{ts,tsx}, **/__tests__/**,
|
|
61
|
+
public/**, *.lock, *.lockb, *.log
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## §3 React 子流程(`primaryStack=frontend-react`)
|
|
67
|
+
|
|
68
|
+
### 3.1 域语义分析(轮 3,三层递进)
|
|
69
|
+
|
|
70
|
+
**层 A:路由前缀语义**(最强证据)
|
|
71
|
+
扫描以下任一来源的路由定义:
|
|
72
|
+
- `src/router/*.ts` 中的 `<Routes>` 路径
|
|
73
|
+
- `app/[seg]/page.tsx`(Next 14 App Router)
|
|
74
|
+
- `pages/[seg]/*.tsx`(Next 旧版 Pages Router)
|
|
75
|
+
- `src/routes/**/route.tsx`(Remix)
|
|
76
|
+
- `@tanstack/router` 的路径定义
|
|
77
|
+
|
|
78
|
+
路由前缀 `/order/*`、`/user/*`、`/payment/*` → 直接对应业务域(置信度 High)
|
|
79
|
+
|
|
80
|
+
**层 B:Page 文件名语义**
|
|
81
|
+
- `pages/Order/List.tsx` + `pages/Order/Detail.tsx` + `pages/Order/Edit.tsx` → 同业务名词 ≥ 3 次 → 确认 `order` 域
|
|
82
|
+
|
|
83
|
+
**层 C:Hook + API 双重证据**
|
|
84
|
+
- 命名前缀:`useOrder.ts` / `orderApi.ts` / `orderStore.ts`
|
|
85
|
+
- import 链路:`Page → Hook → API` 跨模块 import 的归属信号
|
|
86
|
+
|
|
87
|
+
**特殊处理:**
|
|
88
|
+
- `common/`、`shared/`、`ui/` → 通用层,不算业务域
|
|
89
|
+
- `layouts/`、`guards/` → 框架层
|
|
90
|
+
- `locales/`、`i18n/` → 国际化层
|
|
91
|
+
|
|
92
|
+
### 3.2 跨域依赖扫描(轮 4)
|
|
93
|
+
|
|
94
|
+
| 信号 | 含义 |
|
|
95
|
+
|------|------|
|
|
96
|
+
| `import @/order/* from @/payment/*` | 跨模块 import,order 依赖 payment |
|
|
97
|
+
| `import.meta.env.VITE_API_USER_BASE` / `process.env.NEXT_PUBLIC_API_PAYMENT` | 调用独立微服务 |
|
|
98
|
+
| `socket.on('order:created', ...)` / `eventBus.on(...)` | 跨域事件订阅 |
|
|
99
|
+
| `'use server'` 标注的函数(Next 14) | Server Action ≈ 后端 Service 调用 |
|
|
100
|
+
|
|
101
|
+
### 3.3 API endpoint 所有权图谱(轮 5)
|
|
102
|
+
|
|
103
|
+
扫描所有 `src/api/*.ts` / `src/services/*.ts`,提取调用模式:
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
fetch('/api/order/list') // → /api/order/* 归 order 域
|
|
107
|
+
axios.post('/api/payment/refund', ...) // → /api/payment/* 归 payment 域
|
|
108
|
+
useSWR('/api/user/me', fetcher) // → /api/user/* 归 user 域
|
|
109
|
+
useQuery({ queryKey: ['orders'], queryFn: () => api.get('/api/order/...') })
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**输出 endpoint 所有权矩阵:**
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
/api/order/* → [order]
|
|
116
|
+
/api/payment/* → [payment]
|
|
117
|
+
/api/user/* → [user, payment] ← ⚠️ 共享 endpoint
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
孤儿 endpoint(无任何前端模块调用):报警,可能是死代码 / 后端先行。
|
|
121
|
+
|
|
122
|
+
### 3.4 React 项目置信度评分矩阵
|
|
123
|
+
|
|
124
|
+
| 评分维度 | 评分规则 |
|
|
125
|
+
|---------|---------|
|
|
126
|
+
| ① 路由前缀内聚度 | 高=2 / 中=1 / 低=0 |
|
|
127
|
+
| ② API endpoint 独占率 | >70%=2 / >40%=1 / <40%=0 |
|
|
128
|
+
| ③ Page 完备性 | 有 list+detail+edit=2 / 仅 list=1 / 无=0 |
|
|
129
|
+
| ④ 类型独立性 | 仅本域 import=2 / 跨域共享=1 / 无 type=0 |
|
|
130
|
+
| ⑤ 状态管理集中度 | 集中本域 store/hook=2 / 分散=1 / 无=0 |
|
|
131
|
+
|
|
132
|
+
### 3.5 React 业务 Skill 17 节填充指南
|
|
133
|
+
|
|
134
|
+
| 节 | React 栈填充重点 |
|
|
135
|
+
|---|------------|
|
|
136
|
+
| **2 核心实体** | TS `interface` / Zod `schema`,可选标记 `?` |
|
|
137
|
+
| **3 业务规则** | `[guideline]` 加 表单校验规则 / 权限判断 / 状态转换条件 |
|
|
138
|
+
| **4 关键文件索引** | 层次 = `路由 / Page / Hook / Store / API / Type` |
|
|
139
|
+
| **5 API 契约** | 调用的后端 endpoint 列表 + Request/Response TS 类型 + 鉴权方式(JWT/Cookie/Bearer) |
|
|
140
|
+
| **6 项目特有模式** | Hook 命名约定 / 状态管理选型(Redux/Zustand/Jotai/Recoil) / 表单库(react-hook-form + zod) / 错误边界 |
|
|
141
|
+
| **7 代码示例** | Page + Hook + API 的协作骨架,体现自定义 Hook 抽象 |
|
|
142
|
+
| **8 状态机** | XState 状态机 / 表单流程 / 页面流(idle→loading→success→error) |
|
|
143
|
+
| **9 错误处理** | toast 时机 / fallback UI / `<ErrorBoundary>` / 表单字段错误展示 / 路由守卫拦截 |
|
|
144
|
+
| **10 跨模块依赖** | upstream/downstream 模块 + 跨服务调用 |
|
|
145
|
+
| **11 数据流向** | React Query / SWR 的请求-缓存-渲染链路 / WebSocket 订阅 / Server Actions |
|
|
146
|
+
| **12 关键 API 调用模式** | debounce / throttle / 重试 / 缓存(QueryClient 配置) / 取消(AbortController) / 乐观更新 |
|
|
147
|
+
| **13 开发陷阱** | Closure 陷阱 / 依赖数组 / SSR Hydration 不一致 / Memory Leak / 不必要 re-render / 异步 setState 时机 |
|
|
148
|
+
| **14 性能优化** | 路由懒加载(React.lazy) / 虚拟列表 / `React.memo`/`useMemo`/`useCallback` / Suspense / Code Split / 预加载 |
|
|
149
|
+
| **15 业务不变量** | 「金额展示永远 toFixed(2)」「未登录不展示订单」等 |
|
|
150
|
+
|
|
151
|
+
### 3.6 React 栈 key_files 选取优先级
|
|
152
|
+
|
|
153
|
+
最多 20 个:
|
|
154
|
+
|
|
155
|
+
**优先级 1(必选)**
|
|
156
|
+
- 路由配置文件(`src/router.ts` / `app/[domain]/page.tsx`)
|
|
157
|
+
- 主 Page(list/detail/edit)
|
|
158
|
+
- 核心 Hook(`use{Domain}*.ts`)
|
|
159
|
+
- 核心 API(`{domain}Api.ts` / `{domain}Service.ts`)
|
|
160
|
+
- 核心 Type(`{Domain}.ts` / `{domain}Schema.ts`)
|
|
161
|
+
- Store slice(`{domain}Slice.ts` / `{domain}Store.ts`)
|
|
162
|
+
|
|
163
|
+
**优先级 2(强烈建议)**
|
|
164
|
+
- 权限/鉴权相关(`{domain}Permissions.ts`、路由守卫)
|
|
165
|
+
- 常量枚举(`{Domain}Status.ts`)
|
|
166
|
+
- 表单 schema(`{domain}FormSchema.ts`,zod/yup)
|
|
167
|
+
|
|
168
|
+
**优先级 3(有则加入)**
|
|
169
|
+
- WebSocket/SSE 监听(`{domain}Socket.ts`)
|
|
170
|
+
- Service Worker / 离线缓存
|
|
171
|
+
- E2E 测试入口(cypress / playwright)
|
|
172
|
+
|
|
173
|
+
### 3.7 React 栈 frontmatter 特化
|
|
174
|
+
|
|
175
|
+
```yaml
|
|
176
|
+
stack: frontend-react
|
|
177
|
+
format_version: v3-frontend-react
|
|
178
|
+
external_deps: # 从 package.json deps + devDeps 提取,排除工具链
|
|
179
|
+
react: "^18.2"
|
|
180
|
+
"@tanstack/react-query": "^5.0"
|
|
181
|
+
zustand: "^4.4"
|
|
182
|
+
"react-hook-form": "^7.45"
|
|
183
|
+
zod: "^3.22"
|
|
184
|
+
key_files: [...]
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## §4 Vue 子流程(`primaryStack=frontend-vue`)
|
|
190
|
+
|
|
191
|
+
### 4.1 与 React 的差异点
|
|
192
|
+
|
|
193
|
+
| 维度 | React | Vue |
|
|
194
|
+
|------|-------|-----|
|
|
195
|
+
| 业务逻辑封装 | Custom Hook(`useXxx.ts`) | Composable(`useXxx.ts`,内部用 ref/computed/watch) |
|
|
196
|
+
| 状态管理 | Redux/Zustand/Jotai | Pinia/Vuex |
|
|
197
|
+
| 路由 | react-router | vue-router(`createRouter`) |
|
|
198
|
+
| Meta 框架 | Next/Remix | Nuxt(`pages/`、`server/`) |
|
|
199
|
+
| 模板 | JSX/TSX | SFC(`.vue` 单文件,`<template>/<script setup>/<style>`) |
|
|
200
|
+
| 表单库 | react-hook-form + zod | VeeValidate + zod / FormKit |
|
|
201
|
+
| 数据获取 | React Query / SWR | `@tanstack/vue-query` / `useFetch`(Nuxt) |
|
|
202
|
+
|
|
203
|
+
### 4.2 Vue 特有扫描信号
|
|
204
|
+
|
|
205
|
+
**SFC 解析(轮 3 增强):**
|
|
206
|
+
```vue
|
|
207
|
+
<script setup lang="ts">
|
|
208
|
+
// → ref/reactive/computed/watch 使用模式
|
|
209
|
+
// → defineProps/defineEmits/defineExpose 组件契约
|
|
210
|
+
</script>
|
|
211
|
+
<template>
|
|
212
|
+
<!-- → <RouterLink :to="..."> 路由跳转 -->
|
|
213
|
+
<!-- → 子组件 import 依赖 -->
|
|
214
|
+
</template>
|
|
215
|
+
<style scoped>
|
|
216
|
+
/* → 样式隔离 */
|
|
217
|
+
</style>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**实施提示:** MVP 阶段使用正则提取 `<script>` 块,复杂场景调用 `@vue/compiler-sfc`。
|
|
221
|
+
|
|
222
|
+
**Vue 3 特有 API:**
|
|
223
|
+
- `provide` / `inject` → 跨层级依赖(≈ React Context)
|
|
224
|
+
- `defineModel`(Vue 3.4+) → 双向绑定契约
|
|
225
|
+
- Pinia: `defineStore('xxx', ...)` 或 `useXxxStore` 函数式
|
|
226
|
+
|
|
227
|
+
### 4.3 Vue 栈 17 节填充指南差异(与 React 共享 §3.5 大部分)
|
|
228
|
+
|
|
229
|
+
仅列出与 React 不同的节:
|
|
230
|
+
|
|
231
|
+
| 节 | Vue 栈填充重点 |
|
|
232
|
+
|---|------------|
|
|
233
|
+
| **6 项目特有模式** | Composable 命名(`useXxx`) / 组件通信(props/emit/v-model/provide-inject/Pinia) / 路由守卫(`beforeEach`/`beforeEnter`) / Suspense + AsyncComponent |
|
|
234
|
+
| **12 API 调用模式** | axios interceptor 全局拦截 / Pinia store action 调 API / `vue-query` 的 `useQuery`/`useMutation` / Nuxt 的 `$fetch`/`useFetch` SSR 一致性 |
|
|
235
|
+
| **13 开发陷阱** | ref vs reactive 解构丢响应式 / watch immediate vs watchEffect / v-for + v-if 同元素冲突 / 深层 watch 性能 / Nuxt useState 服务端复用 / `unref`/`toValue` 与 `.value` 不一致 |
|
|
236
|
+
|
|
237
|
+
### 4.4 Vue 栈 frontmatter 特化
|
|
238
|
+
|
|
239
|
+
```yaml
|
|
240
|
+
stack: frontend-vue
|
|
241
|
+
format_version: v3-frontend-vue
|
|
242
|
+
external_deps:
|
|
243
|
+
vue: "^3.4"
|
|
244
|
+
pinia: "^2.1"
|
|
245
|
+
"vue-router": "^4.2"
|
|
246
|
+
"@tanstack/vue-query": "^5.0"
|
|
247
|
+
"@vee-validate/zod": "^4.12"
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## §5 其他/通用前端(`primaryStack=frontend-other`)
|
|
253
|
+
|
|
254
|
+
适用:Svelte / Angular / 纯 JS / 未识别框架。
|
|
255
|
+
|
|
256
|
+
### 退化策略
|
|
257
|
+
|
|
258
|
+
- 跳过 §3.1 / §4.1 的精细域语义分析,改用**目录前缀分组**
|
|
259
|
+
- 17 节生成时简化为以下 8 节,跳过状态机/扩展点/数据流向:
|
|
260
|
+
1 域概述 / 2 核心实体 / 3 业务规则 / 4 文件索引 / 5 API 契约 / 9 错误处理 / 13 陷阱 / 17 新人手册
|
|
261
|
+
- 业务 Skill 标记 `format_version: v3-frontend-other`
|
|
262
|
+
- 在 Step 14 完成回报中提示用户:`⚠️ 当前栈未深度适配,业务 Skill 简化为 8 节。如需完整 17 节支持,请运行 /modus:platform -add 提需求或手动升级 strategy。`
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## §6 前端栈完成回报片段(Router 在 Step 14 拼接)
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
✅ 前端栈业务知识库已生成(基于 frontend-{react|vue|other} strategy)
|
|
270
|
+
|
|
271
|
+
域置信度报告:
|
|
272
|
+
┌─────────────────┬──────┬──────┬──────┬──────┬──────┬──────────┐
|
|
273
|
+
│ 域名 │置信度│规则数│状态机│API完备│不变量│隐性知识率│
|
|
274
|
+
├─────────────────┼──────┼──────┼──────┼──────┼──────┼──────────┤
|
|
275
|
+
│ biz-order │ 8/10 │ 6条 │ 100% │ 100% │ 4条 │ 70% │
|
|
276
|
+
│ biz-checkout │ 7/10 │ 5条 │ 100% │ 90% │ 3条 │ 60% │
|
|
277
|
+
└─────────────────┴──────┴──────┴──────┴──────┴──────┴──────────┘
|
|
278
|
+
|
|
279
|
+
API endpoint 所有权图谱:
|
|
280
|
+
/api/order/* → [biz-order]
|
|
281
|
+
/api/payment/* → [biz-checkout] ← ⚠️ 共享:biz-order 也调用,建议人工确认主域
|
|
282
|
+
|
|
283
|
+
外部依赖快照(来自 package.json):
|
|
284
|
+
react: ^18.2 | @tanstack/react-query: ^5.0 | zustand: ^4.4 | zod: ^3.22
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## §7 风险与权衡(实施提示)
|
|
290
|
+
|
|
291
|
+
| 风险 | 应对 |
|
|
292
|
+
|------|------|
|
|
293
|
+
| `.vue` SFC 解析复杂 | MVP 用正则;复杂场景上 `@vue/compiler-sfc` |
|
|
294
|
+
| Next 14 Server Component 与 Client Component 混合 | 单独标注 `'use server'` 文件为"server-action 域",与 client 域区分;体现在 Section 11 |
|
|
295
|
+
| Monorepo 跨 package 依赖爆炸 | 每个 package 单独 init,workspace-catalog 顶层路由 |
|
|
296
|
+
| Pinia store 命名千差万别 | 至少识别两种范式:`useXxxStore` 函数 vs `defineStore('xxx', ...)` |
|
|
297
|
+
| 团队不用 TypeScript(纯 JS) | 显式提示降级,按 `frontend-other` 走简化 8 节 |
|
|
298
|
+
| Hooks 与 Composables 命名重叠 | 用文件路径区分:`hooks/` ≈ React,`composables/` ≈ Vue |
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Java Strategy — Spring Boot / MyBatis 后端项目扫描与 Skill 生成
|
|
3
|
+
parent_skill: modus-init
|
|
4
|
+
load_when: "Router SKILL.md 在 Step 0.5 检测到 primaryStack=java 后,在 Step 5 与 Step 8 加载本文档执行"
|
|
5
|
+
stack: java
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Java Strategy(Spring Boot / MyBatis 后端项目)
|
|
9
|
+
|
|
10
|
+
> 当 Router 在 Step 0.5 检测到 `primaryStack=java` 时加载本文档。本 Strategy 负责:
|
|
11
|
+
> - **Step 5**:5 轮 Java 项目结构化扫描
|
|
12
|
+
> - **Step 8**:生成符合 Java 语义的业务 Skill(基于 `shared/universal-skill-format.md` 17 节骨架)
|
|
13
|
+
>
|
|
14
|
+
> **不负责**:参数解析、平台同步、catalog 生成、回报——这些都在 Router 中(栈无关)。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 适用范围
|
|
19
|
+
|
|
20
|
+
| 信号 | 是否适用 |
|
|
21
|
+
|------|---------|
|
|
22
|
+
| `pom.xml` / `build.gradle` / `build.gradle.kts` | ✅ |
|
|
23
|
+
| Spring Boot / Spring Cloud / Dubbo / Spring MVC | ✅ |
|
|
24
|
+
| MyBatis / MyBatis-Plus / JPA | ✅ |
|
|
25
|
+
| Gradle 多模块项目 | ✅ |
|
|
26
|
+
| 纯 Kotlin 项目(基于 Spring) | ✅(信号词等价) |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Step 5(Java 版):5 轮全量扫描
|
|
31
|
+
|
|
32
|
+
### 扫描前置:读取 scanRules
|
|
33
|
+
|
|
34
|
+
读取 `modus/config.yaml.scanRules`,与 Java 默认值合并:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
默认 include_extensions: [.java, .kt]
|
|
38
|
+
默认 exclude_patterns:
|
|
39
|
+
target/**, build/**, .gradle/**, .idea/**, .vscode/**,
|
|
40
|
+
generated/**, **/*Generated.java, .git/**, .github/**,
|
|
41
|
+
**/*Test.java, **/*Tests.java, **/*IT.java
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 轮次 1:模块发现
|
|
45
|
+
|
|
46
|
+
**信号:** `pom.xml`(Maven)或 `settings.gradle` / `settings.gradle.kts`(Gradle)
|
|
47
|
+
|
|
48
|
+
输出:模块列表(含模块名、路径、构建文件路径)
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
[1/5 模块发现] ✓ 发现 {N} 个 Maven Module — order-core, order-api, order-job
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 轮次 2:包级清单(Java 类型分布统计)
|
|
55
|
+
|
|
56
|
+
对每个模块,逐包统计文件数 + 以下 **10 类 Java 类型** 分布:
|
|
57
|
+
|
|
58
|
+
| 类型 | 信号词 |
|
|
59
|
+
|------|--------|
|
|
60
|
+
| `Controller` | `@Controller` / `@RestController` 类 |
|
|
61
|
+
| `Facade` | 类名后缀 `*Facade` |
|
|
62
|
+
| `Service` | `@Service` / 类名后缀 `*Service` |
|
|
63
|
+
| `Manager` | 类名后缀 `*Manager` |
|
|
64
|
+
| `Mapper / DAO` | `@Mapper` / 类名后缀 `*Mapper` / `*Dao` |
|
|
65
|
+
| `Domain / Entity` | `@TableName` / 类位于 `domain/`、`entity/` 包下 |
|
|
66
|
+
| `Enum / Constant` | `enum` 关键字 / 含静态 final 常量集合 |
|
|
67
|
+
| `DTO / VO / Request / Response` | 类名含 `*DTO` / `*VO` / `*Request` / `*Response` |
|
|
68
|
+
| `Exception / ErrorCode` | 类名含 `*Exception` / 枚举类名含 `ErrorCode` |
|
|
69
|
+
| `MQ Consumer / Producer` | `@KafkaListener` / `@RocketMQMessageListener` / `kafkaTemplate` / `rocketMQTemplate` |
|
|
70
|
+
| `XML Mapper` | `resources/**/mapper/*.xml` |
|
|
71
|
+
| `@Configuration` | `@Configuration` / `@Component` 注解的配置类 |
|
|
72
|
+
|
|
73
|
+
输出格式(按文件数排序,全量展示不截断):
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
包级清单(共 {N} 个包):
|
|
77
|
+
order(43个文件) Controller✓ Facade✓ 主要概念: 订单创建/支付/状态流转
|
|
78
|
+
payment(31个文件) Controller✓ 主要概念: 支付发起/回调/退款
|
|
79
|
+
...
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 轮次 3:域语义分析(方法签名级,三层递进)
|
|
83
|
+
|
|
84
|
+
**层 A:包名语义词匹配**(快速初判)
|
|
85
|
+
- 包名 `order/pay/user/payment/inventory` 等业务名词 → 直接归入对应域(置信度 High)
|
|
86
|
+
|
|
87
|
+
**层 B:公开方法签名分析**(语义细化)
|
|
88
|
+
- 对 Service/Manager/Facade 提取所有 `public` 方法:
|
|
89
|
+
- 方法名(动词 + 名词,如 `confirmOrder` → 操作=confirm,对象=Order)
|
|
90
|
+
- 返回类型(`List`/`PageResult`/`void` → 推断查询/写/事件)
|
|
91
|
+
- 参数 DTO 名(`CreateOrderRequest` → 明确归入 order 域)
|
|
92
|
+
- 同包内方法名含同一业务名词 ≥ 3 个 → 确认域归属
|
|
93
|
+
|
|
94
|
+
**层 C:回退策略**
|
|
95
|
+
- 类名含多语义域(`OrderPaymentService`) → 标"待人工确认"
|
|
96
|
+
- 包仅 1-2 个文件 → 标"⚠️ 小包候选"
|
|
97
|
+
|
|
98
|
+
输出(含代表性方法签名):
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
域识别结果(共 {N} 个域):
|
|
102
|
+
order(订单域) [置信度 High]
|
|
103
|
+
核心方法:createOrder(CreateOrderReq) → OrderVO
|
|
104
|
+
cancelOrder(Long orderId) → void
|
|
105
|
+
queryOrderPage(OrderPageQuery) → PageResult<OrderVO>
|
|
106
|
+
→ 关键文件:OrderService, OrderManager, OrderMapper
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 轮次 4:跨域依赖
|
|
110
|
+
|
|
111
|
+
扫描以下信号绘制域间依赖图:
|
|
112
|
+
|
|
113
|
+
| 信号 | 含义 |
|
|
114
|
+
|------|------|
|
|
115
|
+
| `@DubboReference` / `@FeignClient` | 跨域 RPC 依赖 |
|
|
116
|
+
| `kafkaTemplate.send()` / `rocketMQTemplate.send()` | MQ 发布 |
|
|
117
|
+
| `@KafkaListener` / `@RocketMQMessageListener` | MQ 订阅 |
|
|
118
|
+
| 跨业务包的 `@Autowired` 注入 | Spring 跨域注入 |
|
|
119
|
+
| `ApplicationEventPublisher.publishEvent()` + `@EventListener` | 事件驱动隐式依赖 |
|
|
120
|
+
|
|
121
|
+
### 轮次 5:数据库表所有权图谱
|
|
122
|
+
|
|
123
|
+
扫描以下两类信号构建全局表归属:
|
|
124
|
+
|
|
125
|
+
| 信号 | 提取方法 |
|
|
126
|
+
|------|--------|
|
|
127
|
+
| `resources/**/mapper/*.xml` | 解析 `<select>/<insert>/<update>/<delete>` 中的 FROM/INTO/UPDATE 子句 |
|
|
128
|
+
| `@TableName("xxx")` | MyBatis-Plus Entity 注解 |
|
|
129
|
+
|
|
130
|
+
输出:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
order_main → [order] ← 独占表
|
|
134
|
+
payment_record → [payment] ← 独占表
|
|
135
|
+
user_account → [user, payment] ← ⚠️ 共享表
|
|
136
|
+
config_dict → [order, user, payment] ← 公共配置表(排除统计)
|
|
137
|
+
|
|
138
|
+
孤立表:{N} 张无域归属,需用户决策
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 域置信度评分矩阵(Java 版,5 轮全部完成后执行)
|
|
144
|
+
|
|
145
|
+
| 评分维度 | 评分规则 | 权重 |
|
|
146
|
+
|---------|---------|------|
|
|
147
|
+
| ① 包名语义内聚度 | 高=2 / 中=1 / 低=0 | 2 |
|
|
148
|
+
| ② 数据库表独占率 | >70%=2 / >40%=1 / <40%=0 | 2 |
|
|
149
|
+
| ③ 对外入口完备性 | 有 Controller/Facade=2 / 仅内部=1 / 无入口=0 | 2 |
|
|
150
|
+
| ④ 核心实体独立性 | 仅本域路径=2 / 跨域共享=1 / 无 Entity=0 | 2 |
|
|
151
|
+
| ⑤ 事务边界清晰度 | 集中本域 Service=2 / 跨域=1 / 无=0 | 2 |
|
|
152
|
+
|
|
153
|
+
**分级处理:**
|
|
154
|
+
- ≥ 7 分 → ✅ 自动确认
|
|
155
|
+
- 4-6 分 → ⚠️ 用户确认
|
|
156
|
+
- < 4 分 → ❌ 强制暂停决策
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Step 8(Java 版):生成业务 Skill
|
|
161
|
+
|
|
162
|
+
### 文件分批扫描(无文件数量上限)
|
|
163
|
+
|
|
164
|
+
每个 SubAgent 按 git 最近修改时间排序,分三批扫描该域**全量文件**:
|
|
165
|
+
|
|
166
|
+
**第一批(核心知识,必扫)**
|
|
167
|
+
- ① Controller / Facade → API 契约、权限注解(`@PreAuthorize`、`@UserAuthorization`)
|
|
168
|
+
- ② Service / Manager → 业务规则、`@Transactional` 边界
|
|
169
|
+
- ③ Domain / Entity → 核心字段、业务方法
|
|
170
|
+
- ⑥ Enum / Constant → 完整枚举值和业务含义
|
|
171
|
+
|
|
172
|
+
**第二批(细节知识,全量扫)**
|
|
173
|
+
- ④ Mapper / DAO → 数据操作模式
|
|
174
|
+
- ⑤ XML Mapper → 关键 SQL(JOIN / 子查询 / 复杂条件)
|
|
175
|
+
- ⑦ DTO / VO / Request / Response → 字段约束、JSR-303 校验
|
|
176
|
+
|
|
177
|
+
**第三批(扩展知识)**
|
|
178
|
+
- ⑧ Exception / ErrorCode → 错误码体系
|
|
179
|
+
- ⑨ MQ Consumer / Producer → 消息契约、幂等保障
|
|
180
|
+
- ⑩ `@Configuration` → 开关配置、扩展点
|
|
181
|
+
|
|
182
|
+
### Java 业务 Skill 17 节填充指南
|
|
183
|
+
|
|
184
|
+
> 节骨架严格遵循 `shared/universal-skill-format.md`。本节仅给出 Java 栈的"节内填充重点"。
|
|
185
|
+
|
|
186
|
+
| 节 | Java 栈填充重点 |
|
|
187
|
+
|---|---------|
|
|
188
|
+
| **2 核心实体** | Java 类型(`Long`/`String`/`BigDecimal`),关键字段含 `@TableField` / `@TableId` / 校验注解 |
|
|
189
|
+
| **3 业务规则** | `[guideline]` 加 `AopContext.currentProxy()` / `@DistributedLock` / `BaseRpcResponse.build()` |
|
|
190
|
+
| **4 关键文件索引** | 层次 = `Controller / Facade / Service / Manager / Mapper / Domain` |
|
|
191
|
+
| **5 API 契约** | Controller/Facade 暴露的 REST/RPC,含权限注解、错误码、幂等标注 |
|
|
192
|
+
| **6 项目特有模式** | `@Transactional` + 同类调用陷阱 / 分布式锁注解 / 统一响应包装 / `@SaTokenAuth`/`@UserAuthorization` |
|
|
193
|
+
| **7 代码示例** | Java 类风格,体现校验→业务→Domain→Mapper→MQ 发布→响应包装的完整链 |
|
|
194
|
+
| **8 状态机** | Domain Entity 的 `status` 字段,状态图含 `@Transactional` 标注 |
|
|
195
|
+
| **9 错误码** | ErrorCode 枚举 + Exception 类 + HTTP 状态映射(`@RestControllerAdvice`) |
|
|
196
|
+
| **10 跨域依赖** | `@DubboReference` / `@FeignClient` / MQ Topic |
|
|
197
|
+
| **11 数据流向** | MQ Topic + Spring Event;含幂等保障(DB 唯一索引/业务唯一键) |
|
|
198
|
+
| **12 关键 SQL 模式** | XML Mapper 的复杂 SQL,含 JOIN/索引命中/数据量级/慢查询风险 |
|
|
199
|
+
| **13 开发陷阱** | 同类 `@Transactional` 失效 / 枚举存 `name()` / 并发未加分布式锁 / `Long.equals` 拆箱 NPE |
|
|
200
|
+
| **14 扩展点** | 策略模式(`Map<String, Strategy>` 注入)/ `@ConditionalOnProperty` / SPI |
|
|
201
|
+
| **15 业务不变量** | 来源:`if/else` 推断 + JSR-303 校验器 + 访谈问卷 |
|
|
202
|
+
|
|
203
|
+
### Java 栈 key_files 选取优先级
|
|
204
|
+
|
|
205
|
+
最多 20 个,按以下优先级选取:
|
|
206
|
+
|
|
207
|
+
**优先级 1(必选)**
|
|
208
|
+
- `src/.../service/{Domain}Service.java`
|
|
209
|
+
- `src/.../manager/{Domain}Manager.java`
|
|
210
|
+
- `src/.../dao/{Domain}Mapper.java` 或 `src/.../dao/{Domain}CustomMapper.java`
|
|
211
|
+
- `src/.../domain/{Domain}.java`
|
|
212
|
+
|
|
213
|
+
**优先级 2(强烈建议)**
|
|
214
|
+
- `src/.../enums/{Domain}Status.java`
|
|
215
|
+
- `src/.../enums/{Domain}Type.java`
|
|
216
|
+
- `src/.../exception/{Domain}Exception.java`
|
|
217
|
+
- `src/.../enums/{Domain}ErrorCode.java`
|
|
218
|
+
|
|
219
|
+
**优先级 3(有则加入)**
|
|
220
|
+
- `src/.../mq/{Domain}Consumer.java`
|
|
221
|
+
- `src/.../mq/{Domain}Producer.java`
|
|
222
|
+
- `src/.../config/{Domain}Config.java`
|
|
223
|
+
- `src/.../controller/{Domain}Controller.java`
|
|
224
|
+
- `src/.../facade/{Domain}Facade.java`
|
|
225
|
+
|
|
226
|
+
> 满 20 个时从优先级 3 末尾截断。
|
|
227
|
+
|
|
228
|
+
### Java 栈 frontmatter 必填项(在通用规范基础上的特化)
|
|
229
|
+
|
|
230
|
+
```yaml
|
|
231
|
+
stack: java
|
|
232
|
+
format_version: v3-java
|
|
233
|
+
external_deps: # 自动从 pom.xml 提取,排除 java.* / javax.* / springframework.*
|
|
234
|
+
spring-boot: "~2.7"
|
|
235
|
+
mybatis-plus: ">=3.5 <4.0"
|
|
236
|
+
dubbo: "~3.1"
|
|
237
|
+
key_files: # 见上方优先级清单
|
|
238
|
+
- src/.../service/OrderService.java
|
|
239
|
+
- ...
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
> 其他防腐字段(`last_hash`、`file_hashes`、`usage_count` 等)见 `shared/frontmatter-spec.md`。
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Step 7(Java 版):访谈问卷触发条件
|
|
247
|
+
|
|
248
|
+
> Step 7 框架在 Router 中(栈无关)。本节仅列出 Java 栈特有的触发条件。
|
|
249
|
+
|
|
250
|
+
| 触发条件 | 生成的问题模板 | 写入目标 |
|
|
251
|
+
|---------|-------------|---------|
|
|
252
|
+
| 状态机有孤立状态(无入/出转换) | "❓ 状态 `{STATUS}` 无明确出口转换,请问:什么情况结束?由谁操作?" | Section 8 |
|
|
253
|
+
| `create/pay/submit` 接口无幂等保护 | "❓ 接口 `{METHOD} {PATH}` 未发现幂等机制,请问:是否有业务层防重?key 是什么?" | Section 5 |
|
|
254
|
+
| 跨域 RPC 无超时/降级配置 | "❓ `{ServiceA}` 调用 `{ServiceB}` 未发现超时配置,请问:超时业务兜底逻辑?" | Section 10 |
|
|
255
|
+
| `//TODO:` 超过 3 处 | "❓ 发现 {N} 处 TODO,是否是已知技术债务?" | Section 13 |
|
|
256
|
+
| 共享数据库表(多域访问) | "❓ 表 `{table}` 被 {A} 和 {B} 访问,谁是主域?" | Section 10 |
|
|
257
|
+
| 无 ErrorCode 的 RuntimeException | "❓ `{ExceptionClass}` 无对应错误码枚举,前端展示什么?HTTP 码?" | Section 9 |
|
|
258
|
+
| 金额字段类型为 Double/Float | "❓ `{field}` 用 Double 存金额,是有意还是技术债?" | Section 15 |
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Java 栈完成回报片段(Router 在 Step 14 中拼接)
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
✅ Java 栈业务知识库已生成(基于 java strategy,Spring Boot + MyBatis)
|
|
266
|
+
|
|
267
|
+
域置信度报告:
|
|
268
|
+
┌─────────────────┬──────┬──────┬──────┬──────┬──────┬──────────┐
|
|
269
|
+
│ 域名 │置信度│规则数│状态机│API完备│不变量│隐性知识率│
|
|
270
|
+
├─────────────────┼──────┼──────┼──────┼──────┼──────┼──────────┤
|
|
271
|
+
│ biz-order │ 9/10 │ 8条 │ 100% │ 100% │ 3条 │ 80% │
|
|
272
|
+
└─────────────────┴──────┴──────┴──────┴──────┴──────┴──────────┘
|
|
273
|
+
|
|
274
|
+
外部依赖快照(来自 pom.xml):
|
|
275
|
+
spring-boot: ~2.7
|
|
276
|
+
mybatis-plus: >=3.5 <4.0
|
|
277
|
+
dubbo: ~3.1
|
|
278
|
+
```
|