@xtalpi/agentic-lab-skills 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +1 -1
  2. package/package.json +14 -14
  3. package/skills/lab-flow-designer/SKILL.md +612 -612
  4. package/skills/lab-flow-designer/embedded-template/SKILL.md +103 -103
  5. package/skills/lab-flow-designer/embedded-template/pools//345/205/245/345/217/243/346/261/240.md +21 -21
  6. package/skills/lab-flow-designer/embedded-template/pools//345/207/272/345/217/243/346/261/240.md +21 -21
  7. package/skills/lab-flow-designer/embedded-template/scripts//347/244/272/344/276/213/346/225/260/346/215/256/344/270/216/346/240/241/351/252/214/351/227/250/346/216/247.js +142 -142
  8. package/skills/lab-flow-designer/embedded-template/valves//347/244/272/344/276/213/346/225/260/346/215/256/344/270/216/346/240/241/351/252/214/351/227/250/346/216/247.md +114 -114
  9. package/skills/lab-flow-designer/references/agentic-lab-processer.md +122 -122
  10. package/skills/lab-flow-designer/references/agentic-lab-sdk.md +534 -361
  11. package/skills/lab-flow-designer/references/rhea-api/README.md +7 -7
  12. package/skills/lab-flow-designer/references/rhea-api/execute_process_batch.md +58 -58
  13. package/skills/lab-flow-designer/references/skill-package-layout.md +268 -268
  14. package/skills/lab-flow-designer/references//344/270/232/345/212/241/346/265/201/347/250/213/346/226/207/346/241/243/346/240/207/345/207/206.md +216 -216
  15. package/skills/lab-flow-designer/templates//344/270/232/345/212/241/346/265/201/347/250/213/346/226/207/346/241/243/346/250/241/346/235/277.md +192 -192
  16. package/skills/lab-flow-designer/templates//344/270/232/345/212/241/346/265/201/347/250/213/346/226/207/346/241/243/347/244/272/344/276/213.md +207 -207
  17. package/skills/lab-flow-designer/testing/test-processer.mjs +1240 -1240
  18. package/skills/lab-nocobase-flow-generator/SKILL.md +164 -164
  19. package/skills/lab-nocobase-flow-generator/examples/setting/350/241/250/350/216/267/345/217/226/345/244/226/351/203/250/346/234/215/345/212/241.js +70 -70
  20. package/skills/lab-nocobase-flow-generator/examples//346/237/245/350/257/242/345/214/226/345/255/246/345/223/201/344/277/241/346/201/257.js +30 -30
  21. package/skills/lab-nocobase-flow-generator/references/doc-standard.md +84 -84
  22. package/skills/lab-nocobase-flow-generator/references/runtime-api.md +224 -224
  23. package/skills/lab-nocobase-flow-generator/templates//350/204/232/346/234/254/351/200/273/350/276/221/346/226/207/346/241/243/346/250/241/346/235/277.md +121 -121
  24. package/skills/lab-nocobase-flow-generator/templates//350/204/232/346/234/254/351/200/273/350/276/221/346/226/207/346/241/243/347/244/272/344/276/213.md +67 -67
  25. package/skills/lab-orbit-component-builder/SKILL.md +353 -353
  26. package/skills/lab-orbit-component-builder/examples/xnb-component-template/.env.local.example +27 -27
  27. package/skills/lab-orbit-component-builder/examples/xnb-component-template/.eslintignore +7 -7
  28. package/skills/lab-orbit-component-builder/examples/xnb-component-template/.eslintrc.cjs +88 -88
  29. package/skills/lab-orbit-component-builder/examples/xnb-component-template/.nvmrc +1 -1
  30. package/skills/lab-orbit-component-builder/examples/xnb-component-template/AgenticAppAPI.md +268 -268
  31. package/skills/lab-orbit-component-builder/examples/xnb-component-template/Jenkinsfile +106 -106
  32. package/skills/lab-orbit-component-builder/examples/xnb-component-template/OrbitAPI.md +453 -453
  33. package/skills/lab-orbit-component-builder/examples/xnb-component-template/README.md +176 -176
  34. package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/public/index.html +12 -12
  35. package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/App.vue +151 -151
  36. package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/components/DevOpenerLauncher.vue +143 -143
  37. package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/global.d.ts +77 -77
  38. package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/main.ts +308 -308
  39. package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/mockXNBBitable.ts +119 -119
  40. package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/shims-vue.d.ts +6 -6
  41. package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/utils/devOpenerHost.ts +75 -75
  42. package/skills/lab-orbit-component-builder/examples/xnb-component-template/index.html +13 -13
  43. package/skills/lab-orbit-component-builder/examples/xnb-component-template/package.json +60 -60
  44. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/api/agenticlabTickets.ts +110 -110
  45. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/entries/bitable.ts +4 -4
  46. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/entries/custom-page.ts +4 -4
  47. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/index.ts +1 -1
  48. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/styles/orbit-quasar-host.scss +19 -19
  49. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/types/context.ts +15 -15
  50. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/types/xnb-context.ts +70 -70
  51. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useBitablePage.ts +189 -189
  52. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useSuperCellDemo.ts +257 -257
  53. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useSuperTableBitableLifecycle.ts +555 -555
  54. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/openerInitParams.ts +158 -158
  55. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/openerTicketIds.ts +32 -32
  56. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/orbitHttpClient.ts +110 -110
  57. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/request.ts +92 -92
  58. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/views/bitable.vue +67 -67
  59. package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/views/custom-page.vue +140 -140
  60. package/skills/lab-orbit-component-builder/examples/xnb-component-template/tsconfig.json +45 -45
  61. package/skills/lab-orbit-component-builder/examples/xnb-component-template/vite.config.ts +170 -170
  62. package/skills/lab-orbit-component-builder/examples/xnb-component-template/vite.dev.config.ts +58 -58
  63. package/skills/lab-orbit-component-builder/references/flow-document-human-ui.md +65 -65
  64. package/skills/lab-orbit-component-builder/references/orbit-vue-conventions.md +133 -133
  65. package/skills/lab-orbit-component-builder/references/pool-schema-to-columns.md +67 -67
  66. package/skills/lab-orbit-component-builder/references/vue-template-checklist.md +179 -179
  67. package/skills/lab-orbit-component-builder/references/xnb-context-vue-props.md +49 -49
  68. package/skills/lab-orbit-component-builder/references/xnbitable-vue-parity.md +32 -32
