@lovrabet/rabetbase-cli 2.0.2-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.
Files changed (163) hide show
  1. package/LICENSE +45 -0
  2. package/README.md +605 -0
  3. package/lib/ai-setup/config.js +1 -0
  4. package/lib/api/api-doc-ui.js +1 -0
  5. package/lib/api/api-doc.js +1 -0
  6. package/lib/api/api-pull-ui.js +1 -0
  7. package/lib/api/fetch-model-list.js +1 -0
  8. package/lib/api/generate-api-file.js +1 -0
  9. package/lib/api/main.js +1 -0
  10. package/lib/api/pull-silent.js +1 -0
  11. package/lib/app-menu/app-menu-sync-ui.js +1 -0
  12. package/lib/app-menu/create-menu.js +1 -0
  13. package/lib/app-menu/get-local-pages.js +1 -0
  14. package/lib/app-menu/get-online-menu-list.js +1 -0
  15. package/lib/app-menu/types.js +1 -0
  16. package/lib/app-menu/use-get-online-menu-list.js +1 -0
  17. package/lib/app-menu/utils.js +1 -0
  18. package/lib/app-menu/valid-url.js +1 -0
  19. package/lib/app-menu-update-cdn/current-content.js +1 -0
  20. package/lib/app-menu-update-cdn/input-cdn-asset.js +1 -0
  21. package/lib/app-menu-update-cdn/main.js +1 -0
  22. package/lib/app-menu-update-cdn/types.js +1 -0
  23. package/lib/app-menu-update-cdn/update-menu-cdn-url.js +1 -0
  24. package/lib/auth/auth-server-ui.js +1 -0
  25. package/lib/auth/auth-server.js +1 -0
  26. package/lib/auth/constant.js +1 -0
  27. package/lib/auth/get-cookie.js +1 -0
  28. package/lib/auth/is-session-valid.js +1 -0
  29. package/lib/auth/logout.js +1 -0
  30. package/lib/cli-flags.js +1 -0
  31. package/lib/cli.js +2 -0
  32. package/lib/commands/api.js +1 -0
  33. package/lib/commands/app.js +1 -0
  34. package/lib/commands/auth.js +1 -0
  35. package/lib/commands/bff/delete.js +1 -0
  36. package/lib/commands/bff/detail.js +1 -0
  37. package/lib/commands/bff/index.js +1 -0
  38. package/lib/commands/bff/list.js +1 -0
  39. package/lib/commands/bff/new.js +1 -0
  40. package/lib/commands/bff/pull.js +1 -0
  41. package/lib/commands/bff/push.js +1 -0
  42. package/lib/commands/bff/status.js +1 -0
  43. package/lib/commands/build.js +1 -0
  44. package/lib/commands/codegen/index.js +1 -0
  45. package/lib/commands/codegen/sdk.js +1 -0
  46. package/lib/commands/codegen/sql.js +1 -0
  47. package/lib/commands/config.js +1 -0
  48. package/lib/commands/create.js +1 -0
  49. package/lib/commands/dataset/detail.js +1 -0
  50. package/lib/commands/dataset/index.js +1 -0
  51. package/lib/commands/dataset/links.js +1 -0
  52. package/lib/commands/dataset/list.js +1 -0
  53. package/lib/commands/dataset/operations.js +1 -0
  54. package/lib/commands/init.js +1 -0
  55. package/lib/commands/logout.js +1 -0
  56. package/lib/commands/logs.js +1 -0
  57. package/lib/commands/mcp.js +1 -0
  58. package/lib/commands/menu.js +1 -0
  59. package/lib/commands/preview.js +1 -0
  60. package/lib/commands/registry.js +1 -0
  61. package/lib/commands/run.js +1 -0
  62. package/lib/commands/skill.js +1 -0
  63. package/lib/commands/sql/detail.js +1 -0
  64. package/lib/commands/sql/exec.js +1 -0
  65. package/lib/commands/sql/index.js +1 -0
  66. package/lib/commands/sql/list.js +1 -0
  67. package/lib/commands/sql/save.js +1 -0
  68. package/lib/commands/sql/validate.js +1 -0
  69. package/lib/commands/start.js +1 -0
  70. package/lib/config/config-help.js +1 -0
  71. package/lib/config/main.js +1 -0
  72. package/lib/constant/cli.js +1 -0
  73. package/lib/constant/domain.js +1 -0
  74. package/lib/constant/env.js +1 -0
  75. package/lib/context.js +1 -0
  76. package/lib/core/alias-resolver.js +1 -0
  77. package/lib/core/api-client.js +1 -0
  78. package/lib/core/bff/config.js +1 -0
  79. package/lib/core/bff/file-system.js +1 -0
  80. package/lib/core/bff/hash.js +1 -0
  81. package/lib/core/bff/lock.js +1 -0
  82. package/lib/core/bff/types.js +1 -0
  83. package/lib/core/bff/utils.js +1 -0
  84. package/lib/core/db-resolver.js +1 -0
  85. package/lib/core/sql-validator.js +1 -0
  86. package/lib/create-app/enhanced-guided-create.js +1 -0
  87. package/lib/create-app/format-elapsed.js +1 -0
  88. package/lib/create-app/main.js +1 -0
  89. package/lib/create-app/non-interactive.js +1 -0
  90. package/lib/create-app/task-finished.js +1 -0
  91. package/lib/create-app/task-loading.js +1 -0
  92. package/lib/create-app/task-running.js +1 -0
  93. package/lib/create-app/task-time.js +1 -0
  94. package/lib/create-app/use-copy-project-template.js +1 -0
  95. package/lib/create-app/use-format-code.js +1 -0
  96. package/lib/create-app/use-install-dependencies.js +1 -0
  97. package/lib/errors.js +1 -0
  98. package/lib/framework/flags.js +1 -0
  99. package/lib/framework/help.js +1 -0
  100. package/lib/framework/index.js +1 -0
  101. package/lib/framework/output.js +1 -0
  102. package/lib/framework/response.js +1 -0
  103. package/lib/framework/runner.js +1 -0
  104. package/lib/framework/types.js +1 -0
  105. package/lib/generated/build-info.js +1 -0
  106. package/lib/help.js +1 -0
  107. package/lib/init/main.js +1 -0
  108. package/lib/mcp/McpInstallUI.js +1 -0
  109. package/lib/mcp/claude.js +1 -0
  110. package/lib/mcp/cursor.js +1 -0
  111. package/lib/mcp/main.js +1 -0
  112. package/lib/mcp/mcp-install-non-interactive.js +1 -0
  113. package/lib/mcp/mcp-installer.js +1 -0
  114. package/lib/skills/main.js +1 -0
  115. package/lib/skills/npx-skills-add.js +1 -0
  116. package/lib/types/index.js +1 -0
  117. package/lib/ui/IDESelector.js +1 -0
  118. package/lib/ui/useIDESelection.js +1 -0
  119. package/lib/utils/ai_config.js +1 -0
  120. package/lib/utils/cdn-config.js +1 -0
  121. package/lib/utils/check-sdk-version.js +1 -0
  122. package/lib/utils/cli-version-check.js +1 -0
  123. package/lib/utils/config.js +1 -0
  124. package/lib/utils/copy-directory.js +1 -0
  125. package/lib/utils/file-utils.js +1 -0
  126. package/lib/utils/guides-cdn.js +1 -0
  127. package/lib/utils/http-client.js +1 -0
  128. package/lib/utils/logger.js +1 -0
  129. package/lib/utils/rules-cdn.js +1 -0
  130. package/lib/utils/sleep.js +1 -0
  131. package/lib/utils/template-replacer.js +1 -0
  132. package/package.json +77 -0
  133. package/sidecar/flags.json +10 -0
  134. package/templates/README.md +97 -0
  135. package/templates/generate-api/api.ts.tpl +47 -0
  136. package/templates/generate-api/client.ts.tpl +64 -0
  137. package/templates/projects/sub-app-react-demo/.prettierrc +1 -0
  138. package/templates/projects/sub-app-react-demo/CHANGELOG.md +53 -0
  139. package/templates/projects/sub-app-react-demo/README.md +318 -0
  140. package/templates/projects/sub-app-react-demo/docs/API_RULE_CHANGE.md +212 -0
  141. package/templates/projects/sub-app-react-demo/docs/quick-start.md +526 -0
  142. package/templates/projects/sub-app-react-demo/index.html +27 -0
  143. package/templates/projects/sub-app-react-demo/package.json +34 -0
  144. package/templates/projects/sub-app-react-demo/public/logo.svg +1 -0
  145. package/templates/projects/sub-app-react-demo/public/vite.svg +1 -0
  146. package/templates/projects/sub-app-react-demo/src/api/api.ts +83 -0
  147. package/templates/projects/sub-app-react-demo/src/api/client.ts +64 -0
  148. package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +311 -0
  149. package/templates/projects/sub-app-react-demo/src/main.tsx +48 -0
  150. package/templates/projects/sub-app-react-demo/src/pages/dashboard/index.tsx +572 -0
  151. package/templates/projects/sub-app-react-demo/src/pages/data-screen/index.tsx +526 -0
  152. package/templates/projects/sub-app-react-demo/src/pages/index.tsx +467 -0
  153. package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +453 -0
  154. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.module.css +293 -0
  155. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +155 -0
  156. package/templates/projects/sub-app-react-demo/src/router/index.tsx +30 -0
  157. package/templates/projects/sub-app-react-demo/src/style.css +92 -0
  158. package/templates/projects/sub-app-react-demo/src/utils/api.ts +12 -0
  159. package/templates/projects/sub-app-react-demo/src/vite-env.d.ts +2 -0
  160. package/templates/projects/sub-app-react-demo/tsconfig.json +26 -0
  161. package/templates/projects/sub-app-react-demo/vite.config.ts +111 -0
  162. package/templates/rules/lovrabet_rules.mdc.tpl +891 -0
  163. package/templates/skill/SKILL.md.tpl +120 -0
