@lovrabet/rabetbase-cli 2.2.4 → 2.2.5-beta.2

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 (240) hide show
  1. package/README.md +1 -1
  2. package/lib/api/api-doc.js +1 -1
  3. package/lib/api/fetch-model-list.js +1 -1
  4. package/lib/api/generate-api-file.js +1 -1
  5. package/lib/auth/auth-server-ui.js +1 -1
  6. package/lib/auth/auth-server.js +1 -1
  7. package/lib/auth/constant.js +1 -1
  8. package/lib/auth/get-cookie.js +1 -1
  9. package/lib/auth/get-session-user.js +1 -1
  10. package/lib/auth/is-session-valid.js +1 -1
  11. package/lib/auth/login-success-html.js +1 -1
  12. package/lib/auth/logout.js +1 -1
  13. package/lib/cli-flags.js +1 -1
  14. package/lib/cli.js +1 -1
  15. package/lib/commands/api/generate.js +1 -1
  16. package/lib/commands/api/index.js +1 -1
  17. package/lib/commands/api/list.js +1 -1
  18. package/lib/commands/api/pull.js +1 -1
  19. package/lib/commands/api/shared.js +1 -1
  20. package/lib/commands/app/add.js +1 -1
  21. package/lib/commands/app/discover.js +1 -1
  22. package/lib/commands/app/index.js +1 -1
  23. package/lib/commands/app/list.js +1 -1
  24. package/lib/commands/app/remove.js +1 -1
  25. package/lib/commands/app/shared.js +1 -1
  26. package/lib/commands/app/use.js +1 -1
  27. package/lib/commands/app-config/delete.js +1 -0
  28. package/lib/commands/app-config/get.js +1 -0
  29. package/lib/commands/app-config/index.js +1 -0
  30. package/lib/commands/app-config/list.js +1 -0
  31. package/lib/commands/app-config/set.js +1 -0
  32. package/lib/commands/app-config/shared.js +1 -0
  33. package/lib/commands/auth/index.js +1 -1
  34. package/lib/commands/bff/create.js +1 -1
  35. package/lib/commands/bff/delete.js +1 -1
  36. package/lib/commands/bff/detail.js +1 -1
  37. package/lib/commands/bff/index.js +1 -1
  38. package/lib/commands/bff/list.js +1 -1
  39. package/lib/commands/bff/pull.js +1 -1
  40. package/lib/commands/bff/push.js +1 -1
  41. package/lib/commands/bff/status.js +1 -1
  42. package/lib/commands/cli-update.js +1 -1
  43. package/lib/commands/codegen/index.js +1 -1
  44. package/lib/commands/codegen/sdk.js +1 -1
  45. package/lib/commands/codegen/sql.js +1 -1
  46. package/lib/commands/common/app-selector.js +1 -1
  47. package/lib/commands/common/flags.js +1 -1
  48. package/lib/commands/common/validate.js +1 -1
  49. package/lib/commands/config/get.js +1 -1
  50. package/lib/commands/config/index.js +1 -1
  51. package/lib/commands/config/list.js +1 -1
  52. package/lib/commands/config/set.js +1 -1
  53. package/lib/commands/config/shared.js +1 -1
  54. package/lib/commands/data/filter.js +1 -1
  55. package/lib/commands/data/getOne.js +1 -1
  56. package/lib/commands/data/index.js +1 -1
  57. package/lib/commands/data/shared.js +1 -1
  58. package/lib/commands/dataset/business-group-update.js +1 -0
  59. package/lib/commands/dataset/capability.js +1 -1
  60. package/lib/commands/dataset/delete.js +1 -1
  61. package/lib/commands/dataset/detail.js +1 -1
  62. package/lib/commands/dataset/extend-update.js +1 -1
  63. package/lib/commands/dataset/field-update.js +1 -1
  64. package/lib/commands/dataset/index.js +1 -1
  65. package/lib/commands/dataset/list.js +1 -1
  66. package/lib/commands/dataset/operations.js +1 -1
  67. package/lib/commands/dataset/relation-create.js +1 -1
  68. package/lib/commands/dataset/relation-delete.js +1 -1
  69. package/lib/commands/dataset/relation-shared.js +1 -1
  70. package/lib/commands/dataset/relation-update.js +1 -1
  71. package/lib/commands/dataset/relations.js +1 -1
  72. package/lib/commands/dataset/rename.js +1 -1
  73. package/lib/commands/dataset/restore.js +1 -0
  74. package/lib/commands/db/analyze-cancel.js +1 -1
  75. package/lib/commands/db/analyze-start.js +1 -1
  76. package/lib/commands/db/analyze-status.js +1 -1
  77. package/lib/commands/db/create.js +1 -1
  78. package/lib/commands/db/delete.js +1 -1
  79. package/lib/commands/db/detail.js +1 -1
  80. package/lib/commands/db/diff.js +1 -1
  81. package/lib/commands/db/index.js +1 -1
  82. package/lib/commands/db/list.js +1 -1
  83. package/lib/commands/db/shared.js +1 -1
  84. package/lib/commands/db/tables.js +1 -1
  85. package/lib/commands/db/test.js +1 -1
  86. package/lib/commands/db/update.js +1 -1
  87. package/lib/commands/doctor.js +1 -1
  88. package/lib/commands/init/index.js +1 -1
  89. package/lib/commands/issue/index.js +1 -1
  90. package/lib/commands/issue/nudge.js +1 -1
  91. package/lib/commands/issue/report.js +1 -1
  92. package/lib/commands/issue/shared.js +1 -1
  93. package/lib/commands/logs/index.js +1 -1
  94. package/lib/commands/menu/index.js +1 -1
  95. package/lib/commands/menu/list.js +1 -1
  96. package/lib/commands/menu/shared/compare-table.js +1 -1
  97. package/lib/commands/menu/shared/index.js +1 -1
  98. package/lib/commands/menu/shared/inquirer.js +1 -1
  99. package/lib/commands/menu/shared/local-pages.js +1 -1
  100. package/lib/commands/menu/shared/logic.js +1 -1
  101. package/lib/commands/menu/shared/service.js +1 -1
  102. package/lib/commands/menu/shared/sync-core.js +1 -1
  103. package/lib/commands/menu/shared/update-core.js +1 -1
  104. package/lib/commands/menu/shared/valid-url.js +1 -1
  105. package/lib/commands/menu/sync.js +1 -1
  106. package/lib/commands/menu/update.js +1 -1
  107. package/lib/commands/page/generate-start.js +1 -1
  108. package/lib/commands/page/generate-status.js +1 -1
  109. package/lib/commands/page/index.js +1 -1
  110. package/lib/commands/page/pull.js +1 -1
  111. package/lib/commands/page/push.js +1 -1
  112. package/lib/commands/page/relation-audit.js +1 -1
  113. package/lib/commands/page/shared.js +1 -1
  114. package/lib/commands/page/standard-page-status.js +1 -1
  115. package/lib/commands/page/sync.js +1 -1
  116. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  117. package/lib/commands/project/create/format-elapsed.js +1 -1
  118. package/lib/commands/project/create/main.js +1 -1
  119. package/lib/commands/project/create/non-interactive.js +1 -1
  120. package/lib/commands/project/create/project-template-path.js +1 -1
  121. package/lib/commands/project/create/use-copy-project-template.js +1 -1
  122. package/lib/commands/project/create/use-format-code.js +1 -1
  123. package/lib/commands/project/create/use-install-dependencies.js +1 -1
  124. package/lib/commands/project/index.js +1 -1
  125. package/lib/commands/project/init.js +1 -1
  126. package/lib/commands/project/upgrade.js +1 -1
  127. package/lib/commands/registry.js +1 -1
  128. package/lib/commands/run/index.js +1 -1
  129. package/lib/commands/schema.js +1 -1
  130. package/lib/commands/skill/index.js +1 -1
  131. package/lib/commands/sql/create.js +1 -1
  132. package/lib/commands/sql/delete.js +1 -1
  133. package/lib/commands/sql/detail.js +1 -1
  134. package/lib/commands/sql/exec.js +1 -1
  135. package/lib/commands/sql/index.js +1 -1
  136. package/lib/commands/sql/list.js +1 -1
  137. package/lib/commands/sql/pull.js +1 -1
  138. package/lib/commands/sql/push.js +1 -1
  139. package/lib/commands/sql/save.js +1 -1
  140. package/lib/commands/sql/shared.js +1 -1
  141. package/lib/commands/sql/status.js +1 -1
  142. package/lib/commands/sql/validate.js +1 -1
  143. package/lib/commands/workspace/index.js +1 -1
  144. package/lib/config/schema.js +1 -1
  145. package/lib/constant/cdn.js +1 -1
  146. package/lib/constant/cli.js +1 -1
  147. package/lib/constant/defaults.js +1 -1
  148. package/lib/constant/domain.js +1 -1
  149. package/lib/constant/env.js +1 -1
  150. package/lib/constant/output.js +1 -1
  151. package/lib/constant/paths.js +1 -1
  152. package/lib/constant/risk.js +1 -1
  153. package/lib/context/app-resolver.js +1 -1
  154. package/lib/context/auth-resolver.js +1 -1
  155. package/lib/context/config-loader.js +1 -1
  156. package/lib/context.js +1 -1
  157. package/lib/core/alias-resolver.js +1 -1
  158. package/lib/core/api-client.js +1 -1
  159. package/lib/core/bff/config.js +1 -1
  160. package/lib/core/bff/file-system.js +1 -1
  161. package/lib/core/bff/hash.js +1 -1
  162. package/lib/core/bff/lock.js +1 -1
  163. package/lib/core/bff/utils.js +1 -1
  164. package/lib/core/db-resolver.js +1 -1
  165. package/lib/core/page/file-system.js +1 -1
  166. package/lib/core/page/hash.js +1 -1
  167. package/lib/core/page/lock.js +1 -1
  168. package/lib/core/sql-sync/config.js +1 -1
  169. package/lib/core/sql-sync/file-system.js +1 -1
  170. package/lib/core/sql-sync/hash.js +1 -1
  171. package/lib/core/sql-sync/lock.js +1 -1
  172. package/lib/core/sql-sync/utils.js +1 -1
  173. package/lib/core/sql-validator.js +1 -1
  174. package/lib/errors.js +1 -1
  175. package/lib/framework/build-all-flags.js +1 -1
  176. package/lib/framework/flags.js +1 -1
  177. package/lib/framework/help.js +1 -1
  178. package/lib/framework/index.js +1 -1
  179. package/lib/framework/output.js +1 -1
  180. package/lib/framework/response.js +1 -1
  181. package/lib/framework/runner-alias.js +1 -1
  182. package/lib/framework/runner.js +1 -1
  183. package/lib/framework/schema-export.js +1 -1
  184. package/lib/framework/types.js +1 -1
  185. package/lib/generated/build-info.js +1 -1
  186. package/lib/help.js +1 -1
  187. package/lib/skills/main.js +1 -1
  188. package/lib/skills/npx-skills-add.js +1 -1
  189. package/lib/telemetry/cli-command-trace.js +1 -1
  190. package/lib/telemetry/cli-help-trace.js +1 -1
  191. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  192. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  193. package/lib/telemetry/send-cli-trace-log.js +1 -1
  194. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  195. package/lib/utils/ai_config.js +1 -1
  196. package/lib/utils/apply-jq-filter.js +1 -1
  197. package/lib/utils/cdn-config.js +1 -1
  198. package/lib/utils/check-sdk-version.js +1 -1
  199. package/lib/utils/cli-version-check.js +1 -1
  200. package/lib/utils/cli-version-policy.js +1 -1
  201. package/lib/utils/config.js +1 -1
  202. package/lib/utils/copy-directory.js +1 -1
  203. package/lib/utils/entity-with-id.js +1 -1
  204. package/lib/utils/file-utils.js +1 -1
  205. package/lib/utils/guides-cdn.js +1 -1
  206. package/lib/utils/http-client.js +1 -1
  207. package/lib/utils/is-non-interactive.js +1 -1
  208. package/lib/utils/logger.js +1 -1
  209. package/lib/utils/params.js +1 -1
  210. package/lib/utils/platform.js +1 -1
  211. package/lib/utils/rules-cdn.js +1 -1
  212. package/lib/utils/sleep.js +1 -1
  213. package/lib/utils/template-replacer.js +1 -1
  214. package/lib/utils/update-notice.js +1 -1
  215. package/lib/utils/version.js +1 -1
  216. package/lib/utils/with-active-cookie.js +1 -1
  217. package/lib/utils/write-cli-side-channel.js +1 -1
  218. package/package.json +1 -1
  219. package/templates/README.md +15 -25
  220. package/templates/generate-api/api.ts.tpl +2 -2
  221. package/templates/generate-api/client.ts.tpl +2 -2
  222. package/templates/projects/sub-app-react-demo/CHANGELOG.md +15 -1
  223. package/templates/projects/sub-app-react-demo/README.md +159 -231
  224. package/templates/projects/sub-app-react-demo/docs/quick-start.md +145 -426
  225. package/templates/projects/sub-app-react-demo/src/api/api.ts +8 -65
  226. package/templates/projects/sub-app-react-demo/src/api/client.ts +10 -42
  227. package/templates/projects/sub-app-react-demo/src/components/demo-page-container/DemoPageContainer.module.css +28 -0
  228. package/templates/projects/sub-app-react-demo/src/components/demo-page-container/DemoPageContainer.tsx +55 -0
  229. package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +6 -9
  230. package/templates/projects/sub-app-react-demo/src/main.tsx +10 -6
  231. package/templates/projects/sub-app-react-demo/src/pages/dashboard/index.tsx +3 -5
  232. package/templates/projects/sub-app-react-demo/src/pages/data-screen/index.tsx +153 -148
  233. package/templates/projects/sub-app-react-demo/src/pages/index.module.css +500 -0
  234. package/templates/projects/sub-app-react-demo/src/pages/index.tsx +517 -343
  235. package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +325 -242
  236. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.module.css +8 -6
  237. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +174 -87
  238. package/templates/projects/sub-app-react-demo/src/style.css +19 -3
  239. package/templates/projects/sub-app-react-demo/src/vite-env.d.ts +1 -1
  240. package/templates/projects/sub-app-react-demo/docs/API_RULE_CHANGE.md +0 -212
