byteplan-cli 1.0.2 → 1.2.0

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 (65) hide show
  1. package/package.json +7 -3
  2. package/skills/byteplan-analysis/SKILL.md +1078 -0
  3. package/skills/byteplan-api/API_REFERENCE.md +249 -0
  4. package/skills/byteplan-api/SKILL.md +96 -0
  5. package/skills/byteplan-api/package.json +16 -0
  6. package/skills/byteplan-api/scripts/api.js +973 -0
  7. package/skills/byteplan-excel/SKILL.md +212 -0
  8. package/skills/byteplan-excel/examples/margin-analysis.json +40 -0
  9. package/skills/byteplan-excel/package.json +12 -0
  10. package/skills/byteplan-excel/pnpm-lock.yaml +68 -0
  11. package/skills/byteplan-excel/scripts/generate_excel.js +156 -0
  12. package/skills/byteplan-html/SKILL.md +490 -0
  13. package/skills/byteplan-html/examples/example-output.html +184 -0
  14. package/skills/byteplan-html/examples/generate-ppt-style-html.js +611 -0
  15. package/skills/byteplan-html/examples/margin-contribution-analysis.json +152 -0
  16. package/skills/byteplan-html/package.json +18 -0
  17. package/skills/byteplan-html/scripts/generate_html.js +517 -0
  18. package/skills/byteplan-ppt/SKILL.md +394 -0
  19. package/skills/byteplan-ppt/examples/margin-contribution-analysis.json +152 -0
  20. package/skills/byteplan-ppt/package.json +16 -0
  21. package/skills/byteplan-ppt/pnpm-lock.yaml +138 -0
  22. package/skills/byteplan-ppt/scripts/check_ppt_overlap.js +318 -0
  23. package/skills/byteplan-ppt/scripts/generate_ppt.js +680 -0
  24. package/skills/byteplan-video/SKILL.md +606 -0
  25. package/skills/byteplan-video/examples/sample-video-data.json +82 -0
  26. package/skills/byteplan-video/remotion-project/package.json +22 -0
  27. package/skills/byteplan-video/remotion-project/pnpm-lock.yaml +1646 -0
  28. package/skills/byteplan-video/remotion-project/remotion.config.ts +6 -0
  29. package/skills/byteplan-video/remotion-project/scene_durations.json +32 -0
  30. package/skills/byteplan-video/remotion-project/scripts/generate_audio.js +279 -0
  31. package/skills/byteplan-video/remotion-project/src/DynamicReport.tsx +172 -0
  32. package/skills/byteplan-video/remotion-project/src/Root.tsx +51 -0
  33. package/skills/byteplan-video/remotion-project/src/SalesReport.tsx +107 -0
  34. package/skills/byteplan-video/remotion-project/src/index.tsx +4 -0
  35. package/skills/byteplan-video/remotion-project/src/scenes/ChartSlide.tsx +201 -0
  36. package/skills/byteplan-video/remotion-project/src/scenes/CoverSlide.tsx +61 -0
  37. package/skills/byteplan-video/remotion-project/src/scenes/EndSlide.tsx +60 -0
  38. package/skills/byteplan-video/remotion-project/src/scenes/InsightSlide.tsx +101 -0
  39. package/skills/byteplan-video/remotion-project/src/scenes/KpiSlide.tsx +84 -0
  40. package/skills/byteplan-video/remotion-project/src/scenes/RecommendationSlide.tsx +100 -0
  41. package/skills/byteplan-video/remotion-project/tsconfig.json +13 -0
  42. package/skills/byteplan-video/remotion-project/video_data.json +76 -0
  43. package/skills/byteplan-video/scripts/generate_video.js +270 -0
  44. package/skills/byteplan-video/templates/package.json +31 -0
  45. package/skills/byteplan-video/templates/pnpm-lock.yaml +2200 -0
  46. package/skills/byteplan-video/templates/remotion.config.ts +9 -0
  47. package/skills/byteplan-video/templates/scripts/generate-audio.ts +55 -0
  48. package/skills/byteplan-video/templates/src/components/BarChartScene.tsx +153 -0
  49. package/skills/byteplan-video/templates/src/components/InsightScene.tsx +135 -0
  50. package/skills/byteplan-video/templates/src/components/LineChartScene.tsx +214 -0
  51. package/skills/byteplan-video/templates/src/components/SceneFactory.tsx +34 -0
  52. package/skills/byteplan-video/templates/src/components/SummaryScene.tsx +155 -0
  53. package/skills/byteplan-video/templates/src/components/TitleScene.tsx +130 -0
  54. package/skills/byteplan-video/templates/src/compositions/AnalysisVideo.tsx +39 -0
  55. package/skills/byteplan-video/templates/src/index.tsx +28 -0
  56. package/skills/byteplan-video/templates/src/register-root.tsx +4 -0
  57. package/skills/byteplan-video/templates/src/storyboard/types.ts +46 -0
  58. package/skills/byteplan-video/templates/tsconfig.json +17 -0
  59. package/skills/byteplan-video/templates/tsconfig.scripts.json +13 -0
  60. package/skills/byteplan-word/SKILL.md +233 -0
  61. package/skills/byteplan-word/package.json +12 -0
  62. package/skills/byteplan-word/pnpm-lock.yaml +120 -0
  63. package/skills/byteplan-word/scripts/generate_word.js +548 -0
  64. package/src/cli.js +4 -0
  65. package/src/commands/skills.js +279 -0
