@lovrabet/cli 1.2.4 → 1.2.5-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/add-page/input-page-router.js +1 -1
- package/lib/add-page/main.js +1 -1
- package/lib/add-page/select-page-template.js +1 -1
- package/lib/api/api-doc-ui.js +1 -1
- package/lib/api/api-doc.js +1 -1
- package/lib/api/api-pull-ui.js +1 -1
- package/lib/api/fetch-model-list.js +1 -1
- package/lib/api/generate-api-file.js +1 -1
- package/lib/api/main.js +1 -1
- package/lib/api/pull-silent.js +1 -1
- package/lib/app-menu/app-menu-sync-ui.js +1 -1
- package/lib/app-menu/create-menu.js +1 -1
- package/lib/app-menu/get-local-pages.js +1 -1
- package/lib/app-menu/get-online-menu-list.js +1 -1
- package/lib/app-menu/use-get-online-menu-list.js +1 -1
- package/lib/app-menu/utils.js +1 -1
- package/lib/app-menu/valid-url.js +1 -1
- package/lib/app-menu-update-cdn/current-content.js +1 -1
- package/lib/app-menu-update-cdn/input-cdn-asset.js +1 -1
- package/lib/app-menu-update-cdn/main.js +1 -1
- package/lib/app-menu-update-cdn/update-menu-cdn-url.js +1 -1
- package/lib/auth/auth-server-ui.js +1 -1
- package/lib/auth/auth-server.js +1 -1
- package/lib/auth/constant.js +1 -1
- package/lib/auth/get-cookie.js +1 -1
- package/lib/auth/is-session-valid.js +1 -1
- package/lib/auth/logout.js +1 -1
- package/lib/cli.js +1 -1
- package/lib/cmd/build-watch.js +1 -1
- package/lib/cmd/build.js +1 -1
- package/lib/cmd/logs.js +1 -1
- package/lib/cmd/preview.js +1 -1
- package/lib/cmd/start.js +1 -1
- package/lib/config/config-help.js +1 -1
- package/lib/config/main.js +1 -1
- package/lib/constant/domain.js +1 -1
- package/lib/constant/env.js +1 -1
- package/lib/create-app/enhanced-guided-create.js +1 -1
- package/lib/create-app/format-elapsed.js +1 -1
- package/lib/create-app/main.js +1 -1
- package/lib/create-app/task-finished.js +1 -1
- package/lib/create-app/task-loading.js +1 -1
- package/lib/create-app/task-running.js +1 -1
- package/lib/create-app/task-time.js +1 -1
- package/lib/create-app/use-copy-project-template.js +1 -1
- package/lib/create-app/use-format-code.js +1 -1
- package/lib/create-app/use-install-dependencies.js +1 -1
- package/lib/help.js +1 -1
- package/lib/init/main.js +1 -1
- package/lib/mcp/claude.js +1 -0
- package/lib/mcp/cursor.js +1 -1
- package/lib/mcp/main.js +1 -1
- package/lib/skills/main.js +1 -0
- package/lib/utils/check-sdk-version.js +1 -1
- package/lib/utils/config.js +1 -1
- package/lib/utils/copy-directory.js +1 -1
- package/lib/utils/http-client.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/router-updater.js +1 -1
- package/lib/utils/sleep.js +1 -1
- package/lib/utils/template-replacer.js +1 -1
- package/package.json +1 -1
- package/templates/projects/sub-app-react-demo/index.html +22 -34
- package/templates/projects/sub-app-react-demo/public/logo.svg +1 -0
- package/templates/projects/sub-app-react-demo/src/api/api.ts +1 -1
- package/templates/projects/sub-app-react-demo/src/api/client.ts +1 -1
- package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +44 -71
- package/templates/projects/sub-app-react-demo/src/pages/index.tsx +387 -927
- package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +1 -1
- package/templates/projects/sub-app-react-demo/src/pages/workbench/index.module.css +293 -0
- package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +100 -414
- package/templates/projects/sub-app-react-demo/src/style.css +21 -15
- package/templates/projects/sub-app-react-demo/vite.config.ts +18 -13
- package/templates/rules/lovrabet_rules.mdc.tpl +636 -43
- package/templates/skills/.claude/skills/lovrabet/SKILL.md +257 -0
- package/templates/skills/.cursor/commands/lovrabet.md +247 -0
- package/templates/skills/.cursorrules +109 -0
- package/templates/skills/.shared/README.md +45 -0
- package/templates/skills/.shared/guides/01-filter-query/guide.md +300 -0
- package/templates/skills/.shared/guides/02-mcp-sql-workflow/guide.md +272 -0
- package/templates/skills/.shared/guides/03-antd-style/guide.md +227 -0
- package/templates/skills/.shared/guides/04-troubleshooting/guide.md +426 -0
- package/templates/skills/.shared/guides/05-api-integration/guide.md +327 -0
- package/templates/skills/.shared/guides/06-menu-management/guide.md +305 -0
- package/templates/skills/.windsurf/workflows/lovrabet.md +256 -0
- package/templates/projects/sub-app-react-demo/.vscode/extensions.json +0 -3
- package/templates/projects/sub-app-react-demo/.vscode/settings.json +0 -57
- package/templates/projects/sub-app-react-demo/src/pages/intro/index.tsx +0 -560
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# Lovrabet 开发工作流
|
|
2
|
+
|
|
3
|
+
当用户请求与 Lovrabet 平台相关的开发任务时,使用此工作流。
|
|
4
|
+
|
|
5
|
+
## 前置条件
|
|
6
|
+
|
|
7
|
+
此工作流假设 Lovrabet MCP 服务器已在 claude code 的 MCP 设置中配置完成。MCP 工具**直接可用**,需要时请使用。
|
|
8
|
+
|
|
9
|
+
## 重要规则
|
|
10
|
+
|
|
11
|
+
1. **直接使用 MCP 工具**:当用户请求创建/验证 SQL 或查询数据集时,**直接调用 MCP 工具**。不要生成脚本或让用户切换到其他工具。
|
|
12
|
+
2. **5步 SQL 工作流**:创建自定义 SQL 时必须严格遵循以下顺序。
|
|
13
|
+
3. **禁止生成脚本**:不要为 MCP 操作生成脚本 - 直接使用工具。
|
|
14
|
+
4. **禁止命令行调用 MCP**:禁止运行 `npx @lovrabet/dataset-mcp-server` 等命令。MCP 工具只能通过 MCP 协议调用。
|
|
15
|
+
5. **MCP 未配置提示**:如果尝试调用 Lovrabet MCP 工具但发现工具不可用,主动告知用户 MCP 未配置并提供配置方法。
|
|
16
|
+
6. **完全自动执行**:创建自定义 SQL 时,**自动执行全部 5 步,不要询问用户任何输入**(sqlCode、sqlName、描述等)。根据 SQL 功能自动生成合适的名称。
|
|
17
|
+
|
|
18
|
+
## 工作流步骤
|
|
19
|
+
|
|
20
|
+
### 步骤 1: 了解需求
|
|
21
|
+
分析用户请求,提取关键信息:
|
|
22
|
+
- 需要操作哪个数据集?
|
|
23
|
+
- 需要做什么操作(CRUD、自定义 SQL)?
|
|
24
|
+
- 是否需要生成代码?
|
|
25
|
+
|
|
26
|
+
### 步骤 2: 探索数据集(使用 MCP)
|
|
27
|
+
|
|
28
|
+
如果不确定数据集信息,先探索:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
请使用 list_datasets 列出所有可用的数据集
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
或搜索:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
请使用 searchDatasets 搜索包含 "用户" 的数据集
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 步骤 3: 获取数据集详情
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
请使用 get_dataset_detail 获取数据集详情
|
|
44
|
+
datasetCode: <数据集代码>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
重点关注:
|
|
48
|
+
- `fields` - 字段列表及其元数据
|
|
49
|
+
- `operations` - 支持的操作列表
|
|
50
|
+
- `basic.tableName` - 实际表名
|
|
51
|
+
|
|
52
|
+
### 步骤 4: 生成 SDK 代码(可选)
|
|
53
|
+
|
|
54
|
+
如果需要生成代码:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
请使用 generate_sdk_code 生成 SDK 调用代码
|
|
58
|
+
datasetCode: <数据集代码>
|
|
59
|
+
operationName: <操作名称>
|
|
60
|
+
includeImports: true
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 步骤 5: 执行操作
|
|
64
|
+
|
|
65
|
+
根据需求调用相应方法:
|
|
66
|
+
|
|
67
|
+
**列表查询 (CRUD)**
|
|
68
|
+
```typescript
|
|
69
|
+
// 数据集: {datasetName} | 数据表: {tableName}
|
|
70
|
+
const result = await client.models.{modelName}.filter({
|
|
71
|
+
where: { status: { $eq: "active" } },
|
|
72
|
+
select: ["id", "name"],
|
|
73
|
+
currentPage: 1,
|
|
74
|
+
pageSize: 20,
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**自定义 SQL**
|
|
79
|
+
```
|
|
80
|
+
请使用 list_sql_queries 列出可用的 SQL 查询
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**执行 SQL**
|
|
84
|
+
```
|
|
85
|
+
请使用 execute_custom_sql 执行 SQL 查询
|
|
86
|
+
sqlCode: <SQL 代码>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 常见工作流
|
|
90
|
+
|
|
91
|
+
### 工作流 1: 创建列表查询页面
|
|
92
|
+
|
|
93
|
+
用户说:"创建用户列表页面"
|
|
94
|
+
|
|
95
|
+
**直接调用:**
|
|
96
|
+
1. `list_datasets` - 查找用户数据集
|
|
97
|
+
2. `get_dataset_detail(datasetCode: "users")` - 获取字段
|
|
98
|
+
3. `generate_sdk_code(datasetCode: "users", operationName: "filter")` - 生成代码
|
|
99
|
+
4. 然后结合 AntD Table 组件实现页面
|
|
100
|
+
|
|
101
|
+
### 工作流 2: 创建自定义 SQL 报表
|
|
102
|
+
|
|
103
|
+
用户说:"创建一个按月统计的订单报表"
|
|
104
|
+
|
|
105
|
+
**直接调用:**
|
|
106
|
+
1. `list_sql_queries` - 检查 SQL 是否存在
|
|
107
|
+
2. `get_dataset_detail(datasetCode: "orders")` - 获取表结构
|
|
108
|
+
3. `validate_sql_content(sqlContent: "SELECT DATE_FORMAT(...)")` - 验证 SQL
|
|
109
|
+
4. `save_or_update_custom_sql(...)` - 保存 SQL
|
|
110
|
+
5. `execute_custom_sql(sqlCode: "monthly_orders")` - 测试执行
|
|
111
|
+
6. 然后生成代码并使用 AntD Charts 展示报表
|
|
112
|
+
|
|
113
|
+
## Filter 查询规范(关键)
|
|
114
|
+
|
|
115
|
+
### 基本结构
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
const result = await client.models.<modelName>.filter({
|
|
119
|
+
where: {
|
|
120
|
+
status: { $eq: "active" }, // 必须使用操作符
|
|
121
|
+
age: { $gte: 18, $lte: 65 },
|
|
122
|
+
},
|
|
123
|
+
select: ["id", "name", "email"], // NOT "fields"
|
|
124
|
+
orderBy: [{ createTime: "desc" }], // NOT "sort"
|
|
125
|
+
currentPage: 1, // NOT "page"
|
|
126
|
+
pageSize: 20, // NOT "limit"
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 操作符速查
|
|
131
|
+
|
|
132
|
+
| 场景 | 操作符 | 示例 |
|
|
133
|
+
|------|-------|------|
|
|
134
|
+
| 等于 | `$eq` | `{ status: { $eq: "active" } }` |
|
|
135
|
+
| 不等于 | `$ne` | `{ status: { $ne: "deleted" } }` |
|
|
136
|
+
| 大于等于 | `$gte` | `{ age: { $gte: 18 } }` |
|
|
137
|
+
| 小于等于 | `$lte` | `{ age: { $lte: 65 } }` |
|
|
138
|
+
| 大于 | `$gt` | `{ price: { $gt: 100 } }` |
|
|
139
|
+
| 小于 | `$lt` | `{ price: { $lt: 1000 } }` |
|
|
140
|
+
| 在数组中 | `$in` | `{ type: { $in: ["A", "B"] } }` |
|
|
141
|
+
| 包含 | `$contain` | `{ name: { $contain: "keyword" } }` |
|
|
142
|
+
| 开头是 | `$startWith` | `{ email: { $startWith: "admin" } }` |
|
|
143
|
+
| 结尾是 | `$endWith` | `{ domain: { $endWith: ".com" } }` |
|
|
144
|
+
| 并且 | `$and` | `{ $and: [{ age: { $gte: 18 } }, { status: { $eq: "active" } }] }` |
|
|
145
|
+
| 或者 | `$or` | `{ $or: [{ status: { $eq: "pending" } }, { status: { $eq: "processing" } }] }` |
|
|
146
|
+
|
|
147
|
+
## SQL 创建规范(关键)
|
|
148
|
+
|
|
149
|
+
### 5 步强制流程
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
查询 → 生成 → 验证 → 保存 → 测试
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
1. **查询**: `list_sql_queries` - 检查 SQL 是否已存在
|
|
156
|
+
2. **生成**: `get_dataset_detail` - 先获取表结构,确保字段名正确
|
|
157
|
+
3. **验证**: `validate_sql_content` - 验证 SQL 语法和结构
|
|
158
|
+
4. **保存**: `save_or_update_custom_sql` - 保存到平台
|
|
159
|
+
5. **测试**: `execute_custom_sql` - 测试执行
|
|
160
|
+
|
|
161
|
+
**禁止跳过任何步骤!**
|
|
162
|
+
|
|
163
|
+
**SQL 命名规范(自动生成):**
|
|
164
|
+
- `sqlCode`:snake_case,描述性(如 `monthly_order_stats`、`user_activity_report`)
|
|
165
|
+
- `sqlName`:中文名称描述功能(如 "月度订单统计"、"用户活跃度报表")
|
|
166
|
+
- `description`:简要描述 SQL 的功能
|
|
167
|
+
|
|
168
|
+
**重要**:禁止询问用户 sqlCode、sqlName 或 description。根据上下文自动生成。
|
|
169
|
+
|
|
170
|
+
## AntD UI 规范(关键)
|
|
171
|
+
|
|
172
|
+
### 禁止项(强制)
|
|
173
|
+
|
|
174
|
+
- ❌ 禁止 emoji
|
|
175
|
+
- ❌ 禁止感叹号
|
|
176
|
+
- ❌ 禁止 AI 味道的文案("太棒了!")
|
|
177
|
+
- ❌ 禁止花哨颜色(#FF00FF,渐变)
|
|
178
|
+
- ❌ 禁止使用 emoji 作为图标
|
|
179
|
+
|
|
180
|
+
### 必需项
|
|
181
|
+
|
|
182
|
+
- ✅ 使用 AntD token 颜色
|
|
183
|
+
- ✅ 专业文案:"保存"、"取消"、"操作成功"
|
|
184
|
+
- ✅ 使用 @ant-design/icons
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
// ✅ 正确
|
|
188
|
+
<Button type="primary">保存</Button>
|
|
189
|
+
<message.success("操作成功" />
|
|
190
|
+
|
|
191
|
+
// ❌ 错误
|
|
192
|
+
<Button>保存!</Button>
|
|
193
|
+
<message.success="🎉 操作成功!" />
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## 返回格式
|
|
197
|
+
|
|
198
|
+
### Filter 返回
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
{
|
|
202
|
+
tableData: Array<{ // 数据列表
|
|
203
|
+
total: number, // 总数
|
|
204
|
+
}>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Execute SQL 返回
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
{
|
|
211
|
+
execSuccess: boolean, // SQL 是否执行成功
|
|
212
|
+
execResult?: Array<any>, // 查询结果(成功时)
|
|
213
|
+
execError?: string, // 错误信息(失败时)
|
|
214
|
+
rowCount?: number, // 返回的行数
|
|
215
|
+
message: string, // 可读消息
|
|
216
|
+
fixSuggestions?: Array<SqlFixSuggestion> // 错误修复建议
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## CLI 命令参考
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
lovrabet api pull # 拉取并生成 API 定义
|
|
224
|
+
lovrabet menu sync # 同步菜单到平台
|
|
225
|
+
lovrabet menu update # 更新菜单 CDN 资源
|
|
226
|
+
lovrabet skill --help # 显示技能包帮助
|
|
227
|
+
lovrabet skill install <ide> # 安装技能包到项目
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## 开发者指南位置
|
|
231
|
+
|
|
232
|
+
安装后,详细指南位于:
|
|
233
|
+
- `.lovrabet/skill/.shared/guides/01-filter-query/guide.md`
|
|
234
|
+
- `.lovrabet/skill/.shared/guides/02-mcp-sql-workflow/guide.md`
|
|
235
|
+
- `.lovrabet/skill/.shared/guides/03-antd-style/guide.md`
|
|
236
|
+
- `.lovrabet/skill/.shared/guides/04-troubleshooting/guide.md`
|
|
237
|
+
- `.lovrabet/skill/.shared/guides/05-api-integration/guide.md`
|
|
238
|
+
- `.lovrabet/skill/.shared/guides/06-menu-management/guide.md`
|
|
239
|
+
|
|
240
|
+
## MCP 配置说明
|
|
241
|
+
|
|
242
|
+
当 MCP 工具不可用时,主动告知用户:
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
Lovrabet MCP 服务器未配置,请先配置:
|
|
246
|
+
|
|
247
|
+
运行: lovrabet mcp install claude
|
|
248
|
+
|
|
249
|
+
这将输出 claude mcp add 命令供您手动执行。
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## 注意事项
|
|
253
|
+
|
|
254
|
+
- 每次调用 SDK 前添加注释:`// 数据集: <数据集名称> | 数据表: <表名>`
|
|
255
|
+
- 所有 SDK 调用必须用 try-catch 包裹
|
|
256
|
+
- filter 查询必须使用 filter() 方法,不要用 getList()
|
|
257
|
+
- 自定义 SQL 必须先验证字段名与实际表结构匹配
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# Lovrabet 开发工作流
|
|
2
|
+
|
|
3
|
+
当用户请求与 Lovrabet 平台相关的开发任务时,使用此工作流。
|
|
4
|
+
|
|
5
|
+
## 前置条件
|
|
6
|
+
|
|
7
|
+
此工作流假设 Lovrabet MCP 服务器已在 IDE 的 MCP 设置中配置完成。使用 `lovrabet mcp install cursor` 命令可自动配置。
|
|
8
|
+
|
|
9
|
+
## 重要规则
|
|
10
|
+
|
|
11
|
+
1. **直接使用 MCP 工具**:当用户请求创建/验证 SQL 或查询数据集时,**直接调用 MCP 工具**。不要生成脚本或让用户切换到其他工具。
|
|
12
|
+
2. **5步 SQL 工作流**:创建自定义 SQL 时必须严格遵循以下顺序。
|
|
13
|
+
3. **禁止生成脚本**:不要为 MCP 操作生成脚本 - 直接使用工具。
|
|
14
|
+
4. **禁止命令行调用 MCP**:禁止运行 `npx @lovrabet/dataset-mcp-server` 等命令。MCP 工具只能通过 MCP 协议调用。
|
|
15
|
+
5. **MCP 未配置提示**:如果尝试调用 Lovrabet MCP 工具但发现工具不可用,主动告知用户 MCP 未配置并提供配置方法。
|
|
16
|
+
6. **完全自动执行**:创建自定义 SQL 时,**自动执行全部 5 步,不要询问用户任何输入**(sqlCode、sqlName、描述等)。根据 SQL 功能自动生成合适的名称。
|
|
17
|
+
|
|
18
|
+
## 工作流步骤
|
|
19
|
+
|
|
20
|
+
### 步骤 1: 了解需求
|
|
21
|
+
分析用户请求,提取关键信息:
|
|
22
|
+
- 需要操作哪个数据集?
|
|
23
|
+
- 需要做什么操作(CRUD、自定义 SQL)?
|
|
24
|
+
- 是否需要生成代码?
|
|
25
|
+
|
|
26
|
+
### 步骤 2: 探索数据集(使用 MCP)
|
|
27
|
+
|
|
28
|
+
如果不确定数据集信息,先探索:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
请使用 list_datasets 列出所有可用的数据集
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
或搜索:
|
|
35
|
+
```
|
|
36
|
+
请使用 searchDatasets 搜索包含 "用户" 的数据集
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 步骤 3: 获取数据集详情
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
请使用 get_dataset_detail 获取数据集详情
|
|
43
|
+
datasetCode: <数据集代码>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
重点关注:
|
|
47
|
+
- `fields` - 字段列表及其元数据
|
|
48
|
+
- `operations` - 支持的操作列表
|
|
49
|
+
- `basic.tableName` - 实际表名
|
|
50
|
+
|
|
51
|
+
### 步骤 4: 生成 SDK 代码(可选)
|
|
52
|
+
|
|
53
|
+
如果需要生成代码:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
请使用 generate_sdk_code 生成 SDK 调用代码
|
|
57
|
+
datasetCode: <数据集代码>
|
|
58
|
+
operationName: <操作名称>
|
|
59
|
+
includeImports: true
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 步骤 5: 执行操作
|
|
63
|
+
|
|
64
|
+
根据需求调用相应方法:
|
|
65
|
+
|
|
66
|
+
**列表查询 (CRUD)**
|
|
67
|
+
```typescript
|
|
68
|
+
// 数据集: {datasetName} | 数据表: {tableName}
|
|
69
|
+
const result = await client.models.{modelName}.filter({
|
|
70
|
+
where: { status: { $eq: "active" } },
|
|
71
|
+
select: ["id", "name"],
|
|
72
|
+
currentPage: 1,
|
|
73
|
+
pageSize: |
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**自定义 SQL**
|
|
78
|
+
```
|
|
79
|
+
请使用 list_sql_queries 列出可用的 SQL 查询
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**执行 SQL**
|
|
83
|
+
```
|
|
84
|
+
请使用 execute_custom_sql 执行 SQL 查询
|
|
85
|
+
sqlCode: <SQL 代码>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 常见工作流
|
|
89
|
+
|
|
90
|
+
### 工作流 1: 创建列表查询页面
|
|
91
|
+
|
|
92
|
+
用户说:"创建用户列表页面"
|
|
93
|
+
|
|
94
|
+
1. 列出数据集:`list_datasets`
|
|
95
|
+
2. 获取详情:`get_dataset_detail(datasetCode: "users")`
|
|
96
|
+
3. 生成代码:`generate_sdk_code(datasetCode: "users", operationName: "filter")`
|
|
97
|
+
4. 结合 AntD Table 组件实现页面
|
|
98
|
+
|
|
99
|
+
### 工作流 2: 创建自定义 SQL 报表
|
|
100
|
+
|
|
101
|
+
用户说:"创建一个按月统计的订单报表"
|
|
102
|
+
|
|
103
|
+
1. 列出 SQL:`list_sql_queries`
|
|
104
|
+
2. 获取详情:`get_dataset_detail(datasetCode: "orders")`
|
|
105
|
+
3. 验证 SQL:`validate_sql_content(sqlContent: "SELECT DATE_FORMAT(...)")`
|
|
106
|
+
4. 保存 SQL:`save_or_update_custom_sql(...)`
|
|
107
|
+
5. 生成代码:`generate_sql_code(sqlCode: "monthly_orders")`
|
|
108
|
+
6. 结合 AntD Charts 展示报表
|
|
109
|
+
|
|
110
|
+
## Filter 查询规范(关键)
|
|
111
|
+
|
|
112
|
+
### 基本结构
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
const result = await client.models.<modelName>.filter({
|
|
116
|
+
where: {
|
|
117
|
+
status: { $eq: "active" }, // 必须使用操作符
|
|
118
|
+
age: { $gte: 18, $lte: 65 },
|
|
119
|
+
},
|
|
120
|
+
select: ["id", "name", "email"], // NOT "fields"
|
|
121
|
+
orderBy: [{ createTime: "desc" }], // NOT "sort"
|
|
122
|
+
currentPage: 1, // NOT "page"
|
|
123
|
+
pageSize: 20, // NOT "limit"
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 操作符速查
|
|
128
|
+
|
|
129
|
+
| 场景 | 操作符 | 示例 |
|
|
130
|
+
|------|-------|------|
|
|
131
|
+
| 等于 | `$eq` | `{ status: { $eq: "active" } }` |
|
|
132
|
+
| 不等于 | `$ne` | `{ status: { $ne: "deleted" } }` |
|
|
133
|
+
| 大于等于 | `$gte` | `{ age: { $gte: 18 } }` |
|
|
134
|
+
| 小于等于 | `$lte` | `{ age: { $lte: 65 } }` |
|
|
135
|
+
| 大于 | `$gt` | `{ price: { $gt: 100 } }` |
|
|
136
|
+
| 小于 | `$lt` | `{ price: { $lt: 1000 } }` |
|
|
137
|
+
| 在数组中 | `$in` | `{ type: { $in: ["A", "B"] } }` |
|
|
138
|
+
| 包含 | `$contain` | `{ name: { $contain: "keyword" } }` |
|
|
139
|
+
| 开头是 | `$startWith` | `{ email: { $startWith: "admin" } }` |
|
|
140
|
+
| 结尾是 | `$endWith` | `{ domain: { $endWith: ".com" } }` |
|
|
141
|
+
| 并且 | `$and` | `{ $and: [{ age: { $gte: 18 } }, { status: { $eq: "active" } }] }` |
|
|
142
|
+
| 或者 | `$or` | `{ $or: [{ status: { $eq: "pending" } }, { status: { $eq: "processing" } }] }` |
|
|
143
|
+
|
|
144
|
+
## SQL 创建规范(关键)
|
|
145
|
+
|
|
146
|
+
### 5 步强制流程
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
查询 → 生成 → 验证 → 保存 → 测试
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
1. **查询**: `list_sql_queries` - 检查 SQL 是否已存在
|
|
153
|
+
2. **生成**: `get_dataset_detail` - 先获取表结构,确保字段名正确
|
|
154
|
+
3. **验证**: `validate_sql_content` - 验证 SQL 语法和结构
|
|
155
|
+
4. **保存**: `save_or_update_custom_sql` - 保存到平台
|
|
156
|
+
5. **测试**: `execute_custom_sql` - 测试执行
|
|
157
|
+
|
|
158
|
+
**禁止跳过任何步骤!**
|
|
159
|
+
|
|
160
|
+
**SQL 命名规范(自动生成):**
|
|
161
|
+
- `sqlCode`:snake_case,描述性(如 `monthly_order_stats`、`user_activity_report`)
|
|
162
|
+
- `sqlName`:中文名称描述功能(如 "月度订单统计"、"用户活跃度报表")
|
|
163
|
+
- `description`:简要描述 SQL 的功能
|
|
164
|
+
|
|
165
|
+
**重要**:禁止询问用户 sqlCode、sqlName 或 description。根据上下文自动生成。
|
|
166
|
+
|
|
167
|
+
## AntD UI 规范(关键)
|
|
168
|
+
|
|
169
|
+
### 禁止项(强制)
|
|
170
|
+
|
|
171
|
+
- ❌ 禁止 emoji
|
|
172
|
+
- ❌ 禁止感叹号
|
|
173
|
+
- ❌ 禁止 AI 味道的文案("太棒了!")
|
|
174
|
+
- ❌ 禁止花哨颜色(#FF00FF,渐变)
|
|
175
|
+
- ❌ 禁止使用 emoji 作为图标
|
|
176
|
+
|
|
177
|
+
### 必需项
|
|
178
|
+
|
|
179
|
+
- ✅ 使用 AntD token 颜色
|
|
180
|
+
- ✅ 专业文案:"保存"、"取消"、"操作成功"
|
|
181
|
+
- ✅ 使用 @ant-design/icons
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
// ✅ 正确
|
|
185
|
+
<Button type="primary">保存</Button>
|
|
186
|
+
<message.success("操作成功" />
|
|
187
|
+
|
|
188
|
+
// ❌ 错误
|
|
189
|
+
<Button>保存!</Button>
|
|
190
|
+
<message.success="🎉 操作成功!" />
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## 返回格式
|
|
194
|
+
|
|
195
|
+
### Filter 返回
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
{
|
|
199
|
+
tableData: Array<{ // 数据列表
|
|
200
|
+
total: number, // 总数
|
|
201
|
+
}>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Execute SQL 返回
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
{
|
|
208
|
+
execSuccess: boolean, // SQL 是否执行成功
|
|
209
|
+
execResult?: Array<any>, // 查询结果(成功时)
|
|
210
|
+
execError?: string, // 错误信息(失败时)
|
|
211
|
+
rowCount?: number, // 返回的行数
|
|
212
|
+
message: string, // 可读消息
|
|
213
|
+
fixSuggestions?: Array<SqlFixSuggestion> // 错误修复建议
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 注意事项
|
|
218
|
+
|
|
219
|
+
- 每次调用 SDK 前添加注释:`// 数据集: <数据集名称> | 数据表: <表名>`
|
|
220
|
+
- 所有 SDK 调用必须用 try-catch 包裹
|
|
221
|
+
- filter 查询必须使用 filter() 方法,不要用 getList()
|
|
222
|
+
- 自定义 SQL 必须先验证字段名与实际表结构匹配
|
|
223
|
+
|
|
224
|
+
## 开发者指南
|
|
225
|
+
|
|
226
|
+
详细开发指南位于 `.lovrabet/skill/.shared/guides/`:
|
|
227
|
+
|
|
228
|
+
- **01-filter-query** - Filter 查询构建规范(10 种常见错误对照)
|
|
229
|
+
- **02-mcp-sql-workflow** - MCP SQL 创建工作流(5 步强制流程)
|
|
230
|
+
- **03-antd-style** - AntD UI 开发规范(禁止 AI 味道)
|
|
231
|
+
- **04-troubleshooting** - 问题排查指南(常见问题快速定位)
|
|
232
|
+
- **05-api-integration** - API 集成指南(lovrabet api pull 流程)
|
|
233
|
+
- **06-menu-management** - 菜单管理指南(menu sync/update 流程)
|
|
234
|
+
|
|
235
|
+
当遇到复杂问题时,可以参考这些指南获取更详细的说明和示例。
|
|
236
|
+
|
|
237
|
+
## MCP 配置说明
|
|
238
|
+
|
|
239
|
+
当 MCP 工具不可用时,主动告知用户:
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
Lovrabet MCP 服务器未配置,请先配置:
|
|
243
|
+
|
|
244
|
+
运行: lovrabet mcp install cursor
|
|
245
|
+
|
|
246
|
+
这将自动在 IDE 中配置 Lovrabet MCP 服务器。
|
|
247
|
+
```
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
globs: ["*.ts", "*.tsx"]
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Lovrabet Development Rules
|
|
7
|
+
|
|
8
|
+
You are a Lovrabet platform development assistant. Help developers use Lovrabet SDK and MCP correctly.
|
|
9
|
+
|
|
10
|
+
## Core Rules
|
|
11
|
+
|
|
12
|
+
### 1. Filter Query Construction (CRITICAL)
|
|
13
|
+
|
|
14
|
+
This is the most error-prone area. Strictly follow these rules:
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
// ✅ Correct structure
|
|
18
|
+
const result = await client.models.<modelName>.filter({
|
|
19
|
+
where: {
|
|
20
|
+
status: { $eq: 'active' }, // MUST use operators
|
|
21
|
+
age: { $gte: 18, $lte: 65 },
|
|
22
|
+
},
|
|
23
|
+
select: ['id', 'name'], // NOT 'fields'
|
|
24
|
+
orderBy: [{ createTime: 'desc' }], // NOT 'sort'
|
|
25
|
+
currentPage: 1, // NOT 'page'
|
|
26
|
+
pageSize: 20, // NOT 'limit'
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Common Errors to Avoid:**
|
|
31
|
+
- `where: { status: 'active' }` → Use `where: { status: { $eq: 'active' } }`
|
|
32
|
+
- `fields: ['id']` → Use `select: ['id']`
|
|
33
|
+
- `orderBy: 'createTime desc'` → Use `orderBy: [{ createTime: 'desc' }]`
|
|
34
|
+
- `where: { name: 'LIKE %keyword%' }` → Use `where: { name: { $contain: 'keyword' } }`
|
|
35
|
+
|
|
36
|
+
### 2. MCP SQL Workflow (STRICT ORDER)
|
|
37
|
+
|
|
38
|
+
When creating custom SQL, follow this 5-step workflow:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Step 1 → Step 2 → Step 3 → Step 4 → Step 5
|
|
42
|
+
Query → Generate → Validate → Save → Test
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
1. **Query**: Use `list_sql_queries` to check if SQL exists
|
|
46
|
+
2. **Generate**: Use `get_dataset_detail` to get table structure FIRST
|
|
47
|
+
3. **Validate**: Use `validate_sql_content` to verify syntax
|
|
48
|
+
4. **Save**: Use `save_or_update_custom_sql` to save
|
|
49
|
+
5. **Test**: Use `execute_custom_sql` to test execution
|
|
50
|
+
|
|
51
|
+
**NEVER skip any step!**
|
|
52
|
+
|
|
53
|
+
### 3. AntD UI Standards (No AI Style)
|
|
54
|
+
|
|
55
|
+
**Prohibited:**
|
|
56
|
+
- emoji: ✨🚀💡🎯📊🔥🎉
|
|
57
|
+
- AI-style text: "太棒了!", "让我们开始吧!"
|
|
58
|
+
- Fancy colors: #FF00FF, gradients
|
|
59
|
+
- Exclamation marks in buttons
|
|
60
|
+
- Cute terms: "小伙伴", "亲", "宝宝"
|
|
61
|
+
|
|
62
|
+
**Required:**
|
|
63
|
+
- Use AntD token colors
|
|
64
|
+
- Professional text: "保存", "取消", "操作成功"
|
|
65
|
+
- @ant-design/icons for icons (not emoji)
|
|
66
|
+
|
|
67
|
+
### 4. Code Comments
|
|
68
|
+
|
|
69
|
+
Always add dataset/table comments before SDK calls:
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
// 数据集: 用户信息 | 数据表: users
|
|
73
|
+
const users = await client.models.users.filter({
|
|
74
|
+
where: { status: { $eq: 'active' } },
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Available Operators
|
|
79
|
+
|
|
80
|
+
| Operator | Description | Example |
|
|
81
|
+
|----------|-------------|---------|
|
|
82
|
+
| `$eq` | Equals | `{ status: { $eq: 'active' } }` |
|
|
83
|
+
| `$ne` | Not equals | `{ status: { $ne: 'deleted' } }` |
|
|
84
|
+
| `$gte` | Greater or equal | `{ age: { $gte: 18 } }` |
|
|
85
|
+
| `$lte` | Less or equal | `{ age: { $lte: 65 } }` |
|
|
86
|
+
| `$gt` | Greater than | `{ price: { $gt: 100 } }` |
|
|
87
|
+
| `$lt` | Less than | `{ price: { $lt: 1000 } }` |
|
|
88
|
+
| `$in` | In array | `{ type: { $in: ['A', 'B'] } }` |
|
|
89
|
+
| `$contain` | Contains | `{ name: { $contain: 'keyword' } }` |
|
|
90
|
+
| `$startWith` | Starts with | `{ email: { $startWith: 'admin' } }` |
|
|
91
|
+
| `$endWith` | Ends with | `{ domain: { $endWith: '.com' } }` |
|
|
92
|
+
|
|
93
|
+
## CLI Commands Reference
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
lovrabet api pull # Pull and generate API definitions
|
|
97
|
+
lovrabet menu sync # Sync menu to platform
|
|
98
|
+
lovrabet menu update # Update menu CDN resources
|
|
99
|
+
lovrabet skill --help # Show skill package help
|
|
100
|
+
lovrabet skill install <ide> # Install skill package to project
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Quick Reference
|
|
104
|
+
|
|
105
|
+
- **SDK docs**: https://open.lovrabet.com/docs/lovrabet-sdk/intro
|
|
106
|
+
- **Filter API**: https://open.lovrabet.com/docs/lovrabet-sdk/filter-api
|
|
107
|
+
- **Developer guides**: `.lovrabet/skill/.shared/guides/`
|
|
108
|
+
|
|
109
|
+
Remember: Accuracy > Speed. Always verify field names and API usage.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Lovrabet 开发者技能包
|
|
2
|
+
|
|
3
|
+
这个目录包含 Lovrabet 平台开发的技能指南,帮助开发者正确使用 SDK 和 MCP。
|
|
4
|
+
|
|
5
|
+
## 📚 技能列表
|
|
6
|
+
|
|
7
|
+
### 1. [Filter 查询构建规范](./guides/01-filter-query/guide.md)
|
|
8
|
+
学会正确使用 SDK `filter()` 方法,避免常见错误。
|
|
9
|
+
|
|
10
|
+
### 2. [MCP SQL 创建工作流](./guides/02-mcp-sql-workflow/guide.md)
|
|
11
|
+
掌握创建自定义 SQL 的 5 步流程。
|
|
12
|
+
|
|
13
|
+
### 3. [AntD UI 开发规范](./guides/03-antd-style/guide.md)
|
|
14
|
+
统一 AntD 组件使用风格,避免 AI 味道。
|
|
15
|
+
|
|
16
|
+
### 4. [API 集成指南](./guides/05-api-integration/guide.md)
|
|
17
|
+
使用 `lovrabet api pull` 集成数据集 API。
|
|
18
|
+
|
|
19
|
+
### 5. [菜单管理指南](./guides/06-menu-management/guide.md)
|
|
20
|
+
使用 `lovrabet menu sync/update` 管理菜单。
|
|
21
|
+
|
|
22
|
+
## 🚀 快速开始
|
|
23
|
+
|
|
24
|
+
这些指南已经安装到项目中,可以直接阅读:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# 查看指南目录
|
|
28
|
+
ls .lovrabet/skill/.shared/guides/
|
|
29
|
+
|
|
30
|
+
# 阅读某个指南
|
|
31
|
+
cat .lovrabet/skill/.shared/guides/01-filter-query/guide.md
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 📖 文件说明
|
|
35
|
+
|
|
36
|
+
- **`.cursorrules`** - 通用项目级规则(适用于 Cursor 等支持 .cursorrules 的 IDE)
|
|
37
|
+
- **`.cursor/`** - Cursor 特定规则
|
|
38
|
+
- **`.windsurf/`** - Windsurf 特定规则
|
|
39
|
+
- **`.claude/`** - claude code 特定规则
|
|
40
|
+
|
|
41
|
+
## 🔗 相关资源
|
|
42
|
+
|
|
43
|
+
- [Lovrabet 官方文档](https://open.lovrabet.com/docs)
|
|
44
|
+
- [SDK API 参考](https://open.lovrabet.com/docs/lovrabet-sdk/api-reference)
|
|
45
|
+
- [Filter API](https://open.lovrabet.com/docs/lovrabet-sdk/filter-api)
|