@@ -1,89 +1,97 @@
1
1
  /**
2
- * Title: Rabetbase 开发指南
2
+ * Title: 子应用启动台
3
3
  */
4
4
  import React from "react";
5
+ import { Link } from "react-router-dom";
6
+ import { Alert, Button, Card, Space, Tag, Typography } from "antd";
5
7
  import {
6
- Typography,
7
- Card,
8
- Row,
9
- Col,
10
- Button,
11
- Tabs,
12
- Alert,
13
- Space,
14
- Tag,
15
- } from "antd";
16
- import {
17
- CodeOutlined,
18
- RobotOutlined,
19
- ToolOutlined,
20
- BookOutlined,
8
+ ApiOutlined,
9
+ AppstoreOutlined,
21
10
  ArrowRightOutlined,
22
- CopyOutlined,
11
+ BarChartOutlined,
12
+ BookOutlined,
13
+ CheckCircleOutlined,
23
14
  CheckOutlined,
15
+ CloudUploadOutlined,
16
+ CodeOutlined,
17
+ CopyOutlined,
18
+ DashboardOutlined,
19
+ DatabaseOutlined,
20
+ DeploymentUnitOutlined,
21
+ LinkOutlined,
22
+ PlayCircleOutlined,
24
23
  RocketOutlined,
25
- ExclamationCircleOutlined,
24
+ SettingOutlined,
25
+ ToolOutlined,
26
+ WarningOutlined,
26
27
  } from "@ant-design/icons";