@@ -0,0 +1,249 @@
1
+ # API Reference
2
+
3
+ > 本文档详细说明 api.js 的函数接口,需要深入了解时阅读。
4
+
5
+ ## 导入方式
6
+
7
+ ```javascript
8
+ // 从 byteplan-api skill 导入
9
+ import { login, loginWithEnv, getUserInfo, setEnvironment } from '/Users/fudebao/.claude/skills/byteplan-api/scripts/api.js';
10
+ ```
11
+
12
+ ## 环境管理
13
+
14
+ | 函数 | 描述 |
15
+ |------|------|
16
+ | `setEnvironment(env)` | 设置登录环境(仅支持 'uat') |
17
+ | `getEnvironment()` | 获取当前环境 |
18
+ | `getBaseUrl()` | 获取当前环境的基础 URL |
19
+ | `setCliMode(useCli)` | 设置是否使用 CLI 模式(默认 true) |
20
+ | `isUsingCli()` | 检查当前是否使用 CLI 模式 |
21
+
22
+ ## 登录认证
23
+
24
+ | 函数 | 描述 |
25
+ |------|------|
26
+ | `login(username, password, env?)` | 使用凭证登录(自动处理 RSA 加密,**自动保存 token**) |
27
+ | `loginWithEnv()` | 使用 `.env` 凭证登录(自动使用缓存 token,**自动续期**) |
28
+ | `loginWithEnv(env, forceReLogin)` | 强制重新登录 |
29
+ | `getToken()` | 从 `.env` 获取 token |
30
+
31
+ ```javascript
32
+ // 方式 1:自动使用缓存 token(推荐)
33
+ // 首次登录会保存 token,后续调用自动复用
34
+ import { loginWithEnv } from './api.js';
35
+ const result = await loginWithEnv();
36
+ const token = result.access_token;
37
+ if (result._cached) {
38
+ console.log('使用缓存的 token'); // 无需重新登录
39
+ }
40
+
41
+ // 方式 2:强制重新登录
42
+ const result = await loginWithEnv('uat', true); // forceReLogin = true
43
+
44
+ // 方式 3:手动传入凭证(也会自动保存 token)
45
+ import { login } from './api.js';
46
+ const result = await login('手机号', '密码', 'uat');
47
+ const token = result.access_token;
48
+ ```
49
+
50
+ ## Token 持久化
51
+
52
+ 登录成功后,系统会自动将以下信息保存到 `~/.byteplan/.env` 文件:
53
+
54
+ | 字段 | 说明 |
55
+ |------|------|
56
+ | `ACCESS_TOKEN` | 访问令牌 |
57
+ | `REFRESH_TOKEN` | 刷新令牌 |
58
+ | `TOKEN_EXPIRES_IN` | 过期时间戳(毫秒) |
59
+
60
+ **自动续期机制**:
61
+ - `loginWithEnv()` 会自动检查 token 是否过期
62
+ - 如果 token 有效(未过期或距离过期超过 5 分钟),直接使用缓存
63
+ - 如果 token 过期,自动使用保存的账号密码重新登录
64
+
65
+ ## 用户与租户
66
+
67
+ | 函数 | 描述 |
68
+ |------|------|
69
+ | `getUserInfo(token)` | 获取用户和租户信息,返回 `{ user: {...}, tenantList: [...] }` |
70
+ | `switchTenant(token, tenantId)` | 切换租户上下文 |
71
+
72
+ ```javascript
73
+ // 获取用户信息和可用租户列表
74
+ const userInfo = await getUserInfo(token);
75
+ // userInfo.user = { name, userName, tenantName, ... }
76
+ // userInfo.tenantList = [{ tenantId, tenantName }, ...]
77
+
78
+ // 如需切换到特定租户
79
+ await switchTenant(token, tenantId);
80
+ ```
81
+
82
+ ## 模型查询
83
+
84
+ | 函数 | 描述 |
85
+ |------|------|
86
+ | `queryModels(token, options?)` | 列出可用模型 |
87
+ | `getModelColumns(token, modelCodes)` | 获取模型字段定义 |
88
+ | `getModelData(token, modelCode, params)` | 查询模型数据 |
89
+
90
+ ### 返回值格式说明(重要)
91
+
92
+ **⚠️ 所有 API 函数直接返回后端响应,无需额外处理:**
93
+
94
+ | 函数 | 返回值类型 | 说明 |
95
+ |------|-----------|------|
96
+ | `queryModels()` | `Array` | **直接返回数组**,可用 `models.map()` 遍历 |
97
+ | `getModelColumns()` | `Object` | 返回 `{ data: [...], ... }` 结构 |
98
+ | `getModelData()` | `Object` | 返回 `{ data: [...], total: number }` 结构,用 `.data` 取数据 |
99
+
100
+ ```javascript
101
+ // ❌ 错误用法:queryModels 返回的是数组,不要加 .data
102
+ const models = await queryModels(token);
103
+ const list = models.data; // 错误!models 本身就是数组
104
+
105
+ // ✅ 正确用法:直接遍历
106
+ const models = await queryModels(token);
107
+ const modelList = models.map(m => ({ name: m.modelName, code: m.modelCode }));
108
+ // models.length = 模型总数
109
+
110
+ // ✅ getModelData 返回的是对象,需要用 .data 取数据数组
111
+ const result = await getModelData(token, 'model_code');
112
+ const items = result.data; // 数据数组
113
+ const total = result.total; // 总记录数
114
+
115
+ // ✅ getModelColumns 返回的是对象
116
+ const columns = await getModelColumns(token, ['model_code_1']);
117
+ // columns.data = 字段定义数组
118
+ ```
119
+
120
+ ## 字段类型值获取
121
+
122
+ | 函数 | 描述 |
123
+ |------|------|
124
+ | `getDimValues(token, dimCode, options?)` | 获取 DIM 字段可选值 |
125
+ | `getListValues(token, listCode, options?)` | 获取 LIST 字段可选值 |
126
+ | `getLovValues(token, lovCode, options?)` | 获取 LOV 字段可选值 |
127
+ | `getLevelValues(token, levelCode, options?)` | 获取 LEVEL 字段可选值 |
128
+
129
+ ```javascript
130
+ // 获取维度值
131
+ const dimValues = await getDimValues(token, 'dim_code', {
132
+ modelCode: 'model_code',
133
+ colName: 'field_name',
134
+ page: 0,
135
+ size: 100
136
+ });
137
+
138
+ // 获取列表值
139
+ const listValues = await getListValues(token, 'list_code', {
140
+ modelCode: 'model_code',
141
+ colName: 'field_name'
142
+ });
143
+
144
+ // 获取 LOV 值
145
+ const lovValues = await getLovValues(token, 'lov_code', {
146
+ keywords: '搜索关键词'
147
+ });
148
+
149
+ // 获取层级值
150
+ const levelValues = await getLevelValues(token, 'level_code', {
151
+ modelCode: 'model_code',
152
+ colName: 'field_name'
153
+ });
154
+ ```
155
+
156
+ ## 查询语法
157
+
158
+ ### 条件结构
159
+
160
+ ```javascript
161
+ {
162
+ type: 'condition',
163
+ field: '字段名',
164
+ operator: '=', // 支持: =, !=, >, <, >=, <=, LIKE, IN, BETWEEN
165
+ value: '值'
166
+ }
167
+ ```
168
+
169
+ ### 条件组结构(多条件)
170
+
171
+ ```javascript
172
+ {
173
+ type: 'group',
174
+ logic: 'AND', // AND 或 OR
175
+ children: [
176
+ { type: 'condition', field: '字段1', operator: '=', value: '值1' },
177
+ { type: 'condition', field: '字段2', operator: '>', value: '值2' }
178
+ ]
179
+ }
180
+ ```
181
+
182
+ ### 特殊字段类型
183
+
184
+ 对于 DIM、LIST、LOV、LEVEL 类型字段:
185
+ - 直接使用原字段名(不需要拼接 `.code` 或 `.name`)
186
+ - 使用编码值进行筛选
187
+
188
+ ```javascript
189
+ // 示例:按性别筛选(DIM 类型)
190
+ { field: 'sex', operator: '=', value: '1' } // '1' = 男性编码
191
+
192
+ // 示例:按学科筛选(LIST 类型)
193
+ { field: 'subject', operator: '=', value: 'math' }
194
+ ```
195
+
196
+ ### 聚合查询
197
+
198
+ ```javascript
199
+ const result = await getModelData(token, 'model_code', {
200
+ groupFields: ['category'],
201
+ functions: [
202
+ { func: 'sum', field: 'amount', alias: 'total_amount' },
203
+ { func: 'avg', field: 'price', alias: 'avg_price' }
204
+ ]
205
+ });
206
+ ```
207
+
208
+ ## 完整登录示例
209
+
210
+ ```javascript
211
+ import { login, loginWithEnv, getUserInfo } from './api.js';
212
+ import { existsSync } from 'fs';
213
+ import { homedir } from 'os';
214
+ import path from 'path';
215
+
216
+ // 凭证文件路径
217
+ const BYTEPLAN_DIR = path.join(homedir(), '.byteplan');
218
+ const ENV_FILE = path.join(BYTEPLAN_DIR, '.env');
219
+
220
+ // 尝试使用 ~/.byteplan/.env 凭证登录
221
+ let token;
222
+ if (existsSync(ENV_FILE)) {
223
+ try {
224
+ const result = await loginWithEnv();
225
+ token = result.access_token;
226
+ } catch (e) {
227
+ // 凭证无效,需要询问用户
228
+ }
229
+ }
230
+
231
+ // 如果没有 token,询问用户输入账号密码
232
+ if (!token) {
233
+ // 使用 AskUserQuestion 询问用户名和密码
234
+ // const username = ...;
235
+ // const password = ...;
236
+ const result = await login(username, password, 'uat');
237
+ token = result.access_token;
238
+ }
239
+
240
+ // ✅ 显示当前租户信息
241
+ const userInfo = await getUserInfo(token);
242
+ const currentTenant = userInfo.user?.tenantName || '未知租户';
243
+ const userName = userInfo.user?.name || userInfo.user?.userName || '未知用户';
244
+
245
+ `✅ 登录成功!
246
+ 环境: UAT 环境
247
+ 用户: ${userName}
248
+ 当前租户: ${currentTenant}`;
249
+ ```
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: byteplan-api
3
+ description: BytePlan 数据平台 API 封装。提供登录认证、模型查询、数据获取等接口。可被 byteplan-analysis、byteplan-excel、byteplan-html、byteplan-ppt、byteplan-video、byteplan-word 等技能依赖使用。
4
+ ---
5
+
6
+ # BytePlan API Skill
7
+
8
+ ## 概述
9
+
10
+ 提供 BytePlan 数据平台的 JavaScript API 封装,支持:
11
+ - 登录认证(UAT 环境)
12
+ - 用户与租户管理
13
+ - 模型查询与数据获取
14
+ - 字段类型值获取(DIM/LIST/LOV/LEVEL)
15
+
16
+ ## CLI 模式
17
+
18
+ 本 skill 支持两种调用模式:
19
+
20
+ 1. **CLI 模式(默认)**:优先使用 `byteplan-cli` 命令行工具
21
+ 2. **直接 API 模式**:当 CLI 未安装或执行失败时,自动回退到直接 API 调用
22
+
23
+ ### CLI 自动安装
24
+
25
+ 使用 API 前,系统会自动检测用户是否安装了 `byteplan-cli`:
26
+ - 如果未安装,会自动执行 `npm i -g byteplan-cli` 进行安装
27
+ - 安装成功后,后续操作优先使用 CLI 模式
28
+
29
+ ### CLI 命令帮助
30
+
31
+ 如果不知道 CLI 命令的参数和用法,可以使用 `-h` 或 `--help` 查看帮助信息:
32
+
33
+ ```bash
34
+ byteplan --help
35
+ byteplan login --help
36
+ byteplan model --help
37
+ byteplan data --help
38
+ ```
39
+
40
+ ## 依赖此 Skill 的其他 Skill
41
+
42
+ - [byteplan-analysis](../byteplan-analysis/SKILL.md) - 从 BytePlan 平台查询数据并生成分析报告
43
+ - [byteplan-excel](../byteplan-excel/SKILL.md) - 数据分析 Excel 报告生成
44
+ - [byteplan-html](../byteplan-html/SKILL.md) - 数据分析网页报告生成
45
+ - [byteplan-ppt](../byteplan-ppt/SKILL.md) - 数据分析 PPT 报告生成
46
+ - [byteplan-video](../byteplan-video/SKILL.md) - 数据可视化视频生成
47
+ - [byteplan-word](../byteplan-word/SKILL.md) - 数据分析 Word 文档报告生成
48
+
49
+ ## 环境配置
50
+
51
+ **凭证存储路径**:`~/.byteplan/.env`
52
+
53
+ 登录成功后自动创建 `.env` 文件:
54
+
55
+ ```env
56
+ BP_ENV=uat
57
+ BP_USER=你的手机号
58
+ BP_PASSWORD="你的密码"
59
+ ACCESS_TOKEN= # 自动管理
60
+ REFRESH_TOKEN= # 自动管理
61
+ TOKEN_EXPIRES_IN= # 自动管理
62
+ ```
63
+
64
+ **注意**:
65
+ - 密码包含特殊字符时用引号包裹
66
+ - Token 由系统自动管理,无需手动修改
67
+
68
+ ### 首次使用流程
69
+
70
+ 如果没有 `.env` 文件或 token 无效,**必须询问用户输入**:
71
+ 1. 询问用户名(手机号)
72
+ 2. 询问密码
73
+ 3. 使用凭证登录
74
+ 4. 登录成功后显示当前租户信息
75
+
76
+ ## API 详细文档
77
+
78
+ 需要深入了解 api.js 的函数接口时,请阅读 [API_REFERENCE.md](./API_REFERENCE.md)。
79
+
80
+ ## 快速开始
81
+
82
+ ```javascript
83
+ import { loginWithEnv, getUserInfo, queryModels } from './scripts/api.js';
84
+
85
+ // 自动登录(使用缓存的 token 或重新登录)
86
+ const result = await loginWithEnv();
87
+ const token = result.access_token;
88
+
89
+ // 获取用户信息
90
+ const userInfo = await getUserInfo(token);
91
+ console.log(`当前租户: ${userInfo.user?.tenantName}`);
92
+
93
+ // 查询模型列表
94
+ const models = await queryModels(token);
95
+ console.log(`可用模型: ${models.length} 个`);
96
+ ```
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "byteplan-api",
3
+ "version": "1.0.0",
4
+ "description": "BytePlan 数据平台 API 封装",
5
+ "type": "module",
6
+ "dependencies": {
7
+ "dotenv": "^16.4.5"
8
+ },
9
+ "keywords": [
10
+ "byteplan",
11
+ "api",
12
+ "data-platform"
13
+ ],
14
+ "author": "",
15
+ "license": "MIT"
16
+ }