package/LICENSE ADDED
@@ -0,0 +1,45 @@
1
+ # Lovrabet CLI 软件许可协议
2
+
3
+ 版权所有 (c) 2024-2025 Lovrabet
4
+
5
+ ## 许可范围
6
+
7
+ 本软件("Lovrabet CLI")是专有软件,由 Lovrabet 开发和维护。
8
+
9
+ ### 允许的使用
10
+
11
+ 您被授予有限的、非独占的、不可转让的许可,可以:
12
+
13
+ 1. **安装和使用** - 通过 npm 安装并在您的开发环境中使用本软件
14
+ 2. **个人和商业用途** - 在个人项目或商业项目中使用本软件
15
+ 3. **生成内容** - 使用本软件生成的代码和项目文件归您所有
16
+
17
+ ### 限制条款
18
+
19
+ 您**不得**:
20
+
21
+ 1. ❌ **修改源代码** - 不得修改、反编译、逆向工程或反汇编本软件
22
+ 2. ❌ **再分发** - 不得复制、分发、出售或转让本软件
23
+ 3. ❌ **创建衍生作品** - 不得基于本软件创建衍生产品或竞争产品
24
+ 4. ❌ **移除版权声明** - 不得移除或修改任何版权声明或商标
25
+ 5. ❌ **公开源代码** - 本软件为闭源软件,源代码不公开
26
+
27
+ ## 免责声明
28
+
29
+ 本软件按"原样"提供,不提供任何明示或暗示的保证,包括但不限于对适销性、特定用途适用性和非侵权性的保证。
30
+
31
+ 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为还是其他方面。
32
+
33
+ ## 终止
34
+
35
+ 如果您违反本许可协议的任何条款,您使用本软件的权利将自动终止。
36
+
37
+ ## 联系方式
38
+
39
+ 如有疑问或需要商业授权,请联系:
40
+ - 网站:https://www.lovrabet.com
41
+ - 邮箱:support@lovrabet.com
42
+
43
+ ---
44
+
45
+ **本软件受著作权法和国际条约保护。未经授权的复制或分发可能导致严重的民事和刑事处罚。**
package/README.md ADDED
@@ -0,0 +1,605 @@
1
+ # Rabetbase CLI(`@lovrabet/rabetbase-cli`)
2
+
3
+ 一个强大的前端开发脚手架工具,专为 [Lovrabet](https://www.lovrabet.com) 开放平台应用开发而设计。提供项目创建、页面生成、API 集成、开发调试等全套开发工具链。全局安装后的默认可执行文件名为 **`rabetbase`**(仍提供 **`lovrabet`** 作为兼容别名)。
4
+
5
+ ## ✨ 特性
6
+
7
+ - 🚀 **快速创建项目** - 基于模板快速生成完整的前端应用项目
8
+ - 📄 **智能页面生成** - 自动生成页面组件和路由配置
9
+ - 🔐 **统一身份认证** - 集成 Lovrabet 平台登录和权限管理
10
+ - 🌐 **API 自动生成** - 根据数据集自动生成 API 配置文件
11
+ - 📋 **菜单智能同步** - 自动扫描本地页面并同步菜单到平台,支持多种命名策略
12
+ - ⚡ **开发服务器** - 内置热更新开发服务器
13
+ - 🏗️ **智能构建** - 优化的生产环境构建配置
14
+ - 📦 **模板管理** - 丰富的项目模板和组件模板
15
+ - 📝 **日志管理** - 完整的开发日志记录和查看
16
+
17
+ ## 📦 安装
18
+
19
+ ### 全局安装(推荐)
20
+
21
+ ```bash
22
+ # 使用 npm
23
+ npm install -g @lovrabet/rabetbase-cli
24
+
25
+ # 使用 bun(推荐)
26
+ bun install -g @lovrabet/rabetbase-cli
27
+ ```
28
+
29
+ ### 验证安装
30
+
31
+ ```bash
32
+ rabetbase --help
33
+ ```
34
+
35
+ ## 🚀 快速上手
36
+
37
+ ### 1. 登录认证
38
+
39
+ 首先需要登录 Lovrabet 平台获取访问权限:
40
+
41
+ ```bash
42
+ rabetbase auth
43
+ ```
44
+
45
+ 这会打开浏览器登录页面,完成登录后 CLI 会自动保存认证信息。
46
+
47
+ ### 2. 创建项目
48
+
49
+ ```bash
50
+ rabetbase create
51
+ ```
52
+
53
+ CLI 会引导您选择项目模板并创建完整的项目结构。
54
+
55
+ ### 3. 启动开发
56
+
57
+ 进入项目目录并启动开发服务器:
58
+
59
+ ```bash
60
+ cd your-project
61
+ rabetbase start
62
+ ```
63
+
64
+ ### 4. 生成 API 配置[可选]
65
+
66
+ 如果在create的时候未选择自动更新API列表,或者API已经发生变化,可以手动根据应用的appcode自动生成 API 配置:
67
+
68
+ ```bash
69
+ rabetbase api pull --appcode <app-code>
70
+ ```
71
+
72
+ ### 5. 添加页面
73
+
74
+ 在项目中快速添加新页面:
75
+
76
+ ```bash
77
+ rabetbase add page
78
+ ```
79
+
80
+ ## 📚 命令详解
81
+
82
+ ### 项目管理
83
+
84
+ #### `rabetbase create [项目名]`
85
+
86
+ 创建新的前端应用项目
87
+
88
+ - **功能**: 基于预设模板创建完整的项目结构
89
+ - **模板类型**:
90
+ - React 单页应用
91
+ - 多页面应用
92
+ - 组件库项目
93
+ - **自动配置**: 路由、状态管理、API 集成、构建配置
94
+
95
+ #### `rabetbase add page`
96
+
97
+ 添加新页面到当前项目
98
+
99
+ - **功能**: 自动生成页面组件、样式文件和路由配置
100
+ - **支持**: 嵌套路由、动态路由、页面模板选择
101
+ - **自动更新**: 路由配置文件和导航菜单
102
+
103
+ ### 开发调试
104
+
105
+ #### `rabetbase start`
106
+
107
+ 启动开发服务器
108
+
109
+ - **热更新**: 文件变化自动刷新
110
+ - **代理配置**: 自动配置 API 代理
111
+ - **错误提示**: 友好的错误信息和调试提示
112
+
113
+ #### `rabetbase build`
114
+
115
+ 构建生产版本
116
+
117
+ - **代码压缩**: 自动压缩 JS、CSS、HTML
118
+ - **资源优化**: 图片压缩、字体子集化
119
+ - **缓存优化**: 文件名哈希、分包策略
120
+
121
+ #### `rabetbase preview [--watch]`
122
+
123
+ 预览构建结果
124
+
125
+ - **本地服务**: 启动本地预览服务器
126
+ - **监听模式**: `--watch` 参数自动重新构建
127
+
128
+ ### API 集成
129
+
130
+ #### `rabetbase api pull`
131
+
132
+ 拉取并生成 API 配置文件
133
+
134
+ - **自动发现**: 扫描应用数据集和接口
135
+ - **类型生成**: 自动生成 TypeScript 类型定义
136
+ - **配置生成**: 生成 SDK 配置文件
137
+ - **可用参数**: `--appcode`、`--output`、`--env`(v1.1.7+)
138
+
139
+ ### 身份认证
140
+
141
+ #### `rabetbase auth`
142
+
143
+ 登录 Lovrabet 平台
144
+
145
+ - **浏览器登录**: 打开浏览器进行 OAuth 登录
146
+ - **令牌管理**: 自动保存和刷新访问令牌
147
+ - **权限验证**: 验证项目访问权限
148
+
149
+ #### `rabetbase logout`
150
+
151
+ 退出登录
152
+
153
+ - **清理令牌**: 清除本地保存的认证信息
154
+ - **安全退出**: 通知服务器撤销令牌
155
+
156
+ ### 菜单管理
157
+
158
+ #### `rabetbase menu sync`
159
+
160
+ 同步本地页面到 Lovrabet 平台菜单
161
+
162
+ ```bash
163
+ rabetbase menu sync
164
+ ```
165
+
166
+ - **自动扫描**: 扫描 `src/pages` 目录下的所有页面
167
+ - **智能对比**: 对比本地和平台菜单,找出缺失项
168
+ - **智能命名**: 支持多种菜单名称提取策略(详见文档)
169
+ - **批量创建**: 一键创建所有缺失的菜单项
170
+
171
+ **菜单名称提取优先级**:
172
+
173
+ 1. **Title 注释**(最高优先级)- 在文件顶部注释中添加 `Title: 菜单名称`
174
+ 2. **displayName 属性** - 组件的 `displayName` 属性
175
+ 3. **组件名** - `export default` 的组件名(PascalCase)
176
+ 4. **文件路径**(兜底)- 使用相对路径作为菜单名
177
+
178
+ > 💡 **推荐做法**:使用 `Title:` 注释,可以设置中文菜单名,更加清晰易懂。
179
+
180
+ ### 配置管理
181
+
182
+ #### `rabetbase init`
183
+
184
+ 在现有项目中初始化 Lovrabet 配置文件(v1.1.12+)
185
+
186
+ ```bash
187
+ rabetbase init # 交互式初始化
188
+ rabetbase init --appcode my-app-code # 直接指定 appcode
189
+ rabetbase init --appcode my-app --env daily # 指定环境
190
+ ```
191
+
192
+ - **交互式输入**: 支持交互式输入 appcode,带实时格式验证
193
+ - **智能验证**: 自动验证 appcode 格式(字母、数字、- 和 \_)
194
+ - **安全保护**: 检测并防止覆盖现有配置文件
195
+ - **配置继承**: 自动继承全局配置(如环境设置)
196
+ - **版本记录**: 生成的配置包含创建时间和 CLI 版本
197
+
198
+ **使用场景**:为已有的前端项目添加 Lovrabet 支持,无需重新创建项目。
199
+
200
+ #### `rabetbase config`
201
+
202
+ 项目配置管理
203
+
204
+ - **应用绑定**: 绑定 Lovrabet 应用
205
+ - **环境配置**: 开发/生产环境切换
206
+ - **API 配置**: 数据集和接口配置
207
+
208
+ ### 日志管理
209
+
210
+ #### `rabetbase logs`
211
+
212
+ 查看开发日志
213
+
214
+ ```bash
215
+ rabetbase logs # 查看最新日志
216
+ rabetbase logs --clear # 清空日志记录
217
+ ```
218
+
219
+ ## 🏗️ 项目结构
220
+
221
+ CLI 创建的项目具有以下标准结构:
222
+
223
+ ```
224
+ your-project/
225
+ ├── src/
226
+ │ ├── components/ # 公共组件
227
+ │ ├── pages/ # 页面组件
228
+ │ ├── layouts/ # 布局组件
229
+ │ ├── api/ # API 配置
230
+ │ ├── utils/ # 工具函数
231
+ │ ├── router/ # 路由配置
232
+ │ └── main.tsx # 入口文件
233
+ ├── public/ # 静态资源
234
+ ├── docs/ # 项目文档
235
+ ├── package.json # 项目配置
236
+ ├── vite.config.ts # 构建配置
237
+ ├── tsconfig.json # TypeScript 配置
238
+ └── .rabetbase.json # Rabetbase CLI 配置
239
+ ```
240
+
241
+ ## ⚙️ 配置文件
242
+
243
+ ### `.rabetbase.json`
244
+
245
+ 项目根目录的配置文件(JSON 格式),用于配置应用基本信息:
246
+
247
+ ```json
248
+ {
249
+ "appcode": "your-app-code",
250
+ "env": "online",
251
+ "createdAt": "2025/1/5 10:30:00",
252
+ "version": "1.1.15"
253
+ }
254
+ ```
255
+
256
+ **配置说明:**
257
+
258
+ | 字段 | 说明 | 可选值 |
259
+ |------|------|--------|
260
+ | `appcode` | 应用代码,用于标识您的应用 | 字母、数字、`-` 和 `_` |
261
+ | `env` | 运行环境 | `"online"` 或 `"daily"` |
262
+ | `createdAt` | 配置创建时间(自动生成) | - |
263
+ | `version` | CLI 版本(自动生成) | - |
264
+
265
+ **生成方式:**
266
+
267
+ ```bash
268
+ # 通过 init 命令生成
269
+ rabetbase init --appcode your-app-code
270
+
271
+ # 或通过 create 命令自动生成
272
+ rabetbase create
273
+ ```
274
+
275
+ > 💡 **注意**:`.rabetbase.json` 是 CLI 工具的配置文件(兼容旧名 `.lovrabet.json` / `.lovrabetrc`)。SDK 的 API 配置(models)由 `rabetbase api pull` 命令自动生成到 `src/api/` 目录。
276
+
277
+ ## 🔧 环境要求
278
+
279
+ - **Node.js**: >= 20.0.0
280
+ - **包管理器**: npm、yarn 或 bun
281
+ - **浏览器**: Chrome、Firefox、Safari、Edge 等现代浏览器
282
+
283
+ ## 🎯 使用场景
284
+
285
+ ### 快速原型开发
286
+
287
+ ```bash
288
+ rabetbase create prototype-app
289
+ cd prototype-app
290
+ rabetbase api pull --appcode your-app-code
291
+ rabetbase start
292
+ ```
293
+
294
+ ### 为现有项目添加 Lovrabet 支持(v1.1.12+)
295
+
296
+ ```bash
297
+ # 进入现有项目目录
298
+ cd existing-project
299
+
300
+ # 初始化 Lovrabet 配置
301
+ rabetbase init --appcode your-app-code
302
+
303
+ # 拉取 API 配置
304
+ rabetbase api pull
305
+
306
+ # 生成 API 文档
307
+ rabetbase api doc
308
+ ```
309
+
310
+ ### 企业级应用开发
311
+
312
+ ```bash
313
+ rabetbase create enterprise-app
314
+ cd enterprise-app
315
+ rabetbase config # 配置生产环境
316
+ rabetbase add page # 添加业务页面
317
+ rabetbase build # 构建生产版本
318
+ ```
319
+
320
+ ### 组件库开发
321
+
322
+ ```bash
323
+ rabetbase create component-library
324
+ cd component-library
325
+ # 开发和测试组件...
326
+ rabetbase build
327
+ ```
328
+
329
+ ## 🆘 故障排查
330
+
331
+ ### 常见问题
332
+
333
+ **Q: 登录失败或权限不足?**
334
+ A: 确保您有 Lovrabet 平台的访问权限,尝试重新登录:
335
+
336
+ ```bash
337
+ rabetbase logout
338
+ rabetbase auth
339
+ ```
340
+
341
+ **Q: API 拉取失败?**
342
+ A: 检查应用代码是否正确,确认您有该应用的访问权限:
343
+
344
+ ```bash
345
+ rabetbase api pull --appcode correct-app-code
346
+ ```
347
+
348
+ **Q: 构建错误?**
349
+ A: 查看详细错误信息:
350
+
351
+ ```bash
352
+ rabetbase logs
353
+ ```
354
+
355
+ **Q: 开发服务器启动失败?**
356
+ A: 检查端口是否被占用,或指定其他端口。
357
+
358
+ ### 日志和调试
359
+
360
+ 查看详细的操作日志:
361
+
362
+ ```bash
363
+ rabetbase logs
364
+ ```
365
+
366
+ 清空日志记录:
367
+
368
+ ```bash
369
+ rabetbase logs --clear
370
+ ```
371
+
372
+ ## 📝 What's New
373
+
374
+ ### v1.1.15 (2025-01-05)
375
+
376
+ **新增功能 (New Features):**
377
+
378
+ - ✨ **菜单同步智能标题提取** - `rabetbase menu sync` 命令一键将二开应用工程自动同步到Lovrabet生成的业务系统,瞬间完成主子应用合并,无需执行繁琐的手动配置。
379
+ **核心特性:**
380
+ - 🎯 **支持中文菜单名** - 使用 Title 注释可以直接写中文,用户体验更友好
381
+ - 📋 **优先级清晰** - Title > displayName > 组件名 > 文件路径
382
+ - 🔧 **灵活配置** - 支持多种命名策略,满足不同团队习惯
383
+ - ✅ **自动回退** - 即使没有设置,也能自动使用文件路径作为兜底
384
+ - 🛡️ **格式容错** - Title 支持大小写、单双星号注释等多种格式
385
+
386
+ 详情点击此处 [rabetbase menu sync](https://open.lovrabet.com/docs/lovrabet-cli/menu-sync)
387
+
388
+ ---
389
+
390
+ ### v1.1.12 (2025-10-17)
391
+
392
+ **新增功能 (New Features):**
393
+
394
+ - ✨ **新增 `rabetbase init` 命令** - 在现有项目中快速初始化配置
395
+
396
+ 为已有项目添加 Lovrabet 配置支持:
397
+
398
+ ```bash
399
+ # 交互式初始化
400
+ rabetbase init
401
+
402
+ # 直接指定 appcode
403
+ rabetbase init --appcode my-app-code
404
+
405
+ # 指定环境
406
+ rabetbase init --appcode my-app-code --env daily
407
+ ```
408
+
409
+ - 🔍 智能验证 appcode 格式(只允许字母、数字、- 和 \_)
410
+ - 🛡️ 自动检测并防止覆盖现有配置文件
411
+ - 🔄 继承全局配置,无需重复设置
412
+ - 📝 配置文件包含创建时间和 CLI 版本信息
413
+ - 💬 友好的交互式输入体验
414
+
415
+ - ✨ **`rabetbase api doc` 增强** - 支持按需生成和自定义参数
416
+
417
+ ```bash
418
+ # 只生成指定数据集的文档
419
+ rabetbase api doc --datasetcode ds_001
420
+
421
+ # 生成多个指定数据集的文档(用逗号分隔)
422
+ rabetbase api doc --datasetcode ds_001,ds_002,ds_003
423
+
424
+ # 传递额外参数到文档生成 API
425
+ rabetbase api doc --params '{"customField": "value"}'
426
+ ```
427
+
428
+ - 🎯 **按需生成文档** - 通过 `--datasetcode` 参数指定要生成的数据集
429
+ - ✅ **智能验证** - 自动检查指定的数据集代码是否存在
430
+ - 📊 **统计反馈** - 显示匹配的数据集数量和无效的代码
431
+ - 🔧 **自定义参数** - 支持通过 JSON 格式传递额外参数
432
+
433
+ **改进优化 (Improvements):**
434
+
435
+ - 📊 **优化文件命名策略** - 提高文件名唯一性
436
+ - 短代码从 4 位扩展到 6 位
437
+ - 减少文件名冲突的可能性
438
+
439
+ **使用场景:**
440
+
441
+ ```bash
442
+ # 场景1: 为现有项目添加 Lovrabet 支持
443
+ cd existing-project
444
+ rabetbase init --appcode my-app
445
+ rabetbase api pull
446
+
447
+ # 场景2: 只生成指定数据集的文档
448
+ rabetbase api doc --datasetcode dataset_abc123
449
+
450
+ # 场景3: 批量生成多个数据集的文档
451
+ rabetbase api doc --datasetcode dataset_abc123,dataset_def456,dataset_ghi789
452
+ ```
453
+
454
+ ---
455
+
456
+ ### v1.1.11 (2025-10-16)
457
+
458
+ **新增功能 (New Features):**
459
+
460
+ - ✨ **API 文档自动生成** - 全新的文档生成工具,让 API 使用更清晰
461
+
462
+ 现在可以一键生成所有数据集的 API 使用文档(Markdown 格式):
463
+
464
+ ```bash
465
+ rabetbase api doc
466
+ ```
467
+
468
+ - 📚 自动生成完整的 API 使用说明
469
+ - 📊 包含数据字段、请求示例、响应格式等
470
+ - 🎯 支持批量生成,自动处理所有数据集
471
+ - 📁 输出为标准 Markdown 格式,便于团队共享
472
+
473
+ **改进优化 (Improvements):**
474
+
475
+ - 📦 **升级项目模板 SDK** - 提升开发体验和类型安全
476
+ - 项目模板中的 `@lovrabet/sdk` 升级至 v1.1.16
477
+ - 新增 `SortOrder` 类型支持,提供更好的类型提示
478
+ - 优化代码规范和格式,提升生成代码质量
479
+
480
+ - 🔧 **数据集智能去重** - API 拉取更精准
481
+ - 自动识别并过滤重复的数据集(相同 `tableName`)
482
+ - 显示详细的去重统计信息
483
+ - 避免配置文件中出现重复项
484
+
485
+ - 🎨 **SDK 数据获取页面模板优化** - 生成的页面更简洁高效
486
+ - 精简 UI 组件代码,提升可维护性
487
+ - 增强表格数据处理能力
488
+ - 改进数据展示性能
489
+ - 优化代码结构和注释
490
+
491
+ - 🎯 **API 配置管理优化**
492
+ - 优化用户交互提示信息
493
+ - 改进错误处理和提示
494
+ - 提升整体用户体验
495
+
496
+ **使用示例:**
497
+
498
+ ```bash
499
+ # 创建新项目(自动使用最新模板)
500
+ rabetbase create my-app
501
+
502
+ # 生成 API 配置文件
503
+ rabetbase api pull --appcode my-app
504
+
505
+ # 生成 API 文档(新功能)
506
+ rabetbase api doc
507
+
508
+ # 查看详细日志
509
+ rabetbase logs
510
+ ```
511
+
512
+ ---
513
+
514
+ ### v1.1.7 (2025-10-10)
515
+
516
+ **重大变更 (Breaking Changes):**
517
+
518
+ - 🔴 **`rabetbase api pull` 命令参数调整**
519
+ - ❌ **不再支持**位置参数方式(如 `rabetbase api pull my-app-code`)
520
+ - ✅ **改用** `--appcode` 参数(如 `rabetbase api pull --appcode my-app-code`)
521
+ - 迁移指南:将 `rabetbase api pull <app-code>` 改为 `rabetbase api pull --appcode <app-code>`
522
+
523
+ **新增功能 (New Features):**
524
+
525
+ - ✨ **新增 `--output` 参数** - 支持自定义 API 文件输出目录
526
+ ```bash
527
+ rabetbase api pull --output ./lib/api
528
+ ```
529
+ - ✨ **新增 `--env` 参数** - 支持指定环境拉取 API(内部使用)
530
+ ```bash
531
+ rabetbase api pull --env <env>
532
+ ```
533
+
534
+ **改进 (Improvements):**
535
+
536
+ - 📚 优化命令行帮助信息,参数说明更加清晰
537
+ - 🔧 统一命令行参数风格,所有参数均使用 `--` 前缀
538
+ - 📖 更新文档,添加版本标识和迁移说明
539
+
540
+ **使用示例:**
541
+
542
+ ```bash
543
+ # ✅ 推荐用法
544
+ rabetbase api pull # 使用配置的 appcode
545
+ rabetbase api pull --appcode my-app # 指定 appcode
546
+ rabetbase api pull --output ./lib/api # 自定义输出目录
547
+ rabetbase api pull --appcode my-app --output ./api # 组合使用
548
+
549
+ # ❌ 不再支持
550
+ rabetbase api pull my-app # 位置参数方式已废弃
551
+ ```
552
+
553
+ ---
554
+
555
+ ### v1.1.6 (2025-09-30)
556
+
557
+ **改进 (Improvements):**
558
+
559
+ - 📦 **升级模板 SDK** - 项目模板中的 SDK 升级到最新版本,支持更多特性
560
+
561
+ ---
562
+
563
+ ### v1.1.4 (2025-09-27)
564
+
565
+ **重大变更 (Breaking Changes):**
566
+
567
+ - 🔴 **统一模型配置字段命名** - 重构模型配置字段命名规范(可能影响现有配置)
568
+ - 请查阅文档更新配置文件中的字段名称
569
+
570
+ ---
571
+
572
+ ## 📖 更多资源
573
+
574
+ - [Lovrabet SDK 使用指南](https://www.npmjs.com/package/@lovrabet/sdk)
575
+ - [示例项目](https://github.com/rabetbase-ai/sub-app-react-demo)
576
+ - [完整文档](https://docs.lovrabet.com)
577
+
578
+ ---
579
+
580
+ ## 📎 源码仓库
581
+
582
+ - Git(阿里云 Codeup):`git@codeup.aliyun.com:yuntoo/open/rabetbase-cli.git`
583
+ - 从旧仓库 `lovrabet-cli` 迁移后,请更新本地 `remote`:`git remote set-url origin git@codeup.aliyun.com:yuntoo/open/rabetbase-cli.git`
584
+
585
+ ## 🤝 反馈
586
+
587
+ 如遇到问题或有功能建议,欢迎提交 Issue!
588
+
589
+ ## 📄 许可证
590
+
591
+ **专有软件(Proprietary)** - 详见 [LICENSE](./LICENSE) 文件
592
+
593
+ 本软件为 Lovrabet 开放平台的专有工具:
594
+
595
+ - ✅ **允许使用** - 可以安装和使用本工具开发 Lovrabet 应用
596
+ - ✅ **生成内容归您** - 使用本工具生成的代码和项目归您所有
597
+ - ❌ **不得修改** - 不得修改、反编译或逆向工程
598
+ - ❌ **不得再分发** - 不得复制或分发本软件
599
+ - ❌ **源代码不公开** - 本软件为闭源软件
600
+
601
+ 如需商业授权或有疑问,请访问 [lovrabet.com](https://www.lovrabet.com)
602
+
603
+ ---
604
+
605
+ **开始您的 Lovrabet 应用开发之旅!** 🎉
@@ -0,0 +1 @@
1
+ const a0_0x8fa46e=a0_0x15da;(function(_0x23b022,_0x12795d){const _0x4e7d09=a0_0x15da,_0x470d12=_0x23b022();while(!![]){try{const _0x61a09d=-parseInt(_0x4e7d09(0x1a0))/0x1*(-parseInt(_0x4e7d09(0x18b))/0x2)+parseInt(_0x4e7d09(0x1ac))/0x3+parseInt(_0x4e7d09(0x1b0))/0x4*(parseInt(_0x4e7d09(0x19b))/0x5)+-parseInt(_0x4e7d09(0x191))/0x6+parseInt(_0x4e7d09(0x193))/0x7*(parseInt(_0x4e7d09(0x198))/0x8)+parseInt(_0x4e7d09(0x19c))/0x9*(-parseInt(_0x4e7d09(0x1b8))/0xa)+parseInt(_0x4e7d09(0x18a))/0xb*(-parseInt(_0x4e7d09(0x199))/0xc);if(_0x61a09d===_0x12795d)break;else _0x470d12['push'](_0x470d12['shift']());}catch(_0x2042c7){_0x470d12['push'](_0x470d12['shift']());}}}(a0_0x1b27,0xd7ef2));function a0_0x1b27(){const _0x5d6b21=['Written\x20.cursor/mcp.json','.cursor','22SzlwzI','234MyCOCh','mcp-install','Other','app','message','join','733074TxmEfq','@lovrabet/dataset-mcp-server@latest','812595EwpYPh','cursor','\x20\x20\x20\x20\x20\x20\x20\x20\x22RABETBASE_APP_CODE\x22:\x20\x22','stringify','utf-8','88tclMoU','4472940qGivvG','mcpServers','60105iTimgx','27jXcfOk','info','\x20\x20\x20\x20\x22','\x20\x20\x20\x20\x20\x20\x22args\x22:\x20[','6276wSvfmc','mcp.json','\x0a📋\x20Other\x20IDE\x20MCP\x20configuration:\x0a','\x20\x20}','\x20-e\x20RABETBASE_APP_CODE=','production','Configuration\x20guide\x20displayed','Unsupported\x20MCP\x20IDE:\x20','\x0a📋\x20Run\x20the\x20following\x20command\x20to\x20configure\x20Claude\x20Code\x20MCP:\x0a','\x20-e\x20RABETBASE_ENV=','\x22:\x20{','error','1198161dwaLUX','Appcode\x20must\x20be\x20configured\x20first','success','RABETBASE_ENV','332iJCkSi','log','appcode','\x20\x20\x20\x20}','\x20\x20\x22mcpServers\x22:\x20{','cwd','claude','parse','5520740IkrBpl','Please\x20run:\x20','env','Cursor\x20MCP\x20configuration\x20failed','\x20\x20\x20\x20\x20\x20\x22env\x22:\x20{','npx','claude\x20mcp\x20add\x20','map','Cursor','\x20\x20\x20\x20\x20\x20}','\x20\x20Environment:\x20','manual'];a0_0x1b27=function(){return _0x5d6b21;};return a0_0x1b27();}import{existsSync,mkdirSync,writeFileSync,readFileSync}from'node:fs';import{join}from'node:path';import{readConfig}from'../utils/config.js';import{logger}from'../utils/logger.js';import{copyRulesToAgentsMd,copyRulesToCursor}from'../utils/rules-cdn.js';function a0_0x15da(_0x545993,_0x29f4c2){_0x545993=_0x545993-0x187;const _0x1b2725=a0_0x1b27();let _0x15da0f=_0x1b2725[_0x545993];return _0x15da0f;}import{normalizeEnv}from'../constant/env.js';const MCP_SERVER_NAME='lovrabet-dataset',MCP_COMMAND=a0_0x8fa46e(0x1bd),MCP_ARGS=[a0_0x8fa46e(0x192)];export function buildEnvConfig(_0x2c6921,_0x2bcf55){const _0x1d67fb=a0_0x8fa46e,_0x3aa954={'RABETBASE_APP_CODE':String(_0x2c6921)};return _0x2bcf55!=='production'&&(_0x3aa954[_0x1d67fb(0x1af)]=String(_0x2bcf55)),_0x3aa954;}export async function configureCursorMcp(_0x5e057a){const _0x18336c=a0_0x8fa46e,_0xbe4c1f=_0x5e057a||process['cwd'](),_0x126ec0=readConfig(_0xbe4c1f),_0x4d6e93=_0x126ec0[_0x18336c(0x1b2)]||_0x126ec0[_0x18336c(0x18e)],_0x17ae64=normalizeEnv(_0x126ec0[_0x18336c(0x1ba)]||_0x18336c(0x1a5));if(!_0x4d6e93)return{'ide':_0x18336c(0x1c0),'status':'error','message':_0x18336c(0x1ad)};const _0x36620e=buildEnvConfig(_0x4d6e93,_0x17ae64),_0x889a43={'command':MCP_COMMAND,'args':MCP_ARGS,'env':_0x36620e},_0x3b6f1e=join(_0xbe4c1f,_0x18336c(0x189),_0x18336c(0x1a1)),_0x5684fc=join(_0xbe4c1f,_0x18336c(0x189));try{!existsSync(_0x5684fc)&&mkdirSync(_0x5684fc,{'recursive':!![]});let _0x350349={'mcpServers':{}};if(existsSync(_0x3b6f1e)){const _0x7c8e43=readFileSync(_0x3b6f1e,_0x18336c(0x197));_0x350349=JSON[_0x18336c(0x1b7)](_0x7c8e43);}return(!_0x350349['mcpServers']||typeof _0x350349[_0x18336c(0x19a)]!=='object')&&(_0x350349[_0x18336c(0x19a)]={}),_0x350349[_0x18336c(0x19a)][MCP_SERVER_NAME]=_0x889a43,writeFileSync(_0x3b6f1e,JSON[_0x18336c(0x196)](_0x350349,null,0x2),_0x18336c(0x197)),logger[_0x18336c(0x19d)](_0x18336c(0x18c),'Cursor\x20MCP\x20configured\x20successfully',{'appcode':_0x4d6e93,'env':_0x17ae64,'path':_0x3b6f1e}),await copyRulesToCursor(_0xbe4c1f),{'ide':_0x18336c(0x1c0),'status':_0x18336c(0x1ae),'message':_0x18336c(0x188)};}catch(_0x2d5e1e){return logger[_0x18336c(0x1ab)](_0x18336c(0x18c),_0x18336c(0x1bb),{'error':_0x2d5e1e instanceof Error?_0x2d5e1e[_0x18336c(0x18f)]:String(_0x2d5e1e)}),{'ide':_0x18336c(0x1c0),'status':'error','message':_0x2d5e1e instanceof Error?_0x2d5e1e[_0x18336c(0x18f)]:String(_0x2d5e1e)};}}export async function configureClaudeMcp(_0x29e8b8){const _0x33d086=a0_0x8fa46e,_0x2a28ec=_0x29e8b8||process[_0x33d086(0x1b5)](),_0x42ba6c=readConfig(_0x2a28ec),_0x19478e=_0x42ba6c['appcode']||_0x42ba6c['app'],_0x55ecc3=normalizeEnv(_0x42ba6c[_0x33d086(0x1ba)]||_0x33d086(0x1a5));if(!_0x19478e)return{'ide':'Claude\x20Code','status':_0x33d086(0x1ab),'message':_0x33d086(0x1ad)};let _0xd4eea5=_0x33d086(0x1be)+MCP_SERVER_NAME+'\x20'+MCP_COMMAND+'\x20'+MCP_ARGS[_0x33d086(0x190)]('\x20')+_0x33d086(0x1a4)+_0x19478e;return _0x55ecc3!==_0x33d086(0x1a5)&&(_0xd4eea5+=_0x33d086(0x1a9)+_0x55ecc3),await copyRulesToAgentsMd(_0x2a28ec),logger[_0x33d086(0x19d)](_0x33d086(0x18c),'Claude\x20Code\x20MCP\x20command\x20generated',{'command':_0xd4eea5,'appcode':_0x19478e,'env':_0x55ecc3}),console[_0x33d086(0x1b1)](_0x33d086(0x1a8)),console['log']('\x20\x20'+_0xd4eea5+'\x0a'),console[_0x33d086(0x1b1)]('Configuration:'),console[_0x33d086(0x1b1)]('\x20\x20AppCode:\x20'+_0x19478e),_0x55ecc3!==_0x33d086(0x1a5)&&console['log'](_0x33d086(0x1c2)+_0x55ecc3),console['log']('\x20\x20Restart\x20Claude\x20Code\x20to\x20take\x20effect\x0a'),{'ide':'Claude\x20Code','status':_0x33d086(0x187),'message':_0x33d086(0x1b9)+_0xd4eea5};}export async function showOtherGuide(_0x17b27b){const _0x3de0e6=a0_0x8fa46e,_0x1dc9f4=_0x17b27b||process[_0x3de0e6(0x1b5)](),_0x20645d=readConfig(_0x1dc9f4),_0x2e56b8=_0x20645d['appcode']||_0x20645d[_0x3de0e6(0x18e)],_0xd66fd7=normalizeEnv(_0x20645d[_0x3de0e6(0x1ba)]||_0x3de0e6(0x1a5));if(!_0x2e56b8)return{'ide':_0x3de0e6(0x18d),'status':_0x3de0e6(0x1ab),'message':_0x3de0e6(0x1ad)};return console[_0x3de0e6(0x1b1)](_0x3de0e6(0x1a2)),console[_0x3de0e6(0x1b1)]('{'),console[_0x3de0e6(0x1b1)](_0x3de0e6(0x1b4)),console['log'](_0x3de0e6(0x19e)+MCP_SERVER_NAME+_0x3de0e6(0x1aa)),console[_0x3de0e6(0x1b1)]('\x20\x20\x20\x20\x20\x20\x22command\x22:\x20\x22'+MCP_COMMAND+'\x22,'),console[_0x3de0e6(0x1b1)](_0x3de0e6(0x19f)+MCP_ARGS[_0x3de0e6(0x1bf)](_0x181f0c=>'\x22'+_0x181f0c+'\x22')[_0x3de0e6(0x190)](',\x20')+'],'),console[_0x3de0e6(0x1b1)](_0x3de0e6(0x1bc)),console[_0x3de0e6(0x1b1)](_0x3de0e6(0x195)+_0x2e56b8+'\x22,'),_0xd66fd7!==_0x3de0e6(0x1a5)&&console[_0x3de0e6(0x1b1)]('\x20\x20\x20\x20\x20\x20\x20\x20\x22RABETBASE_ENV\x22:\x20\x22'+_0xd66fd7+'\x22,'),console[_0x3de0e6(0x1b1)](_0x3de0e6(0x1c1)),console['log'](_0x3de0e6(0x1b3)),console[_0x3de0e6(0x1b1)](_0x3de0e6(0x1a3)),console[_0x3de0e6(0x1b1)]('}\x0a'),logger[_0x3de0e6(0x19d)](_0x3de0e6(0x18c),_0x3de0e6(0x1a6),{'appcode':_0x2e56b8,'env':_0xd66fd7}),{'ide':_0x3de0e6(0x18d),'status':_0x3de0e6(0x187),'message':'Configuration\x20guide\x20displayed'};}export async function configureMcp(_0x1d3b1f,_0x4a6351){const _0x405763=a0_0x8fa46e;switch(_0x1d3b1f){case _0x405763(0x194):return await configureCursorMcp(_0x4a6351);case _0x405763(0x1b6):return await configureClaudeMcp(_0x4a6351);default:throw new Error(_0x405763(0x1a7)+_0x1d3b1f);}}
@@ -0,0 +1 @@
1
+ function a1_0x51e4(){const _0x574496=['\x20datasets','length','success','70395nxKdIE','env','./docs','Generating\x20','log','\x20login\x20again\x20and\x20retry','\x1b[33m!\x20The\x20following\x20dataset\x20codes\x20do\x20not\x20exist:\x20','55280GYWKKa','\x20matching\x20datasets\x20from\x20','\x1b[0m','Using\x20configured\x20AppCode:\x20','No\x20datasets\x20found','Doc\x20generation\x20failed:\x20','25629810ImzcBh','The\x20following\x20datasets\x20failed\x20to\x20generate:','All\x20specified\x20dataset\x20codes\x20do\x20not\x20exist:\x20','gray','filter','文档生成完成','Using\x20specified\x20AppCode:\x20','20480soFkfZ','join','Generating\x20docs\x20for\x20','red','datasetCode','15798618ZKoOJT','\x20total\x1b[0m','*\x20Output\x20directory:\x20','[ERROR]\x20','cyan','Fetching\x20dataset\x20list...','column','2208iBGrCj','api-doc','\x20datasets...','includes','expired','dim','8wCqfjt','cwd','6trRBtb','41336UWnmgi','error','No\x20AppCode\x20provided\x20and\x20no\x20default\x20configured','\x1b[90m*\x20Filtered\x20','√\x20Doc\x20generation\x20complete!\x20','.md\x20(','white','\x20-\x20','*\x20Generated\x20doc\x20files:','map','yellow','\x20failed','12730277evOWkm'];a1_0x51e4=function(){return _0x574496;};return a1_0x51e4();}(function(_0x1256e3,_0x3ffe6b){const _0x393115=a1_0x3f55,_0x30a5bb=_0x1256e3();while(!![]){try{const _0x5113f2=-parseInt(_0x393115(0x204))/0x1+parseInt(_0x393115(0x1f4))/0x2*(parseInt(_0x393115(0x1f3))/0x3)+-parseInt(_0x393115(0x20b))/0x4+parseInt(_0x393115(0x218))/0x5*(-parseInt(_0x393115(0x1eb))/0x6)+-parseInt(_0x393115(0x200))/0x7*(parseInt(_0x393115(0x1f1))/0x8)+parseInt(_0x393115(0x21d))/0x9+parseInt(_0x393115(0x211))/0xa;if(_0x5113f2===_0x3ffe6b)break;else _0x30a5bb['push'](_0x30a5bb['shift']());}catch(_0x2f69d9){_0x30a5bb['push'](_0x30a5bb['shift']());}}}(a1_0x51e4,0xe7d3d));import{jsx as a1_0xb1c2f3,jsxs as a1_0x1ecd9c,Fragment as a1_0x59b60e}from'react/jsx-runtime';import{useEffect,useState}from'react';import{Box,Text,useApp}from'ink';import{readConfig,getConfigAppCode}from'../utils/config.js';import{initEnv}from'../constant/env.js';import{fetchModelList}from'./fetch-model-list.js';function a1_0x3f55(_0x364e21,_0x37dc1d){_0x364e21=_0x364e21-0x1ea;const _0x51e424=a1_0x51e4();let _0x3f5509=_0x51e424[_0x364e21];return _0x3f5509;}import{generateDatasetDocs}from'./api-doc.js';import{logger}from'../utils/logger.js';export const ApiDocUI=({appCode:_0x1a4c6a,env:_0x4be9b6,output:_0x53346a,extraParams:_0x2a06b0,datasetCodes:_0x43da12})=>{const _0x5699d9=a1_0x3f55,{exit:_0xf04ab0}=useApp(),[_0x352504,_0x54c7d7]=useState(![]),[_0xd6e531,_0x4c89ea]=useState(''),[_0x32a23c,_0x4bacc2]=useState(![]),[_0x9ab147,_0x188571]=useState(null),[_0x44db14,_0x4fef4a]=useState(null),[_0x56877a,_0x4dc2d6]=useState(0x0),_0x245ff9=readConfig(),_0x6b54b9=getConfigAppCode(),_0x522b8c=_0x1a4c6a||_0x6b54b9,_0x4810f5=typeof _0x245ff9?.[_0x5699d9(0x205)]==='string'?_0x245ff9['env']:undefined,_0x2dc889=_0x4be9b6||_0x4810f5||'production';initEnv(_0x2dc889);const _0xb55ee7=_0x53346a||_0x5699d9(0x206),_0x3af676=_0x1a4c6a?_0x5699d9(0x217)+_0x522b8c:_0x5699d9(0x20e)+_0x522b8c;useEffect(()=>{_0x54c7d7(!![]),_0x50c00a();},[]),useEffect(()=>{(_0x32a23c||_0x9ab147)&&_0xf04ab0();},[_0x32a23c,_0x9ab147,_0xf04ab0]);async function _0x50c00a(){const _0x4db291=_0x5699d9;if(!_0x522b8c){_0x188571(_0x4db291(0x1f6));return;}try{logger['setLogPath'](process[_0x4db291(0x1f2)]()),_0x4c89ea(_0x4db291(0x222));const {configArray:_0x3d306a}=await fetchModelList(_0x522b8c);_0x4dc2d6(_0x3d306a['length']);if(_0x3d306a[_0x4db291(0x202)]===0x0){_0x188571(_0x4db291(0x20f));return;}let _0x3fd722=_0x3d306a;if(_0x43da12&&_0x43da12[_0x4db291(0x202)]>0x0){_0x3fd722=_0x3d306a[_0x4db291(0x215)](_0x163bca=>_0x43da12[_0x4db291(0x1ee)](_0x163bca[_0x4db291(0x21c)]));const _0x20550d=_0x3fd722[_0x4db291(0x1fd)](_0x425d48=>_0x425d48[_0x4db291(0x21c)]),_0x5a26a4=_0x43da12['filter'](_0x535989=>!_0x20550d[_0x4db291(0x1ee)](_0x535989));_0x5a26a4[_0x4db291(0x202)]>0x0&&console[_0x4db291(0x208)](_0x4db291(0x20a)+_0x5a26a4[_0x4db291(0x219)](',\x20')+_0x4db291(0x20d));if(_0x3fd722['length']===0x0){_0x188571(_0x4db291(0x213)+_0x43da12[_0x4db291(0x219)](',\x20'));return;}console[_0x4db291(0x208)](_0x4db291(0x1f7)+_0x3fd722[_0x4db291(0x202)]+_0x4db291(0x20c)+_0x3d306a[_0x4db291(0x202)]+_0x4db291(0x21e));}_0x4c89ea(_0x4db291(0x21a)+_0x3fd722[_0x4db291(0x202)]+_0x4db291(0x1ed));const _0x4dd5ce=await generateDatasetDocs(_0x3fd722,_0x522b8c,_0xb55ee7,(_0x31b661,_0x211f4b,_0x4c1dae)=>{const _0x3767bb=_0x4db291;_0x4c89ea(_0x3767bb(0x207)+_0x4c1dae+_0x3767bb(0x1f9)+_0x31b661+'/'+_0x211f4b+')');},_0x2a06b0);_0x4fef4a(_0x4dd5ce),_0x4bacc2(!![]);const _0xfddb09=_0x4dd5ce[_0x4db291(0x215)](_0x2d67d3=>_0x2d67d3[_0x4db291(0x203)])[_0x4db291(0x202)],_0x30f374=_0x4dd5ce[_0x4db291(0x215)](_0xc4d146=>!_0xc4d146[_0x4db291(0x203)])['length'];logger['success'](_0x4db291(0x1ec),_0x4db291(0x216),undefined,{'totalCount':_0x4dd5ce['length'],'successCount':_0xfddb09,'failCount':_0x30f374,'outputDir':_0xb55ee7});}catch(_0x592c74){const _0x3d8458=_0x592c74 instanceof Error?_0x592c74['message']:String(_0x592c74);logger[_0x4db291(0x1f5)](_0x4db291(0x1ec),'文档生成失败:\x20'+_0x3d8458,{'appCode':_0x522b8c,'outputDir':_0xb55ee7}),_0x188571(_0x4db291(0x210)+_0x3d8458);}finally{_0x54c7d7(![]);}}const _0x2cc8b9=_0x44db14?.[_0x5699d9(0x215)](_0x372abf=>_0x372abf[_0x5699d9(0x203)])[_0x5699d9(0x202)]||0x0,_0x10396c=_0x44db14?.[_0x5699d9(0x215)](_0x1916fa=>!_0x1916fa[_0x5699d9(0x203)])[_0x5699d9(0x202)]||0x0;return a1_0x1ecd9c(Box,{'flexDirection':'column','children':[(_0x352504||_0x32a23c)&&a1_0x1ecd9c(Box,{'children':[a1_0xb1c2f3(Text,{'color':_0x5699d9(0x214),'children':'*\x20'}),a1_0xb1c2f3(Text,{'color':_0x1a4c6a?_0x5699d9(0x1fa):_0x5699d9(0x1f0),'children':_0x3af676})]}),_0x352504&&a1_0xb1c2f3(Box,{'children':a1_0x1ecd9c(Text,{'children':['*\x20',_0xd6e531]})}),_0x32a23c&&_0x44db14&&a1_0x1ecd9c(Box,{'flexDirection':_0x5699d9(0x1ea),'children':[a1_0xb1c2f3(Box,{'children':a1_0x1ecd9c(Text,{'color':'green','children':[_0x5699d9(0x1f8)+_0x2cc8b9+'\x20succeeded',_0x10396c>0x0?',\x20'+_0x10396c+_0x5699d9(0x1ff):'']})}),a1_0xb1c2f3(Box,{'marginTop':0x1,'children':a1_0xb1c2f3(Text,{'color':_0x5699d9(0x214),'children':'*\x20Processed\x20'+_0x56877a+_0x5699d9(0x201)})}),a1_0x1ecd9c(Box,{'marginTop':0x1,'children':[a1_0xb1c2f3(Text,{'color':_0x5699d9(0x214),'children':_0x5699d9(0x21f)}),a1_0xb1c2f3(Text,{'color':_0x5699d9(0x221),'children':_0xb55ee7})]}),_0x2cc8b9>0x0&&a1_0x1ecd9c(a1_0x59b60e,{'children':[a1_0xb1c2f3(Box,{'marginTop':0x1,'children':a1_0xb1c2f3(Text,{'color':_0x5699d9(0x214),'children':_0x5699d9(0x1fc)})}),_0x44db14[_0x5699d9(0x215)](_0x5e5583=>_0x5e5583[_0x5699d9(0x203)])['map']((_0x4150f9,_0x1b7d7c)=>a1_0x1ecd9c(Box,{'marginLeft':0x2,'children':[a1_0x1ecd9c(Text,{'color':_0x5699d9(0x221),'children':['•\x20',_0x4150f9['filePath']]}),a1_0x1ecd9c(Text,{'color':_0x5699d9(0x1f0),'children':[_0x5699d9(0x1fb),_0x4150f9['datasetName']]})]},_0x1b7d7c))]}),_0x10396c>0x0&&a1_0x1ecd9c(a1_0x59b60e,{'children':[a1_0xb1c2f3(Box,{'marginTop':0x1,'children':a1_0xb1c2f3(Text,{'color':'yellow','children':_0x5699d9(0x212)})}),_0x44db14[_0x5699d9(0x215)](_0x2f317c=>!_0x2f317c['success'])[_0x5699d9(0x1fd)]((_0x4e008e,_0x385e42)=>a1_0x1ecd9c(Box,{'marginLeft':0x2,'flexDirection':_0x5699d9(0x1ea),'children':[a1_0x1ecd9c(Text,{'color':_0x5699d9(0x21b),'children':['•\x20',_0x4e008e['datasetName'],'\x20(',_0x4e008e[_0x5699d9(0x21c)],')']}),_0x4e008e[_0x5699d9(0x1f5)]&&a1_0xb1c2f3(Box,{'marginLeft':0x2,'children':a1_0xb1c2f3(Text,{'color':_0x5699d9(0x1f0),'children':_0x4e008e['error']})})]},_0x385e42))]})]}),_0x9ab147&&a1_0x1ecd9c(Box,{'flexDirection':_0x5699d9(0x1ea),'children':[a1_0xb1c2f3(Box,{'children':a1_0x1ecd9c(Text,{'color':_0x5699d9(0x21b),'children':[_0x5699d9(0x220),_0x9ab147]})}),(_0x9ab147['includes']('登录')||_0x9ab147[_0x5699d9(0x1ee)]('Authentication')||_0x9ab147['includes'](_0x5699d9(0x1ef)))&&a1_0x1ecd9c(Box,{'marginTop':0x1,'children':[a1_0xb1c2f3(Text,{'color':_0x5699d9(0x1fe),'children':'*\x20'}),a1_0xb1c2f3(Text,{'color':_0x5699d9(0x221),'children':'rabetbase\x20auth'}),a1_0xb1c2f3(Text,{'color':_0x5699d9(0x1fe),'children':_0x5699d9(0x209)})]})]})]});};