28
+ import styles from "./index.module.css";
27
29
 
28
30
  const { Title, Paragraph, Text } = Typography;
29
31
 
30
- // 可复制的代码块
31
- function CopyableCode({ code, label }: { code: string; label: string }) {
32
+ interface CopyableCodeProps {
33
+ code: string;
34
+ label: string;
35
+ compact?: boolean;
36
+ }
37
+
38
+ function CopyableCode({ code, label, compact = false }: CopyableCodeProps) {
32
39
  const [copied, setCopied] = React.useState(false);
33
40
 
34
41
  const handleCopy = async () => {
35
- await navigator.clipboard.writeText(code);
36
- setCopied(true);
37
- setTimeout(() => setCopied(false), 2000);
42
+ try {
43
+ if (navigator.clipboard?.writeText) {
44
+ await navigator.clipboard.writeText(code);
45
+ }
46
+ setCopied(true);
47
+ window.setTimeout(() => setCopied(false), 2000);
48
+ } catch (err) {
49
+ console.error("复制失败:", err);
50
+ }
38
51
  };
39
52
 
40
53
  return (
41
- <div style={{ marginBottom: 12 }}>
42
- <div
43
- style={{
44
- display: "flex",
45
- justifyContent: "space-between",
46
- alignItems: "center",
47
- marginBottom: 8,
48
- }}
49
- >
54
+ <div
55
+ className={`${styles.copyBlock} ${
56
+ compact ? styles.copyBlockCompact : ""
57
+ }`}
58
+ >
59
+ <div className={styles.copyHeader}>
50
60
  <Text type="secondary">{label}</Text>
51
61
  <Button
52
- type="primary"
53
62
  size="small"
54
63
  icon={copied ? <CheckOutlined /> : <CopyOutlined />}
55
64
  onClick={handleCopy}
65
+ className={styles.copyButton}
56
66
  >
57
67
  {copied ? "已复制" : "复制"}
58
68
  </Button>
59
69
  </div>
60
- <pre
61
- style={{
62
- background: "#1e1e1e",
63
- borderRadius: 8,
64
- padding: "16px 20px",
65
- margin: 0,
66
- fontFamily: "'JetBrains Mono', 'Monaco', monospace",
67
- fontSize: 13,
68
- lineHeight: 1.6,
69
- color: "#e4e4e7",
70
- overflowX: "auto",
71
- }}
72
- >
70
+ <pre className={styles.copyPre}>
73
71
  <code>{code}</code>
74
72
  </pre>
75
73
  </div>
76
74
  );
77
75
  }
78
76
 
79
- // 从 api.ts 提取 appCode
80
77
  function getAppCodeFromApi(content: string): string | null {
81
78
  const match =
82
79
  content.match(/RABETBASE_APP_CODE\s*=\s*["']([^"']+)["']/) ||
80
+ content.match(/LOVRABET_APP_CODE\s*=\s*["']([^"']+)["']/) ||
83
81
  content.match(/appCode:\s*["']([^"']+)["']/);
84
82
  return match ? match[1] : null;
85
83
  }
86
84
 
85
+ const feishuDocs = {
86
+ root: "https://qizhiyuntu.feishu.cn/wiki/EaApwb1Wpi2j0ykAkhNcya0ZnEh",
87
+ onboarding:
88
+ "https://qizhiyuntu.feishu.cn/wiki/T5gJwrcQqixLCikNYO2caZYDnsc",
89
+ core: "https://qizhiyuntu.feishu.cn/wiki/S71hw5c2HiwyoHkLgyecKrI8n3M",
90
+ systemPageSdk:
91
+ "https://qizhiyuntu.feishu.cn/wiki/XCdWwnN7ViYOc0knRu8c411uneh",
92
+ sdk: "https://qizhiyuntu.feishu.cn/wiki/B1PLw34AwiDtNmkCAlCcO3T2ngh",
93
+ };
94
+
87
95
  function HomePage() {
88
96
  const [appCode, setAppCode] = React.useState<string | null>(null);
89
97
  const [loading, setLoading] = React.useState(true);
@@ -112,355 +120,521 @@ function HomePage() {
112
120
  loadAppCode();
113
121
  }, []);
114
122
 
115
- // 检查是否已配置
116
- const isNotSet = appCode === "NOT-SET" || appCode === null;
117
- const displayAppCode = isNotSet ? "your-app-code" : appCode;
118
-
119
- const mcpConfig = `{
120
- "mcpServers": {
121
- "lovrabet-dataset": {
122
- "command": "npx",
123
- "args": ["-y", "@lovrabet/dataset-mcp-server"],
124
- "env": {
125
- "RABETBASE_APP_CODE": "${displayAppCode}"
126
- }
127
- }
128
- }
129
- }`;
123
+ const isConfigured = !loading && appCode !== null && appCode !== "NOT-SET";
124
+ const displayAppCode = isConfigured ? appCode : "your-app-code";
125
+ const statusLabel = loading ? "读取中" : isConfigured ? "已配置" : "待配置";
130
126
 
131
- const cliCode = `# 拉取最新 API 配置
132
- lovrabet api pull
127
+ const setupPrompt = `请帮我检查当前 Lovrabet React 子应用的项目配置。
128
+ 确认 AppCode、.rabetbase.json、SDK 模型文件和 src/api/client.ts 是否完整。
129
+ 如果缺少配置,请按当前项目情况补齐,并告诉我可以用于页面开发的数据模型。`;
133
130
 
134
- # 微前端子应用同步菜单
135
- lovrabet menu sync`;
131
+ const agentSurfaces = ["Claude Code", "Cursor", "Codex"];
136
132
 
137
- const configTabs = [
133
+ const docLinks = [
138
134
  {
139
- key: "mcp",
140
- label: (
141
- <span>
142
- <RobotOutlined /> MCP 配置
143
- </span>
144
- ),
145
- children: (
146
- <div>
147
- <Paragraph>claude code 配置:</Paragraph>
148
- <Paragraph style={{ fontSize: 12, color: "#666" }}>
149
- 配置文件路径:
150
- <br />
151
- macOS: ~/Library/Application
152
- Support/Claude/claude_desktop_config.json
153
- <br />
154
- Windows: %APPDATA%/Claude/claude_desktop_config.json
155
- </Paragraph>
156
- <CopyableCode code={mcpConfig} label="claude_desktop_config.json" />
157
-
158
- <Paragraph style={{ marginTop: 16 }}>Cursor 配置:</Paragraph>
159
- <Paragraph style={{ fontSize: 12, color: "#666" }}>
160
- 设置 → MCP → 添加服务器
161
- </Paragraph>
162
- <CopyableCode
163
- code={`// Cursor MCP 配置
164
- {
165
- "mcpServers": {
166
- "lovrabet-dataset": {
167
- "command": "npx",
168
- "args": ["-y", "@lovrabet/dataset-mcp-server"],
169
- "env": {
170
- "RABETBASE_APP_CODE": "${displayAppCode}"
171
- }
172
- }
173
- }
174
- }`}
175
- label="Cursor MCP 配置"
176
- />
177
-
178
- <Paragraph style={{ marginTop: 16 }}>
179
- Claude Code (VS Code 扩展):
180
- </Paragraph>
181
- <CopyableCode
182
- code={`claude mcp add lovrabet-dataset npx @lovrabet/dataset-mcp-server@latest -e RABETBASE_APP_CODE=${displayAppCode}`}
183
- label="Claude Code 终端命令"
184
- />
185
-
186
- <Button
187
- type="link"
188
- href="https://open.lovrabet.com/docs/mcp/intro"
189
- target="_blank"
190
- >
191
- 查看完整文档 <ArrowRightOutlined />
192
- </Button>
193
- </div>
194
- ),
135
+ title: "Rabetbase CLI 文库",
136
+ description: "从上手路径进入完整研发能力目录。",
137
+ url: feishuDocs.root,
138
+ icon: <BookOutlined />,
195
139
  },
196
140
  {
197
- key: "cli",
198
- label: (
199
- <span>
200
- <ToolOutlined /> CLI 命令
201
- </span>
202
- ),
203
- children: (
204
- <div>
205
- <Paragraph>常用 CLI 命令:</Paragraph>
206
- <CopyableCode code={cliCode} label="终端命令" />
207
- <Button
208
- type="link"
209
- href="https://open.lovrabet.com/docs/lovrabet-cli/quickstart"
210
- target="_blank"
211
- >
212
- 查看完整文档 <ArrowRightOutlined />
213
- </Button>
214
- </div>
215
- ),
141
+ title: "系统页面开发",
142
+ description: "用 SDK 开发列表页、详情页、表单和看板。",
143
+ url: feishuDocs.systemPageSdk,
144
+ icon: <CodeOutlined />,
145
+ },
146
+ {
147
+ title: "TypeScript SDK",
148
+ description: "查看模型客户端、数据读写和类型使用方式。",
149
+ url: feishuDocs.sdk,
150
+ icon: <ApiOutlined />,
216
151
  },
217
152
  ];
218
153
 
219
- const docLinks = [
154
+ const taskGuides = [
220
155
  {
221
- title: "入门指南",
156
+ title: "刚创建项目",
157
+ description: "确认项目结构、AppCode、SDK 模型和本地启动方式。",
158
+ action: "查看入门与上手",
159
+ url: feishuDocs.onboarding,
222
160
  icon: <RocketOutlined />,
223
- links: [
224
- {
225
- label: "5 分钟上手指引",
226
- url: "https://open.lovrabet.com/docs/guides/step-guide",
227
- },
228
- {
229
- label: "开发者工具全景",
230
- url: "https://open.lovrabet.com/docs/guides/toolchain",
231
- },
232
- { label: "常见问题", url: "https://open.lovrabet.com/docs/guides/faq" },
161
+ },
162
+ {
163
+ title: "开发客户列表页",
164
+ description: "让 Agent 基于数据模型生成筛选、表格、详情和表单。",
165
+ action: "查看页面开发",
166
+ url: feishuDocs.systemPageSdk,
167
+ icon: <CodeOutlined />,
168
+ },
169
+ {
170
+ title: "调用 SDK 读写数据",
171
+ description: "确认模型别名、字段类型、filter、getOne 和写入接口。",
172
+ action: "查看 SDK 文档",
173
+ url: feishuDocs.sdk,
174
+ icon: <ApiOutlined />,
175
+ },
176
+ {
177
+ title: "做统计和看板",
178
+ description: "把客户活跃度、跟进转化和销售机会做成指标视图。",
179
+ action: "查看核心能力",
180
+ url: feishuDocs.core,
181
+ icon: <BarChartOutlined />,
182
+ },
183
+ {
184
+ title: "封装服务端逻辑",
185
+ description: "把稳定的写入、校验或聚合操作沉淀成可复用能力。",
186
+ action: "查看核心能力",
187
+ url: feishuDocs.core,
188
+ icon: <DeploymentUnitOutlined />,
189
+ },
190
+ {
191
+ title: "构建并发布",
192
+ description: "检查构建产物、页面配置、菜单、路由和主应用接入。",
193
+ action: "查看发布路径",
194
+ url: feishuDocs.core,
195
+ icon: <CloudUploadOutlined />,
196
+ },
197
+ ];
198
+
199
+ const promptCards = [
200
+ {
201
+ title: "检查项目上下文",
202
+ description:
203
+ "让 Agent 识别 AppCode、项目配置和 SDK 模型,后续开发不再手动查接口。",
204
+ icon: <SettingOutlined />,
205
+ tags: ["项目配置", "模型同步"],
206
+ prompt: setupPrompt,
207
+ commands: [
208
+ "rabetbase project init",
209
+ "rabetbase config get",
210
+ "rabetbase api pull",
233
211
  ],
212
+ docUrl: feishuDocs.onboarding,
213
+ docLabel: "入门与上手",
234
214
  },
235
215
  {
236
- title: "开发文档",
237
- icon: <BookOutlined />,
238
- links: [
239
- {
240
- label: "TypeScript SDK",
241
- url: "https://open.lovrabet.com/docs/lovrabet-sdk/intro",
242
- },
243
- {
244
- label: "Java SDK",
245
- url: "https://open.lovrabet.com/docs/java-opensdk/quickstart",
246
- },
247
- {
248
- label: "OpenAPI",
249
- url: "https://open.lovrabet.com/docs/openapi/intro",
250
- },
251
- { label: "MCP", url: "https://open.lovrabet.com/docs/mcp/intro" },
252
- {
253
- label: "Backend Function",
254
- url: "https://open.lovrabet.com/docs/guides/best-practices",
255
- },
216
+ title: "开发客户列表页",
217
+ description:
218
+ "用真实 CRM 场景描述页面目标,让 Agent 生成列表、筛选和详情交互。",
219
+ icon: <PlayCircleOutlined />,
220
+ tags: ["页面开发", "SDK 接入"],
221
+ prompt: `请在当前 React 子应用里开发一个客户列表页。
222
+ 页面需要支持按客户名称、负责人、客户等级和最近跟进时间筛选。
223
+ 列表展示客户名称、联系人、负责人、客户等级、最近跟进时间和状态。
224
+ 点击客户后打开详情抽屉,详情数据和列表数据都使用 @lovrabet/sdk。`,
225
+ commands: [
226
+ "rabetbase api pull",
227
+ "rabetbase dataset list",
228
+ "rabetbase dataset detail",
229
+ ],
230
+ docUrl: feishuDocs.systemPageSdk,
231
+ docLabel: "系统页面开发",
232
+ },
233
+ {
234
+ title: "接入客户编辑表单",
235
+ description: "在列表页基础上补齐新增、编辑和字段校验,形成完整业务闭环。",
236
+ icon: <CodeOutlined />,
237
+ tags: ["表单开发", "写入校验"],
238
+ prompt: `请给客户列表页增加新增客户和编辑客户能力。
239
+ 先确认客户模型里可写字段、必填字段和选项字段。
240
+ 表单需要包含客户名称、联系人、联系电话、客户等级、负责人和备注。
241
+ 提交后使用 @lovrabet/sdk 写入数据,并刷新列表。`,
242
+ commands: [
243
+ "rabetbase dataset detail",
244
+ "rabetbase dataset operations",
245
+ "rabetbase api pull",
256
246
  ],
247
+ docUrl: feishuDocs.sdk,
248
+ docLabel: "TypeScript SDK",
249
+ },
250
+ {
251
+ title: "改造销售看板",
252
+ description: "把示例看板变成客户活跃度、跟进转化和销售机会分析页。",
253
+ icon: <DashboardOutlined />,
254
+ tags: ["二次开发", "统计看板"],
255
+ prompt: `请把 /dashboard 改造成销售客户看板。
256
+ 先读取当前 SDK 模型配置,确认客户、跟进记录和销售机会可用字段。
257
+ 页面展示客户总数、本周新增客户、待跟进客户、销售机会金额和最近跟进列表。
258
+ 不要写死模拟接口,优先使用项目里的 SDK 客户端。`,
259
+ commands: [
260
+ "rabetbase api pull",
261
+ "rabetbase dataset detail",
262
+ "rabetbase run build",
263
+ ],
264
+ docUrl: feishuDocs.systemPageSdk,
265
+ docLabel: "系统页面开发",
266
+ },
267
+ {
268
+ title: "发布接入主应用",
269
+ description:
270
+ "让 Agent 检查构建产物、Lovrabet 主应用接入方式、菜单和路由配置。",
271
+ icon: <DeploymentUnitOutlined />,
272
+ tags: ["构建检查", "主应用接入"],
273
+ prompt: `请检查这个 React 子应用是否可以接入 Lovrabet 主应用。
274
+ 确认构建产物、页面路由、basename、菜单同步和 import 加载配置。
275
+ 如果发现缺口,请直接修复或列出需要我确认的项。`,
276
+ commands: [
277
+ "rabetbase run build",
278
+ "rabetbase run preview",
279
+ "rabetbase menu sync",
280
+ ],
281
+ docUrl: feishuDocs.core,
282
+ docLabel: "核心研发能力",
283
+ },
284
+ ];
285
+
286
+ const pageEntries = [
287
+ {
288
+ title: "SDK 演示",
289
+ path: "/sdk-demo",
290
+ description:
291
+ "集中验证 filter、getOne、create、update、delete 等 SDK 调用。",
292
+ icon: <ApiOutlined />,
293
+ tags: ["SDK", "API"],
294
+ },
295
+ {
296
+ title: "工作台",
297
+ path: "/workbench",
298
+ description: "面向日常运营的概览页结构,适合扩展成业务人员首页。",
299
+ icon: <DashboardOutlined />,
300
+ tags: ["运营", "概览"],
301
+ },
302
+ {
303
+ title: "数据看板",
304
+ path: "/dashboard",
305
+ description: "用图表和指标卡展示业务数据,适合作为管理驾驶舱起点。",
306
+ icon: <DatabaseOutlined />,
307
+ tags: ["图表", "指标"],
308
+ },
309
+ {
310
+ title: "数据大屏",
311
+ path: "/data-screen",
312
+ description: "全屏展示型页面示例,适合投屏、会议室和实时监控场景。",
313
+ icon: <BarChartOutlined />,
314
+ tags: ["大屏", "实时"],
257
315
  },
258
316
  ];
259
317
 
318
+ const integrationSteps = [
319
+ "让 Agent 确认当前项目上下文里已有 AppCode。",
320
+ "让 Agent 刷新 SDK 类型,保持本地模型与平台数据模型一致。",
321
+ "让 Agent 构建并检查可发布到 CDN 的静态产物。",
322
+ "在 Lovrabet 主应用新增或更新页面,选择 import 接入方式。",
323
+ "让 Agent 核对菜单、路由、basename 和主应用访问路径。",
324
+ ];
325
+
260
326
  return (
261
- <div style={{ maxWidth: "1200px", margin: "0 auto", padding: "24px" }}>
262
- {/* 标题区 */}
263
- <div style={{ marginBottom: 32 }}>
264
- <div
265
- style={{
266
- display: "flex",
267
- justifyContent: "space-between",
268
- alignItems: "flex-start",
269
- flexWrap: "wrap",
270
- gap: 16,
271
- }}
272
- >
273
- <div>
274
- <Title level={2} style={{ margin: 0 }}>
275
- Rabetbase 开发指南
276
- </Title>
277
- <Paragraph style={{ color: "#666", marginTop: 8, marginBottom: 0 }}>
278
- 基于 Lovrabet 平台的后端即服务(BaaS)
279
- </Paragraph>
327
+ <main className={styles.homepage}>
328
+ <section className={styles.hero}>
329
+ <div className={styles.heroCopy}>
330
+ <Tag color="blue" icon={<RocketOutlined />}>
331
+ Agent-first Rabetbase Template
332
+ </Tag>
333
+ <Title level={1} className={styles.heroTitle}>
334
+ Agent 开发 Lovrabet React 子应用
335
+ </Title>
336
+ <Paragraph className={styles.heroText}>
337
+ 这是可运行的 React 微前端模板。描述页面目标,Agent
338
+ 会读取项目上下文、调用 SDK、改页面并完成构建检查。
339
+ </Paragraph>
340
+ <div className={styles.surfaceRow}>
341
+ {agentSurfaces.map((name) => (
342
+ <Tag key={name}>{name}</Tag>
343
+ ))}
280
344
  </div>
281
- <Space size="middle">
282
- <a
283
- href="https://open.lovrabet.com"
345
+ <Space size={12} wrap className={styles.heroActions}>
346
+ <Link to="/sdk-demo">
347
+ <Button type="primary" icon={<ApiOutlined />}>
348
+ 查看 SDK 演示
349
+ </Button>
350
+ </Link>
351
+ <Button
352
+ href={feishuDocs.systemPageSdk}
284
353
  target="_blank"
285
354
  rel="noopener noreferrer"
355
+ icon={<BookOutlined />}
286
356
  >
287
- Rabetbase官网
288
- </a>
289
- <a
290
- href="https://open.lovrabet.com/docs/changelog"
357
+ 页面开发文档
358
+ </Button>
359
+ <Button
360
+ href={feishuDocs.sdk}
291
361
  target="_blank"
292
362
  rel="noopener noreferrer"
363
+ icon={<LinkOutlined />}
293
364
  >
294
- 更新日志
295
- </a>
296
- {!isNotSet && appCode && (
297
- <a
365
+ SDK 文档
366
+ </Button>
367
+ {isConfigured && appCode && (
368
+ <Button
298
369
  href={`https://app.lovrabet.com/app/${appCode}/data/intro/`}
299
370
  target="_blank"
300
- rel="noopener noreferrer"
371
+ icon={<AppstoreOutlined />}
301
372
  >
302
373
  应用配置后台
303
- </a>
374
+ </Button>
304
375
  )}
305
376
  </Space>
306
377
  </div>
307
- </div>
308
378
 
309
- {/* Rabetbase 介绍卡片 */}
310
- <Card style={{ marginBottom: 24 }}>
311
- <Row gutter={[24, 16]} align="middle">
312
- <Col xs={24} lg={16}>
313
- <Title level={3} style={{ marginBottom: 12 }}>
314
- 什么是 Rabetbase?
315
- </Title>
316
- <Paragraph
317
- style={{ fontSize: 15, marginBottom: 16, color: "#595959" }}
318
- >
319
- <strong>Rabetbase 是 Lovrabet 面向技术岗位的开发者平台。</strong>
320
- <br />
321
- Lovrabet 工作台让业务人员用 AI
322
- 生成管理系统,但有些个性化需求(如小程序、ERP
323
- 对接、复杂业务逻辑)需要开发者介入。 Rabetbase 把 Lovrabet
324
- 平台的数据能力开放出来,让开发者专注于写业务逻辑。
325
- </Paragraph>
326
- <Space wrap>
327
- <Button
328
- size="small"
329
- href="https://open.lovrabet.com/docs/category/openapi"
330
- target="_blank"
331
- >
332
- OpenAPI
333
- </Button>
334
- <Button
335
- size="small"
336
- href="https://open.lovrabet.com/docs/category/lovrabet-node-sdk"
337
- target="_blank"
338
- >
339
- TypeScript SDK
340
- </Button>
341
- <Button
342
- size="small"
343
- href="https://open.lovrabet.com/docs/category/java-opensdk"
344
- target="_blank"
345
- >
346
- Java SDK
347
- </Button>
348
- <Button
349
- size="small"
350
- href="https://open.lovrabet.com/docs/mcp/intro"
351
- target="_blank"
352
- >
353
- MCP
354
- </Button>
355
- <Button
356
- size="small"
357
- href="https://open.lovrabet.com/docs/lovrabet-cli/"
358
- target="_blank"
359
- >
360
- CLI 工具
361
- </Button>
362
- </Space>
363
- </Col>
364
- <Col xs={24} lg={8}>
365
- <div
366
- style={{
367
- background: "#f5f5f5",
368
- borderRadius: 8,
369
- padding: 20,
370
- }}
379
+ <aside className={styles.statusPanel}>
380
+ <div className={styles.statusHeader}>
381
+ <div>
382
+ <Text type="secondary">项目状态</Text>
383
+ <Title level={2}>项目上下文</Title>
384
+ </div>
385
+ <Tag
386
+ color={
387
+ loading ? "processing" : isConfigured ? "success" : "warning"
388
+ }
371
389
  >
372
- <Text
373
- style={{ fontSize: 14, display: "block", marginBottom: 12 }}
374
- >
375
- <strong>核心价值:</strong>
376
- </Text>
377
- <ul
378
- style={{
379
- color: "#595959",
380
- margin: 0,
381
- paddingLeft: 20,
382
- fontSize: 14,
383
- }}
384
- >
385
- <li style={{ marginBottom: 8 }}>AI 自动理解业务模型</li>
386
- <li style={{ marginBottom: 8 }}>现成的 API 和 SDK</li>
387
- <li style={{ marginBottom: 8 }}>开发效率提升 2~5 倍</li>
388
- <li>你只需要专注写业务逻辑</li>
389
- </ul>
390
+ {statusLabel}
391
+ </Tag>
392
+ </div>
393
+ <div className={styles.statusCode}>
394
+ <Text type="secondary">AppCode</Text>
395
+ <strong>{loading ? "读取中" : displayAppCode}</strong>
396
+ </div>
397
+ <div className={styles.statusGrid}>
398
+ <div>
399
+ <Text type="secondary">API 文件</Text>
400
+ <strong>src/api/api.ts</strong>
401
+ </div>
402
+ <div>
403
+ <Text type="secondary">路由模式</Text>
404
+ <strong>src/pages 自动路由</strong>
405
+ </div>
406
+ <div>
407
+ <Text type="secondary">SDK 客户端</Text>
408
+ <strong>src/api/client.ts</strong>
409
+ </div>
410
+ <div>
411
+ <Text type="secondary">推荐下一步</Text>
412
+ <strong>开发客户列表页</strong>
390
413
  </div>
391
- </Col>
392
- </Row>
393
- </Card>
414
+ </div>
415
+ <div className={styles.statusLinks}>
416
+ <Button
417
+ block
418
+ href={feishuDocs.systemPageSdk}
419
+ target="_blank"
420
+ rel="noopener noreferrer"
421
+ icon={<BookOutlined />}
422
+ >
423
+ 系统页面开发文档
424
+ </Button>
425
+ <Button
426
+ block
427
+ href={feishuDocs.root}
428
+ target="_blank"
429
+ rel="noopener noreferrer"
430
+ icon={<LinkOutlined />}
431
+ >
432
+ Rabetbase 文库首页
433
+ </Button>
434
+ </div>
435
+ </aside>
436
+ </section>
394
437
 
395
- {/* 未配置提示 */}
396
- {isNotSet && !loading && (
438
+ {!loading && !isConfigured && (
397
439
  <Alert
398
440
  type="warning"
399
- icon={<ExclamationCircleOutlined />}
441
+ showIcon
442
+ icon={<WarningOutlined />}
443
+ className={styles.setupAlert}
400
444
  message="项目尚未配置 AppCode"
401
445
  description={
402
- <div style={{ marginTop: 8 }}>
403
- <Paragraph style={{ marginBottom: 8 }}>
404
- 请先执行以下命令初始化项目(替换{" "}
405
- <code>&lt;your-app-code&gt;</code> 为你的应用代码):
446
+ <div className={styles.alertBody}>
447
+ <Paragraph>
448
+ 直接把下面这段话发给 Claude Code、Cursor 或 Codex。Agent
449
+ 会根据项目情况补齐配置并刷新 SDK 模型。
406
450
  </Paragraph>
407
451
  <CopyableCode
408
- code={`# 1. 设置 AppCode
409
- lovrabet config set app <your-app-code>
410
-
411
- # 2. 拉取 API 配置
412
- lovrabet api pull`}
413
- label="初始化命令"
452
+ code={setupPrompt}
453
+ label="可直接输入的 Prompt"
454
+ compact
414
455
  />
415
- <Paragraph style={{ marginBottom: 0 }}>
416
- 执行完成后刷新页面即可。
417
- </Paragraph>
418
456
  </div>
419
457
  }
420
- style={{ marginBottom: 24 }}
421
458
  />
422
459
  )}
423
460
 
424
- {/* 配置代码 */}
425
- <Card style={{ marginBottom: 24 }}>
426
- <Tabs items={configTabs} />
427
- </Card>
461
+ <section className={styles.section}>
462
+ <div className={styles.sectionHeader}>
463
+ <div>
464
+ <Text type="secondary">飞书文库导航</Text>
465
+ <Title level={2}>按任务选择下一步</Title>
466
+ </div>
467
+ </div>
468
+ <div className={styles.taskGrid}>
469
+ {taskGuides.map((item) => (
470
+ <a
471
+ key={item.title}
472
+ className={styles.taskCard}
473
+ href={item.url}
474
+ target="_blank"
475
+ rel="noopener noreferrer"
476
+ >
477
+ <span className={styles.iconBox}>{item.icon}</span>
478
+ <span>
479
+ <strong>{item.title}</strong>
480
+ <span>{item.description}</span>
481
+ </span>
482
+ <em>
483
+ {item.action} <ArrowRightOutlined />
484
+ </em>
485
+ </a>
486
+ ))}
487
+ </div>
488
+ </section>
489
+
490
+ <section className={styles.section}>
491
+ <div className={styles.sectionHeader}>
492
+ <div>
493
+ <Text type="secondary">在线文库</Text>
494
+ <Title level={2}>常用入口</Title>
495
+ </div>
496
+ </div>
497
+ <div className={styles.docGrid}>
498
+ {docLinks.map((item) => (
499
+ <a
500
+ key={item.title}
501
+ className={styles.docCard}
502
+ href={item.url}
503
+ target="_blank"
504
+ rel="noopener noreferrer"
505
+ >
506
+ <span className={styles.routeIcon}>{item.icon}</span>
507
+ <strong>{item.title}</strong>
508
+ <span>{item.description}</span>
509
+ <em>
510
+ 打开文档 <ArrowRightOutlined />
511
+ </em>
512
+ </a>
513
+ ))}
514
+ </div>
515
+ </section>
428
516
 
429
- {/* 文档链接 */}
430
- <Row gutter={16}>
431
- {docLinks.map((section) => (
432
- <Col xs={24} md={12} key={section.title}>
433
- <Card style={{ height: "100%" }}>
434
- <div
435
- style={{
436
- display: "flex",
437
- alignItems: "center",
438
- gap: 8,
439
- marginBottom: 16,
440
- }}
441
- >
442
- {section.icon}
443
- <Title level={4} style={{ margin: 0 }}>
444
- {section.title}
445
- </Title>
517
+ <section className={styles.section}>
518
+ <div className={styles.sectionHeader}>
519
+ <div>
520
+ <Text type="secondary">AI 开发方式</Text>
521
+ <Title level={2}>直接输入这些 Prompt</Title>
522
+ </div>
523
+ <Button
524
+ href={feishuDocs.systemPageSdk}
525
+ target="_blank"
526
+ rel="noopener noreferrer"
527
+ icon={<ToolOutlined />}
528
+ >
529
+ 查看页面开发文档
530
+ </Button>
531
+ </div>
532
+ <div className={styles.promptGrid}>
533
+ {promptCards.map((item) => (
534
+ <Card key={item.title} className={styles.promptCard}>
535
+ <div className={styles.cardHeading}>
536
+ <span className={styles.iconBox}>{item.icon}</span>
537
+ <div>
538
+ <Title level={3}>{item.title}</Title>
539
+ <Paragraph>{item.description}</Paragraph>
540
+ </div>
446
541
  </div>
447
- {section.links.map((link) => (
448
- <div key={link.label}>
449
- <Button
450
- type="link"
451
- href={link.url}
452
- target="_blank"
453
- style={{ padding: "8px 0" }}
454
- >
455
- {link.label} <ArrowRightOutlined />
456
- </Button>
542
+ <div className={styles.tagRow}>
543
+ {item.tags.map((tag) => (
544
+ <Tag key={tag}>{tag}</Tag>
545
+ ))}
546
+ </div>
547
+ <div className={styles.commandList}>
548
+ <Text type="secondary">AI 可能调用</Text>
549
+ <div>
550
+ {item.commands.map((command) => (
551
+ <Text code key={command}>
552
+ {command}
553
+ </Text>
554
+ ))}
457
555
  </div>
458
- ))}
556
+ </div>
557
+ <CopyableCode
558
+ code={item.prompt}
559
+ label="可直接输入的 Prompt"
560
+ compact
561
+ />
562
+ <Button
563
+ type="link"
564
+ href={item.docUrl}
565
+ target="_blank"
566
+ rel="noopener noreferrer"
567
+ className={styles.inlineDocLink}
568
+ >
569
+ {item.docLabel} <ArrowRightOutlined />
570
+ </Button>
459
571
  </Card>
460
- </Col>
461
- ))}
462
- </Row>
463
- </div>
572
+ ))}
573
+ </div>
574
+ </section>
575
+
576
+ <section className={styles.section}>
577
+ <div className={styles.sectionHeader}>
578
+ <div>
579
+ <Text type="secondary">页面示例</Text>
580
+ <Title level={2}>内置页面入口</Title>
581
+ </div>
582
+ </div>
583
+ <div className={styles.pageGrid}>
584
+ {pageEntries.map((entry) => (
585
+ <Card key={entry.path} className={styles.routeCard}>
586
+ <div className={styles.routeIcon}>{entry.icon}</div>
587
+ <Title level={3}>{entry.title}</Title>
588
+ <Paragraph>{entry.description}</Paragraph>
589
+ <div className={styles.tagRow}>
590
+ {entry.tags.map((tag) => (
591
+ <Tag key={tag}>{tag}</Tag>
592
+ ))}
593
+ </div>
594
+ <Link className={styles.routeLink} to={entry.path}>
595
+ 打开页面 <ArrowRightOutlined />
596
+ </Link>
597
+ </Card>
598
+ ))}
599
+ </div>
600
+ </section>
601
+
602
+ <section className={styles.bottomGrid}>
603
+ <Card className={styles.sectionCard}>
604
+ <div className={styles.cardTitleLine}>
605
+ <CloudUploadOutlined />
606
+ <Title level={2}>接入主应用检查清单</Title>
607
+ </div>
608
+ <ol className={styles.checkList}>
609
+ {integrationSteps.map((step) => (
610
+ <li key={step}>
611
+ <CheckCircleOutlined />
612
+ <span>{step}</span>
613
+ </li>
614
+ ))}
615
+ </ol>
616
+ </Card>
617
+
618
+ <Card className={styles.sectionCard}>
619
+ <div className={styles.cardTitleLine}>
620
+ <ToolOutlined />
621
+ <Title level={2}>Agent 开发提示</Title>
622
+ </div>
623
+ <Paragraph className={styles.mutedText}>
624
+ 日常开发时,直接描述业务页面、数据来源、交互方式和验收标准。
625
+ Agent 会结合当前项目配置、SDK 模型和飞书文库完成实现。
626
+ </Paragraph>
627
+ <CopyableCode
628
+ code={`请基于当前 Lovrabet React 子应用开发客户列表页。
629
+ 先确认可用的客户数据模型和字段。
630
+ 页面需要包含筛选、表格、详情抽屉和新增表单。
631
+ 数据读写使用项目里的 @lovrabet/sdk,并在完成后运行构建检查。`}
632
+ label="推荐起步 Prompt"
633
+ compact
634
+ />
635
+ </Card>
636
+ </section>
637
+ </main>
464
638
  );
465
639
  }
466
640