@xtalpi/agentic-lab-skills 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/package.json +14 -0
- package/skills/lab-flow-designer/SKILL.md +360 -0
- package/skills/lab-flow-designer/embedded-template/SKILL.md +84 -0
- package/skills/lab-flow-designer/embedded-template/pools//345/205/245/345/217/243/346/261/240.md +12 -0
- package/skills/lab-flow-designer/embedded-template/pools//345/207/272/345/217/243/346/261/240.md +12 -0
- 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 +149 -0
- 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 +100 -0
- package/skills/lab-flow-designer/references/agentic-lab-processer.md +101 -0
- package/skills/lab-flow-designer/references/agentic-lab-sdk.md +440 -0
- package/skills/lab-flow-designer/references/rhea-api/README.md +7 -0
- package/skills/lab-flow-designer/references/rhea-api/execute_process_batch.md +58 -0
- package/skills/lab-flow-designer/references/skill-package-layout.md +199 -0
- 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 +208 -0
- package/skills/lab-orbit-component-builder/SKILL.md +305 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.env.local.example +27 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.eslintignore +7 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.eslintrc.cjs +88 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.nvmrc +1 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/AgenticAppAPI.md +268 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/Jenkinsfile +106 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/OrbitAPI.md +453 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/README.md +176 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/public/index.html +12 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/App.vue +151 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/components/DevOpenerLauncher.vue +143 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/global.d.ts +74 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/main.ts +305 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/mockXNBBitable.ts +119 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/shims-vue.d.ts +6 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/utils/devOpenerHost.ts +75 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/index.html +13 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/package.json +57 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/api/agenticlabTickets.ts +110 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/entries/bitable.ts +4 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/entries/custom-page.ts +4 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/index.ts +1 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/styles/orbit-quasar-host.scss +19 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/types/context.ts +15 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/types/xnb-context.ts +70 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useBitablePage.ts +180 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useSuperCellDemo.ts +257 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useSuperTableBitableLifecycle.ts +547 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/openerInitParams.ts +158 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/openerTicketIds.ts +32 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/orbitHttpClient.ts +110 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/request.ts +92 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/views/bitable.vue +65 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/views/custom-page.vue +140 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/tsconfig.json +48 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/vite.config.ts +165 -0
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/vite.dev.config.ts +51 -0
- package/skills/lab-orbit-component-builder/references/flow-document-human-ui.md +65 -0
- package/skills/lab-orbit-component-builder/references/pool-schema-to-columns.md +67 -0
- package/skills/lab-orbit-component-builder/references/vue-template-checklist.md +113 -0
- package/skills/lab-orbit-component-builder/references/xnb-context-vue-props.md +49 -0
- package/skills/lab-orbit-component-builder/references/xnbitable-vue-parity.md +32 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { defineConfig, loadEnv } from 'vite'
|
|
2
|
+
import vue from '@vitejs/plugin-vue'
|
|
3
|
+
import { quasar, transformAssetUrls } from '@quasar/vite-plugin'
|
|
4
|
+
import { resolve } from 'path'
|
|
5
|
+
|
|
6
|
+
export default defineConfig(({ mode }) => {
|
|
7
|
+
const env = loadEnv(mode, process.cwd(), '')
|
|
8
|
+
|
|
9
|
+
return {
|
|
10
|
+
root: resolve(__dirname),
|
|
11
|
+
plugins: [
|
|
12
|
+
vue({ template: { transformAssetUrls } }),
|
|
13
|
+
quasar({ sassVariables: 'quasar/src/css/variables.sass' })
|
|
14
|
+
],
|
|
15
|
+
resolve: {
|
|
16
|
+
alias: {
|
|
17
|
+
'@': resolve(__dirname, 'src'),
|
|
18
|
+
'Views': resolve(__dirname, 'src/views'),
|
|
19
|
+
'Libs': resolve(__dirname, 'src/libs'),
|
|
20
|
+
'Components': resolve(__dirname, 'src/components'),
|
|
21
|
+
'Api': resolve(__dirname, 'src/api'),
|
|
22
|
+
'Utils': resolve(__dirname, 'src/utils'),
|
|
23
|
+
'Assets': resolve(__dirname, 'src/assets'),
|
|
24
|
+
'Types': resolve(__dirname, 'src/types'),
|
|
25
|
+
'Plugins': resolve(__dirname, 'src/plugins')
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
css: {
|
|
29
|
+
preprocessorOptions: {
|
|
30
|
+
sass: {
|
|
31
|
+
additionalData: '@import "quasar/src/css/variables.sass"\n',
|
|
32
|
+
silenceDeprecations: ['legacy-js-api', 'import', 'global-builtin', 'slash-div']
|
|
33
|
+
},
|
|
34
|
+
scss: {
|
|
35
|
+
additionalData: '@import "quasar/src/css/variables.sass";',
|
|
36
|
+
silenceDeprecations: ['legacy-js-api', 'import', 'global-builtin', 'slash-div']
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
server: {
|
|
41
|
+
proxy: env.VITE_REQUEST_URL
|
|
42
|
+
? {
|
|
43
|
+
'/api': {
|
|
44
|
+
target: env.VITE_REQUEST_URL,
|
|
45
|
+
changeOrigin: true
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
: undefined
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
})
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# 流程文档 → Orbit Vue 人工处理页
|
|
2
|
+
|
|
3
|
+
## 识别目标章节
|
|
4
|
+
|
|
5
|
+
在流程说明 Markdown 中,每个门控下通常存在:
|
|
6
|
+
|
|
7
|
+
- **`#### 人工处理`**(或文档约定的同级标题)
|
|
8
|
+
- **`##### 界面形态与数据绑定`**:条目化描述界面类型与按钮
|
|
9
|
+
|
|
10
|
+
示例(节选,语义对齐即可):
|
|
11
|
+
|
|
12
|
+
1. **界面类型**:超级表格
|
|
13
|
+
2. **刷新按钮**:重新获取所有数据
|
|
14
|
+
3. **检查按钮**:检查所有规则是否验证通过
|
|
15
|
+
4. **提交按钮**:检查所有数据通过后调用 AgenticLab App 接口提交
|
|
16
|
+
|
|
17
|
+
当 **界面类型** 为「超级表格」时,生成物应对齐模板中的 **`bitable.vue` + `useBitablePage` + `useSuperTableBitableLifecycle`** 能力(刷新 / 检查 / 提交);若为「自定义多区页面」等,则以 **`custom-page.vue`** 为骨架扩展,**不强行**挂载 XNBBitable。
|
|
18
|
+
|
|
19
|
+
## 样式主题与按钮(默认)
|
|
20
|
+
|
|
21
|
+
除非流程文档或用户在任务中**明确描述**了不同 UI,否则:
|
|
22
|
+
|
|
23
|
+
| 参照 | 用途 |
|
|
24
|
+
|------|------|
|
|
25
|
+
| `examples/xnb-component-template/src/views/bitable.vue` | 页面结构、工具栏、`q-btn` 属性分工 |
|
|
26
|
+
| `examples/xnb-component-template/src/styles/orbit-quasar-host.scss` | Cell 内 Quasar 主题(主色、`q-btn` 全局);**新增/调整主题只改此文件** |
|
|
27
|
+
|
|
28
|
+
| 文档按钮语义 | `q-btn` 约定 |
|
|
29
|
+
|--------------|--------------|
|
|
30
|
+
| 刷新、检查等(拉数、本地校验,不改持久化数据) | `dense outline`,**不用** `color="primary"` |
|
|
31
|
+
| 提交等(校验通过后写回 / `execution/complete`) | `color="primary" dense unelevated`,**不用** `outline` |
|
|
32
|
+
|
|
33
|
+
详见主技能 **SKILL.md** 规则 2、规则 6。
|
|
34
|
+
|
|
35
|
+
## 人工处理配置项表
|
|
36
|
+
|
|
37
|
+
流程文档常见表格列:**配置项 | 类别 | 默认值/占位 | 说明**。
|
|
38
|
+
|
|
39
|
+
| 文档配置项 | 落地建议 |
|
|
40
|
+
|------------|----------|
|
|
41
|
+
| **AppBaseUrl** | 本地/CI:`VITE_AGENTICLAB_API_URL`(见模板 `.env.local.example`);Orbit 内 HTTP 走 `orbitRequestJson` / `window.xnb.http.client.request`,基址以宿主代理为准 |
|
|
42
|
+
| **数据查询上限** | 列表请求 `limit` 默认值(如 `9000`);与 **flow-package-from-design** 列表类约定一致时注意网关上限 |
|
|
43
|
+
| **语言类型** | 影响 UI 文案语言(中/英);未给定时与团队默认一致 |
|
|
44
|
+
|
|
45
|
+
门控级 **脚本配置项**(如 StationBaseURL)属于 **后置/工站脚本**,不默认写进 Vue 页;若文档明确要求页面内调用,再在 `AgenticAppAPI` 之外单独增加 `src/api/*` 与环境变量。
|
|
46
|
+
|
|
47
|
+
## 一门控一页:多组件命名
|
|
48
|
+
|
|
49
|
+
- **一个门控**对应文档中 **一块**「人工处理」描述 → **一个独立入口组件**(`vite.config.ts` 中 `COMPONENT_MAP` 的一个 key);视图文件须为 **`src/views/<业务语义>.vue`**,**不要**把模板里的 `bitable.vue` / `custom-page.vue` 复制到用户目录当交付物(模板内文件仅作阅读参考,见 **`references/vue-template-checklist.md`**)。
|
|
50
|
+
- **多个门控**各自有人工处理 → **同一工程**下多个 `src/views/<id>.vue`,**禁止**把无关联门控硬塞进同一视图(除非文档明确要求合并)。
|
|
51
|
+
|
|
52
|
+
### 命名规则(须有业务意义)
|
|
53
|
+
|
|
54
|
+
| 来源 | 建议 |
|
|
55
|
+
|------|------|
|
|
56
|
+
| 门控 YAML `name` / `valve_id` | `views` 文件名:`process-execute-manual`;`distBaseName`:`FragmentProcessExecuteManual`(示例) |
|
|
57
|
+
| 流程名称 + 门控简称 | 避免仅用 `bitable`、`gate1` |
|
|
58
|
+
| `registrarName` | 与宿主/Book 约定一致;与 `distBaseName` 可同可异,见模板 README「命名约定」 |
|
|
59
|
+
|
|
60
|
+
生成后应在业务 README 或 Skill 输出中写明:**文档门控标题 ↔ 组件 id ↔ `registrarName` ↔ UMD 文件名**。
|
|
61
|
+
|
|
62
|
+
## 与数据池的衔接
|
|
63
|
+
|
|
64
|
+
- 人工处理页的 **主表格数据源** 通常对应门控 **primary 输入池** 的只读列表(或工单 `ticket/list` 映射后的行)。
|
|
65
|
+
- 列定义优先来自 **`pools/<池名>.md` 的 Schema 表**(见 **`pool-schema-to-columns.md`**),并与接口返回字段做映射。
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 池 Schema → XNBBitable 列(默认展示策略)
|
|
2
|
+
|
|
3
|
+
## 数据来源
|
|
4
|
+
|
|
5
|
+
流程包或业务文档中的 **`pools/<池名>.md`** 常见「Schema」表:**字段 | 字段标题 | 字段描述 | 字段类型 | …**。
|
|
6
|
+
|
|
7
|
+
人工处理超级表格的 **默认列集**应来自门控 **primary 输入池** 的该表(或流程正文中等价表格)。
|
|
8
|
+
|
|
9
|
+
## 字段类型映射(仅表格友好子集)
|
|
10
|
+
|
|
11
|
+
XNBBitable / Luckysheet 列通过 **`data_columns`** 描述(模板见 `useSuperTableBitableLifecycle.ts` 中 `dv` / `ct`)。
|
|
12
|
+
|
|
13
|
+
| 池 Schema「字段类型」 | 是否默认生成列 | `dv` / `ct` 建议 |
|
|
14
|
+
|----------------------|----------------|------------------|
|
|
15
|
+
| **text** | 是 | `dv: { type: 'text_length' }`,只读列可加 `readonly: true` |
|
|
16
|
+
| **int** / **number** | 是 | `dv: { type: 'number' }`,`ct: { fa: '0', t: 'n' }`(与模板数量列一致) |
|
|
17
|
+
| **json** | **默认否** | 数组/对象在单格展示与校验复杂;若业务必须展示,可改为 **只读字符串列**(`JSON.stringify` 摘要)或拆多列(需文档明确要求) |
|
|
18
|
+
| **bool** | 视产品支持而定 | 若不确定渲染形态,可映射为 **text**(`true`/`false`)或单独与产品确认 |
|
|
19
|
+
|
|
20
|
+
**原则**:首版交付以 **string / number** 类列为主,与「仅展示 XNBBitable 支持的类型」一致;**json** 型池字段不默认展开为多列,避免 `field` 与 `items` 展平规则不一致导致空格。
|
|
21
|
+
|
|
22
|
+
## 列头与数据键
|
|
23
|
+
|
|
24
|
+
- **`data_columns[].field`**:展示列头,建议使用 Schema 的 **「字段标题」**(或中英一致时用语义化标题)。
|
|
25
|
+
- **`items` 每行 `fields` 的键**:必须与 **`field`** 一致(见 **OrbitAPI.md** §8.4.1 / **orbit-write-js-cell** 反模式表)。
|
|
26
|
+
- 池内「字段」常为 **snake_case**(如 `source_barcode`),若接口返回 snake_case,列 `field` 可直接用该键或统一映射层;**同一表内保持一种约定**。
|
|
27
|
+
|
|
28
|
+
## 接口映射
|
|
29
|
+
|
|
30
|
+
当行数据来自 **AgenticLab `ticket/list`** 的 `detail` 对象时:
|
|
31
|
+
|
|
32
|
+
- 在 composable 中编写 **`mapTicketToRow`**,把 `detail` 中需要的键映射到上表 **`field`** 键。
|
|
33
|
+
- 未在 Schema 出现的字段默认 **不展示**(除非文档列在「界面额外列」)。
|
|
34
|
+
|
|
35
|
+
## 可编辑字段策略(readonly vs 可人工录入)
|
|
36
|
+
|
|
37
|
+
池 Schema 或流程文档中标记为「可人工录入」(或 `editable: true` / `manual_input: true` 等等效标注)的字段:
|
|
38
|
+
|
|
39
|
+
- 在 `data_columns` 中设 **`readonly: false`**,用户可在表格中直接编辑
|
|
40
|
+
- 在提交(`submitRows`)时,**仅**这些字段的修改值会被映射回 ticket `detail` 并提交
|
|
41
|
+
|
|
42
|
+
**未标记为可人工录入**的字段默认 **`readonly: true`**,用户无法在表格中编辑。
|
|
43
|
+
|
|
44
|
+
### 与提交参数的对齐
|
|
45
|
+
|
|
46
|
+
可编辑字段必须与 ticket schema 中的可写路径一一对应(如 `detail.process_params['@requested_amount_mg']`)。
|
|
47
|
+
|
|
48
|
+
`mergeEditedRowIntoAgenticTicket`(或等效合并函数)中,应**只回写可编辑字段**对应的 detail 路径,不可把 readonly 的展示列值回写覆盖原始数据。
|
|
49
|
+
|
|
50
|
+
### 自定义渲染与编辑
|
|
51
|
+
|
|
52
|
+
若池字段类型为 **json** 但用户明确要求展示:
|
|
53
|
+
- 渲染前:将 JSON 拆解为 string 摘要(如 `JSON.stringify` 或提取特定子字段)
|
|
54
|
+
- 提交时:将编辑后的 string 重新组装为原始 JSON 结构再写回 detail
|
|
55
|
+
|
|
56
|
+
此类自定义逻辑仅在用户**明确描述**时实现,默认不展开 json 字段。
|
|
57
|
+
|
|
58
|
+
## 校验(检查按钮)
|
|
59
|
+
|
|
60
|
+
校验规则**默认**从池 Schema / 流程文档的字段约束生成,除非用户明确描述更多自定义校验规则:
|
|
61
|
+
|
|
62
|
+
- **number** 列:按文档约束校验(范围、必填等);模板示例为「数量为正」,业务应替换为实际规则。
|
|
63
|
+
- **text** 列:非空、格式(条码、位置路径)等按文档实现。
|
|
64
|
+
- **必填**:Schema 中标记 `required` 或「必填」的字段,校验时检查非空/非零。
|
|
65
|
+
- **互斥/依赖**:文档描述了字段间约束关系时,在 `checkRows` 中实现对应逻辑。
|
|
66
|
+
|
|
67
|
+
`checkRows` 在 `submitRows` 之前**必须**执行,校验不通过时阻止提交。
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# xnb-component-template 脚手架清单(生成/增量必查)
|
|
2
|
+
|
|
3
|
+
路径前缀:`examples/xnb-component-template/`(相对本 skill 根目录)。
|
|
4
|
+
|
|
5
|
+
## 首次生成 vs 增量修改(首要判断)
|
|
6
|
+
|
|
7
|
+
**执行任何操作前,先检查用户目标目录是否已有工程。**
|
|
8
|
+
|
|
9
|
+
| 标志文件 | 说明 |
|
|
10
|
+
|----------|------|
|
|
11
|
+
| `package.json`(含 `vite` devDependency) | 构建系统 |
|
|
12
|
+
| `vite.config.ts`(含 `COMPONENT_MAP`) | 多入口配置 |
|
|
13
|
+
| `src/use/useBitablePage.ts` | 核心 composable |
|
|
14
|
+
|
|
15
|
+
- **全部不存在** → **首次生成**:复制完整脚手架 + 生成业务组件(见下文「首次生成清单」)
|
|
16
|
+
- **已存在** → **增量修改**:仅修改/新增业务文件,**不触碰**基础设施(见下文「增量修改边界」)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 首次生成清单
|
|
21
|
+
|
|
22
|
+
### 必须复制的脚手架文件
|
|
23
|
+
|
|
24
|
+
| 类别 | 文件 |
|
|
25
|
+
|------|------|
|
|
26
|
+
| 构建配置 | `package.json`、`vite.config.ts`、`vite.dev.config.ts`、`tsconfig.json`、`index.html`、`.nvmrc` |
|
|
27
|
+
| 代码规范 | `.eslintrc.cjs`、`.eslintignore`、`.gitignore` |
|
|
28
|
+
| 组件配置 | `vite.config.ts`(复制后清空 `COMPONENT_MAP` 示例条目,只写业务条目) |
|
|
29
|
+
| 环境配置 | `.env.local.example` |
|
|
30
|
+
| CI | `Jenkinsfile` |
|
|
31
|
+
| 类型 | `src/types/xnb-context.ts` |
|
|
32
|
+
| 工具函数 | `src/utils/openerInitParams.ts`、`src/utils/openerTicketIds.ts`、`src/utils/orbitHttpClient.ts` |
|
|
33
|
+
| API | `src/api/agenticlabTickets.ts` |
|
|
34
|
+
| Composable | `src/use/useBitablePage.ts`、`src/use/useSuperTableBitableLifecycle.ts` |
|
|
35
|
+
| Dev 调试 | `dev/` 整个目录 |
|
|
36
|
+
| 文档 | `OrbitAPI.md`、`AgenticAppAPI.md`、`README.md` |
|
|
37
|
+
|
|
38
|
+
### 禁止复制的示例文件
|
|
39
|
+
|
|
40
|
+
| 文件 | 原因 |
|
|
41
|
+
|------|------|
|
|
42
|
+
| `src/views/bitable.vue` | 示例视图,仅供阅读参考 |
|
|
43
|
+
| `src/views/custom-page.vue` | 示例视图,仅供阅读参考 |
|
|
44
|
+
| `src/entries/bitable.ts` | 示例入口,随业务视图新建 |
|
|
45
|
+
| `src/entries/custom-page.ts` | 示例入口,随业务视图新建 |
|
|
46
|
+
| `src/use/useSuperCellDemo.ts` | 演示用 composable,业务不需要 |
|
|
47
|
+
| `src/index.ts` | 默认导出占位,业务工程按需重写 |
|
|
48
|
+
|
|
49
|
+
### 首次生成后必须做的适配
|
|
50
|
+
|
|
51
|
+
1. **`vite.config.ts`**:清空 `COMPONENT_MAP` 中的 `bitable` / `custom-page` 示例条目,替换为业务组件条目(`distBaseName`、`registrarName`)
|
|
52
|
+
2. **`package.json`**:删除 `dev:bitable` / `build:bitable` / `dev:custom-page` / `build:custom-page` 脚本,替换为业务脚本;`main` 指向业务默认产物
|
|
53
|
+
3. **`src/use/useSuperTableBitableLifecycle.ts`**:替换 `DEMO_*` 常量、`DemoListRow` 类型、映射/校验函数为业务逻辑
|
|
54
|
+
4. **`.env.local`**:从 `.env.local.example` 复制,填入文档中的 `AppBaseUrl` 等
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 增量修改边界
|
|
59
|
+
|
|
60
|
+
### 禁止修改(除非用户明确要求)
|
|
61
|
+
|
|
62
|
+
- `package.json` 中的 `dependencies` / `devDependencies`
|
|
63
|
+
- `vite.config.ts`(除 `COMPONENT_MAP` 外)、`vite.dev.config.ts`、`tsconfig.json`
|
|
64
|
+
- `dev/` 目录
|
|
65
|
+
- `src/utils/orbitHttpClient.ts`
|
|
66
|
+
|
|
67
|
+
### 允许的操作
|
|
68
|
+
|
|
69
|
+
| 操作 | 涉及文件 |
|
|
70
|
+
|------|----------|
|
|
71
|
+
| 新增门控入口 | 新建 `src/views/<id>.vue` + `src/entries/<id>.ts`,在 `vite.config.ts` 的 `COMPONENT_MAP` 增加条目,在 `package.json scripts` 增加 `dev:<id>` / `build:<id>` |
|
|
72
|
+
| 修改已有视图 | 编辑 `src/views/<id>.vue` |
|
|
73
|
+
| 修改 composable | 编辑 `src/use/useSuperTableBitableLifecycle.ts`(列、校验、映射等) |
|
|
74
|
+
| 修改 API | 编辑 `src/api/agenticlabTickets.ts` |
|
|
75
|
+
| 修改类型 | 编辑 `src/types/xnb-context.ts` |
|
|
76
|
+
| 修改环境配置 | 编辑 `.env.local`(新增/修改环境变量) |
|
|
77
|
+
|
|
78
|
+
### 增量修改前必读
|
|
79
|
+
|
|
80
|
+
1. `vite.config.ts` 中的 `COMPONENT_MAP` → 已有哪些组件入口
|
|
81
|
+
2. `src/use/useSuperTableBitableLifecycle.ts` → 当前列定义、校验、映射逻辑
|
|
82
|
+
3. 目标 `src/views/<id>.vue` → 当前 UI 结构
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 新增一个入口组件(首次/增量均适用)
|
|
87
|
+
|
|
88
|
+
| 步骤 | 文件 / 动作 |
|
|
89
|
+
|------|-------------|
|
|
90
|
+
| 1 | 新建 `src/views/<组件id>.vue`(`setup` + props) |
|
|
91
|
+
| 2 | 新建 `src/entries/<组件id>.ts`:`export { default as View } from '../views/<组件id>.vue'` 与 `packageData` |
|
|
92
|
+
| 3 | 在 `vite.config.ts` 的 `COMPONENT_MAP` 增加一项:`distBaseName`、`registrarName`、`label`(可选) |
|
|
93
|
+
| 4 | 在 `package.json` → `scripts` 增加 `dev:<组件id>`、`build:<组件id>` |
|
|
94
|
+
| 5 | 若作为 npm 包默认导出,更新 `package.json` 的 `main` 指向新产物 |
|
|
95
|
+
|
|
96
|
+
## 超级表格相关文件(按需复制或 import)
|
|
97
|
+
|
|
98
|
+
- `src/types/xnb-context.ts`:扩展 `XnbSuperCellContext` 时在此集中声明。
|
|
99
|
+
- `src/use/useSuperTableBitableLifecycle.ts`:列定义、`bootstrap` / `refreshTable` / `checkRows` / `submitRows`。
|
|
100
|
+
- `src/use/useBitablePage.ts`:opener 初始化、刷新确认框、挂载 watcher。
|
|
101
|
+
- `src/utils/openerInitParams.ts`、`openerTicketIds.ts`、`orbitHttpClient.ts`。
|
|
102
|
+
- `src/api/agenticlabTickets.ts`。
|
|
103
|
+
- 本地调试:`dev/src/mockXNBBitable.ts`、`App.vue` 里注入假 `xnbContext`。
|
|
104
|
+
|
|
105
|
+
## 文档链路
|
|
106
|
+
|
|
107
|
+
- **运行时 HTTP / XNBBitable**:`OrbitAPI.md`(模板内为 orbit-write-js-cell API 的拷贝)。
|
|
108
|
+
- **AgenticLab**:`AgenticAppAPI.md`。
|
|
109
|
+
- **环境变量**:`.env.local.example`(开发,含 `VITE_DEV_TOKEN`、`VITE_AGENTICLAB_API_URL`)。
|
|
110
|
+
|
|
111
|
+
## 静态加载契约(宿主)
|
|
112
|
+
|
|
113
|
+
README 中 JsCode 返回 `component.view / filename / source / params` 的占位;生成业务组件后须同步 **`registrarName` 与 `distBaseName`**(在 `vite.config.ts` 的 `COMPONENT_MAP` 中定义)到业务文档。
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# xnbContext:JsCode 注入 vs Vue props
|
|
2
|
+
|
|
3
|
+
## 差异摘要
|
|
4
|
+
|
|
5
|
+
| 维度 | JsCode(`orbit-write-js-cell`) | Vue 组件(本技能 / 模板) |
|
|
6
|
+
|------|----------------------------------|---------------------------|
|
|
7
|
+
| 上下文来源 | 运行时注入,源码中可直接写 `xnbContext.cellUid` | **`defineProps<{ xnbContext: ... }>()`**,通过宿主挂载组件时传入 |
|
|
8
|
+
| 典型入口 | 文件顶部 `const cellUid = xnbContext.cellUid` | `useXxx(() => props.xnbContext)` |
|
|
9
|
+
| UI | `return \`...\`` HTML 字符串 | `<template>` + Quasar |
|
|
10
|
+
|
|
11
|
+
## 与 `xnb-jscode` `useContext.ts` 的对照
|
|
12
|
+
|
|
13
|
+
宿主侧 `XNBContext` 在构造时会把常用能力挂到 **`this.context`**(JsCode 里合并进 `xnbContext`)。Vue 侧应在 **`XnbSuperCellContext`**(模板 `src/types/xnb-context.ts`)上**按需扩展** props 类型,并在文档中注明「以宿主实际注入为准」。
|
|
14
|
+
|
|
15
|
+
以下为 **常见** `context` 成员与 Vue 中的用法(名称以宿主为准):
|
|
16
|
+
|
|
17
|
+
| `useContext.ts` / 宿主 `context` | 用途 | Vue 中建议 |
|
|
18
|
+
|----------------------------------|------|------------|
|
|
19
|
+
| `bookPath` | Book 路径 | `props.xnbContext.bookPath`,传入 `XNBBitable` 与 HTTP |
|
|
20
|
+
| `cellUid` | 当前 Cell | `props.xnbContext.cellUid` |
|
|
21
|
+
| `notifySuccess` / `notifyError` | 轻提示 | 在 composable 中 `ctx.notifyError?.(...)` |
|
|
22
|
+
| `loadingShow` / `loadingHide` | 全局 loading | 异步请求前后调用 |
|
|
23
|
+
| `getUserData` / `updateUserData` / `mergeUserData` | Cell 用户数据 | 读配置、写回前合并(若宿主注入) |
|
|
24
|
+
| `getInstanceValueById` / `setInstanceValueById` | Materialize 表单控件 | **Vue SFC 优先用 `v-model`/Quasar 表单**,仅在嵌入旧 HTML 片段时需要 |
|
|
25
|
+
| `saveBitableConfig` / `getBitableConfig` / `clearBitableConfig` | 子表配置持久化 | 按需调用;注意异步与 book 名解析 |
|
|
26
|
+
| `getXnbParams` / `updateXnbParams` | 运行参数 | 与提交 payload 合并(见 `afterRun` 逻辑对照) |
|
|
27
|
+
| `XNBBitable`(类) | `new XNBBitable({ bookPath, cellUid })` | `props.xnbContext.XNBBitable`,存在时再创建 choreo 实例 |
|
|
28
|
+
|
|
29
|
+
## 代码模式(模板已有;以下为**写法参考**,示例文件名 `bitable.vue` 不应用于用户业务复制粘贴)
|
|
30
|
+
|
|
31
|
+
```vue
|
|
32
|
+
<script lang="ts" setup>
|
|
33
|
+
import { useBitablePage } from '@/use/useBitablePage'
|
|
34
|
+
import type { XnbSuperCellContext } from '@/types/xnb-context'
|
|
35
|
+
|
|
36
|
+
const props = defineProps<{
|
|
37
|
+
xnbContext: XnbSuperCellContext
|
|
38
|
+
}>()
|
|
39
|
+
|
|
40
|
+
const { onRefresh, onCheck, onSubmit, ... } = useBitablePage(() => props.xnbContext)
|
|
41
|
+
</script>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**注意**:`watch(() => [getContext().bookPath, getContext().cellUid, ...])` 时,`getContext` 应始终读取 **最新** `props.xnbContext`,避免闭包捕获旧引用。
|
|
45
|
+
|
|
46
|
+
## 禁止
|
|
47
|
+
|
|
48
|
+
- 在 Vue SFC 中假设存在未注入的全局 **`xnbContext`** 变量(除非宿主明确提供且类型已声明)。
|
|
49
|
+
- 使用已废弃的 `window.xnb.getUserData` 等(与 **OrbitAPI.md** §1.3 反模式表一致)。
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Vue 中实现 XNBBitable:与 JsCode 语义对齐
|
|
2
|
+
|
|
3
|
+
## 权威参考顺序
|
|
4
|
+
|
|
5
|
+
1. **本仓库模板** [`examples/xnb-component-template/OrbitAPI.md`](../examples/xnb-component-template/OrbitAPI.md)(§7–§9、反模式 §1.3)——与线上 JsCode 文档同源摘要。
|
|
6
|
+
2. **`orbit-write-js-cell`** 技能中的 **`references/API.md`**(若助手环境已安装该 skill):列与 `items`、`updateSubBitable`、`§8.5.2` 全量 list 为**唯一细粒度权威**。
|
|
7
|
+
3. **示例脚本** `orbit-write-js-cell/examples/bitable-list-lifecycle.js`:可复制其**状态机顺序**,改写成 `async function` + Vue `ref`,而非复制 `return` HTML。
|
|
8
|
+
|
|
9
|
+
## Vue 风格改写要点
|
|
10
|
+
|
|
11
|
+
| JsCode / 生命周期脚本 | Vue 等价物 |
|
|
12
|
+
|----------------------|------------|
|
|
13
|
+
| 顶部解构 `xnbContext` | `props.xnbContext` + `() => props.xnbContext` 传入 composable |
|
|
14
|
+
| `const choreo = new xnbContext.XNBBitable({ bookPath, cellUid })` | `computed`/`ref` 保存实例;`watch` bookPath/cellUid 变化时重新 bootstrap |
|
|
15
|
+
| `notifyError` / `loadingShow` | 同成员,从 `getContext()` 读取 |
|
|
16
|
+
| 按钮 `onclick="window.xnb.cell.run(...)"` | `<q-btn @click="onRefresh">` 调用 composable 方法 |
|
|
17
|
+
| `return \`...\`` 工具栏 | `<template>` 内 Quasar 布局 |
|
|
18
|
+
|
|
19
|
+
## 必须遵守的 XNBBitable 规则(摘要)
|
|
20
|
+
|
|
21
|
+
- **主列表唯一载体**:子表数据走 **`getSubBitable` / `getAllSubBitable` + `items` + `updateSubBitable`**;**不要**再用 `createCell('Sheet')`+`celldata` 做同一批数据的主表(**§7.0**)。
|
|
22
|
+
- **全量 list 刷新**:接口返回当前全集时,每次刷新 **`bitable.items = mappedRows`** 再 `updateSubBitable`,**不要**仅依赖「有行则按 id 合并」的增量逻辑(**§8.5.2**)。
|
|
23
|
+
- **列与行键一致**:`data_columns[].field` 必须与每行 `fields` 的键一致,否则「有表头无格内文字」。
|
|
24
|
+
- **重建列**:仅在首屏或 `dataColumnsMismatch` 时 `addColumns`;避免每次刷新都 `createSubBitable` 清空重建(**§8.5.1**)。
|
|
25
|
+
|
|
26
|
+
## 模板内落地文件
|
|
27
|
+
|
|
28
|
+
- **`src/use/useSuperTableBitableLifecycle.ts`**:`bootstrap`、`refreshTable`(`replaceAll`)、`checkRows`、`submitRows`。
|
|
29
|
+
- **`src/use/useBitablePage.ts`**:与 opener、`watch` 联动。
|
|
30
|
+
- **`src/types/xnb-context.ts`**:`XNBBitableChoreo` 方法签名对齐用。
|
|
31
|
+
|
|
32
|
+
生成新业务组件时,优先 **扩展/参数化** 上述 composable(如注入列定义、mapRow、校验规则),避免从零重写子表状态机。
|