@@ -1,84 +1,84 @@
1
- # 脚本逻辑文档规范
2
-
3
- 本文档定义了产品人员编写「脚本逻辑文档」时须遵循的格式,Skill 依据此规范解析文档并生成脚本。
4
-
5
- ---
6
-
7
- ## 必备章节与检查项
8
-
9
- ### §1 基本信息(必填)
10
-
11
- 表格形式,包含:
12
-
13
- | 字段 | 要求 |
14
- |------|------|
15
- | 脚本名称 | 必填,简洁描述功能 |
16
- | 业务场景 | 必填,说明触发场景和业务目的 |
17
- | 输入参数来源 | 必填,`input_data` / `workflow_context` / 无 |
18
-
19
- ### §2 输入参数(必填)
20
-
21
- 表格列出所有参数:`参数名`、`类型`、`必填`、`说明`。
22
-
23
- 必须描述**参数校验规则**(如互斥、至少一个必填等)。
24
-
25
- ### §3 数据操作(必填)
26
-
27
- 分为两个子节:
28
-
29
- #### §3.1 NocoBase 数据库操作
30
-
31
- 每个操作一个子标题,包含:
32
- - **数据表**:表名(必填)
33
- - **操作类型**:`find` / `create` / `update` / `destroy`(必填)
34
- - **关联加载**:appends 字段名列表或 `无`
35
- - **过滤条件**:列出所有条件
36
- - **更新/写入字段**(仅 create/update):`字段名`、`值来源`、`说明`
37
-
38
- #### §3.2 外部服务操作(可选)
39
-
40
- 每个接口一个子标题,包含:
41
- - **接口地址来源**:`setting` 表配置项名称 或 固定地址(必填)
42
- - **请求路径**:接口路径(必填)
43
- - **请求方法**:`GET` / `POST` / `PUT` / `DELETE`(必填)
44
- - **认证方式**:`Bearer Token` / 无 / `setting` 表配置项
45
- - **请求参数/请求体**:JSON 示例
46
- - **响应取值路径**:如 `res.data.results.records`
47
-
48
- ### §4 核心逻辑(必填)
49
-
50
- 编号步骤描述处理流程,可包含:
51
- - **条件分支**:当 XXX 时 → 执行 A
52
- - **循环处理**:遍历 XXX,对每条执行 ...
53
- - **数据转换**:字段映射、计算等
54
-
55
- ### §5 输出结果(必填)
56
-
57
- 表格列出各场景的返回值:`场景`、`返回值`、`类型`。
58
-
59
- 至少覆盖:成功(含空数据)、校验失败、异常。返回格式须符合标准信封格式(`ok()` / `fail()`)。
60
-
61
- ### §6 备注(可选)
62
-
63
- 补充说明、注意事项。
64
-
65
- ---
66
-
67
- ## 合规检查清单
68
-
69
- Skill 在生成脚本前会检查以下项目:
70
-
71
- | # | 检查项 | 阻断级别 |
72
- |---|--------|----------|
73
- | 1 | §1 基本信息完整 | 阻断 |
74
- | 2 | §2 输入参数至少列出一项,或明确标注「无输入参数」 | 阻断 |
75
- | 3 | §3 至少有一个数据操作(数据库或外部服务) | 阻断 |
76
- | 4 | §3.1 每个数据库操作的表名和操作类型已指定 | 阻断 |
77
- | 5 | §3.2 外部接口的地址来源、路径、方法已指定 | 阻断 |
78
- | 6 | §4 核心逻辑步骤清晰,无歧义条件 | 阻断 |
79
- | 7 | §5 输出结果覆盖成功/异常场景 | 建议 |
80
- | 8 | §3.1 过滤条件使用支持的操作符 | 建议 |
81
- | 9 | §3.2 接口认证方式已说明 | 建议 |
82
-
83
- - **阻断**:未满足则不生成脚本,输出补充建议
84
- - **建议**:未满足仍可生成,但提示优化
1
+ # 脚本逻辑文档规范
2
+
3
+ 本文档定义了产品人员编写「脚本逻辑文档」时须遵循的格式,Skill 依据此规范解析文档并生成脚本。
4
+
5
+ ---
6
+
7
+ ## 必备章节与检查项
8
+
9
+ ### §1 基本信息(必填)
10
+
11
+ 表格形式,包含:
12
+
13
+ | 字段 | 要求 |
14
+ |------|------|
15
+ | 脚本名称 | 必填,简洁描述功能 |
16
+ | 业务场景 | 必填,说明触发场景和业务目的 |
17
+ | 输入参数来源 | 必填,`input_data` / `workflow_context` / 无 |
18
+
19
+ ### §2 输入参数(必填)
20
+
21
+ 表格列出所有参数:`参数名`、`类型`、`必填`、`说明`。
22
+
23
+ 必须描述**参数校验规则**(如互斥、至少一个必填等)。
24
+
25
+ ### §3 数据操作(必填)
26
+
27
+ 分为两个子节:
28
+
29
+ #### §3.1 NocoBase 数据库操作
30
+
31
+ 每个操作一个子标题,包含:
32
+ - **数据表**:表名(必填)
33
+ - **操作类型**:`find` / `create` / `update` / `destroy`(必填)
34
+ - **关联加载**:appends 字段名列表或 `无`
35
+ - **过滤条件**:列出所有条件
36
+ - **更新/写入字段**(仅 create/update):`字段名`、`值来源`、`说明`
37
+
38
+ #### §3.2 外部服务操作(可选)
39
+
40
+ 每个接口一个子标题,包含:
41
+ - **接口地址来源**:`setting` 表配置项名称 或 固定地址(必填)
42
+ - **请求路径**:接口路径(必填)
43
+ - **请求方法**:`GET` / `POST` / `PUT` / `DELETE`(必填)
44
+ - **认证方式**:`Bearer Token` / 无 / `setting` 表配置项
45
+ - **请求参数/请求体**:JSON 示例
46
+ - **响应取值路径**:如 `res.data.results.records`
47
+
48
+ ### §4 核心逻辑(必填)
49
+
50
+ 编号步骤描述处理流程,可包含:
51
+ - **条件分支**:当 XXX 时 → 执行 A
52
+ - **循环处理**:遍历 XXX,对每条执行 ...
53
+ - **数据转换**:字段映射、计算等
54
+
55
+ ### §5 输出结果(必填)
56
+
57
+ 表格列出各场景的返回值:`场景`、`返回值`、`类型`。
58
+
59
+ 至少覆盖:成功(含空数据)、校验失败、异常。返回格式须符合标准信封格式(`ok()` / `fail()`)。
60
+
61
+ ### §6 备注(可选)
62
+
63
+ 补充说明、注意事项。
64
+
65
+ ---
66
+
67
+ ## 合规检查清单
68
+
69
+ Skill 在生成脚本前会检查以下项目:
70
+
71
+ | # | 检查项 | 阻断级别 |
72
+ |---|--------|----------|
73
+ | 1 | §1 基本信息完整 | 阻断 |
74
+ | 2 | §2 输入参数至少列出一项,或明确标注「无输入参数」 | 阻断 |
75
+ | 3 | §3 至少有一个数据操作(数据库或外部服务) | 阻断 |
76
+ | 4 | §3.1 每个数据库操作的表名和操作类型已指定 | 阻断 |
77
+ | 5 | §3.2 外部接口的地址来源、路径、方法已指定 | 阻断 |
78
+ | 6 | §4 核心逻辑步骤清晰,无歧义条件 | 阻断 |
79
+ | 7 | §5 输出结果覆盖成功/异常场景 | 建议 |
80
+ | 8 | §3.1 过滤条件使用支持的操作符 | 建议 |
81
+ | 9 | §3.2 接口认证方式已说明 | 建议 |
82
+
83
+ - **阻断**:未满足则不生成脚本,输出补充建议
84
+ - **建议**:未满足仍可生成,但提示优化
@@ -1,224 +1,224 @@
1
- # NocoBase 工作流脚本运行时 API
2
-
3
- ## 1. 全局对象
4
-
5
- 脚本在 NocoBase 工作流的「脚本节点」中执行,运行时注入以下全局对象:
6
-
7
- | 对象 | 说明 |
8
- |------|------|
9
- | `appContext` | NocoBase 应用上下文,用于获取数据表 Repository |
10
- | `dayjs` | 日期处理库(已全局注入,无需 require) |
11
- | `getMessageFromError(err)` | 从错误对象提取可读信息的工具函数 |
12
- | `input_data` | 工作流传入的参数对象(由前一个节点或触发器提供) |
13
-
14
- ## 2. 获取 Repository
15
-
16
- ```javascript
17
- const repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('表名')
18
- ```
19
-
20
- ## 3. Repository 操作
21
-
22
- ### 3.1 find — 查询
23
-
24
- ```javascript
25
- const data = await repo.find({
26
- pageSize: 9999, // 分页大小
27
- filter: { // 过滤条件
28
- field_name: 'value',
29
- status: { $in: ['A', 'B'] },
30
- date_field: {
31
- $dateBefore: '2025-01-01 00:00:00',
32
- $dateAfter: '2024-01-01 00:00:00'
33
- },
34
- name: { $notEmpty: true }
35
- },
36
- appends: ['relation_field'] // 加载关联字段(可选)
37
- })
38
- // 返回值: Array
39
- ```
40
-
41
- ### 3.2 create — 创建
42
-
43
- ```javascript
44
- const res = await repo.create({
45
- values: {
46
- field1: 'value1',
47
- field2: 123
48
- }
49
- })
50
- // 返回值: Object (创建的记录)
51
- ```
52
-
53
- ### 3.3 update — 更新
54
-
55
- ```javascript
56
- const res = await repo.update({
57
- filter: { id: 1 }, // 或 { id: { $in: [1, 2, 3] } }
58
- values: {
59
- status: 'new_status'
60
- }
61
- })
62
- // 返回值: Array (更新的记录)
63
- ```
64
-
65
- ### 3.4 destroy — 删除
66
-
67
- ```javascript
68
- await repo.destroy({
69
- filter: { id: 1 }
70
- })
71
- ```
72
-
73
- ## 4. 常用过滤操作符
74
-
75
- | 操作符 | 说明 | 示例 |
76
- |--------|------|------|
77
- | `$eq` | 等于(默认) | `{ name: 'test' }` |
78
- | `$ne` | 不等于 | `{ status: { $ne: 'deleted' } }` |
79
- | `$in` | 在列表中 | `{ status: { $in: ['A', 'B'] } }` |
80
- | `$notIn` | 不在列表中 | `{ status: { $notIn: ['X'] } }` |
81
- | `$empty` | 为空 | `{ name: { $empty: true } }` |
82
- | `$notEmpty` | 不为空 | `{ name: { $notEmpty: true } }` |
83
- | `$dateBefore` | 日期早于 | `{ date: { $dateBefore: '...' } }` |
84
- | `$dateAfter` | 日期晚于 | `{ date: { $dateAfter: '...' } }` |
85
- | `$or` | 或条件 | `{ $or: [{ a: 1 }, { b: 2 }] }` |
86
-
87
- ## 5. 外部 HTTP 调用(axios)
88
-
89
- ```javascript
90
- const axios = require('axios')
91
-
92
- const res = await axios({
93
- method: 'get', // 或 'post', 'put', 'delete'
94
- url: 'http://example.com/api/xxx',
95
- params: { key: 'val' }, // GET 参数
96
- data: { key: 'val' }, // POST 请求体
97
- headers: {
98
- 'Content-Type': 'application/json',
99
- 'Authorization': 'Bearer xxx'
100
- }
101
- })
102
- // 响应: res.data
103
- ```
104
-
105
- ## 6. 从 setting 表读取配置(用于动态获取外部服务地址)
106
-
107
- 当外部接口地址需要从系统配置中读取时:
108
-
109
- ```javascript
110
- const setting_repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('setting')
111
-
112
- const get_settings = async () => {
113
- const res = await setting_repo.find({ pageSize: 9999 })
114
- const settings = {}
115
- res.forEach(s => {
116
- settings[s.setting_name] = s.setting_value
117
- })
118
- return settings
119
- }
120
-
121
- // 使用示例
122
- const settings = await get_settings()
123
- if (!settings.rhea_host) return fail('CONFIG_ERROR', 'rhea_host 未在 setting 表中配置')
124
- const url = `${settings.rhea_host}/api/process/list_process`
125
- ```
126
-
127
- > **注意:** 不同项目的 setting 表字段名可能不同(`setting_name`/`name`、`setting_value`/`value`),以实际表结构为准。
128
- > 必要配置缺失时使用 `fail('CONFIG_ERROR', ...)` 返回结构化错误,不要使用 `throw`。
129
-
130
- ## 7. 脚本结构规范
131
-
132
- ```javascript
133
- // 1. 引入外部依赖(按需)
134
- const axios = require('axios')
135
-
136
- // 2. 辅助函数
137
- const ok = (data) => ({ success: true, error_code: null, error_message: null, http_status: null, data })
138
- const fail = (error_code, error_message, http_status = null) => ({ success: false, error_code, error_message, http_status, data: null })
139
-
140
- // 3. 解构输入参数
141
- const { param1, param2 } = input_data
142
-
143
- // 4. 获取 Repository
144
- const xxx_repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('xxx')
145
-
146
- // 5. try-catch 包裹所有业务逻辑(含参数校验)
147
- try {
148
- if (!param1) return fail('VALIDATION_ERROR', 'param1 is required')
149
-
150
- const data = await xxx_repo.find({ ... })
151
-
152
- return ok(data)
153
- } catch (err) {
154
- const err_info = getMessageFromError(err)
155
- console.error('操作失败:', err)
156
- return fail('DB_ERROR', err_info)
157
- }
158
- ```
159
-
160
- ## 8. 标准返回格式
161
-
162
- 所有脚本必须通过 `ok()` / `fail()` 辅助函数返回统一的信封对象:
163
-
164
- ```javascript
165
- const ok = (data) => ({ success: true, error_code: null, error_message: null, http_status: null, data })
166
- const fail = (error_code, error_message, http_status = null) => ({ success: false, error_code, error_message, http_status, data: null })
167
- ```
168
-
169
- **信封字段:**
170
-
171
- | 字段 | 类型 | 成功时 | 失败时 |
172
- |------|------|--------|--------|
173
- | `success` | `boolean` | `true` | `false` |
174
- | `error_code` | `string \| null` | `null` | 错误码枚举值 |
175
- | `error_message` | `string \| null` | `null` | 可读的错误描述 |
176
- | `http_status` | `number \| null` | `null` | HTTP 状态码(仅 `HTTP_ERROR`) |
177
- | `data` | `any` | 业务数据 | `null` |
178
-
179
- **错误码枚举:**
180
-
181
- | 错误码 | 含义 | 使用场景 |
182
- |--------|------|----------|
183
- | `VALIDATION_ERROR` | 参数缺失或不合法 | 参数校验 |
184
- | `DB_ERROR` | 数据库操作失败 | Repository 操作异常 |
185
- | `HTTP_ERROR` | 外部 HTTP 调用失败 | axios 调用异常 |
186
- | `CONFIG_ERROR` | 配置缺失 | setting 表缺少必要配置 |
187
- | `UNKNOWN_ERROR` | 未分类异常 | catch 兜底 |
188
-
189
- **约定:**
190
- - 查询无结果不是错误,返回 `ok([])`,由下游节点判断
191
- - 参数校验使用 `return fail(...)` 而非 `throw new Error(...)`
192
- - 下游节点通过 `result.success` 判断成功/失败
193
-
194
- ## 9. Axios 错误处理
195
-
196
- 当脚本包含外部 HTTP 调用时,catch 块需区分错误类型:
197
-
198
- ```javascript
199
- } catch (err) {
200
- const err_info = getMessageFromError(err)
201
- console.error('操作失败:', err)
202
-
203
- // HTTP 响应错误(4xx / 5xx)
204
- if (err.response) return fail('HTTP_ERROR', err_info, err.response.status)
205
-
206
- // 请求已发出但无响应(网络超时等)
207
- if (err.request) return fail('HTTP_ERROR', '外部服务无响应: ' + err_info)
208
-
209
- // 非 HTTP 错误(数据库或其他)
210
- return fail('DB_ERROR', err_info)
211
- }
212
- ```
213
-
214
- - `err.response` 存在 → 服务器返回了错误状态码,`err.response.status` 为 HTTP 状态码
215
- - `err.request` 存在但无 `err.response` → 请求已发出但未收到响应
216
- - 两者都不存在 → 非 HTTP 错误,归类为 `DB_ERROR`
217
-
218
- ## 10. 注意事项
219
-
220
- - 脚本顶层支持 `await`,无需包裹 async 函数
221
- - `return` 的值会作为脚本节点的输出,传递给工作流下游节点
222
- - `console.log` 可用于调试,日志输出到工作流执行日志
223
- - 查询大量数据时 `pageSize` 设为较大值(如 `9999` 或 `99999`)
224
- - 日期格式统一使用 `dayjs().format('YYYY-MM-DD HH:mm:ss')`
1
+ # NocoBase 工作流脚本运行时 API
2
+
3
+ ## 1. 全局对象
4
+
5
+ 脚本在 NocoBase 工作流的「脚本节点」中执行,运行时注入以下全局对象:
6
+
7
+ | 对象 | 说明 |
8
+ |------|------|
9
+ | `appContext` | NocoBase 应用上下文,用于获取数据表 Repository |
10
+ | `dayjs` | 日期处理库(已全局注入,无需 require) |
11
+ | `getMessageFromError(err)` | 从错误对象提取可读信息的工具函数 |
12
+ | `input_data` | 工作流传入的参数对象(由前一个节点或触发器提供) |
13
+
14
+ ## 2. 获取 Repository
15
+
16
+ ```javascript
17
+ const repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('表名')
18
+ ```
19
+
20
+ ## 3. Repository 操作
21
+
22
+ ### 3.1 find — 查询
23
+
24
+ ```javascript
25
+ const data = await repo.find({
26
+ pageSize: 9999, // 分页大小
27
+ filter: { // 过滤条件
28
+ field_name: 'value',
29
+ status: { $in: ['A', 'B'] },
30
+ date_field: {
31
+ $dateBefore: '2025-01-01 00:00:00',
32
+ $dateAfter: '2024-01-01 00:00:00'
33
+ },
34
+ name: { $notEmpty: true }
35
+ },
36
+ appends: ['relation_field'] // 加载关联字段(可选)
37
+ })
38
+ // 返回值: Array
39
+ ```
40
+
41
+ ### 3.2 create — 创建
42
+
43
+ ```javascript
44
+ const res = await repo.create({
45
+ values: {
46
+ field1: 'value1',
47
+ field2: 123
48
+ }
49
+ })
50
+ // 返回值: Object (创建的记录)
51
+ ```
52
+
53
+ ### 3.3 update — 更新
54
+
55
+ ```javascript
56
+ const res = await repo.update({
57
+ filter: { id: 1 }, // 或 { id: { $in: [1, 2, 3] } }
58
+ values: {
59
+ status: 'new_status'
60
+ }
61
+ })
62
+ // 返回值: Array (更新的记录)
63
+ ```
64
+
65
+ ### 3.4 destroy — 删除
66
+
67
+ ```javascript
68
+ await repo.destroy({
69
+ filter: { id: 1 }
70
+ })
71
+ ```
72
+
73
+ ## 4. 常用过滤操作符
74
+
75
+ | 操作符 | 说明 | 示例 |
76
+ |--------|------|------|
77
+ | `$eq` | 等于(默认) | `{ name: 'test' }` |
78
+ | `$ne` | 不等于 | `{ status: { $ne: 'deleted' } }` |
79
+ | `$in` | 在列表中 | `{ status: { $in: ['A', 'B'] } }` |
80
+ | `$notIn` | 不在列表中 | `{ status: { $notIn: ['X'] } }` |
81
+ | `$empty` | 为空 | `{ name: { $empty: true } }` |
82
+ | `$notEmpty` | 不为空 | `{ name: { $notEmpty: true } }` |
83
+ | `$dateBefore` | 日期早于 | `{ date: { $dateBefore: '...' } }` |
84
+ | `$dateAfter` | 日期晚于 | `{ date: { $dateAfter: '...' } }` |
85
+ | `$or` | 或条件 | `{ $or: [{ a: 1 }, { b: 2 }] }` |
86
+
87
+ ## 5. 外部 HTTP 调用(axios)
88
+
89
+ ```javascript
90
+ const axios = require('axios')
91
+
92
+ const res = await axios({
93
+ method: 'get', // 或 'post', 'put', 'delete'
94
+ url: 'http://example.com/api/xxx',
95
+ params: { key: 'val' }, // GET 参数
96
+ data: { key: 'val' }, // POST 请求体
97
+ headers: {
98
+ 'Content-Type': 'application/json',
99
+ 'Authorization': 'Bearer xxx'
100
+ }
101
+ })
102
+ // 响应: res.data
103
+ ```
104
+
105
+ ## 6. 从 setting 表读取配置(用于动态获取外部服务地址)
106
+
107
+ 当外部接口地址需要从系统配置中读取时:
108
+
109
+ ```javascript
110
+ const setting_repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('setting')
111
+
112
+ const get_settings = async () => {
113
+ const res = await setting_repo.find({ pageSize: 9999 })
114
+ const settings = {}
115
+ res.forEach(s => {
116
+ settings[s.setting_name] = s.setting_value
117
+ })
118
+ return settings
119
+ }
120
+
121
+ // 使用示例
122
+ const settings = await get_settings()
123
+ if (!settings.rhea_host) return fail('CONFIG_ERROR', 'rhea_host 未在 setting 表中配置')
124
+ const url = `${settings.rhea_host}/api/process/list_process`
125
+ ```
126
+
127
+ > **注意:** 不同项目的 setting 表字段名可能不同(`setting_name`/`name`、`setting_value`/`value`),以实际表结构为准。
128
+ > 必要配置缺失时使用 `fail('CONFIG_ERROR', ...)` 返回结构化错误,不要使用 `throw`。
129
+
130
+ ## 7. 脚本结构规范
131
+
132
+ ```javascript
133
+ // 1. 引入外部依赖(按需)
134
+ const axios = require('axios')
135
+
136
+ // 2. 辅助函数
137
+ const ok = (data) => ({ success: true, error_code: null, error_message: null, http_status: null, data })
138
+ const fail = (error_code, error_message, http_status = null) => ({ success: false, error_code, error_message, http_status, data: null })
139
+
140
+ // 3. 解构输入参数
141
+ const { param1, param2 } = input_data
142
+
143
+ // 4. 获取 Repository
144
+ const xxx_repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('xxx')
145
+
146
+ // 5. try-catch 包裹所有业务逻辑(含参数校验)
147
+ try {
148
+ if (!param1) return fail('VALIDATION_ERROR', 'param1 is required')
149
+
150
+ const data = await xxx_repo.find({ ... })
151
+
152
+ return ok(data)
153
+ } catch (err) {
154
+ const err_info = getMessageFromError(err)
155
+ console.error('操作失败:', err)
156
+ return fail('DB_ERROR', err_info)
157
+ }
158
+ ```
159
+
160
+ ## 8. 标准返回格式
161
+
162
+ 所有脚本必须通过 `ok()` / `fail()` 辅助函数返回统一的信封对象:
163
+
164
+ ```javascript
165
+ const ok = (data) => ({ success: true, error_code: null, error_message: null, http_status: null, data })
166
+ const fail = (error_code, error_message, http_status = null) => ({ success: false, error_code, error_message, http_status, data: null })
167
+ ```
168
+
169
+ **信封字段:**
170
+
171
+ | 字段 | 类型 | 成功时 | 失败时 |
172
+ |------|------|--------|--------|
173
+ | `success` | `boolean` | `true` | `false` |
174
+ | `error_code` | `string \| null` | `null` | 错误码枚举值 |
175
+ | `error_message` | `string \| null` | `null` | 可读的错误描述 |
176
+ | `http_status` | `number \| null` | `null` | HTTP 状态码(仅 `HTTP_ERROR`) |
177
+ | `data` | `any` | 业务数据 | `null` |
178
+
179
+ **错误码枚举:**
180
+
181
+ | 错误码 | 含义 | 使用场景 |
182
+ |--------|------|----------|
183
+ | `VALIDATION_ERROR` | 参数缺失或不合法 | 参数校验 |
184
+ | `DB_ERROR` | 数据库操作失败 | Repository 操作异常 |
185
+ | `HTTP_ERROR` | 外部 HTTP 调用失败 | axios 调用异常 |
186
+ | `CONFIG_ERROR` | 配置缺失 | setting 表缺少必要配置 |
187
+ | `UNKNOWN_ERROR` | 未分类异常 | catch 兜底 |
188
+
189
+ **约定:**
190
+ - 查询无结果不是错误,返回 `ok([])`,由下游节点判断
191
+ - 参数校验使用 `return fail(...)` 而非 `throw new Error(...)`
192
+ - 下游节点通过 `result.success` 判断成功/失败
193
+
194
+ ## 9. Axios 错误处理
195
+
196
+ 当脚本包含外部 HTTP 调用时,catch 块需区分错误类型:
197
+
198
+ ```javascript
199
+ } catch (err) {
200
+ const err_info = getMessageFromError(err)
201
+ console.error('操作失败:', err)
202
+
203
+ // HTTP 响应错误(4xx / 5xx)
204
+ if (err.response) return fail('HTTP_ERROR', err_info, err.response.status)
205
+
206
+ // 请求已发出但无响应(网络超时等)
207
+ if (err.request) return fail('HTTP_ERROR', '外部服务无响应: ' + err_info)
208
+
209
+ // 非 HTTP 错误(数据库或其他)
210
+ return fail('DB_ERROR', err_info)
211
+ }
212
+ ```
213
+
214
+ - `err.response` 存在 → 服务器返回了错误状态码,`err.response.status` 为 HTTP 状态码
215
+ - `err.request` 存在但无 `err.response` → 请求已发出但未收到响应
216
+ - 两者都不存在 → 非 HTTP 错误,归类为 `DB_ERROR`
217
+
218
+ ## 10. 注意事项
219
+
220
+ - 脚本顶层支持 `await`,无需包裹 async 函数
221
+ - `return` 的值会作为脚本节点的输出,传递给工作流下游节点
222
+ - `console.log` 可用于调试,日志输出到工作流执行日志
223
+ - 查询大量数据时 `pageSize` 设为较大值(如 `9999` 或 `99999`)
224
+ - 日期格式统一使用 `dayjs().format('YYYY-MM-DD HH:mm:ss')`