@xtalpi/agentic-lab-skills 0.0.9 → 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.
- package/README.md +1 -1
- package/package.json +14 -14
- package/skills/lab-flow-designer/SKILL.md +612 -593
- package/skills/lab-flow-designer/embedded-template/SKILL.md +103 -88
- package/skills/lab-flow-designer/embedded-template/pools//345/205/245/345/217/243/346/261/240.md +21 -12
- package/skills/lab-flow-designer/embedded-template/pools//345/207/272/345/217/243/346/261/240.md +21 -12
- 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
- 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 -99
- package/skills/lab-flow-designer/references/agentic-lab-processer.md +122 -78
- package/skills/lab-flow-designer/references/agentic-lab-sdk.md +534 -361
- package/skills/lab-flow-designer/references/rhea-api/README.md +7 -7
- package/skills/lab-flow-designer/references/rhea-api/execute_process_batch.md +58 -58
- package/skills/lab-flow-designer/references/skill-package-layout.md +268 -204
- 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 -208
- 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 -169
- 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 -197
- package/skills/lab-flow-designer/testing/test-processer.mjs +1240 -1075
- package/skills/lab-nocobase-flow-generator/SKILL.md +164 -164
- 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
- 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
- package/skills/lab-nocobase-flow-generator/references/doc-standard.md +84 -84
- package/skills/lab-nocobase-flow-generator/references/runtime-api.md +224 -224
- 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
- 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
- package/skills/lab-orbit-component-builder/SKILL.md +353 -353
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.env.local.example +27 -27
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.eslintignore +7 -7
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.eslintrc.cjs +88 -88
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.nvmrc +1 -1
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/AgenticAppAPI.md +268 -268
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/Jenkinsfile +106 -106
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/OrbitAPI.md +453 -453
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/README.md +176 -176
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/public/index.html +12 -12
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/App.vue +151 -151
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/components/DevOpenerLauncher.vue +143 -143
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/global.d.ts +77 -77
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/main.ts +308 -308
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/mockXNBBitable.ts +119 -119
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/shims-vue.d.ts +6 -6
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/utils/devOpenerHost.ts +75 -75
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/index.html +13 -13
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/package.json +60 -60
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/api/agenticlabTickets.ts +110 -110
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/entries/bitable.ts +4 -4
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/entries/custom-page.ts +4 -4
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/index.ts +1 -1
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/styles/orbit-quasar-host.scss +19 -19
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/types/context.ts +15 -15
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/types/xnb-context.ts +70 -70
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useBitablePage.ts +189 -189
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useSuperCellDemo.ts +257 -257
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useSuperTableBitableLifecycle.ts +555 -555
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/openerInitParams.ts +158 -158
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/openerTicketIds.ts +32 -32
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/orbitHttpClient.ts +110 -110
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/request.ts +92 -92
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/views/bitable.vue +67 -67
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/views/custom-page.vue +140 -140
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/tsconfig.json +45 -45
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/vite.config.ts +170 -170
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/vite.dev.config.ts +58 -58
- package/skills/lab-orbit-component-builder/references/flow-document-human-ui.md +65 -65
- package/skills/lab-orbit-component-builder/references/orbit-vue-conventions.md +133 -133
- package/skills/lab-orbit-component-builder/references/pool-schema-to-columns.md +67 -67
- package/skills/lab-orbit-component-builder/references/vue-template-checklist.md +179 -179
- package/skills/lab-orbit-component-builder/references/xnb-context-vue-props.md +49 -49
- package/skills/lab-orbit-component-builder/references/xnbitable-vue-parity.md +32 -32
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: lab-nocobase-flow-generator
|
|
3
|
-
description: >-
|
|
4
|
-
根据脚本逻辑文档(或用户对话描述)生成可在 NocoBase 工作流「脚本节点」中运行的 JavaScript 脚本。
|
|
5
|
-
也可根据用户描述生成符合规范的脚本逻辑文档模板,供用户完善后用于脚本生成。
|
|
6
|
-
Use when user wants to generate a NocoBase workflow script, script logic document template, or provides a script logic document.
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# NocoBase 工作流脚本生成器
|
|
10
|
-
|
|
11
|
-
## 适用场景
|
|
12
|
-
|
|
13
|
-
- 用户提供**脚本逻辑文档**(Markdown,格式见 [references/doc-standard.md](references/doc-standard.md))或在对话中描述需求,需要生成可在 NocoBase 工作流「脚本节点」中直接运行的 JavaScript 脚本。
|
|
14
|
-
- 用户希望生成一份**脚本逻辑文档模板**,用于梳理和描述业务需求,完善后再用本技能生成脚本。
|
|
15
|
-
|
|
16
|
-
## 分层加载
|
|
17
|
-
|
|
18
|
-
| 需求 | 打开 |
|
|
19
|
-
|------|------|
|
|
20
|
-
| **运行时 API、Repository 操作、过滤操作符、脚本结构** | [references/runtime-api.md](references/runtime-api.md) |
|
|
21
|
-
| **逻辑文档格式要求与合规检查** | [references/doc-standard.md](references/doc-standard.md) |
|
|
22
|
-
| **数据库查询示例** | [examples/查询化学品信息.js](examples/查询化学品信息.js) |
|
|
23
|
-
| **外部服务调用 + setting 表示例** | [examples/setting表获取外部服务.js](examples/setting表获取外部服务.js) |
|
|
24
|
-
| **脚本逻辑文档模板** | [templates/脚本逻辑文档模板.md](templates/脚本逻辑文档模板.md) |
|
|
25
|
-
| **逻辑文档填写示例** | [templates/脚本逻辑文档示例.md](templates/脚本逻辑文档示例.md) |
|
|
26
|
-
|
|
27
|
-
## 会话模式判定
|
|
28
|
-
|
|
29
|
-
| 模式 | 判定条件 | 行为 |
|
|
30
|
-
|------|----------|------|
|
|
31
|
-
| **从文档生成** | 用户提供了脚本逻辑文档路径,或贴入文档内容 | 先执行「文档合规预检」,通过后生成脚本 |
|
|
32
|
-
| **对话式生成** | 用户在对话中描述需求,未提供文档 | 通过提问补全关键信息(见§3),然后生成脚本 |
|
|
33
|
-
| **修改已有脚本** | 用户提供已有脚本路径,要求修改功能 | 跳过预检,按用户要求修改 |
|
|
34
|
-
| **生成逻辑文档** | 用户要求生成文档、模板、操作模板 | 基于模板和用户描述,生成预填充的逻辑文档并写入本地文件 |
|
|
35
|
-
|
|
36
|
-
## 工作流
|
|
37
|
-
|
|
38
|
-
### 第 1 步:需求收集与确认
|
|
39
|
-
|
|
40
|
-
#### A. 从文档生成
|
|
41
|
-
|
|
42
|
-
1. 读取用户指定的逻辑文档
|
|
43
|
-
2. 按 [references/doc-standard.md](references/doc-standard.md) 的合规检查清单逐项核对
|
|
44
|
-
3. **若不通过**:列出缺失项和补充建议,等待用户修改后重新提交
|
|
45
|
-
4. **若通过**:进入第 2 步
|
|
46
|
-
|
|
47
|
-
#### B. 对话式生成
|
|
48
|
-
|
|
49
|
-
向用户确认以下关键信息(已明确的跳过):
|
|
50
|
-
|
|
51
|
-
| 主题 | 需要确认的内容 |
|
|
52
|
-
|------|----------------|
|
|
53
|
-
| 输入参数 | 有哪些参数?类型?哪些必填?校验规则? |
|
|
54
|
-
| 数据库操作 | 操作哪些表?查询/创建/更新/删除?过滤条件? |
|
|
55
|
-
| 外部接口 | 是否需要调用外部服务?地址从 setting 表读取还是固定?请求方法和参数? |
|
|
56
|
-
| 核心逻辑 | 数据处理的步骤?条件分支?循环? |
|
|
57
|
-
| 输出结果 | 成功/失败分别返回什么? |
|
|
58
|
-
|
|
59
|
-
#### C. 生成逻辑文档
|
|
60
|
-
|
|
61
|
-
1. 读取 [templates/脚本逻辑文档模板.md](templates/脚本逻辑文档模板.md) 获取文档结构
|
|
62
|
-
2. 参考 [templates/脚本逻辑文档示例.md](templates/脚本逻辑文档示例.md) 了解填写规范
|
|
63
|
-
3. 根据用户描述的业务场景,预填充模板中的各章节(能确定的内容填入,不确定的保留占位提示)
|
|
64
|
-
4. 将文档写入用户指定路径(按优先级:① 用户指定了具体路径 → 使用该路径;② 用户指定了参考文档路径 → 在该文档所在目录下生成 `【逻辑文档】{脚本名称}.md`;③ 均未指定 → 在当前工作目录下生成 `【逻辑文档】{脚本名称}.md`。**禁止**私自创建子目录)
|
|
65
|
-
5. 提示用户:完善文档内容后,可直接用本技能的「从文档生成」模式生成脚本
|
|
66
|
-
|
|
67
|
-
### 第 2 步:生成脚本
|
|
68
|
-
|
|
69
|
-
打开 [references/runtime-api.md](references/runtime-api.md),按以下结构生成脚本:
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
1. 引入外部依赖(按需,无外部调用则省略)
|
|
73
|
-
2. 定义辅助函数 ok() / fail()
|
|
74
|
-
2b. 产物版本常量(__ARTIFACT_VERSION__ / __ARTIFACT_SKILL__)+ console.info 版本打印
|
|
75
|
-
3. 解构输入参数(从 input_data)
|
|
76
|
-
4. 获取 Repository
|
|
77
|
-
5. 定义业务辅助函数(如 get_settings,仅需要时添加)
|
|
78
|
-
6. try-catch 包裹以下所有步骤:
|
|
79
|
-
a. 参数校验(return fail('VALIDATION_ERROR', ...) )
|
|
80
|
-
b. 业务逻辑
|
|
81
|
-
c. return ok(data)
|
|
82
|
-
7. catch 块:return fail(错误码, err_info)
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### 第 3 步:输出与说明
|
|
86
|
-
|
|
87
|
-
向用户输出:
|
|
88
|
-
1. 完整的脚本代码
|
|
89
|
-
2. 简要说明脚本逻辑
|
|
90
|
-
3. 需要在工作流中配置的输入参数列表
|
|
91
|
-
|
|
92
|
-
## 脚本生成规则
|
|
93
|
-
|
|
94
|
-
### 运行时环境
|
|
95
|
-
|
|
96
|
-
- 脚本运行在 NocoBase 工作流的脚本节点中,**非 Node.js 模块**
|
|
97
|
-
- 顶层支持 `await`,无需包裹 async 函数
|
|
98
|
-
- 全局可用:`appContext`、`dayjs`、`getMessageFromError`、`input_data`
|
|
99
|
-
- `return` 的值作为节点输出传递给下游
|
|
100
|
-
- 可使用 `require('axios')`、`require('node:crypto')` 等
|
|
101
|
-
|
|
102
|
-
### 数据库操作
|
|
103
|
-
|
|
104
|
-
- Repository 获取:`appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('表名')`
|
|
105
|
-
- 查询大量数据时 `pageSize` 设为 `9999` 或 `99999`
|
|
106
|
-
- 过滤操作符详见 [references/runtime-api.md](references/runtime-api.md) §4
|
|
107
|
-
|
|
108
|
-
### 外部服务调用(按需)
|
|
109
|
-
|
|
110
|
-
- 仅当逻辑文档 §3.2 声明了外部服务操作时才引入 `axios`
|
|
111
|
-
- 使用 `const axios = require('axios')`
|
|
112
|
-
- 接口地址来源有两种模式:
|
|
113
|
-
- **固定地址**:直接写入 URL
|
|
114
|
-
- **setting 表配置**:通过 `getSettings()` 获取,拼接 URL(参见 [examples/setting表获取外部服务.js](examples/setting表获取外部服务.js))
|
|
115
|
-
|
|
116
|
-
### 错误处理与返回格式
|
|
117
|
-
|
|
118
|
-
- 每个脚本顶部必须定义 `ok()` / `fail()` 辅助函数:
|
|
119
|
-
```javascript
|
|
120
|
-
const ok = (data) => ({ success: true, error_code: null, error_message: null, http_status: null, data })
|
|
121
|
-
const fail = (error_code, error_message, http_status = null) => ({ success: false, error_code, error_message, http_status, data: null })
|
|
122
|
-
```
|
|
123
|
-
- 所有业务逻辑(含参数校验)必须在 `try-catch` 内部
|
|
124
|
-
- 参数校验失败使用 `return fail('VALIDATION_ERROR', '...')`,**不使用 `throw`**
|
|
125
|
-
- 成功返回使用 `return ok(data)`
|
|
126
|
-
- 查询无结果不是错误,返回 `ok([])`
|
|
127
|
-
- 异常捕获使用 `getMessageFromError(err)` 提取信息,通过 `fail()` 返回
|
|
128
|
-
- 错误码枚举:`VALIDATION_ERROR` / `DB_ERROR` / `HTTP_ERROR` / `CONFIG_ERROR` / `UNKNOWN_ERROR`
|
|
129
|
-
- 涉及 axios 调用的脚本,catch 块中需检查 `err.response`(HTTP 错误带状态码)和 `err.request`(无响应)
|
|
130
|
-
- 详见 [references/runtime-api.md](references/runtime-api.md) §8、§9
|
|
131
|
-
|
|
132
|
-
### 代码风格
|
|
133
|
-
|
|
134
|
-
- 不写多余注释,代码自解释
|
|
135
|
-
- 变量命名使用 snake_case(与 NocoBase 字段风格一致)
|
|
136
|
-
- 优先使用 `const`,仅在需要重新赋值时使用 `let`
|
|
137
|
-
- 不添加未使用的依赖和变量
|
|
138
|
-
|
|
139
|
-
### 产物版本追踪
|
|
140
|
-
|
|
141
|
-
每个生成的脚本**必须**包含版本信息,帮助用户识别产物来源和版本。
|
|
142
|
-
|
|
143
|
-
版本块放在 `ok()`/`fail()` 定义之后、参数解构之前:
|
|
144
|
-
|
|
145
|
-
```javascript
|
|
146
|
-
// --- Artifact Version ---
|
|
147
|
-
const __ARTIFACT_VERSION__ = '<semver>'
|
|
148
|
-
const __ARTIFACT_SKILL__ = 'lab-nocobase-flow-generator'
|
|
149
|
-
console.info(`[WorkflowScript] v${__ARTIFACT_VERSION__} (skill: ${__ARTIFACT_SKILL__})`)
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
- **初次生成 / 从文档生成 / 对话式生成**:`__ARTIFACT_VERSION__` = `'1.0.0'`。
|
|
153
|
-
- **修改已有脚本**:读取现有 `__ARTIFACT_VERSION__`,按变更范围递增(patch:修复;minor:新增逻辑;major:输入输出结构变更),**不得**重置为 `1.0.0`。
|
|
154
|
-
|
|
155
|
-
## 硬性约束
|
|
156
|
-
|
|
157
|
-
- **必须**通过 `appContext.dataSourceManager` 获取 Repository,不可直接操作数据库
|
|
158
|
-
- **必须**对所有异步操作做错误处理
|
|
159
|
-
- **禁止**硬编码敏感信息(Token、密码等)到脚本中;应从 `input_data` 或 `setting` 表获取
|
|
160
|
-
- **禁止**使用 `module.exports` / `export`,脚本不是模块
|
|
161
|
-
- **禁止**使用 `process.exit()` 或其他退出进程的操作
|
|
162
|
-
- `return` 的值必须是可序列化的(对象、数组、字符串、数字)
|
|
163
|
-
- `return` 必须使用 `ok()` / `fail()` 辅助函数,确保统一信封格式
|
|
164
|
-
- **必须**在 `ok()`/`fail()` 定义之后、参数解构之前包含 `__ARTIFACT_VERSION__` 和 `__ARTIFACT_SKILL__` 常量及 `console.info` 版本打印
|
|
1
|
+
---
|
|
2
|
+
name: lab-nocobase-flow-generator
|
|
3
|
+
description: >-
|
|
4
|
+
根据脚本逻辑文档(或用户对话描述)生成可在 NocoBase 工作流「脚本节点」中运行的 JavaScript 脚本。
|
|
5
|
+
也可根据用户描述生成符合规范的脚本逻辑文档模板,供用户完善后用于脚本生成。
|
|
6
|
+
Use when user wants to generate a NocoBase workflow script, script logic document template, or provides a script logic document.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# NocoBase 工作流脚本生成器
|
|
10
|
+
|
|
11
|
+
## 适用场景
|
|
12
|
+
|
|
13
|
+
- 用户提供**脚本逻辑文档**(Markdown,格式见 [references/doc-standard.md](references/doc-standard.md))或在对话中描述需求,需要生成可在 NocoBase 工作流「脚本节点」中直接运行的 JavaScript 脚本。
|
|
14
|
+
- 用户希望生成一份**脚本逻辑文档模板**,用于梳理和描述业务需求,完善后再用本技能生成脚本。
|
|
15
|
+
|
|
16
|
+
## 分层加载
|
|
17
|
+
|
|
18
|
+
| 需求 | 打开 |
|
|
19
|
+
|------|------|
|
|
20
|
+
| **运行时 API、Repository 操作、过滤操作符、脚本结构** | [references/runtime-api.md](references/runtime-api.md) |
|
|
21
|
+
| **逻辑文档格式要求与合规检查** | [references/doc-standard.md](references/doc-standard.md) |
|
|
22
|
+
| **数据库查询示例** | [examples/查询化学品信息.js](examples/查询化学品信息.js) |
|
|
23
|
+
| **外部服务调用 + setting 表示例** | [examples/setting表获取外部服务.js](examples/setting表获取外部服务.js) |
|
|
24
|
+
| **脚本逻辑文档模板** | [templates/脚本逻辑文档模板.md](templates/脚本逻辑文档模板.md) |
|
|
25
|
+
| **逻辑文档填写示例** | [templates/脚本逻辑文档示例.md](templates/脚本逻辑文档示例.md) |
|
|
26
|
+
|
|
27
|
+
## 会话模式判定
|
|
28
|
+
|
|
29
|
+
| 模式 | 判定条件 | 行为 |
|
|
30
|
+
|------|----------|------|
|
|
31
|
+
| **从文档生成** | 用户提供了脚本逻辑文档路径,或贴入文档内容 | 先执行「文档合规预检」,通过后生成脚本 |
|
|
32
|
+
| **对话式生成** | 用户在对话中描述需求,未提供文档 | 通过提问补全关键信息(见§3),然后生成脚本 |
|
|
33
|
+
| **修改已有脚本** | 用户提供已有脚本路径,要求修改功能 | 跳过预检,按用户要求修改 |
|
|
34
|
+
| **生成逻辑文档** | 用户要求生成文档、模板、操作模板 | 基于模板和用户描述,生成预填充的逻辑文档并写入本地文件 |
|
|
35
|
+
|
|
36
|
+
## 工作流
|
|
37
|
+
|
|
38
|
+
### 第 1 步:需求收集与确认
|
|
39
|
+
|
|
40
|
+
#### A. 从文档生成
|
|
41
|
+
|
|
42
|
+
1. 读取用户指定的逻辑文档
|
|
43
|
+
2. 按 [references/doc-standard.md](references/doc-standard.md) 的合规检查清单逐项核对
|
|
44
|
+
3. **若不通过**:列出缺失项和补充建议,等待用户修改后重新提交
|
|
45
|
+
4. **若通过**:进入第 2 步
|
|
46
|
+
|
|
47
|
+
#### B. 对话式生成
|
|
48
|
+
|
|
49
|
+
向用户确认以下关键信息(已明确的跳过):
|
|
50
|
+
|
|
51
|
+
| 主题 | 需要确认的内容 |
|
|
52
|
+
|------|----------------|
|
|
53
|
+
| 输入参数 | 有哪些参数?类型?哪些必填?校验规则? |
|
|
54
|
+
| 数据库操作 | 操作哪些表?查询/创建/更新/删除?过滤条件? |
|
|
55
|
+
| 外部接口 | 是否需要调用外部服务?地址从 setting 表读取还是固定?请求方法和参数? |
|
|
56
|
+
| 核心逻辑 | 数据处理的步骤?条件分支?循环? |
|
|
57
|
+
| 输出结果 | 成功/失败分别返回什么? |
|
|
58
|
+
|
|
59
|
+
#### C. 生成逻辑文档
|
|
60
|
+
|
|
61
|
+
1. 读取 [templates/脚本逻辑文档模板.md](templates/脚本逻辑文档模板.md) 获取文档结构
|
|
62
|
+
2. 参考 [templates/脚本逻辑文档示例.md](templates/脚本逻辑文档示例.md) 了解填写规范
|
|
63
|
+
3. 根据用户描述的业务场景,预填充模板中的各章节(能确定的内容填入,不确定的保留占位提示)
|
|
64
|
+
4. 将文档写入用户指定路径(按优先级:① 用户指定了具体路径 → 使用该路径;② 用户指定了参考文档路径 → 在该文档所在目录下生成 `【逻辑文档】{脚本名称}.md`;③ 均未指定 → 在当前工作目录下生成 `【逻辑文档】{脚本名称}.md`。**禁止**私自创建子目录)
|
|
65
|
+
5. 提示用户:完善文档内容后,可直接用本技能的「从文档生成」模式生成脚本
|
|
66
|
+
|
|
67
|
+
### 第 2 步:生成脚本
|
|
68
|
+
|
|
69
|
+
打开 [references/runtime-api.md](references/runtime-api.md),按以下结构生成脚本:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
1. 引入外部依赖(按需,无外部调用则省略)
|
|
73
|
+
2. 定义辅助函数 ok() / fail()
|
|
74
|
+
2b. 产物版本常量(__ARTIFACT_VERSION__ / __ARTIFACT_SKILL__)+ console.info 版本打印
|
|
75
|
+
3. 解构输入参数(从 input_data)
|
|
76
|
+
4. 获取 Repository
|
|
77
|
+
5. 定义业务辅助函数(如 get_settings,仅需要时添加)
|
|
78
|
+
6. try-catch 包裹以下所有步骤:
|
|
79
|
+
a. 参数校验(return fail('VALIDATION_ERROR', ...) )
|
|
80
|
+
b. 业务逻辑
|
|
81
|
+
c. return ok(data)
|
|
82
|
+
7. catch 块:return fail(错误码, err_info)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 第 3 步:输出与说明
|
|
86
|
+
|
|
87
|
+
向用户输出:
|
|
88
|
+
1. 完整的脚本代码
|
|
89
|
+
2. 简要说明脚本逻辑
|
|
90
|
+
3. 需要在工作流中配置的输入参数列表
|
|
91
|
+
|
|
92
|
+
## 脚本生成规则
|
|
93
|
+
|
|
94
|
+
### 运行时环境
|
|
95
|
+
|
|
96
|
+
- 脚本运行在 NocoBase 工作流的脚本节点中,**非 Node.js 模块**
|
|
97
|
+
- 顶层支持 `await`,无需包裹 async 函数
|
|
98
|
+
- 全局可用:`appContext`、`dayjs`、`getMessageFromError`、`input_data`
|
|
99
|
+
- `return` 的值作为节点输出传递给下游
|
|
100
|
+
- 可使用 `require('axios')`、`require('node:crypto')` 等
|
|
101
|
+
|
|
102
|
+
### 数据库操作
|
|
103
|
+
|
|
104
|
+
- Repository 获取:`appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('表名')`
|
|
105
|
+
- 查询大量数据时 `pageSize` 设为 `9999` 或 `99999`
|
|
106
|
+
- 过滤操作符详见 [references/runtime-api.md](references/runtime-api.md) §4
|
|
107
|
+
|
|
108
|
+
### 外部服务调用(按需)
|
|
109
|
+
|
|
110
|
+
- 仅当逻辑文档 §3.2 声明了外部服务操作时才引入 `axios`
|
|
111
|
+
- 使用 `const axios = require('axios')`
|
|
112
|
+
- 接口地址来源有两种模式:
|
|
113
|
+
- **固定地址**:直接写入 URL
|
|
114
|
+
- **setting 表配置**:通过 `getSettings()` 获取,拼接 URL(参见 [examples/setting表获取外部服务.js](examples/setting表获取外部服务.js))
|
|
115
|
+
|
|
116
|
+
### 错误处理与返回格式
|
|
117
|
+
|
|
118
|
+
- 每个脚本顶部必须定义 `ok()` / `fail()` 辅助函数:
|
|
119
|
+
```javascript
|
|
120
|
+
const ok = (data) => ({ success: true, error_code: null, error_message: null, http_status: null, data })
|
|
121
|
+
const fail = (error_code, error_message, http_status = null) => ({ success: false, error_code, error_message, http_status, data: null })
|
|
122
|
+
```
|
|
123
|
+
- 所有业务逻辑(含参数校验)必须在 `try-catch` 内部
|
|
124
|
+
- 参数校验失败使用 `return fail('VALIDATION_ERROR', '...')`,**不使用 `throw`**
|
|
125
|
+
- 成功返回使用 `return ok(data)`
|
|
126
|
+
- 查询无结果不是错误,返回 `ok([])`
|
|
127
|
+
- 异常捕获使用 `getMessageFromError(err)` 提取信息,通过 `fail()` 返回
|
|
128
|
+
- 错误码枚举:`VALIDATION_ERROR` / `DB_ERROR` / `HTTP_ERROR` / `CONFIG_ERROR` / `UNKNOWN_ERROR`
|
|
129
|
+
- 涉及 axios 调用的脚本,catch 块中需检查 `err.response`(HTTP 错误带状态码)和 `err.request`(无响应)
|
|
130
|
+
- 详见 [references/runtime-api.md](references/runtime-api.md) §8、§9
|
|
131
|
+
|
|
132
|
+
### 代码风格
|
|
133
|
+
|
|
134
|
+
- 不写多余注释,代码自解释
|
|
135
|
+
- 变量命名使用 snake_case(与 NocoBase 字段风格一致)
|
|
136
|
+
- 优先使用 `const`,仅在需要重新赋值时使用 `let`
|
|
137
|
+
- 不添加未使用的依赖和变量
|
|
138
|
+
|
|
139
|
+
### 产物版本追踪
|
|
140
|
+
|
|
141
|
+
每个生成的脚本**必须**包含版本信息,帮助用户识别产物来源和版本。
|
|
142
|
+
|
|
143
|
+
版本块放在 `ok()`/`fail()` 定义之后、参数解构之前:
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
// --- Artifact Version ---
|
|
147
|
+
const __ARTIFACT_VERSION__ = '<semver>'
|
|
148
|
+
const __ARTIFACT_SKILL__ = 'lab-nocobase-flow-generator'
|
|
149
|
+
console.info(`[WorkflowScript] v${__ARTIFACT_VERSION__} (skill: ${__ARTIFACT_SKILL__})`)
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
- **初次生成 / 从文档生成 / 对话式生成**:`__ARTIFACT_VERSION__` = `'1.0.0'`。
|
|
153
|
+
- **修改已有脚本**:读取现有 `__ARTIFACT_VERSION__`,按变更范围递增(patch:修复;minor:新增逻辑;major:输入输出结构变更),**不得**重置为 `1.0.0`。
|
|
154
|
+
|
|
155
|
+
## 硬性约束
|
|
156
|
+
|
|
157
|
+
- **必须**通过 `appContext.dataSourceManager` 获取 Repository,不可直接操作数据库
|
|
158
|
+
- **必须**对所有异步操作做错误处理
|
|
159
|
+
- **禁止**硬编码敏感信息(Token、密码等)到脚本中;应从 `input_data` 或 `setting` 表获取
|
|
160
|
+
- **禁止**使用 `module.exports` / `export`,脚本不是模块
|
|
161
|
+
- **禁止**使用 `process.exit()` 或其他退出进程的操作
|
|
162
|
+
- `return` 的值必须是可序列化的(对象、数组、字符串、数字)
|
|
163
|
+
- `return` 必须使用 `ok()` / `fail()` 辅助函数,确保统一信封格式
|
|
164
|
+
- **必须**在 `ok()`/`fail()` 定义之后、参数解构之前包含 `__ARTIFACT_VERSION__` 和 `__ARTIFACT_SKILL__` 常量及 `console.info` 版本打印
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
const axios = require('axios')
|
|
2
|
-
|
|
3
|
-
const ok = (data) => ({ success: true, error_code: null, error_message: null, http_status: null, data })
|
|
4
|
-
const fail = (error_code, error_message, http_status = null) => ({ success: false, error_code, error_message, http_status, data: null })
|
|
5
|
-
|
|
6
|
-
// --- Artifact Version ---
|
|
7
|
-
const __ARTIFACT_VERSION__ = '1.0.0'
|
|
8
|
-
const __ARTIFACT_SKILL__ = 'lab-nocobase-flow-generator'
|
|
9
|
-
console.info(`[WorkflowScript] v${__ARTIFACT_VERSION__} (skill: ${__ARTIFACT_SKILL__})`)
|
|
10
|
-
|
|
11
|
-
const setting_repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('setting')
|
|
12
|
-
|
|
13
|
-
const get_settings = async () => {
|
|
14
|
-
const res = await setting_repo.find({ pageSize: 9999 })
|
|
15
|
-
const settings = {}
|
|
16
|
-
res.forEach(s => {
|
|
17
|
-
settings[s.setting_name] = s.setting_value
|
|
18
|
-
})
|
|
19
|
-
return settings
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const { task_id } = input_data
|
|
23
|
-
|
|
24
|
-
const task_repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('task')
|
|
25
|
-
|
|
26
|
-
try {
|
|
27
|
-
if (!task_id) return fail('VALIDATION_ERROR', 'task_id is required')
|
|
28
|
-
|
|
29
|
-
const task = await task_repo.find({
|
|
30
|
-
pageSize: 1,
|
|
31
|
-
filter: { id: task_id }
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
if (task.length === 0) {
|
|
35
|
-
return ok({ task: null, processes: [] })
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const settings = await get_settings()
|
|
39
|
-
if (!settings.rhea_host) return fail('CONFIG_ERROR', 'rhea_host 未在 setting 表中配置')
|
|
40
|
-
|
|
41
|
-
const res = await axios({
|
|
42
|
-
method: 'post',
|
|
43
|
-
url: `${settings.rhea_host}/api/process/list_process`,
|
|
44
|
-
data: {
|
|
45
|
-
filter: {
|
|
46
|
-
filter: {
|
|
47
|
-
operator: 'and',
|
|
48
|
-
conditions: [
|
|
49
|
-
{ field: 'status', operator: 'not_in', value: ['Failed', 'Completed'] }
|
|
50
|
-
]
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
per_page: 99999,
|
|
54
|
-
page: 1
|
|
55
|
-
}
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
return ok({
|
|
59
|
-
task: task[0],
|
|
60
|
-
processes: res.data.results.records
|
|
61
|
-
})
|
|
62
|
-
} catch (err) {
|
|
63
|
-
const err_info = getMessageFromError(err)
|
|
64
|
-
console.error('操作失败:', err)
|
|
65
|
-
|
|
66
|
-
if (err.response) return fail('HTTP_ERROR', err_info, err.response.status)
|
|
67
|
-
if (err.request) return fail('HTTP_ERROR', '外部服务无响应: ' + err_info)
|
|
68
|
-
|
|
69
|
-
return fail('DB_ERROR', err_info)
|
|
70
|
-
}
|
|
1
|
+
const axios = require('axios')
|
|
2
|
+
|
|
3
|
+
const ok = (data) => ({ success: true, error_code: null, error_message: null, http_status: null, data })
|
|
4
|
+
const fail = (error_code, error_message, http_status = null) => ({ success: false, error_code, error_message, http_status, data: null })
|
|
5
|
+
|
|
6
|
+
// --- Artifact Version ---
|
|
7
|
+
const __ARTIFACT_VERSION__ = '1.0.0'
|
|
8
|
+
const __ARTIFACT_SKILL__ = 'lab-nocobase-flow-generator'
|
|
9
|
+
console.info(`[WorkflowScript] v${__ARTIFACT_VERSION__} (skill: ${__ARTIFACT_SKILL__})`)
|
|
10
|
+
|
|
11
|
+
const setting_repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('setting')
|
|
12
|
+
|
|
13
|
+
const get_settings = async () => {
|
|
14
|
+
const res = await setting_repo.find({ pageSize: 9999 })
|
|
15
|
+
const settings = {}
|
|
16
|
+
res.forEach(s => {
|
|
17
|
+
settings[s.setting_name] = s.setting_value
|
|
18
|
+
})
|
|
19
|
+
return settings
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const { task_id } = input_data
|
|
23
|
+
|
|
24
|
+
const task_repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('task')
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
if (!task_id) return fail('VALIDATION_ERROR', 'task_id is required')
|
|
28
|
+
|
|
29
|
+
const task = await task_repo.find({
|
|
30
|
+
pageSize: 1,
|
|
31
|
+
filter: { id: task_id }
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
if (task.length === 0) {
|
|
35
|
+
return ok({ task: null, processes: [] })
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const settings = await get_settings()
|
|
39
|
+
if (!settings.rhea_host) return fail('CONFIG_ERROR', 'rhea_host 未在 setting 表中配置')
|
|
40
|
+
|
|
41
|
+
const res = await axios({
|
|
42
|
+
method: 'post',
|
|
43
|
+
url: `${settings.rhea_host}/api/process/list_process`,
|
|
44
|
+
data: {
|
|
45
|
+
filter: {
|
|
46
|
+
filter: {
|
|
47
|
+
operator: 'and',
|
|
48
|
+
conditions: [
|
|
49
|
+
{ field: 'status', operator: 'not_in', value: ['Failed', 'Completed'] }
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
per_page: 99999,
|
|
54
|
+
page: 1
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
return ok({
|
|
59
|
+
task: task[0],
|
|
60
|
+
processes: res.data.results.records
|
|
61
|
+
})
|
|
62
|
+
} catch (err) {
|
|
63
|
+
const err_info = getMessageFromError(err)
|
|
64
|
+
console.error('操作失败:', err)
|
|
65
|
+
|
|
66
|
+
if (err.response) return fail('HTTP_ERROR', err_info, err.response.status)
|
|
67
|
+
if (err.request) return fail('HTTP_ERROR', '外部服务无响应: ' + err_info)
|
|
68
|
+
|
|
69
|
+
return fail('DB_ERROR', err_info)
|
|
70
|
+
}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
const ok = (data) => ({ success: true, error_code: null, error_message: null, http_status: null, data })
|
|
2
|
-
const fail = (error_code, error_message, http_status = null) => ({ success: false, error_code, error_message, http_status, data: null })
|
|
3
|
-
|
|
4
|
-
// --- Artifact Version ---
|
|
5
|
-
const __ARTIFACT_VERSION__ = '1.0.0'
|
|
6
|
-
const __ARTIFACT_SKILL__ = 'lab-nocobase-flow-generator'
|
|
7
|
-
console.info(`[WorkflowScript] v${__ARTIFACT_VERSION__} (skill: ${__ARTIFACT_SKILL__})`)
|
|
8
|
-
|
|
9
|
-
const { chemical_name, cas } = input_data
|
|
10
|
-
|
|
11
|
-
const chemical_repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('chemical')
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
if (!chemical_name && !cas) return fail('VALIDATION_ERROR', 'chemical_name 或 cas 至少提供一个')
|
|
15
|
-
|
|
16
|
-
const filter = {}
|
|
17
|
-
if (chemical_name) filter.chemical_name = chemical_name
|
|
18
|
-
if (cas) filter.cas = cas
|
|
19
|
-
|
|
20
|
-
const data = await chemical_repo.find({
|
|
21
|
-
pageSize: 999,
|
|
22
|
-
filter
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
return ok(data)
|
|
26
|
-
} catch (err) {
|
|
27
|
-
const err_info = getMessageFromError(err)
|
|
28
|
-
console.error('查询chemical失败:', err)
|
|
29
|
-
return fail('DB_ERROR', err_info)
|
|
30
|
-
}
|
|
1
|
+
const ok = (data) => ({ success: true, error_code: null, error_message: null, http_status: null, data })
|
|
2
|
+
const fail = (error_code, error_message, http_status = null) => ({ success: false, error_code, error_message, http_status, data: null })
|
|
3
|
+
|
|
4
|
+
// --- Artifact Version ---
|
|
5
|
+
const __ARTIFACT_VERSION__ = '1.0.0'
|
|
6
|
+
const __ARTIFACT_SKILL__ = 'lab-nocobase-flow-generator'
|
|
7
|
+
console.info(`[WorkflowScript] v${__ARTIFACT_VERSION__} (skill: ${__ARTIFACT_SKILL__})`)
|
|
8
|
+
|
|
9
|
+
const { chemical_name, cas } = input_data
|
|
10
|
+
|
|
11
|
+
const chemical_repo = appContext.dataSourceManager.dataSources.get('main').collectionManager.getRepository('chemical')
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
if (!chemical_name && !cas) return fail('VALIDATION_ERROR', 'chemical_name 或 cas 至少提供一个')
|
|
15
|
+
|
|
16
|
+
const filter = {}
|
|
17
|
+
if (chemical_name) filter.chemical_name = chemical_name
|
|
18
|
+
if (cas) filter.cas = cas
|
|
19
|
+
|
|
20
|
+
const data = await chemical_repo.find({
|
|
21
|
+
pageSize: 999,
|
|
22
|
+
filter
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
return ok(data)
|
|
26
|
+
} catch (err) {
|
|
27
|
+
const err_info = getMessageFromError(err)
|
|
28
|
+
console.error('查询chemical失败:', err)
|
|
29
|
+
return fail('DB_ERROR', err_info)
|
|
30
|
+
}
|