@stalfh233/omc-cli 0.5.6 → 0.5.7
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/LICENSE +21 -21
- package/README.md +359 -359
- package/coverage/m1-coverage-manifest-v1.json +1414 -1414
- package/dist/approval-flow.js +0 -0
- package/dist/args.js +0 -0
- package/dist/artifacts.js +0 -0
- package/dist/batch-call.js +0 -0
- package/dist/bench/call-face-eval.js +0 -0
- package/dist/bench/context-attribution.js +0 -0
- package/dist/bench/discovery-cost-eval.js +0 -0
- package/dist/bench/driver.js +0 -0
- package/dist/bench/evals.js +0 -0
- package/dist/bench/instrument.js +0 -0
- package/dist/bench/intent-face-eval.js +40 -40
- package/dist/bench/run.js +0 -0
- package/dist/bench/scenario.js +0 -0
- package/dist/bench/types.js +0 -0
- package/dist/bi-wire.js +0 -0
- package/dist/bizservice-config.js +0 -0
- package/dist/call.js +0 -0
- package/dist/capability-absences.js +0 -0
- package/dist/capability-overview.js +0 -0
- package/dist/capability-shape.js +0 -0
- package/dist/cli-contract.js +0 -0
- package/dist/cli-output.js +0 -0
- package/dist/cli.js +31 -1
- package/dist/closest-match.js +0 -0
- package/dist/code-rules.js +0 -0
- package/dist/command-transport.js +0 -0
- package/dist/compound-writes.js +0 -0
- package/dist/compute.js +0 -0
- package/dist/config-store.js +0 -0
- package/dist/context.js +0 -0
- package/dist/contract-consistency.js +0 -0
- package/dist/contract-resources.js +0 -0
- package/dist/coverage-consistency.js +0 -0
- package/dist/coverage-registry.js +0 -0
- package/dist/coverage.js +0 -0
- package/dist/data-list-filter.js +0 -0
- package/dist/describe-cache.js +0 -0
- package/dist/discovery.js +0 -0
- package/dist/endpoints.js +0 -0
- package/dist/environment-policy.js +0 -0
- package/dist/execution-metadata.js +0 -0
- package/dist/field-add.js +238 -0
- package/dist/field-change.js +0 -0
- package/dist/field-families.js +0 -0
- package/dist/form-default.js +0 -0
- package/dist/form-layout.js +0 -0
- package/dist/form-support.js +0 -0
- package/dist/formula-lint.js +0 -0
- package/dist/goal-routes.js +28 -16
- package/dist/governed-execution.js +0 -0
- package/dist/graph.js +50 -33
- package/dist/human-summary.js +0 -0
- package/dist/identity.js +0 -0
- package/dist/intent/baseline.js +0 -0
- package/dist/intent/capabilities/bizservice.js +0 -0
- package/dist/intent/capabilities/businessrule.js +0 -0
- package/dist/intent/capabilities/datarule.js +0 -0
- package/dist/intent/capabilities/field.js +0 -0
- package/dist/intent/capabilities/form.js +0 -0
- package/dist/intent/capabilities/index.js +0 -0
- package/dist/intent/capabilities/listview.js +0 -0
- package/dist/intent/capabilities/model.js +0 -0
- package/dist/intent/capabilities/onlinejs.js +0 -0
- package/dist/intent/capabilities/report.js +0 -0
- package/dist/intent/capabilities/workflow.js +0 -0
- package/dist/intent/capability.js +0 -0
- package/dist/intent/cli.js +0 -0
- package/dist/intent/compare.js +0 -0
- package/dist/intent/compiler.js +0 -0
- package/dist/intent/dsl.js +0 -0
- package/dist/intent/plan-apply.js +0 -0
- package/dist/intent/plan-file.js +0 -0
- package/dist/intent/readback.js +0 -0
- package/dist/intent/schema.js +0 -0
- package/dist/intent/validation.js +0 -0
- package/dist/intent/yaml.js +0 -0
- package/dist/journal.js +0 -0
- package/dist/json-column.js +0 -0
- package/dist/lanes/app-contract.js +0 -0
- package/dist/lanes/app-coverage.js +0 -0
- package/dist/lanes/app.js +0 -0
- package/dist/lanes/apply-changes.js +0 -0
- package/dist/lanes/b2-registration-contract.js +0 -0
- package/dist/lanes/b2-registration-coverage.js +0 -0
- package/dist/lanes/b2-registration.js +0 -0
- package/dist/lanes/businessrule-contract.js +0 -0
- package/dist/lanes/businessrule-coverage.js +0 -0
- package/dist/lanes/businessrule.js +11 -3
- package/dist/lanes/contract-support.js +0 -0
- package/dist/lanes/coverage-declaration.js +0 -0
- package/dist/lanes/custom-page.js +0 -0
- package/dist/lanes/datarule-contract.js +0 -0
- package/dist/lanes/datarule-coverage.js +0 -0
- package/dist/lanes/datarule-protocol.js +0 -0
- package/dist/lanes/datarule.js +6 -0
- package/dist/lanes/dictionary-contract.js +0 -0
- package/dist/lanes/dictionary-coverage.js +0 -0
- package/dist/lanes/dictionary.js +0 -0
- package/dist/lanes/environment-contract.js +0 -0
- package/dist/lanes/environment-coverage.js +0 -0
- package/dist/lanes/environment.js +0 -0
- package/dist/lanes/field-contract.js +0 -0
- package/dist/lanes/field-coverage.js +0 -0
- package/dist/lanes/field.js +0 -0
- package/dist/lanes/folder-contract.js +0 -0
- package/dist/lanes/folder-coverage.js +0 -0
- package/dist/lanes/folder.js +0 -0
- package/dist/lanes/form-contract.js +0 -0
- package/dist/lanes/form-coverage.js +0 -0
- package/dist/lanes/form.js +0 -0
- package/dist/lanes/lane-ids.js +0 -0
- package/dist/lanes/list-view-contract.js +0 -0
- package/dist/lanes/list-view-coverage.js +0 -0
- package/dist/lanes/list-view-shapes.js +0 -0
- package/dist/lanes/list-view.js +6 -0
- package/dist/lanes/meta-contract.js +0 -0
- package/dist/lanes/meta.js +0 -0
- package/dist/lanes/model-contract.js +0 -0
- package/dist/lanes/model-coverage.js +0 -0
- package/dist/lanes/model.js +0 -0
- package/dist/lanes/online-js-contract.js +0 -0
- package/dist/lanes/online-js-coverage.js +0 -0
- package/dist/lanes/online-js.js +0 -0
- package/dist/lanes/org-tree.js +0 -0
- package/dist/lanes/organization-coverage.js +27 -0
- package/dist/lanes/organization.js +10 -1
- package/dist/lanes/report-contract.js +0 -0
- package/dist/lanes/report-coverage.js +0 -0
- package/dist/lanes/report.js +0 -0
- package/dist/lanes/rule-graph.js +0 -0
- package/dist/lanes/rule-lifecycle-contract.js +0 -0
- package/dist/lanes/rule-lifecycle-coverage.js +0 -0
- package/dist/lanes/rule-lifecycle.js +0 -0
- package/dist/lanes/runtime-data-contract.js +0 -0
- package/dist/lanes/runtime-data-coverage.js +0 -0
- package/dist/lanes/runtime-data.js +24 -0
- package/dist/lanes/workflow-contract.js +0 -0
- package/dist/lanes/workflow-coverage.js +0 -0
- package/dist/lanes/workflow.js +7 -2
- package/dist/mcp-graph.js +0 -0
- package/dist/model-purge.js +0 -0
- package/dist/model-record.js +0 -0
- package/dist/model-scaffold.js +0 -0
- package/dist/omc-core-lazy.js +0 -0
- package/dist/online-js-layout.js +0 -0
- package/dist/online-js-source.js +28 -28
- package/dist/package-tool.js +0 -0
- package/dist/package.js +0 -0
- package/dist/path-projection.js +0 -0
- package/dist/plan.js +0 -0
- package/dist/read.js +0 -0
- package/dist/recipes/b2-registration.js +0 -0
- package/dist/recipes/businessrule.js +0 -0
- package/dist/recipes/datarule.js +0 -0
- package/dist/recipes/dictionary.js +0 -0
- package/dist/recipes/field.js +0 -0
- package/dist/recipes/form.js +0 -0
- package/dist/recipes/list-view.js +0 -0
- package/dist/recipes/model.js +0 -0
- package/dist/recipes/online-js.js +0 -0
- package/dist/recipes/runtime-data.js +0 -0
- package/dist/recipes/shared.js +0 -0
- package/dist/recipes/workflow.js +0 -0
- package/dist/redact.js +0 -0
- package/dist/refusal-guidance.js +0 -0
- package/dist/rollback-spec.js +0 -0
- package/dist/rollback.js +0 -0
- package/dist/rule-support.js +0 -0
- package/dist/rule-when.js +4 -3
- package/dist/runtime-support.js +0 -0
- package/dist/script.js +0 -0
- package/dist/service-doctor.js +0 -0
- package/dist/session-manager.js +0 -0
- package/dist/session.js +0 -0
- package/dist/skills.js +0 -0
- package/dist/sqlite-warning-filter.js +0 -0
- package/dist/support.js +0 -0
- package/dist/token-cache.js +0 -0
- package/dist/tool-types.js +0 -0
- package/dist/tools.js +0 -0
- package/dist/usage-log.js +0 -0
- package/dist/wire.js +0 -0
- package/dist/workflow-support.js +0 -0
- package/dist/write-lease.js +0 -0
- package/dist/write-lock.js +0 -0
- package/dist/write.js +0 -0
- package/dist/zip.js +0 -0
- package/docs/images/omc-nixi/README.md +41 -41
- package/docs/omc-introduction.md +851 -851
- package/docs/tool-surface-map.md +42 -42
- package/package.json +3 -3
- package/skills/omc-acceptance-criteria.md +50 -50
- package/skills/omc-business-configuration.md +336 -335
- package/skills/omc-capabilities.md +214 -214
- package/skills/omc-capability-scouting.md +55 -55
- package/skills/omc-config-draft-review.md +175 -175
- package/skills/omc-five-piece-flow.md +35 -35
- package/skills/omc-glossary.md +86 -86
- package/skills/omc-refusals.md +129 -129
- package/skills/omc-requirement-analysis.md +161 -161
- package/skills/omc-requirement-vocabulary.md +61 -61
- package/skills/omc-start-here.md +107 -106
- package/skills/omc-tool-selection.md +119 -119
- package/skills/omc-write-hazards.md +222 -200
- package/dist/approval-token.js +0 -102
- package/dist/bench/fake-http-server.js +0 -65
- package/dist/fake/app.js +0 -45
- package/dist/fake/b2-registration.js +0 -594
- package/dist/fake/businessrule.js +0 -242
- package/dist/fake/datarule.js +0 -72
- package/dist/fake/dictionary.js +0 -108
- package/dist/fake/environment.js +0 -30
- package/dist/fake/field.js +0 -167
- package/dist/fake/form.js +0 -101
- package/dist/fake/index.js +0 -121
- package/dist/fake/list-view.js +0 -289
- package/dist/fake/model.js +0 -136
- package/dist/fake/online-js.js +0 -18
- package/dist/fake/report.js +0 -253
- package/dist/fake/routes.js +0 -47
- package/dist/fake/rule-lifecycle.js +0 -37
- package/dist/fake/runtime-data.js +0 -367
- package/dist/fake/state.js +0 -67
- package/dist/fake/workflow.js +0 -364
- package/dist/server.js +0 -92
package/docs/omc-introduction.md
CHANGED
|
@@ -1,851 +1,851 @@
|
|
|
1
|
-
# OMC CLI 介绍 —— CloudPivot 的受治理配置命令行
|
|
2
|
-
|
|
3
|
-
> **面向**:想了解「omc 到底是什么、能替我把 CloudPivot 的哪些事情做掉」的人。
|
|
4
|
-
>
|
|
5
|
-
> **版本基线**:`@stalfh233/omc-cli@0.4.100`(锚点 CloudPivot 8.6.26,兼容其它版本族)。
|
|
6
|
-
|
|
7
|
-
## 目录
|
|
8
|
-
|
|
9
|
-
**先看实战**
|
|
10
|
-
|
|
11
|
-
1. [一句话](#1-一句话)
|
|
12
|
-
2. [实战一:尼西双表单与流程搭建](#2-实战一尼西双表单与流程搭建)
|
|
13
|
-
3. [实战二:用 OMC 排查并修复线上问题](#3-实战二用-omc-排查并修复线上问题)
|
|
14
|
-
|
|
15
|
-
**再了解它**
|
|
16
|
-
|
|
17
|
-
4. [它能做什么](#4-它能做什么)
|
|
18
|
-
5. [怎么用](#5-怎么用)
|
|
19
|
-
6. [设计取舍:为什么是 CLI](#6-设计取舍为什么是-cli)
|
|
20
|
-
|
|
21
|
-
**备查**
|
|
22
|
-
|
|
23
|
-
7. [治理与安全](#7-治理与安全每个写调用都过的管道)
|
|
24
|
-
8. [不能做什么(边界)](#8-不能做什么边界)
|
|
25
|
-
9. [安装(npm)](#9-安装npm)
|
|
26
|
-
10. [上手速查](#10-上手速查)
|
|
27
|
-
11. [术语速记](#11-术语速记)
|
|
28
|
-
12. [附录:全部工具清单](#12-附录全部工具清单)
|
|
29
|
-
|
|
30
|
-
## 1. 一句话
|
|
31
|
-
|
|
32
|
-
**omc 是 CloudPivot 的配置执行器。**
|
|
33
|
-
|
|
34
|
-
它把平台的低代码配置能力封装成一条本地 CLI。
|
|
35
|
-
|
|
36
|
-
它覆盖:
|
|
37
|
-
|
|
38
|
-
发现环境 · 建模型 · 配字段 · 排版表单 · 写业务规则 · 搭审批流 · 注册业务集成 · 灌运行数据。
|
|
39
|
-
|
|
40
|
-
每次写入前做机器校验,写入后做权威读回。
|
|
41
|
-
|
|
42
|
-
受治理(governed),失败即关闭(fail-closed);边界由随包覆盖清单约束。
|
|
43
|
-
|
|
44
|
-
**它首先是给 AI 用的。**
|
|
45
|
-
|
|
46
|
-
相当于给 AI 装上「手脚」:不再只是聊天,而是能稳定地把低代码配置改对、改快。
|
|
47
|
-
|
|
48
|
-
更进一步,是让 AI 把整条二开链路串起来:
|
|
49
|
-
|
|
50
|
-
> 读现状 → 改配置 → 造数据 → 触发流程 → 读回验证
|
|
51
|
-
|
|
52
|
-
人只在关键节点做判断和验收。
|
|
53
|
-
|
|
54
|
-
**下面两个实战,是这套东西最真实的样子。** 先看它们,再看能力与设计取舍。
|
|
55
|
-
|
|
56
|
-
> **当前状态**
|
|
57
|
-
>
|
|
58
|
-
> 工程底子不糙——治理管道、写前校验、写后读回、写锁、幂等、回滚、基线评测都已经在跑。
|
|
59
|
-
>
|
|
60
|
-
> 真正年轻的是**覆盖面和边界**:有些能力只覆盖了已经踩过坑、验过证的部分,遇到新场景还要继续补。
|
|
61
|
-
>
|
|
62
|
-
> 它会跟着真实使用一轮轮长大:补能力、修形状、磨体验。先把它当成一个**还在长的手艺活**,而不是一版定型的成品。
|
|
63
|
-
|
|
64
|
-
## 2. 实战一:尼西双表单与流程搭建
|
|
65
|
-
|
|
66
|
-
> **一次真实交付的记录。**
|
|
67
|
-
>
|
|
68
|
-
> 一个会话里,用 OMC 把「代工厂异常批次(SubCon Maverick Lot)」项目的
|
|
69
|
-
> **两张表单 + 两条审批流 + 角色路由 + 节点字段权限 + 在线 JS** 全部配完。
|
|
70
|
-
>
|
|
71
|
-
> 参考价值:从客户 Excel 到可用的审批应用,中间没有手工点过一次界面。
|
|
72
|
-
|
|
73
|
-
### 背景
|
|
74
|
-
|
|
75
|
-
客户给了两份材料。
|
|
76
|
-
|
|
77
|
-
**一份 Excel**:`SubCon Maverick Lot流程表单`,两个 Sheet。
|
|
78
|
-
|
|
79
|
-
- `FT`:成品 / 封装层
|
|
80
|
-
- `FP`:晶圆层
|
|
81
|
-
|
|
82
|
-
每行列了字段名、显示名、类型、是否必填、LotClass 显隐说明。
|
|
83
|
-
|
|
84
|
-
**两张流程图**:FT / FP 各一张,结构相同。
|
|
85
|
-
|
|
86
|
-
```text
|
|
87
|
-
填写申请单 → AOS PE Review
|
|
88
|
-
→(SubConRootCause=Y)SQE approve
|
|
89
|
-
→ SubCon ENG 执行
|
|
90
|
-
→ AOS PE Confirm
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
目标:**新建一个应用**,内含两个模型、两个子表组、两条审批流。
|
|
94
|
-
|
|
95
|
-
> **[截图 01|客户源需求:FT 表单规格]**
|
|
96
|
-
> 占位文件:`docs/images/omc-nixi/01-requirement-ft-sheet.png`
|
|
97
|
-
> 建议内容:客户 Excel 的 `FT` Sheet(字段清单 + 必填列 + LotClass 显隐说明)
|
|
98
|
-
|
|
99
|
-
> **[截图 02|客户源需求:FP 表单规格]**
|
|
100
|
-
> 占位文件:`docs/images/omc-nixi/02-requirement-fp-sheet.png`
|
|
101
|
-
> 建议内容:客户 Excel 的 `FP` Sheet
|
|
102
|
-
|
|
103
|
-
> **[截图 03|客户源需求:流程图]**
|
|
104
|
-
> 占位文件:`docs/images/omc-nixi/03-requirement-flow.png`
|
|
105
|
-
> 建议内容:FT/FP 两张流程图(含 `SubConRootCause=1` 分支)
|
|
106
|
-
|
|
107
|
-
### 步骤 1:环境自检 + 建应用
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
omc doctor # 配置/登录/版本族/指纹/许可证
|
|
111
|
-
omc call discover_environment --env nixi --args '{}' # 确认环境、默认应用、门户分组
|
|
112
|
-
omc call app.create --env nixi --args '{"code":"SubConMaverick","name":"代工厂异常批次","groupId":"<AOSPE 分组 id>"}'
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
要点:**应用创建不在 `intent` 声明式面内**。
|
|
116
|
-
|
|
117
|
-
必须先 `app.create`,再把环境默认应用指向它;后续 `intent` 建模才会落到新应用。
|
|
118
|
-
|
|
119
|
-
> **[截图 04|对话:应用与环境确认]**
|
|
120
|
-
> 占位文件:`docs/images/omc-nixi/04-chat-app-create.png`
|
|
121
|
-
> 建议内容:与 Agent 确认「新建应用」并返回 `app.create ok` 的那段对话
|
|
122
|
-
|
|
123
|
-
### 步骤 2:读需求,定型号
|
|
124
|
-
|
|
125
|
-
把两个 Sheet 的每一行读成 `{code, name, type, required, 显隐}`,识别出:
|
|
126
|
-
|
|
127
|
-
- FT:39 个字段 + 2 个子表(`Chip` 2 列、`SBLTriggerItem` 3 列)
|
|
128
|
-
- FP:38 个字段 + 1 个子表(`Wafer` 9 列)
|
|
129
|
-
- 类型映射:`字符串→SHORT_TEXT`、`长文本→LONG_TEXT`、`数字→NUMERICAL(+scale)`、`固定枚举→RADIO(choices)`、`附件→ATTACHMENT`、`子表→CHILD_TABLE(subFields)`
|
|
130
|
-
|
|
131
|
-
这里唯一需要人拍板的是几处歧义:节点名 TE/PE、`programName` 类型、子表列数。
|
|
132
|
-
|
|
133
|
-
其余照表落。
|
|
134
|
-
|
|
135
|
-
### 步骤 3:一次声明式建模(intent)
|
|
136
|
-
|
|
137
|
-
两个模型、77 个字段、3 个子表、2 张默认表单、2 个列表视图,全部写进**一个 `intent.yaml`**:
|
|
138
|
-
|
|
139
|
-
```bash
|
|
140
|
-
omc intent validate intent.yaml # 离线校验(会卡 code 命名:必须 lowerCamel / lower_snake)
|
|
141
|
-
omc intent plan intent.yaml --env nixi # 编译成 plan(本例 89 个动作)
|
|
142
|
-
omc intent apply plan.json # 串行执行 + 默认读回等价确认
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
回执关键行:`equivalent: true`。
|
|
146
|
-
|
|
147
|
-
意思是平台实际状态与 intent 声明**逐字段等价**,不是「大概建上了」。
|
|
148
|
-
|
|
149
|
-
> **[截图 05|对话:intent apply 回执]**
|
|
150
|
-
> 占位文件:`docs/images/omc-nixi/05-chat-intent-apply.png`
|
|
151
|
-
> 建议内容:`intent apply` 返回 `DELIVERED` + `equivalent: true`(89 个动作)的那段
|
|
152
|
-
|
|
153
|
-
这一步的收益最直观:**两条命令代替了几百次界面点击**。
|
|
154
|
-
|
|
155
|
-
而且重复跑是幂等的(零变更)。
|
|
156
|
-
|
|
157
|
-
### 步骤 4:两条审批流 + 角色路由
|
|
158
|
-
|
|
159
|
-
流程用 `workflow.create` 起骨架。
|
|
160
|
-
|
|
161
|
-
再用 `workflow.update` 一次性补**节点 + 路由 + 参与人 + 节点字段权限**:
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
omc call workflow.create --env nixi --args '{"schemaCode":"scmFt","name":"SubCon Maverick Lot-FT 流程","code":"scmFtFlow"}'
|
|
165
|
-
omc call workflow.update --env nixi --args-file wf_scmFt.json # 整模板:START/END + 5 节点 + routes + propertyPermissions
|
|
166
|
-
omc call workflow.publish --env nixi --args '{"schemaCode":"scmFt","code":"scmFtFlow"}'
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
拓扑(两条流程一致):
|
|
170
|
-
|
|
171
|
-
```text
|
|
172
|
-
开始 → 填写申请单 → AOS PE Review ─[subConRootCause = Y]→ SQE approve ─┐
|
|
173
|
-
└────────[else 兜底]────────────────────────→ ┴→ SubCon ENG 执行并反馈 → AOS PE Confirm → 结束
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
**角色路由**(本例的「配置角色」落在节点的参与人表达式上):
|
|
177
|
-
|
|
178
|
-
| 节点 | 办理人 |
|
|
179
|
-
|---|---|
|
|
180
|
-
| 填写申请单 | `{Originator}`(发起人) |
|
|
181
|
-
| AOS PE Review | `IF({productType}=="PIC",[蔡依涛],[赵益])` —— 按产品线分流到不同 AOS 工程师 |
|
|
182
|
-
| SQE approve | 部门 `AOSIT` |
|
|
183
|
-
| SubCon ENG 执行并反馈 | 部门 `AOSENG` |
|
|
184
|
-
| AOS PE Confirm | 部门 `AOSIT` |
|
|
185
|
-
|
|
186
|
-
> **[截图 06|对话:流程节点与角色配置]**
|
|
187
|
-
> 占位文件:`docs/images/omc-nixi/06-chat-workflow-role.png`
|
|
188
|
-
> 建议内容:确认「PIC→蔡依涛 / MOS→赵益、SQE/确认→AOSIT、执行→AOSENG」的对话
|
|
189
|
-
|
|
190
|
-
### 步骤 5:节点字段权限 —— 累计可见
|
|
191
|
-
|
|
192
|
-
客户的真实诉求是一句话:
|
|
193
|
-
|
|
194
|
-
> **「每个节点都要能看到本节点以及之前所有节点的字段,不然审批怎么知道表里填了什么」**
|
|
195
|
-
|
|
196
|
-
于是每个审批节点的可见集合 = 前面所有节点字段 ∪ 本节点字段。
|
|
197
|
-
|
|
198
|
-
**只有本节点自己的字段可编辑**,之前的一律只读:
|
|
199
|
-
|
|
200
|
-
| 节点 | 可见 | 可编辑 |
|
|
201
|
-
|---|---|---|
|
|
202
|
-
| 填写申请单 | 22 | 22 |
|
|
203
|
-
| AOS PE Review | 25(22 + 本节点 3) | 3 |
|
|
204
|
-
| SQE approve | 31(+ 本节点 6) | 6 |
|
|
205
|
-
| SubCon ENG 执行 | 33(+ 本节点 2) | 2 |
|
|
206
|
-
| AOS PE Confirm | 39(全部) | 6 |
|
|
207
|
-
|
|
208
|
-
这一步最能体现 CLI 的价值。
|
|
209
|
-
|
|
210
|
-
39 个字段 × 5 个节点的权限矩阵,人手工点要几百次勾选;这里是**一份 JSON 一次写回**。
|
|
211
|
-
|
|
212
|
-
> **[截图 07|对话:节点字段权限矩阵确认]**
|
|
213
|
-
> 占位文件:`docs/images/omc-nixi/07-chat-permission-matrix.png`
|
|
214
|
-
> 建议内容:审批节点「本节点 + 之前所有字段可见」的确认与回读矩阵
|
|
215
|
-
|
|
216
|
-
### 步骤 6:规则类补配
|
|
217
|
-
|
|
218
|
-
| 需求 | 落点 |
|
|
219
|
-
|---|---|
|
|
220
|
-
| 良率自动计算 `Yield = TestOutQty / TestInQty` | `datarule.create`(type2,门户前端计算) |
|
|
221
|
-
| `LotClass=ENG` 时若干字段不显示 | 字段 `options.displayFormula` |
|
|
222
|
-
| Action 与 SubConRootCause 二选一必填 | `options.requiredFormula` + 节点必填 |
|
|
223
|
-
|
|
224
|
-
### 步骤 7:快速配置业务集成(一条命令 = 服务 + 方法 + 参数)
|
|
225
|
-
|
|
226
|
-
这一步是「配置面里最容易低估」的。
|
|
227
|
-
|
|
228
|
-
**平台业务集成不用点界面。**
|
|
229
|
-
|
|
230
|
-
`service.register` 一条命令,就能把一个 SQL 服务连同它的方法、入参、出参一次注册好。
|
|
231
|
-
|
|
232
|
-
本例注册了两个数据源方法(都是 `DATA_SQL` 适配器,直连客户 Oracle):
|
|
233
|
-
|
|
234
|
-
| 服务 code | 服务名 | 连接池 | 方法 | 入参 | 出参 |
|
|
235
|
-
|---|---|---|---|---|---|
|
|
236
|
-
| `productType` | 产品线(件号-PDM) | `PDM` | `GetProductTypeByPartName` | `PartName` | `PRODUCT_TYPE` |
|
|
237
|
-
| `datahub` | datahub | `datahub` | `GetProductTypeByWaferName` | `WaferName` | `PRODUCT_TYPE` |
|
|
238
|
-
|
|
239
|
-
注册顺序(先建分类,再一次注册):
|
|
240
|
-
|
|
241
|
-
```bash
|
|
242
|
-
# 1. 建集成分类(返回 id,下一步要用)
|
|
243
|
-
omc call service.category.create --env nixi --args '{"name":"产品线查询"}'
|
|
244
|
-
# → readback.id = d0db6b83be474234b8ab66c63fb6cbb8
|
|
245
|
-
|
|
246
|
-
# 2. 一条命令:服务 + 方法 + 入参 + 出参(DATA_SQL)
|
|
247
|
-
omc call service.register --env nixi --args '{
|
|
248
|
-
"serviceCode": "productType",
|
|
249
|
-
"name": "产品线(件号-PDM)",
|
|
250
|
-
"adapterCode": "DATA_SQL",
|
|
251
|
-
"serviceCategoryId": "d0db6b83be474234b8ab66c63fb6cbb8",
|
|
252
|
-
"description": "根据件号查询产品线(MOS/PIC/NA)",
|
|
253
|
-
"serviceConfig": {
|
|
254
|
-
"auth": {"code": "", "name": "", "parameterlist": []},
|
|
255
|
-
"commonlist": [{"code": "databaseConnectionPoolCode", "name": "数据库连接池编码", "required": true, "value": "PDM"}]
|
|
256
|
-
},
|
|
257
|
-
"methodName": "GetProductTypeByPartName",
|
|
258
|
-
"methodConfig": {
|
|
259
|
-
"sql": "select itemname, case when product_line in (...) then ''MOS'' ... end product_type from (...) where itemname = :PartName",
|
|
260
|
-
"countSql": "select count(*) as count from (...) t where itemname = :PartName",
|
|
261
|
-
"returnType": "SingleObject",
|
|
262
|
-
"frontEndExtensionEnable": true
|
|
263
|
-
},
|
|
264
|
-
"methodInputParameters": [{"code":"PartName","name":"PartName","required":true,"externParameterType":1000,"bizPropertyType":0}],
|
|
265
|
-
"methodOutputParameters": [{"name":"PRODUCT_TYPE","code":"PRODUCT_TYPE","externParameterType":1000,"required":false,"bizPropertyType":0}]
|
|
266
|
-
}'
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
> **`frontEndExtensionEnable: true` 是整件事的关键开关** —— 只有打开它,表单在线 JS 才能通过
|
|
270
|
-
> `/api/runtime/bizbus/invoke` 直接调这个方法。忘了它,SQL 再对,前端也调不到。
|
|
271
|
-
|
|
272
|
-
**立刻验证(会真连客户库)**
|
|
273
|
-
|
|
274
|
-
```bash
|
|
275
|
-
omc call method.test --env nixi --args '{"serviceCode":"productType","methodCode":"GetProductTypeByPartName","inputParameters":{"PartName":"AO3406L"}}'
|
|
276
|
-
# → {"success":true,"data":{"ITEMNAME":"AO3406L","PRODUCT_TYPE":"MOS"}}
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
`method.test` 的 `externalSideEffect` 会是 `real`(真打外部数据源),所以**只读查询可以直接测,写库型方法要谨慎**。
|
|
280
|
-
|
|
281
|
-
后续改 SQL 用 `method.update`:只动方法,不重建服务。
|
|
282
|
-
|
|
283
|
-
重跑 `method.test` 和 `service.get` 复核;读回是脱敏的,凭据不会进日志。
|
|
284
|
-
|
|
285
|
-
> 本例最终 `service.get` 读回:`adapterCode: DATA_SQL`、`configJson.commonlist[0].value: PDM`、
|
|
286
|
-
> `frontEndExtensionEnable: true`、`methods[0].configJson.returnType: SingleObject`。
|
|
287
|
-
|
|
288
|
-
> **[截图 08|对话:业务集成快速注册]**
|
|
289
|
-
> 占位文件:`docs/images/omc-nixi/08-chat-biz-integration.png`
|
|
290
|
-
> 建议内容:`service.register` 注册 productType 服务 + `method.test` 返回 `PRODUCT_TYPE=MOS` 的那段
|
|
291
|
-
|
|
292
|
-
### 步骤 8:在线 JS(产品线自动带出)
|
|
293
|
-
|
|
294
|
-
客户另给了 SQL(`FT_Get_ProductTypeByAOSPartName`)。
|
|
295
|
-
|
|
296
|
-
需求是:在 FT 表单填「AOS产品名」后,自动带出**产品线**和**封装类型**。
|
|
297
|
-
|
|
298
|
-
关键结论:表单 JS 不用自定义接口,走平台内置的**业务集成调用端点**:
|
|
299
|
-
|
|
300
|
-
```js
|
|
301
|
-
h3form.axios.post(config.apiHost + '/api/runtime/bizbus/invoke', {
|
|
302
|
-
serviceCode: 'productType',
|
|
303
|
-
methodCode: 'GetProductTypeByPartName',
|
|
304
|
-
args: { PartName: value }
|
|
305
|
-
})
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
发布也走 CLI,不必进设计器粘贴:
|
|
309
|
-
|
|
310
|
-
```bash
|
|
311
|
-
omc call onlinejs.compose --env nixi --args-file compose_scmFt.json # replace:true + publish:true
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
> **[截图 09|对话:在线 JS 发布]**
|
|
315
|
-
> 占位文件:`docs/images/omc-nixi/09-chat-onlinejs-publish.png`
|
|
316
|
-
> 建议内容:`onlinejs.compose` 返回 `DELIVERED` / `published: true` 的那段
|
|
317
|
-
|
|
318
|
-
### 交付物
|
|
319
|
-
|
|
320
|
-
```text
|
|
321
|
-
intent.yaml # 两个模型 + 字段 + 子表 + 表单 + 视图(可重放)
|
|
322
|
-
wf_scmFt.json / wf_scmFp.json # 两条流程整模板(节点 + 路由 + 权限)
|
|
323
|
-
service-productType.json # service.register 参数(服务 + 方法 + 入出参)
|
|
324
|
-
compose_scmFt.json # 在线 JS 发布参数
|
|
325
|
-
SQL-已参数化.sql # 业务集成 SQL(:PartName 绑定变量)
|
|
326
|
-
README.md # 内网手工配置步骤
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
一次会话的产出,换来的是一整套**可重放、可 diff、可回滚**的配置源文件。
|
|
330
|
-
|
|
331
|
-
而不是一堆「当时点对了但没留下痕迹」的界面操作。
|
|
332
|
-
|
|
333
|
-
---
|
|
334
|
-
|
|
335
|
-
## 3. 实战二:用 OMC 排查并修复线上问题
|
|
336
|
-
|
|
337
|
-
> **中冶的两个线上问题。**
|
|
338
|
-
>
|
|
339
|
-
> 不点菜单、不连库,靠 OMC 只读面逐步收敛到「配置的哪一行」,再用写面(五件套)改掉。
|
|
340
|
-
>
|
|
341
|
-
> 日志只做一件事:提供**运行时刻**的证据。
|
|
342
|
-
|
|
343
|
-
### 排障主链路:四步全在 OMC 里
|
|
344
|
-
|
|
345
|
-
下面表格里的调用都省略了 `omc call` 前缀,只写工具名和参数。
|
|
346
|
-
|
|
347
|
-
```text
|
|
348
|
-
① 定模型 model.list(按应用过滤)→ model.inspect
|
|
349
|
-
② 定口径 field.list(中文名 → code,别猜字段名)
|
|
350
|
-
③ 定写入者 datarule.list(1=校验 2=计算/拼接)/ onlinejs.get / rule.get + artifact / form.get
|
|
351
|
-
④ 定数据 data.load / data.list → 与日志报文对照:「本来没有」还是「被覆盖」
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
第 ③ 步是成败点。
|
|
355
|
-
|
|
356
|
-
**一个字段有四种写入来源**:
|
|
357
|
-
|
|
358
|
-
- 在线 JS
|
|
359
|
-
- 字段级数据规则
|
|
360
|
-
- 业务规则节点
|
|
361
|
-
- 关联表单带出映射
|
|
362
|
-
|
|
363
|
-
只查一种就下结论,必翻车。日志在这四步之外补位,用法只有两条:
|
|
364
|
-
|
|
365
|
-
```bash
|
|
366
|
-
cd <backend>/launcher/logs/total
|
|
367
|
-
grep -o 'expression=[^ ]*' <(sed -n '4540,4700p' log-total-<日期>.12.log) | sort | uniq -c # 当时跑了哪些规则
|
|
368
|
-
grep -ho '"<字段>":"[^"]*"' *<日期>*.log | sort | uniq -c # 该字段历史上出现过什么值
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
### 案例 A:合同编号每次新增被冲空
|
|
372
|
-
|
|
373
|
-
| 步 | OMC 调用 | 拿到什么 |
|
|
374
|
-
|---|---|---|
|
|
375
|
-
| ① | `model.list --args '{"applicationCode":"HTGL","filter":"合同"}'` | 定位到 `pr_contract_registration`(登记)、`contract_master_data1`(主数据) |
|
|
376
|
-
| ② | `field.list --args '{"schemaCode":"pr_contract_registration","code":"contract_number"}'` | 「合同编号」= `contract_number`;顺带发现「合同编码」是另一个字段 `contract_code` |
|
|
377
|
-
| ③ | `datarule.list --args '{"schemaCode":"pr_contract_registration","dataRuleType":2}'` | **命中根因**:`contract_number` 有一条短文本拼接规则 `CASE({constep}="合同变更/补充",{changeContractCode},{constep}="主合同",{mainCode})` |
|
|
378
|
-
| ③ | `form.get --args '{"schemaCode":"pr_contract_registration","controls":["ref_contract_review"]}'` | 关联评审单的带出映射:`contractNumber → mainCode`、`contractNumber3 → changeContractCode` |
|
|
379
|
-
| ④ | `data.load` 登记单 + 主数据 | 登记单 `contract_number=""`、`mainCode=""`;主数据 `businessCode=""` —— 上游就是空 |
|
|
380
|
-
|
|
381
|
-
日志佐证两点:
|
|
382
|
-
|
|
383
|
-
- 01:24:32 出现 `expression=CASE({constep}=…{mainCode})`,说明保存时规则确实重算并回写了空值——这就是「必现」的机制。
|
|
384
|
-
- `grep '"mainCode":"'` 全时间窗零条非空,说明输入变量从未有值。
|
|
385
|
-
|
|
386
|
-
**结论**:不是谁删了编号,是编号压根没产生。
|
|
387
|
-
|
|
388
|
-
拼接规则的两个输入来自评审单的「经营合同编号 / 变更编号」。
|
|
389
|
-
|
|
390
|
-
这两列为空 → 带出即空 → 拼接再覆盖空 → 主数据与 NC 的 `vbillcode` 一路空。
|
|
391
|
-
|
|
392
|
-
反证:成本类走 `pc_contract_registration`,同期 `cbht01`、`CIEHTGU-01` 正常出号。
|
|
393
|
-
|
|
394
|
-
**OMC 修法(二选一,按业务口径定)**
|
|
395
|
-
|
|
396
|
-
- A|补上游(推荐):评审单侧让编号真正生成/回填,登记单的拼接规则原样保留 —— 不写配置,改流程/编号规则。
|
|
397
|
-
- B|改规则:`datarule.update` 给 CASE 加 `ELSE` 兜底(如取 `contract_code`),保证不落空;
|
|
398
|
-
代价是「合同编号」与「合同编码」被混同,需业务确认。
|
|
399
|
-
|
|
400
|
-
### 案例 B:收款计划变更子表为空
|
|
401
|
-
|
|
402
|
-
| 步 | OMC 调用 | 拿到什么 |
|
|
403
|
-
|---|---|---|
|
|
404
|
-
| ① | `model.inspect --args '{"schemaCode":"contract_master_data1"}'` | 找到 `Update` 规则(14 节点),其中 `DataCreate10` 发起 `collection_plan_adjust` |
|
|
405
|
-
| ③ | `rule.get --args '{"schemaCode":"contract_master_data1","ruleCode":"Update","full":true}'` + `artifact get <id> --jq "nodes"` | **命中根因**:`DataCreate10` 19 条主表映射,`children=""` —— 子表映射根本没配 |
|
|
406
|
-
| ③ | `form.get --args '{"schemaCode":"collection_plan_adjust","sheetCode":"performance_payment","controls":true}'` | 子表控件 `performance_paymentrs` 的 `dataItemName=contract_payment_item` |
|
|
407
|
-
| ④ | `data.list --args '{"schemaCode":"contract_payment_item"}'` / `--args '{"schemaCode":"performance_payment"}'` | 前者 **0 条**,后者 12 条且 `parentId` 指向的主记录**都已不存在**(孤儿行) |
|
|
408
|
-
|
|
409
|
-
**结论**:两层问题叠在一起。
|
|
410
|
-
|
|
411
|
-
1. 规则节点没配子表映射,新单子表天然为空。
|
|
412
|
-
2. 控件绑定的子模型(`contract_payment_item`)与历史数据所在的子模型(`performance_payment`)已经错位,老数据成孤儿。
|
|
413
|
-
|
|
414
|
-
**OMC 修法**
|
|
415
|
-
|
|
416
|
-
1. `rule.node.update` 给 `DataCreate10` 补 children:合同主数据 `con1collectionSchedule_jndv` →
|
|
417
|
-
`performance_paymentrs`,并补 `contractTotalAmount` 映射。
|
|
418
|
-
2. 统一子表模型口径(控件 `dataItemName` 与规则写入目标一致),迁移或清理 12 条孤儿行。
|
|
419
|
-
|
|
420
|
-
### 用 OMC 写:五件套
|
|
421
|
-
|
|
422
|
-
```text
|
|
423
|
-
discover → draft(人工确认)→ 权限门(writable / production 需 confirmProduction:true)
|
|
424
|
-
→ execute(一次写调用)→ readback(证明状态)
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
排障阶段全是读面,改的时候按这个顺序:
|
|
428
|
-
|
|
429
|
-
```bash
|
|
430
|
-
omc call discover_environment --args '{}' # 拿环境指纹,写前必须重取
|
|
431
|
-
omc call datarule.update --args '{…,"dryRun":true}' # 先看计划,不落盘
|
|
432
|
-
omc call datarule.update --args '{…,"confirmProduction":true}' # 生产必带该字段
|
|
433
|
-
omc call datarule.list --args '{"schemaCode":"…","dataRuleType":2}' # 读回:确认不是只改了草稿
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
纪律:
|
|
437
|
-
|
|
438
|
-
- **一个变更包只用一个引擎**(OMC 或 cp-model),读、Dry Run、写、回读都归它。
|
|
439
|
-
- 写前把设计用大白话讲清并拿到明确同意;草稿未批准可随意改,批准后指纹变了就作废重来。
|
|
440
|
-
- 改完固定三条回读:
|
|
441
|
-
1. **规则读回**:`rule.get` / `datarule.list` 确认已发布态。
|
|
442
|
-
2. **数据读回**:造一条新单 `data.load`,看落值 / 子表行数。
|
|
443
|
-
3. **日志读回**:grep 该单 id + TID,确认计算输出符合预期。
|
|
444
|
-
|
|
445
|
-
### 一页速查
|
|
446
|
-
|
|
447
|
-
```text
|
|
448
|
-
字段为空 / 被清空
|
|
449
|
-
├─ datarule.list --dataRuleType 2 → 是不是计算/拼接字段(会被重算覆盖)
|
|
450
|
-
├─ onlinejs.get → 前端有没有在写
|
|
451
|
-
├─ form.get --controls → 关联表单 mappings,源字段是否本来就空
|
|
452
|
-
└─ data.load 对照日志 bizObject 报文 → 「本来没有」还是「被覆盖」
|
|
453
|
-
|
|
454
|
-
下游单据 / 子表没数据
|
|
455
|
-
├─ rule.get + artifact --jq nodes → CREATE 节点 children 是否为空
|
|
456
|
-
├─ 控件 dataItemName 指向哪个子模型 → data.list 该子模型总条数
|
|
457
|
-
└─ 孤儿行:子表 parentId 在主模型 data.load 是否存在
|
|
458
|
-
```
|
|
459
|
-
|
|
460
|
-
---
|
|
461
|
-
|
|
462
|
-
## 4. 它能做什么
|
|
463
|
-
|
|
464
|
-
想确认某个能力能不能做,先跑两条:
|
|
465
|
-
|
|
466
|
-
```bash
|
|
467
|
-
omc capabilities # 一张表看清 16 项能力
|
|
468
|
-
omc capability <id> --executable # 单个能力的完整执行包
|
|
469
|
-
```
|
|
470
|
-
|
|
471
|
-
覆盖的环节:
|
|
472
|
-
|
|
473
|
-
- 环境、应用、模型、字段
|
|
474
|
-
- 表单、视图、业务规则
|
|
475
|
-
- 审批流、业务集成
|
|
476
|
-
- 运行数据、报表
|
|
477
|
-
|
|
478
|
-
| 能力 | 能做的事(需求线索) | 工具数 | 覆盖 | 声明式(intent) | 依赖 |
|
|
479
|
-
|---|---|---|---|---|---|
|
|
480
|
-
| `environment` 环境治理 | 环境发现、指纹、版本、连接/登录/就绪 | 2 | executable | none | - |
|
|
481
|
-
| `app` 应用 | 应用包建/改/删、列出 | 4 | executable | none | - → folder |
|
|
482
|
-
| `folder` 应用目录(分组) | 应用树目录/分组、移动模型、**自定义页面** | 12 | executable | none | app → - |
|
|
483
|
-
| `dictionary` 数据字典 | 字典与字典记录、键值/树型、选项来源 | 12 | executable | none | - |
|
|
484
|
-
| `model` 业务模型 | 建/改名/移动/删除模型、摘要、一次建模型+字段+表单 | 9 | executable | partial | - → field, workflow |
|
|
485
|
-
| `field` 字段 | 字段族、**子表**、下拉/人员/部门/日期/数值/关联、**计算字段**、单据号 | 5 | executable | partial | model → form, listview, datarule, businessrule, data |
|
|
486
|
-
| `form` 默认表单 | 表单布局、发布、按钮(含按钮 JS) | 5 | executable | partial | field → onlinejs |
|
|
487
|
-
| `listview` 列表视图 | 表头列、排序、筛选、按钮(含按钮 JS) | 5 | partial | partial | field → - |
|
|
488
|
-
| `datarule` 字段级规则 | 条件必填/只读/显示、计算拼接 | 4 | partial | partial | field → - |
|
|
489
|
-
| `businessrule` 业务规则 | 图形规则图、事件触发、BRANCH、BIZ_ACTION、**定时任务**、跨规则引用检索 | 5 | executable | partial | field → rule-lifecycle |
|
|
490
|
-
| `rule-lifecycle` 规则生命周期 | 启用/停用/删除/手动执行 | 6 | executable | none | businessrule → - |
|
|
491
|
-
| `workflow` 流程模板 | 审批流模板、节点/路由、发布、事件规则绑定、发起权限、待办、组织(角色/部门/用户) | 38 | executable | partial | model → - |
|
|
492
|
-
| `onlinejs` 表单在线 JS | 表单在线脚本 compose / 读回(含 SHA-256) | 2 | executable | partial | form → - |
|
|
493
|
-
| `bizservice` 业务集成 | 服务与方法注册(RESTFUL/DATA_SQL/…)、分类、连接池、导入导出、设计器测试 | 24 | executable | partial | - |
|
|
494
|
-
| `report` 报表 | 报表页、BI 图表、数据集(**仅用户显式要求时**) | 9 | partial | partial | - |
|
|
495
|
-
| `data` 运行数据 | 业务记录读/写/更新/删除/提交(工作流) | 6 | executable | none | field → - |
|
|
496
|
-
|
|
497
|
-
> **覆盖**:`executable` 全量可用;`partial` 有已取证边界(见 `omc capability <id>` 的 notes)。
|
|
498
|
-
> **声明式(intent)**:`partial` = 该能力可用 YAML 声明一部分(通常 create/update);`none` = 只走 `omc call`。
|
|
499
|
-
> **依赖** = `requires → precedes`,即能力之间的配置顺序;例如字段依赖模型,表单依赖字段。
|
|
500
|
-
> **组织**:`workflow` 的 38 个工具里包含 `org.*`(角色/部门/用户)——组织是流程的一部分,不单独成能力。
|
|
501
|
-
|
|
502
|
-
工具面合计 **154 个**:元/治理 5 + 读 55 + 写 94。
|
|
503
|
-
|
|
504
|
-
## 5. 怎么用
|
|
505
|
-
|
|
506
|
-
### 5.1 `omc call` —— 一次一工具(原子面)
|
|
507
|
-
|
|
508
|
-
```bash
|
|
509
|
-
omc call discover_environment --env test --args '{}'
|
|
510
|
-
omc call model.create --env test --args '{"name":"客户","code":"x_customer"}'
|
|
511
|
-
omc describe field.create --example dictionary-backed-single-select # 拿可运行示例
|
|
512
|
-
```
|
|
513
|
-
|
|
514
|
-
读面可一步取值:`--jq` / `--extract <path>` / `--extract-keys`。
|
|
515
|
-
|
|
516
|
-
这样能省掉再跑一次 `artifact get`。
|
|
517
|
-
|
|
518
|
-
### 5.2 `omc intent` —— 声明式意图面(推荐默认)
|
|
519
|
-
|
|
520
|
-
用一份 YAML 描述一组变更,编译成**不可变 plan** 再执行:
|
|
521
|
-
|
|
522
|
-
```bash
|
|
523
|
-
omc intent validate intent.yaml # 离线语义校验(错误带 源行:列)
|
|
524
|
-
omc intent plan intent.yaml --env test # 读基线 → 编译 → plan(planHash 复核对象)
|
|
525
|
-
omc intent apply plan.json # drift 门 + writable 检查 + 串行执行 + 默认读回等价确认
|
|
526
|
-
omc intent readback intent.yaml --env test # 解码回 intent 形状做等价校验
|
|
527
|
-
```
|
|
528
|
-
|
|
529
|
-
- 顶层 `models[]` / `services[]`;`models[].{code,name,fields,datarules,rules,form,listview,workflow,onlinejs}`。
|
|
530
|
-
- `intent apply` 既可以吃 `plan` 文件,也可以直接吃 YAML(`omc intent apply intent.yaml --env <env>`,自动编译);大 plan 会自动外置,回 `planFile`。
|
|
531
|
-
- **幂等收敛**:已达标环境重跑 plan/apply → 零变更、零重复创建。
|
|
532
|
-
- 显式缺席(删除):`models[].absent:true` 删整模型、`fields[].absent:true` 删单字段;plan 的 `riskClass` 升为 `destructive`。
|
|
533
|
-
- 生产 apply 加 `--confirm-production`;`--dry-run` 预览,`--no-verify` 跳过最终读回。
|
|
534
|
-
|
|
535
|
-
### 5.3 复合命令 —— 一条命令 = 一个变更包
|
|
536
|
-
|
|
537
|
-
| 命令 | 作用 |
|
|
538
|
-
|---|---|
|
|
539
|
-
| `omc model-scaffold` | 一条命令建模型 → N 字段(含子表)→ 发布字段 → 发布表单;先对每个字段 dry-run 预检 |
|
|
540
|
-
| `omc model-purge` | 按依赖倒序清掉一个模型(流程实例 → `model.delete` 级联) |
|
|
541
|
-
| `omc submit-verify` | 逐条提交 → 真实 id 读回 → 差异汇总 |
|
|
542
|
-
| `omc rule-save-enable` | 保存成功才启用,回执回答「会不会真的运行」 |
|
|
543
|
-
| `omc workflow-update-publish` | 显式合成最终模板(默认保留旧节点,`--confirm-replace` 才丢弃) |
|
|
544
|
-
| `omc call apply_changes` | 批量提交异构变更清单 `changes:[{tool,args}]`,首败即停、逐步读回、整批时间预算 |
|
|
545
|
-
| `omc script` | NDJSON 多调脚本,一个进程一次会话跑完全部 |
|
|
546
|
-
| `omc rollback` | 配置回滚(list / plan / apply),git-revert 语义;journal 与 before 快照是本机边界(不跨机器),publish 类生命周期推进不可逆 |
|
|
547
|
-
|
|
548
|
-
另有若干「不写环境」的辅助命令:`compute`(聚合公式编译)、`rule-when`、`approval-flow`、`form-default`、
|
|
549
|
-
`bench`(跑分)、`usage`(用量账本)、`next`(目标 → 工具一步定位)。
|
|
550
|
-
|
|
551
|
-
### 5.4 一条完整链路
|
|
552
|
-
|
|
553
|
-
```bash
|
|
554
|
-
# 0. 配置与自检
|
|
555
|
-
omc setup && omc doctor && omc call discover_environment --env test --args '{}'
|
|
556
|
-
|
|
557
|
-
# 1. 建模型 + 字段 + 表单(默认 dry-run 只列计划;加 --apply 才执行)
|
|
558
|
-
omc model-scaffold --code x_customer --name 客户 \
|
|
559
|
-
--fields '[{"name":"名称","code":"name","propertyType":"SHORT_TEXT"},{"name":"等级","code":"level","propertyType":"DROPDOWN_BOX","choices":["A","B"]}]' \
|
|
560
|
-
--env test --apply
|
|
561
|
-
|
|
562
|
-
# 2. 配业务规则(--node-graph 传规则图 JSON;保存成功才启用;默认 dry-run)
|
|
563
|
-
omc rule-save-enable --schema x_customer --rule-code customer-oncreate --name 创建客户后处理 \
|
|
564
|
-
--node-graph "$(cat rule-graph.json)" --env test --apply
|
|
565
|
-
|
|
566
|
-
# 3. 更新并发布审批流(--template 传流程模板 JSON;默认 dry-run 合成预览)
|
|
567
|
-
omc workflow-update-publish --schema x_customer --code customer_flow \
|
|
568
|
-
--template "$(cat workflow.json)" --env test --apply
|
|
569
|
-
|
|
570
|
-
# 4. 灌一条正式数据(无流程模型)
|
|
571
|
-
omc call data.submit --env test --args '{"schemaCode":"x_customer","formData":{"name":"甲","level":"A"}}'
|
|
572
|
-
|
|
573
|
-
# 5. 验收:读回、核对交付态、清理测试数据
|
|
574
|
-
omc call model.inspect --env test --args '{"schemaCode":"x_customer"}'
|
|
575
|
-
omc rollback list
|
|
576
|
-
```
|
|
577
|
-
|
|
578
|
-
## 6. 设计取舍:为什么是 CLI
|
|
579
|
-
|
|
580
|
-
### 6.1 初衷与一次转向
|
|
581
|
-
|
|
582
|
-
这套 CLI 的初衷很简单:**让二开更简单、更方便**。
|
|
583
|
-
|
|
584
|
-
让 AI 把散落在平台各处的配置、数据、触发和核对,串成一条链。
|
|
585
|
-
|
|
586
|
-
它最早不是这个形态。
|
|
587
|
-
|
|
588
|
-
最初想做的是**基于 dsh 的云枢专用 agent**:一套二开插件,把前后端改造、表单配置、环境配置、二开代码配置都收进去。
|
|
589
|
-
|
|
590
|
-
名字 **Oh My CpAgent / omc**,则受 **Oh My OpenAgent** 和 **Oh My Pi** 启发。
|
|
591
|
-
|
|
592
|
-
**放弃的原因有两个。**
|
|
593
|
-
|
|
594
|
-
- **分发性**。插件绑平台——所有人得先下客户端、再装插件。就像 AI 大赛上基于 dsh 发布的 **Authine X**,能力不错,但使用门槛是「先装一套东西」。我们要的是谁都能用。
|
|
595
|
-
- **版本成本**。dsh 迭代太快,接口几个月换一轮,插件跟着追版本是长期负债。
|
|
596
|
-
|
|
597
|
-
最后选了 **npm CLI**:装在本机,agent 有 shell 就能调用。
|
|
598
|
-
|
|
599
|
-
换模型、换客户端、换平台都不受影响。
|
|
600
|
-
|
|
601
|
-
将来要 MCP 或平台插件,可以在同一条治理管线上再包一层。
|
|
602
|
-
|
|
603
|
-
### 6.2 三条路都比过
|
|
604
|
-
|
|
605
|
-
**MCP:schema 常驻太贵。**
|
|
606
|
-
|
|
607
|
-
81 个工具的 schema 实测 208,985 B(约 53k tokens)。
|
|
608
|
-
|
|
609
|
-
同一条发现流程:MCP 约 214.5 KB,CLI 约 6 KB——约 35 倍、接近 97% 的缩减。
|
|
610
|
-
|
|
611
|
-
工具越多越明显。MCP 面已按 ADR-0004 移除。
|
|
612
|
-
|
|
613
|
-
**Skill:适合讲方法,不适合承担强制治理。**
|
|
614
|
-
|
|
615
|
-
cpdocs 用 Skill 承载编码知识,做得很好。
|
|
616
|
-
|
|
617
|
-
但「真正去改环境」如果只靠文档里的纪律,就依赖模型自觉。
|
|
618
|
-
|
|
619
|
-
CLI 把 writable、生产确认、写锁、幂等、读回做进**进程边界**。
|
|
620
|
-
|
|
621
|
-
结论是:**方法论放 Skill,执行放 CLI。**
|
|
622
|
-
|
|
623
|
-
**平台插件:可分发性最差。**
|
|
624
|
-
|
|
625
|
-
见上面 dsh 那段。
|
|
626
|
-
|
|
627
|
-
### 6.3 Token 治理:渐进式披露
|
|
628
|
-
|
|
629
|
-
**发现面分档,按需放大。**
|
|
630
|
-
|
|
631
|
-
- `next`:2–5 KB
|
|
632
|
-
- `commands --json --compact --lane`:约 1 KB
|
|
633
|
-
- `describe`:1.5–2.5 KB
|
|
634
|
-
- `commands --json`:约 20 KB(回退面)
|
|
635
|
-
|
|
636
|
-
先走小档,缺形状再放大。
|
|
637
|
-
|
|
638
|
-
**默认只回索引 / 摘要 / 形状。**
|
|
639
|
-
|
|
640
|
-
- `help` 回节索引(约 1 KB)
|
|
641
|
-
- `artifact get` 正文 > 8 KB 只回形状
|
|
642
|
-
- `usage` 只回汇总
|
|
643
|
-
|
|
644
|
-
**一步取值,不重复搬。**
|
|
645
|
-
|
|
646
|
-
- `--jq` / `--extract`
|
|
647
|
-
- `model.inspect` 替代六连调
|
|
648
|
-
- `script` / `--args-list` 一进程多调
|
|
649
|
-
|
|
650
|
-
**有基线守着。**
|
|
651
|
-
|
|
652
|
-
`eval:call-face` / `eval:intent-face` / `eval:discovery-cost` 都会跑固定任务;能力投影路线的发现调用约减半(20 → 10)。
|
|
653
|
-
|
|
654
|
-
### 6.4 方法论随包走
|
|
655
|
-
|
|
656
|
-
`omc help` 带 13 个 topic,默认只回节索引。
|
|
657
|
-
|
|
658
|
-
常用的有:
|
|
659
|
-
|
|
660
|
-
- `start-here` · `tool-selection` · `requirement-analysis`
|
|
661
|
-
- `capabilities` · `config-draft-review` · `five-piece-flow`
|
|
662
|
-
- `write-hazards` · `acceptance-criteria` · `refusals`
|
|
663
|
-
- `glossary` · `business-configuration`
|
|
664
|
-
|
|
665
|
-
写操作固定五段式:
|
|
666
|
-
|
|
667
|
-
> 发现现状 → 出草稿 → 过写入门 → 执行 → 读回/清理
|
|
668
|
-
|
|
669
|
-
### 6.5 和 cpdocs 的分工
|
|
670
|
-
|
|
671
|
-
**OMC 是操作低代码配置的「手脚」,cpdocs 是帮 AI 做编码开发的「知识库」。**
|
|
672
|
-
|
|
673
|
-
- cpdocs 负责:需求理解、方案与编码(Java 后端、Vue 前端、规范)。
|
|
674
|
-
- OMC 负责:把方案落到平台配置,并做读回、造数、验收。
|
|
675
|
-
|
|
676
|
-
两者重叠的模型 / 字段 / 表单 / 视图 / 规则 / 流程上,`cpdocs-guide` 会给出两个候选:`cp-model` 与 `omc`。
|
|
677
|
-
|
|
678
|
-
---
|
|
679
|
-
|
|
680
|
-
## 7. 治理与安全(每个写调用都过的管道)
|
|
681
|
-
|
|
682
|
-
```
|
|
683
|
-
语义门(字段族 / 规则图 dry-lint / 业务编码 / 表单布局 / 各工具 preflight,零 wire)
|
|
684
|
-
→ 覆盖门(清单声明;超界拒绝并引用条目)
|
|
685
|
-
→ 环境写入门(writable=false 拒绝;生产需 confirmProduction:true)
|
|
686
|
-
→ 会话 + 版本族门(缺版本证据即关闭)
|
|
687
|
-
→ dry-run / requestId 重放门
|
|
688
|
-
→ 写租约(同环境跨进程文件锁串行;冲突回 write-lock-held)
|
|
689
|
-
→ 执行 → 权威读回 → artifact 交付 + 人话 summary
|
|
690
|
-
```
|
|
691
|
-
|
|
692
|
-
- **stdout 恒为恰好一个 JSON envelope** `{ok,status,result,requestId,error{code,message,retryable}}`;人类诊断全在 stderr。
|
|
693
|
-
- **退出码族**:`0` ok · `10` invalid-input · `11` auth-config · `12` policy-refused · `14` uncertain · `15` internal;细分以 `error.code` 为准。
|
|
694
|
-
- **不确定性语义**:传输失败冻结为 `status:"uncertain", frozen:true`,绝不伪造成功。
|
|
695
|
-
- **人门在对话层**:机器管道只执行 writable 与 `confirmProduction` 检查;Agent 必须先出草稿并取得用户明确批准(`omc help omc-config-draft-review`)。
|
|
696
|
-
|
|
697
|
-
## 8. 不能做什么(边界)
|
|
698
|
-
|
|
699
|
-
这些是**明确答复**,不是要绕过的障碍:
|
|
700
|
-
|
|
701
|
-
| 面 | 状态 | 说明 |
|
|
702
|
-
|---|---|---|
|
|
703
|
-
| 通用权限 / 授权矩阵 | blocked | 授权矩阵不在配置面(流程发起权限、组织/角色写入另有工具) |
|
|
704
|
-
| 跨模型子表 / 关联联动 / 子到子 | blocked | 未取证,不猜写 |
|
|
705
|
-
| OCR / 电子签章 / 发票识别 | unsupported | 不在平台配置覆盖内 |
|
|
706
|
-
| 应用发布 / 环境上线 / 生产发布 | unsupported | CLI 只做配置,不做环境发布 |
|
|
707
|
-
| 在线后端编码(`/api/api/programming` Java 源码) | unsupported | 用二开扩展包,本 CLI 无工具 |
|
|
708
|
-
| 列表视图分组(queryLayer) | 未取证 | 别猜写 |
|
|
709
|
-
|
|
710
|
-
**两条补充:**
|
|
711
|
-
|
|
712
|
-
- **子表天生只有一级。** 一个主表可以有多个子表,但子表不能再套子表。所以「嵌套子表」不是 CLI 的能力缺口,而是平台不存在的形态,别按这个方向设计需求。
|
|
713
|
-
- **被挡不等于做不了。** `blocked / unsupported` 通常意味着行为要路由到另一个代码所有者(配置 + 后端扩展)。
|
|
714
|
-
|
|
715
|
-
## 9. 安装(npm)
|
|
716
|
-
|
|
717
|
-
包名:**`@stalfh233/omc-cli`**(命令仍是 `omc`)。
|
|
718
|
-
|
|
719
|
-
已发布到公共 npm registry:
|
|
720
|
-
<https://www.npmjs.com/package/@stalfh233/omc-cli>
|
|
721
|
-
|
|
722
|
-
环境要求:Node.js 22.13+(`omc-core` 使用内置 `node:sqlite`)。
|
|
723
|
-
|
|
724
|
-
```bash
|
|
725
|
-
# 全局安装(推荐)
|
|
726
|
-
npm install -g @stalfh233/omc-cli@latest
|
|
727
|
-
|
|
728
|
-
# 验证
|
|
729
|
-
omc --version # 当前基线 0.4.100
|
|
730
|
-
omc setup && omc doctor
|
|
731
|
-
|
|
732
|
-
# 查看 npm 上的最新版本
|
|
733
|
-
npm view @stalfh233/omc-cli version
|
|
734
|
-
|
|
735
|
-
# 固定 / 升级版本
|
|
736
|
-
npm install -g @stalfh233/omc-cli@0.4.100
|
|
737
|
-
npm update -g @stalfh233/omc-cli
|
|
738
|
-
```
|
|
739
|
-
|
|
740
|
-
也可以只在当前项目里安装、用 `npx` 调用:
|
|
741
|
-
|
|
742
|
-
```bash
|
|
743
|
-
npm install @stalfh233/omc-cli
|
|
744
|
-
npx omc setup && npx omc doctor
|
|
745
|
-
```
|
|
746
|
-
|
|
747
|
-
> `omc-core` 是内部依赖,会随 `@stalfh233/omc-cli` 自动安装,不需要单独装。
|
|
748
|
-
>
|
|
749
|
-
> 现在还在 `0.4.x` 的阶段,能力覆盖和部分形状还会继续扩、继续调——我们会跟着实际使用不断打磨、修问题。
|
|
750
|
-
>
|
|
751
|
-
> `1.0.0` 之前,别把它当成冻结的契约。
|
|
752
|
-
|
|
753
|
-
## 10. 上手速查
|
|
754
|
-
|
|
755
|
-
```bash
|
|
756
|
-
omc setup && omc doctor && omc commands --json
|
|
757
|
-
|
|
758
|
-
omc help # 命令清单 + 方法论 topic 清单
|
|
759
|
-
omc help --search "<词>" # 跨 topic 找具体事实
|
|
760
|
-
omc next "我想做一个审批流程" # 目标 → 工具一步定位
|
|
761
|
-
omc capabilities # 16 能力一张表
|
|
762
|
-
omc capability model --executable # 单能力完整执行包
|
|
763
|
-
omc describe <tool> # 单工具 schema + 可运行示例
|
|
764
|
-
```
|
|
765
|
-
|
|
766
|
-
**在什么目录运行?**
|
|
767
|
-
|
|
768
|
-
把 omc 当工具用时,请在**独立、干净的项目目录**里运行,不要放在 OMC 研发仓里。
|
|
769
|
-
|
|
770
|
-
否则 Agent 可能读到只属于研发的产物(`.scratch/`、`CONTEXT.md` 等),误当成使用指引。
|
|
771
|
-
|
|
772
|
-
## 11. 术语速记
|
|
773
|
-
|
|
774
|
-
- **覆盖清单(coverage manifest)**:随包的能力契约,`executable / partial / blocked / static-only / unsupported` 五态。
|
|
775
|
-
- **交付态(delivery state)**:写入后权威读回得到的真实状态,是「配好了」的唯一判据。
|
|
776
|
-
- **artifact**:大读回外置的、带 sha256 的 0600 文件。
|
|
777
|
-
- **plan / planHash**:intent 编译出的不可变复核对象。
|
|
778
|
-
- **写租约(write lease)**:同环境写入的跨进程互斥。
|
|
779
|
-
- **最小路径(minimal path)**:某类需求实际需要的最短发现→草稿→写→读回路线,是用量分析的对照基线。
|
|
780
|
-
|
|
781
|
-
## 12. 附录:全部工具清单
|
|
782
|
-
|
|
783
|
-
> 以 `omc commands --json` 为准;下面是按能力分组的当前快照(154 个)。
|
|
784
|
-
|
|
785
|
-
**元 / 治理(6)**
|
|
786
|
-
|
|
787
|
-
`coverage.manifest` · `get_status` · `setup.start` · `setup.commit` · `doctor` · `apply_changes`
|
|
788
|
-
|
|
789
|
-
**environment 环境治理(2)**
|
|
790
|
-
|
|
791
|
-
`discover_environment` · `environment.fingerprint`
|
|
792
|
-
|
|
793
|
-
**app 应用(4)**
|
|
794
|
-
|
|
795
|
-
`app.list` · `app.create` · `app.update` · `app.delete`
|
|
796
|
-
|
|
797
|
-
**folder 应用目录 / 自定义页面(12)**
|
|
798
|
-
|
|
799
|
-
`folder.tree` · `folder.create` · `folder.update` · `folder.delete` · `custompage.list` · `custompage.get` · `custompage.create` · `custompage.update` · `custompage.content.get` · `custompage.content.update` · `custompage.content.publish` · `custompage.delete`
|
|
800
|
-
|
|
801
|
-
**dictionary 数据字典(12)**
|
|
802
|
-
|
|
803
|
-
`dictionary.list` · `dictionary.type` · `dictionary.names` · `dictionary.get` · `dictionary.records` · `dictionary.save` · `dictionary.status` · `dictionary.usage` · `dictionary.parent` · `dictionary.classes` · `dictionary.class.save` · `dictionary.class.delete`
|
|
804
|
-
|
|
805
|
-
**model 业务模型(9)**
|
|
806
|
-
|
|
807
|
-
`model.list` · `model.inspect` · `model.create` · `model.delete` · `model.deleteMany` · `model.setSummary` · `model.update` · `model.move` · `configure_model`
|
|
808
|
-
|
|
809
|
-
**field 字段(5)**
|
|
810
|
-
|
|
811
|
-
`field.list` · `field.create` · `field.update` · `field.publish` · `field.delete`
|
|
812
|
-
|
|
813
|
-
**form 默认表单(5)**
|
|
814
|
-
|
|
815
|
-
`form.get` · `form.draft` · `form.publish` · `configure_form` · `form.runButton`
|
|
816
|
-
|
|
817
|
-
**listview 列表视图(5)**
|
|
818
|
-
|
|
819
|
-
`listview.get` · `listview.list` · `listview.create` · `listview.configure` · `listview.delete`
|
|
820
|
-
|
|
821
|
-
**datarule 字段级规则(4)**
|
|
822
|
-
|
|
823
|
-
`datarule.list` · `datarule.create` · `datarule.update` · `datarule.delete`
|
|
824
|
-
|
|
825
|
-
**businessrule 业务规则(5)**
|
|
826
|
-
|
|
827
|
-
`rule.list` · `rule.references` · `rule.get` · `rule.save` · `rule.node.update`
|
|
828
|
-
|
|
829
|
-
**rule-lifecycle 规则生命周期(6)**
|
|
830
|
-
|
|
831
|
-
`rule.enable` · `rule.disable` · `rule.delete` · `rule.run` · `rule.disableMany` · `configure_rule`
|
|
832
|
-
|
|
833
|
-
**workflow 流程模板(38)**
|
|
834
|
-
|
|
835
|
-
`workflow.get_draft` · `workflow.get_published` · `workflow.validate` · `workflow.create` · `workflow.update` · `workflow.publish` · `workflow.bindRule` · `workflow.setButtons` · `workflow.delete` · `configure_workflow` · `workitem.list` · `workflow.instanceActivity` · `workflow.permissions` · `workflow.addPermission` · `workflow.removePermission` · `org.role.list` · `org.department.list` · `org.user.search` · `org.role.users` · `org.role.userScope` · `org.roleGroup.create` · `org.role.create` · `org.department.create` · `org.department.update` · `org.department.delete` · `org.department.users` · `org.user.create` · `org.user.update` · `org.user.delete` · `org.user.info` · `org.user.departments` · `org.role.delete` · `org.roleGroup.delete` · `org.user.transferDepartment` · `org.role.update` · `org.role.addUsers` · `org.role.removeUsers` · `org.role.setUserScope`
|
|
836
|
-
|
|
837
|
-
**onlinejs 表单在线 JS(2)**
|
|
838
|
-
|
|
839
|
-
`onlinejs.get` · `onlinejs.compose`
|
|
840
|
-
|
|
841
|
-
**bizservice 业务集成(24)**
|
|
842
|
-
|
|
843
|
-
`service.get` · `service.list` · `method.get` · `method.update` · `method.create` · `method.delete` · `service.category.list` · `service.category.create` · `service.category.update` · `service.category.delete` · `service.dbconnpool.list` · `service.dbconnpool.create` · `service.dbconnpool.update` · `service.dbconnpool.delete` · `service.adapter_config` · `service.table_list` · `service.table_sql` · `service.register` · `service.update` · `service.delete` · `service.export` · `service.check` · `service.import` · `method.test`
|
|
844
|
-
|
|
845
|
-
**report 报表(9)**
|
|
846
|
-
|
|
847
|
-
`report.tree` · `report.get` · `report.chartdata` · `report.datasource.list` · `report.datasource.link` · `report.create` · `report.update` · `report.delete` · `report.configure`
|
|
848
|
-
|
|
849
|
-
**data 运行数据(6)**
|
|
850
|
-
|
|
851
|
-
`data.list` · `data.load` · `data.save` · `data.update` · `data.delete` · `data.submit`
|
|
1
|
+
# OMC CLI 介绍 —— CloudPivot 的受治理配置命令行
|
|
2
|
+
|
|
3
|
+
> **面向**:想了解「omc 到底是什么、能替我把 CloudPivot 的哪些事情做掉」的人。
|
|
4
|
+
>
|
|
5
|
+
> **版本基线**:`@stalfh233/omc-cli@0.4.100`(锚点 CloudPivot 8.6.26,兼容其它版本族)。
|
|
6
|
+
|
|
7
|
+
## 目录
|
|
8
|
+
|
|
9
|
+
**先看实战**
|
|
10
|
+
|
|
11
|
+
1. [一句话](#1-一句话)
|
|
12
|
+
2. [实战一:尼西双表单与流程搭建](#2-实战一尼西双表单与流程搭建)
|
|
13
|
+
3. [实战二:用 OMC 排查并修复线上问题](#3-实战二用-omc-排查并修复线上问题)
|
|
14
|
+
|
|
15
|
+
**再了解它**
|
|
16
|
+
|
|
17
|
+
4. [它能做什么](#4-它能做什么)
|
|
18
|
+
5. [怎么用](#5-怎么用)
|
|
19
|
+
6. [设计取舍:为什么是 CLI](#6-设计取舍为什么是-cli)
|
|
20
|
+
|
|
21
|
+
**备查**
|
|
22
|
+
|
|
23
|
+
7. [治理与安全](#7-治理与安全每个写调用都过的管道)
|
|
24
|
+
8. [不能做什么(边界)](#8-不能做什么边界)
|
|
25
|
+
9. [安装(npm)](#9-安装npm)
|
|
26
|
+
10. [上手速查](#10-上手速查)
|
|
27
|
+
11. [术语速记](#11-术语速记)
|
|
28
|
+
12. [附录:全部工具清单](#12-附录全部工具清单)
|
|
29
|
+
|
|
30
|
+
## 1. 一句话
|
|
31
|
+
|
|
32
|
+
**omc 是 CloudPivot 的配置执行器。**
|
|
33
|
+
|
|
34
|
+
它把平台的低代码配置能力封装成一条本地 CLI。
|
|
35
|
+
|
|
36
|
+
它覆盖:
|
|
37
|
+
|
|
38
|
+
发现环境 · 建模型 · 配字段 · 排版表单 · 写业务规则 · 搭审批流 · 注册业务集成 · 灌运行数据。
|
|
39
|
+
|
|
40
|
+
每次写入前做机器校验,写入后做权威读回。
|
|
41
|
+
|
|
42
|
+
受治理(governed),失败即关闭(fail-closed);边界由随包覆盖清单约束。
|
|
43
|
+
|
|
44
|
+
**它首先是给 AI 用的。**
|
|
45
|
+
|
|
46
|
+
相当于给 AI 装上「手脚」:不再只是聊天,而是能稳定地把低代码配置改对、改快。
|
|
47
|
+
|
|
48
|
+
更进一步,是让 AI 把整条二开链路串起来:
|
|
49
|
+
|
|
50
|
+
> 读现状 → 改配置 → 造数据 → 触发流程 → 读回验证
|
|
51
|
+
|
|
52
|
+
人只在关键节点做判断和验收。
|
|
53
|
+
|
|
54
|
+
**下面两个实战,是这套东西最真实的样子。** 先看它们,再看能力与设计取舍。
|
|
55
|
+
|
|
56
|
+
> **当前状态**
|
|
57
|
+
>
|
|
58
|
+
> 工程底子不糙——治理管道、写前校验、写后读回、写锁、幂等、回滚、基线评测都已经在跑。
|
|
59
|
+
>
|
|
60
|
+
> 真正年轻的是**覆盖面和边界**:有些能力只覆盖了已经踩过坑、验过证的部分,遇到新场景还要继续补。
|
|
61
|
+
>
|
|
62
|
+
> 它会跟着真实使用一轮轮长大:补能力、修形状、磨体验。先把它当成一个**还在长的手艺活**,而不是一版定型的成品。
|
|
63
|
+
|
|
64
|
+
## 2. 实战一:尼西双表单与流程搭建
|
|
65
|
+
|
|
66
|
+
> **一次真实交付的记录。**
|
|
67
|
+
>
|
|
68
|
+
> 一个会话里,用 OMC 把「代工厂异常批次(SubCon Maverick Lot)」项目的
|
|
69
|
+
> **两张表单 + 两条审批流 + 角色路由 + 节点字段权限 + 在线 JS** 全部配完。
|
|
70
|
+
>
|
|
71
|
+
> 参考价值:从客户 Excel 到可用的审批应用,中间没有手工点过一次界面。
|
|
72
|
+
|
|
73
|
+
### 背景
|
|
74
|
+
|
|
75
|
+
客户给了两份材料。
|
|
76
|
+
|
|
77
|
+
**一份 Excel**:`SubCon Maverick Lot流程表单`,两个 Sheet。
|
|
78
|
+
|
|
79
|
+
- `FT`:成品 / 封装层
|
|
80
|
+
- `FP`:晶圆层
|
|
81
|
+
|
|
82
|
+
每行列了字段名、显示名、类型、是否必填、LotClass 显隐说明。
|
|
83
|
+
|
|
84
|
+
**两张流程图**:FT / FP 各一张,结构相同。
|
|
85
|
+
|
|
86
|
+
```text
|
|
87
|
+
填写申请单 → AOS PE Review
|
|
88
|
+
→(SubConRootCause=Y)SQE approve
|
|
89
|
+
→ SubCon ENG 执行
|
|
90
|
+
→ AOS PE Confirm
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
目标:**新建一个应用**,内含两个模型、两个子表组、两条审批流。
|
|
94
|
+
|
|
95
|
+
> **[截图 01|客户源需求:FT 表单规格]**
|
|
96
|
+
> 占位文件:`docs/images/omc-nixi/01-requirement-ft-sheet.png`
|
|
97
|
+
> 建议内容:客户 Excel 的 `FT` Sheet(字段清单 + 必填列 + LotClass 显隐说明)
|
|
98
|
+
|
|
99
|
+
> **[截图 02|客户源需求:FP 表单规格]**
|
|
100
|
+
> 占位文件:`docs/images/omc-nixi/02-requirement-fp-sheet.png`
|
|
101
|
+
> 建议内容:客户 Excel 的 `FP` Sheet
|
|
102
|
+
|
|
103
|
+
> **[截图 03|客户源需求:流程图]**
|
|
104
|
+
> 占位文件:`docs/images/omc-nixi/03-requirement-flow.png`
|
|
105
|
+
> 建议内容:FT/FP 两张流程图(含 `SubConRootCause=1` 分支)
|
|
106
|
+
|
|
107
|
+
### 步骤 1:环境自检 + 建应用
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
omc doctor # 配置/登录/版本族/指纹/许可证
|
|
111
|
+
omc call discover_environment --env nixi --args '{}' # 确认环境、默认应用、门户分组
|
|
112
|
+
omc call app.create --env nixi --args '{"code":"SubConMaverick","name":"代工厂异常批次","groupId":"<AOSPE 分组 id>"}'
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
要点:**应用创建不在 `intent` 声明式面内**。
|
|
116
|
+
|
|
117
|
+
必须先 `app.create`,再把环境默认应用指向它;后续 `intent` 建模才会落到新应用。
|
|
118
|
+
|
|
119
|
+
> **[截图 04|对话:应用与环境确认]**
|
|
120
|
+
> 占位文件:`docs/images/omc-nixi/04-chat-app-create.png`
|
|
121
|
+
> 建议内容:与 Agent 确认「新建应用」并返回 `app.create ok` 的那段对话
|
|
122
|
+
|
|
123
|
+
### 步骤 2:读需求,定型号
|
|
124
|
+
|
|
125
|
+
把两个 Sheet 的每一行读成 `{code, name, type, required, 显隐}`,识别出:
|
|
126
|
+
|
|
127
|
+
- FT:39 个字段 + 2 个子表(`Chip` 2 列、`SBLTriggerItem` 3 列)
|
|
128
|
+
- FP:38 个字段 + 1 个子表(`Wafer` 9 列)
|
|
129
|
+
- 类型映射:`字符串→SHORT_TEXT`、`长文本→LONG_TEXT`、`数字→NUMERICAL(+scale)`、`固定枚举→RADIO(choices)`、`附件→ATTACHMENT`、`子表→CHILD_TABLE(subFields)`
|
|
130
|
+
|
|
131
|
+
这里唯一需要人拍板的是几处歧义:节点名 TE/PE、`programName` 类型、子表列数。
|
|
132
|
+
|
|
133
|
+
其余照表落。
|
|
134
|
+
|
|
135
|
+
### 步骤 3:一次声明式建模(intent)
|
|
136
|
+
|
|
137
|
+
两个模型、77 个字段、3 个子表、2 张默认表单、2 个列表视图,全部写进**一个 `intent.yaml`**:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
omc intent validate intent.yaml # 离线校验(会卡 code 命名:必须 lowerCamel / lower_snake)
|
|
141
|
+
omc intent plan intent.yaml --env nixi # 编译成 plan(本例 89 个动作)
|
|
142
|
+
omc intent apply plan.json # 串行执行 + 默认读回等价确认
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
回执关键行:`equivalent: true`。
|
|
146
|
+
|
|
147
|
+
意思是平台实际状态与 intent 声明**逐字段等价**,不是「大概建上了」。
|
|
148
|
+
|
|
149
|
+
> **[截图 05|对话:intent apply 回执]**
|
|
150
|
+
> 占位文件:`docs/images/omc-nixi/05-chat-intent-apply.png`
|
|
151
|
+
> 建议内容:`intent apply` 返回 `DELIVERED` + `equivalent: true`(89 个动作)的那段
|
|
152
|
+
|
|
153
|
+
这一步的收益最直观:**两条命令代替了几百次界面点击**。
|
|
154
|
+
|
|
155
|
+
而且重复跑是幂等的(零变更)。
|
|
156
|
+
|
|
157
|
+
### 步骤 4:两条审批流 + 角色路由
|
|
158
|
+
|
|
159
|
+
流程用 `workflow.create` 起骨架。
|
|
160
|
+
|
|
161
|
+
再用 `workflow.update` 一次性补**节点 + 路由 + 参与人 + 节点字段权限**:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
omc call workflow.create --env nixi --args '{"schemaCode":"scmFt","name":"SubCon Maverick Lot-FT 流程","code":"scmFtFlow"}'
|
|
165
|
+
omc call workflow.update --env nixi --args-file wf_scmFt.json # 整模板:START/END + 5 节点 + routes + propertyPermissions
|
|
166
|
+
omc call workflow.publish --env nixi --args '{"schemaCode":"scmFt","code":"scmFtFlow"}'
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
拓扑(两条流程一致):
|
|
170
|
+
|
|
171
|
+
```text
|
|
172
|
+
开始 → 填写申请单 → AOS PE Review ─[subConRootCause = Y]→ SQE approve ─┐
|
|
173
|
+
└────────[else 兜底]────────────────────────→ ┴→ SubCon ENG 执行并反馈 → AOS PE Confirm → 结束
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**角色路由**(本例的「配置角色」落在节点的参与人表达式上):
|
|
177
|
+
|
|
178
|
+
| 节点 | 办理人 |
|
|
179
|
+
|---|---|
|
|
180
|
+
| 填写申请单 | `{Originator}`(发起人) |
|
|
181
|
+
| AOS PE Review | `IF({productType}=="PIC",[蔡依涛],[赵益])` —— 按产品线分流到不同 AOS 工程师 |
|
|
182
|
+
| SQE approve | 部门 `AOSIT` |
|
|
183
|
+
| SubCon ENG 执行并反馈 | 部门 `AOSENG` |
|
|
184
|
+
| AOS PE Confirm | 部门 `AOSIT` |
|
|
185
|
+
|
|
186
|
+
> **[截图 06|对话:流程节点与角色配置]**
|
|
187
|
+
> 占位文件:`docs/images/omc-nixi/06-chat-workflow-role.png`
|
|
188
|
+
> 建议内容:确认「PIC→蔡依涛 / MOS→赵益、SQE/确认→AOSIT、执行→AOSENG」的对话
|
|
189
|
+
|
|
190
|
+
### 步骤 5:节点字段权限 —— 累计可见
|
|
191
|
+
|
|
192
|
+
客户的真实诉求是一句话:
|
|
193
|
+
|
|
194
|
+
> **「每个节点都要能看到本节点以及之前所有节点的字段,不然审批怎么知道表里填了什么」**
|
|
195
|
+
|
|
196
|
+
于是每个审批节点的可见集合 = 前面所有节点字段 ∪ 本节点字段。
|
|
197
|
+
|
|
198
|
+
**只有本节点自己的字段可编辑**,之前的一律只读:
|
|
199
|
+
|
|
200
|
+
| 节点 | 可见 | 可编辑 |
|
|
201
|
+
|---|---|---|
|
|
202
|
+
| 填写申请单 | 22 | 22 |
|
|
203
|
+
| AOS PE Review | 25(22 + 本节点 3) | 3 |
|
|
204
|
+
| SQE approve | 31(+ 本节点 6) | 6 |
|
|
205
|
+
| SubCon ENG 执行 | 33(+ 本节点 2) | 2 |
|
|
206
|
+
| AOS PE Confirm | 39(全部) | 6 |
|
|
207
|
+
|
|
208
|
+
这一步最能体现 CLI 的价值。
|
|
209
|
+
|
|
210
|
+
39 个字段 × 5 个节点的权限矩阵,人手工点要几百次勾选;这里是**一份 JSON 一次写回**。
|
|
211
|
+
|
|
212
|
+
> **[截图 07|对话:节点字段权限矩阵确认]**
|
|
213
|
+
> 占位文件:`docs/images/omc-nixi/07-chat-permission-matrix.png`
|
|
214
|
+
> 建议内容:审批节点「本节点 + 之前所有字段可见」的确认与回读矩阵
|
|
215
|
+
|
|
216
|
+
### 步骤 6:规则类补配
|
|
217
|
+
|
|
218
|
+
| 需求 | 落点 |
|
|
219
|
+
|---|---|
|
|
220
|
+
| 良率自动计算 `Yield = TestOutQty / TestInQty` | `datarule.create`(type2,门户前端计算) |
|
|
221
|
+
| `LotClass=ENG` 时若干字段不显示 | 字段 `options.displayFormula` |
|
|
222
|
+
| Action 与 SubConRootCause 二选一必填 | `options.requiredFormula` + 节点必填 |
|
|
223
|
+
|
|
224
|
+
### 步骤 7:快速配置业务集成(一条命令 = 服务 + 方法 + 参数)
|
|
225
|
+
|
|
226
|
+
这一步是「配置面里最容易低估」的。
|
|
227
|
+
|
|
228
|
+
**平台业务集成不用点界面。**
|
|
229
|
+
|
|
230
|
+
`service.register` 一条命令,就能把一个 SQL 服务连同它的方法、入参、出参一次注册好。
|
|
231
|
+
|
|
232
|
+
本例注册了两个数据源方法(都是 `DATA_SQL` 适配器,直连客户 Oracle):
|
|
233
|
+
|
|
234
|
+
| 服务 code | 服务名 | 连接池 | 方法 | 入参 | 出参 |
|
|
235
|
+
|---|---|---|---|---|---|
|
|
236
|
+
| `productType` | 产品线(件号-PDM) | `PDM` | `GetProductTypeByPartName` | `PartName` | `PRODUCT_TYPE` |
|
|
237
|
+
| `datahub` | datahub | `datahub` | `GetProductTypeByWaferName` | `WaferName` | `PRODUCT_TYPE` |
|
|
238
|
+
|
|
239
|
+
注册顺序(先建分类,再一次注册):
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# 1. 建集成分类(返回 id,下一步要用)
|
|
243
|
+
omc call service.category.create --env nixi --args '{"name":"产品线查询"}'
|
|
244
|
+
# → readback.id = d0db6b83be474234b8ab66c63fb6cbb8
|
|
245
|
+
|
|
246
|
+
# 2. 一条命令:服务 + 方法 + 入参 + 出参(DATA_SQL)
|
|
247
|
+
omc call service.register --env nixi --args '{
|
|
248
|
+
"serviceCode": "productType",
|
|
249
|
+
"name": "产品线(件号-PDM)",
|
|
250
|
+
"adapterCode": "DATA_SQL",
|
|
251
|
+
"serviceCategoryId": "d0db6b83be474234b8ab66c63fb6cbb8",
|
|
252
|
+
"description": "根据件号查询产品线(MOS/PIC/NA)",
|
|
253
|
+
"serviceConfig": {
|
|
254
|
+
"auth": {"code": "", "name": "", "parameterlist": []},
|
|
255
|
+
"commonlist": [{"code": "databaseConnectionPoolCode", "name": "数据库连接池编码", "required": true, "value": "PDM"}]
|
|
256
|
+
},
|
|
257
|
+
"methodName": "GetProductTypeByPartName",
|
|
258
|
+
"methodConfig": {
|
|
259
|
+
"sql": "select itemname, case when product_line in (...) then ''MOS'' ... end product_type from (...) where itemname = :PartName",
|
|
260
|
+
"countSql": "select count(*) as count from (...) t where itemname = :PartName",
|
|
261
|
+
"returnType": "SingleObject",
|
|
262
|
+
"frontEndExtensionEnable": true
|
|
263
|
+
},
|
|
264
|
+
"methodInputParameters": [{"code":"PartName","name":"PartName","required":true,"externParameterType":1000,"bizPropertyType":0}],
|
|
265
|
+
"methodOutputParameters": [{"name":"PRODUCT_TYPE","code":"PRODUCT_TYPE","externParameterType":1000,"required":false,"bizPropertyType":0}]
|
|
266
|
+
}'
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
> **`frontEndExtensionEnable: true` 是整件事的关键开关** —— 只有打开它,表单在线 JS 才能通过
|
|
270
|
+
> `/api/runtime/bizbus/invoke` 直接调这个方法。忘了它,SQL 再对,前端也调不到。
|
|
271
|
+
|
|
272
|
+
**立刻验证(会真连客户库)**
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
omc call method.test --env nixi --args '{"serviceCode":"productType","methodCode":"GetProductTypeByPartName","inputParameters":{"PartName":"AO3406L"}}'
|
|
276
|
+
# → {"success":true,"data":{"ITEMNAME":"AO3406L","PRODUCT_TYPE":"MOS"}}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
`method.test` 的 `externalSideEffect` 会是 `real`(真打外部数据源),所以**只读查询可以直接测,写库型方法要谨慎**。
|
|
280
|
+
|
|
281
|
+
后续改 SQL 用 `method.update`:只动方法,不重建服务。
|
|
282
|
+
|
|
283
|
+
重跑 `method.test` 和 `service.get` 复核;读回是脱敏的,凭据不会进日志。
|
|
284
|
+
|
|
285
|
+
> 本例最终 `service.get` 读回:`adapterCode: DATA_SQL`、`configJson.commonlist[0].value: PDM`、
|
|
286
|
+
> `frontEndExtensionEnable: true`、`methods[0].configJson.returnType: SingleObject`。
|
|
287
|
+
|
|
288
|
+
> **[截图 08|对话:业务集成快速注册]**
|
|
289
|
+
> 占位文件:`docs/images/omc-nixi/08-chat-biz-integration.png`
|
|
290
|
+
> 建议内容:`service.register` 注册 productType 服务 + `method.test` 返回 `PRODUCT_TYPE=MOS` 的那段
|
|
291
|
+
|
|
292
|
+
### 步骤 8:在线 JS(产品线自动带出)
|
|
293
|
+
|
|
294
|
+
客户另给了 SQL(`FT_Get_ProductTypeByAOSPartName`)。
|
|
295
|
+
|
|
296
|
+
需求是:在 FT 表单填「AOS产品名」后,自动带出**产品线**和**封装类型**。
|
|
297
|
+
|
|
298
|
+
关键结论:表单 JS 不用自定义接口,走平台内置的**业务集成调用端点**:
|
|
299
|
+
|
|
300
|
+
```js
|
|
301
|
+
h3form.axios.post(config.apiHost + '/api/runtime/bizbus/invoke', {
|
|
302
|
+
serviceCode: 'productType',
|
|
303
|
+
methodCode: 'GetProductTypeByPartName',
|
|
304
|
+
args: { PartName: value }
|
|
305
|
+
})
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
发布也走 CLI,不必进设计器粘贴:
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
omc call onlinejs.compose --env nixi --args-file compose_scmFt.json # replace:true + publish:true
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
> **[截图 09|对话:在线 JS 发布]**
|
|
315
|
+
> 占位文件:`docs/images/omc-nixi/09-chat-onlinejs-publish.png`
|
|
316
|
+
> 建议内容:`onlinejs.compose` 返回 `DELIVERED` / `published: true` 的那段
|
|
317
|
+
|
|
318
|
+
### 交付物
|
|
319
|
+
|
|
320
|
+
```text
|
|
321
|
+
intent.yaml # 两个模型 + 字段 + 子表 + 表单 + 视图(可重放)
|
|
322
|
+
wf_scmFt.json / wf_scmFp.json # 两条流程整模板(节点 + 路由 + 权限)
|
|
323
|
+
service-productType.json # service.register 参数(服务 + 方法 + 入出参)
|
|
324
|
+
compose_scmFt.json # 在线 JS 发布参数
|
|
325
|
+
SQL-已参数化.sql # 业务集成 SQL(:PartName 绑定变量)
|
|
326
|
+
README.md # 内网手工配置步骤
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
一次会话的产出,换来的是一整套**可重放、可 diff、可回滚**的配置源文件。
|
|
330
|
+
|
|
331
|
+
而不是一堆「当时点对了但没留下痕迹」的界面操作。
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## 3. 实战二:用 OMC 排查并修复线上问题
|
|
336
|
+
|
|
337
|
+
> **中冶的两个线上问题。**
|
|
338
|
+
>
|
|
339
|
+
> 不点菜单、不连库,靠 OMC 只读面逐步收敛到「配置的哪一行」,再用写面(五件套)改掉。
|
|
340
|
+
>
|
|
341
|
+
> 日志只做一件事:提供**运行时刻**的证据。
|
|
342
|
+
|
|
343
|
+
### 排障主链路:四步全在 OMC 里
|
|
344
|
+
|
|
345
|
+
下面表格里的调用都省略了 `omc call` 前缀,只写工具名和参数。
|
|
346
|
+
|
|
347
|
+
```text
|
|
348
|
+
① 定模型 model.list(按应用过滤)→ model.inspect
|
|
349
|
+
② 定口径 field.list(中文名 → code,别猜字段名)
|
|
350
|
+
③ 定写入者 datarule.list(1=校验 2=计算/拼接)/ onlinejs.get / rule.get + artifact / form.get
|
|
351
|
+
④ 定数据 data.load / data.list → 与日志报文对照:「本来没有」还是「被覆盖」
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
第 ③ 步是成败点。
|
|
355
|
+
|
|
356
|
+
**一个字段有四种写入来源**:
|
|
357
|
+
|
|
358
|
+
- 在线 JS
|
|
359
|
+
- 字段级数据规则
|
|
360
|
+
- 业务规则节点
|
|
361
|
+
- 关联表单带出映射
|
|
362
|
+
|
|
363
|
+
只查一种就下结论,必翻车。日志在这四步之外补位,用法只有两条:
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
cd <backend>/launcher/logs/total
|
|
367
|
+
grep -o 'expression=[^ ]*' <(sed -n '4540,4700p' log-total-<日期>.12.log) | sort | uniq -c # 当时跑了哪些规则
|
|
368
|
+
grep -ho '"<字段>":"[^"]*"' *<日期>*.log | sort | uniq -c # 该字段历史上出现过什么值
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### 案例 A:合同编号每次新增被冲空
|
|
372
|
+
|
|
373
|
+
| 步 | OMC 调用 | 拿到什么 |
|
|
374
|
+
|---|---|---|
|
|
375
|
+
| ① | `model.list --args '{"applicationCode":"HTGL","filter":"合同"}'` | 定位到 `pr_contract_registration`(登记)、`contract_master_data1`(主数据) |
|
|
376
|
+
| ② | `field.list --args '{"schemaCode":"pr_contract_registration","code":"contract_number"}'` | 「合同编号」= `contract_number`;顺带发现「合同编码」是另一个字段 `contract_code` |
|
|
377
|
+
| ③ | `datarule.list --args '{"schemaCode":"pr_contract_registration","dataRuleType":2}'` | **命中根因**:`contract_number` 有一条短文本拼接规则 `CASE({constep}="合同变更/补充",{changeContractCode},{constep}="主合同",{mainCode})` |
|
|
378
|
+
| ③ | `form.get --args '{"schemaCode":"pr_contract_registration","controls":["ref_contract_review"]}'` | 关联评审单的带出映射:`contractNumber → mainCode`、`contractNumber3 → changeContractCode` |
|
|
379
|
+
| ④ | `data.load` 登记单 + 主数据 | 登记单 `contract_number=""`、`mainCode=""`;主数据 `businessCode=""` —— 上游就是空 |
|
|
380
|
+
|
|
381
|
+
日志佐证两点:
|
|
382
|
+
|
|
383
|
+
- 01:24:32 出现 `expression=CASE({constep}=…{mainCode})`,说明保存时规则确实重算并回写了空值——这就是「必现」的机制。
|
|
384
|
+
- `grep '"mainCode":"'` 全时间窗零条非空,说明输入变量从未有值。
|
|
385
|
+
|
|
386
|
+
**结论**:不是谁删了编号,是编号压根没产生。
|
|
387
|
+
|
|
388
|
+
拼接规则的两个输入来自评审单的「经营合同编号 / 变更编号」。
|
|
389
|
+
|
|
390
|
+
这两列为空 → 带出即空 → 拼接再覆盖空 → 主数据与 NC 的 `vbillcode` 一路空。
|
|
391
|
+
|
|
392
|
+
反证:成本类走 `pc_contract_registration`,同期 `cbht01`、`CIEHTGU-01` 正常出号。
|
|
393
|
+
|
|
394
|
+
**OMC 修法(二选一,按业务口径定)**
|
|
395
|
+
|
|
396
|
+
- A|补上游(推荐):评审单侧让编号真正生成/回填,登记单的拼接规则原样保留 —— 不写配置,改流程/编号规则。
|
|
397
|
+
- B|改规则:`datarule.update` 给 CASE 加 `ELSE` 兜底(如取 `contract_code`),保证不落空;
|
|
398
|
+
代价是「合同编号」与「合同编码」被混同,需业务确认。
|
|
399
|
+
|
|
400
|
+
### 案例 B:收款计划变更子表为空
|
|
401
|
+
|
|
402
|
+
| 步 | OMC 调用 | 拿到什么 |
|
|
403
|
+
|---|---|---|
|
|
404
|
+
| ① | `model.inspect --args '{"schemaCode":"contract_master_data1"}'` | 找到 `Update` 规则(14 节点),其中 `DataCreate10` 发起 `collection_plan_adjust` |
|
|
405
|
+
| ③ | `rule.get --args '{"schemaCode":"contract_master_data1","ruleCode":"Update","full":true}'` + `artifact get <id> --jq "nodes"` | **命中根因**:`DataCreate10` 19 条主表映射,`children=""` —— 子表映射根本没配 |
|
|
406
|
+
| ③ | `form.get --args '{"schemaCode":"collection_plan_adjust","sheetCode":"performance_payment","controls":true}'` | 子表控件 `performance_paymentrs` 的 `dataItemName=contract_payment_item` |
|
|
407
|
+
| ④ | `data.list --args '{"schemaCode":"contract_payment_item"}'` / `--args '{"schemaCode":"performance_payment"}'` | 前者 **0 条**,后者 12 条且 `parentId` 指向的主记录**都已不存在**(孤儿行) |
|
|
408
|
+
|
|
409
|
+
**结论**:两层问题叠在一起。
|
|
410
|
+
|
|
411
|
+
1. 规则节点没配子表映射,新单子表天然为空。
|
|
412
|
+
2. 控件绑定的子模型(`contract_payment_item`)与历史数据所在的子模型(`performance_payment`)已经错位,老数据成孤儿。
|
|
413
|
+
|
|
414
|
+
**OMC 修法**
|
|
415
|
+
|
|
416
|
+
1. `rule.node.update` 给 `DataCreate10` 补 children:合同主数据 `con1collectionSchedule_jndv` →
|
|
417
|
+
`performance_paymentrs`,并补 `contractTotalAmount` 映射。
|
|
418
|
+
2. 统一子表模型口径(控件 `dataItemName` 与规则写入目标一致),迁移或清理 12 条孤儿行。
|
|
419
|
+
|
|
420
|
+
### 用 OMC 写:五件套
|
|
421
|
+
|
|
422
|
+
```text
|
|
423
|
+
discover → draft(人工确认)→ 权限门(writable / production 需 confirmProduction:true)
|
|
424
|
+
→ execute(一次写调用)→ readback(证明状态)
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
排障阶段全是读面,改的时候按这个顺序:
|
|
428
|
+
|
|
429
|
+
```bash
|
|
430
|
+
omc call discover_environment --args '{}' # 拿环境指纹,写前必须重取
|
|
431
|
+
omc call datarule.update --args '{…,"dryRun":true}' # 先看计划,不落盘
|
|
432
|
+
omc call datarule.update --args '{…,"confirmProduction":true}' # 生产必带该字段
|
|
433
|
+
omc call datarule.list --args '{"schemaCode":"…","dataRuleType":2}' # 读回:确认不是只改了草稿
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
纪律:
|
|
437
|
+
|
|
438
|
+
- **一个变更包只用一个引擎**(OMC 或 cp-model),读、Dry Run、写、回读都归它。
|
|
439
|
+
- 写前把设计用大白话讲清并拿到明确同意;草稿未批准可随意改,批准后指纹变了就作废重来。
|
|
440
|
+
- 改完固定三条回读:
|
|
441
|
+
1. **规则读回**:`rule.get` / `datarule.list` 确认已发布态。
|
|
442
|
+
2. **数据读回**:造一条新单 `data.load`,看落值 / 子表行数。
|
|
443
|
+
3. **日志读回**:grep 该单 id + TID,确认计算输出符合预期。
|
|
444
|
+
|
|
445
|
+
### 一页速查
|
|
446
|
+
|
|
447
|
+
```text
|
|
448
|
+
字段为空 / 被清空
|
|
449
|
+
├─ datarule.list --dataRuleType 2 → 是不是计算/拼接字段(会被重算覆盖)
|
|
450
|
+
├─ onlinejs.get → 前端有没有在写
|
|
451
|
+
├─ form.get --controls → 关联表单 mappings,源字段是否本来就空
|
|
452
|
+
└─ data.load 对照日志 bizObject 报文 → 「本来没有」还是「被覆盖」
|
|
453
|
+
|
|
454
|
+
下游单据 / 子表没数据
|
|
455
|
+
├─ rule.get + artifact --jq nodes → CREATE 节点 children 是否为空
|
|
456
|
+
├─ 控件 dataItemName 指向哪个子模型 → data.list 该子模型总条数
|
|
457
|
+
└─ 孤儿行:子表 parentId 在主模型 data.load 是否存在
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
## 4. 它能做什么
|
|
463
|
+
|
|
464
|
+
想确认某个能力能不能做,先跑两条:
|
|
465
|
+
|
|
466
|
+
```bash
|
|
467
|
+
omc capabilities # 一张表看清 16 项能力
|
|
468
|
+
omc capability <id> --executable # 单个能力的完整执行包
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
覆盖的环节:
|
|
472
|
+
|
|
473
|
+
- 环境、应用、模型、字段
|
|
474
|
+
- 表单、视图、业务规则
|
|
475
|
+
- 审批流、业务集成
|
|
476
|
+
- 运行数据、报表
|
|
477
|
+
|
|
478
|
+
| 能力 | 能做的事(需求线索) | 工具数 | 覆盖 | 声明式(intent) | 依赖 |
|
|
479
|
+
|---|---|---|---|---|---|
|
|
480
|
+
| `environment` 环境治理 | 环境发现、指纹、版本、连接/登录/就绪 | 2 | executable | none | - |
|
|
481
|
+
| `app` 应用 | 应用包建/改/删、列出 | 4 | executable | none | - → folder |
|
|
482
|
+
| `folder` 应用目录(分组) | 应用树目录/分组、移动模型、**自定义页面** | 12 | executable | none | app → - |
|
|
483
|
+
| `dictionary` 数据字典 | 字典与字典记录、键值/树型、选项来源 | 12 | executable | none | - |
|
|
484
|
+
| `model` 业务模型 | 建/改名/移动/删除模型、摘要、一次建模型+字段+表单 | 9 | executable | partial | - → field, workflow |
|
|
485
|
+
| `field` 字段 | 字段族、**子表**、下拉/人员/部门/日期/数值/关联、**计算字段**、单据号 | 5 | executable | partial | model → form, listview, datarule, businessrule, data |
|
|
486
|
+
| `form` 默认表单 | 表单布局、发布、按钮(含按钮 JS) | 5 | executable | partial | field → onlinejs |
|
|
487
|
+
| `listview` 列表视图 | 表头列、排序、筛选、按钮(含按钮 JS) | 5 | partial | partial | field → - |
|
|
488
|
+
| `datarule` 字段级规则 | 条件必填/只读/显示、计算拼接 | 4 | partial | partial | field → - |
|
|
489
|
+
| `businessrule` 业务规则 | 图形规则图、事件触发、BRANCH、BIZ_ACTION、**定时任务**、跨规则引用检索 | 5 | executable | partial | field → rule-lifecycle |
|
|
490
|
+
| `rule-lifecycle` 规则生命周期 | 启用/停用/删除/手动执行 | 6 | executable | none | businessrule → - |
|
|
491
|
+
| `workflow` 流程模板 | 审批流模板、节点/路由、发布、事件规则绑定、发起权限、待办、组织(角色/部门/用户) | 38 | executable | partial | model → - |
|
|
492
|
+
| `onlinejs` 表单在线 JS | 表单在线脚本 compose / 读回(含 SHA-256) | 2 | executable | partial | form → - |
|
|
493
|
+
| `bizservice` 业务集成 | 服务与方法注册(RESTFUL/DATA_SQL/…)、分类、连接池、导入导出、设计器测试 | 24 | executable | partial | - |
|
|
494
|
+
| `report` 报表 | 报表页、BI 图表、数据集(**仅用户显式要求时**) | 9 | partial | partial | - |
|
|
495
|
+
| `data` 运行数据 | 业务记录读/写/更新/删除/提交(工作流) | 6 | executable | none | field → - |
|
|
496
|
+
|
|
497
|
+
> **覆盖**:`executable` 全量可用;`partial` 有已取证边界(见 `omc capability <id>` 的 notes)。
|
|
498
|
+
> **声明式(intent)**:`partial` = 该能力可用 YAML 声明一部分(通常 create/update);`none` = 只走 `omc call`。
|
|
499
|
+
> **依赖** = `requires → precedes`,即能力之间的配置顺序;例如字段依赖模型,表单依赖字段。
|
|
500
|
+
> **组织**:`workflow` 的 38 个工具里包含 `org.*`(角色/部门/用户)——组织是流程的一部分,不单独成能力。
|
|
501
|
+
|
|
502
|
+
工具面合计 **154 个**:元/治理 5 + 读 55 + 写 94。
|
|
503
|
+
|
|
504
|
+
## 5. 怎么用
|
|
505
|
+
|
|
506
|
+
### 5.1 `omc call` —— 一次一工具(原子面)
|
|
507
|
+
|
|
508
|
+
```bash
|
|
509
|
+
omc call discover_environment --env test --args '{}'
|
|
510
|
+
omc call model.create --env test --args '{"name":"客户","code":"x_customer"}'
|
|
511
|
+
omc describe field.create --example dictionary-backed-single-select # 拿可运行示例
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
读面可一步取值:`--jq` / `--extract <path>` / `--extract-keys`。
|
|
515
|
+
|
|
516
|
+
这样能省掉再跑一次 `artifact get`。
|
|
517
|
+
|
|
518
|
+
### 5.2 `omc intent` —— 声明式意图面(推荐默认)
|
|
519
|
+
|
|
520
|
+
用一份 YAML 描述一组变更,编译成**不可变 plan** 再执行:
|
|
521
|
+
|
|
522
|
+
```bash
|
|
523
|
+
omc intent validate intent.yaml # 离线语义校验(错误带 源行:列)
|
|
524
|
+
omc intent plan intent.yaml --env test # 读基线 → 编译 → plan(planHash 复核对象)
|
|
525
|
+
omc intent apply plan.json # drift 门 + writable 检查 + 串行执行 + 默认读回等价确认
|
|
526
|
+
omc intent readback intent.yaml --env test # 解码回 intent 形状做等价校验
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
- 顶层 `models[]` / `services[]`;`models[].{code,name,fields,datarules,rules,form,listview,workflow,onlinejs}`。
|
|
530
|
+
- `intent apply` 既可以吃 `plan` 文件,也可以直接吃 YAML(`omc intent apply intent.yaml --env <env>`,自动编译);大 plan 会自动外置,回 `planFile`。
|
|
531
|
+
- **幂等收敛**:已达标环境重跑 plan/apply → 零变更、零重复创建。
|
|
532
|
+
- 显式缺席(删除):`models[].absent:true` 删整模型、`fields[].absent:true` 删单字段;plan 的 `riskClass` 升为 `destructive`。
|
|
533
|
+
- 生产 apply 加 `--confirm-production`;`--dry-run` 预览,`--no-verify` 跳过最终读回。
|
|
534
|
+
|
|
535
|
+
### 5.3 复合命令 —— 一条命令 = 一个变更包
|
|
536
|
+
|
|
537
|
+
| 命令 | 作用 |
|
|
538
|
+
|---|---|
|
|
539
|
+
| `omc model-scaffold` | 一条命令建模型 → N 字段(含子表)→ 发布字段 → 发布表单;先对每个字段 dry-run 预检 |
|
|
540
|
+
| `omc model-purge` | 按依赖倒序清掉一个模型(流程实例 → `model.delete` 级联) |
|
|
541
|
+
| `omc submit-verify` | 逐条提交 → 真实 id 读回 → 差异汇总 |
|
|
542
|
+
| `omc rule-save-enable` | 保存成功才启用,回执回答「会不会真的运行」 |
|
|
543
|
+
| `omc workflow-update-publish` | 显式合成最终模板(默认保留旧节点,`--confirm-replace` 才丢弃) |
|
|
544
|
+
| `omc call apply_changes` | 批量提交异构变更清单 `changes:[{tool,args}]`,首败即停、逐步读回、整批时间预算 |
|
|
545
|
+
| `omc script` | NDJSON 多调脚本,一个进程一次会话跑完全部 |
|
|
546
|
+
| `omc rollback` | 配置回滚(list / plan / apply),git-revert 语义;journal 与 before 快照是本机边界(不跨机器),publish 类生命周期推进不可逆 |
|
|
547
|
+
|
|
548
|
+
另有若干「不写环境」的辅助命令:`compute`(聚合公式编译)、`rule-when`、`approval-flow`、`form-default`、
|
|
549
|
+
`bench`(跑分)、`usage`(用量账本)、`next`(目标 → 工具一步定位)。
|
|
550
|
+
|
|
551
|
+
### 5.4 一条完整链路
|
|
552
|
+
|
|
553
|
+
```bash
|
|
554
|
+
# 0. 配置与自检
|
|
555
|
+
omc setup && omc doctor && omc call discover_environment --env test --args '{}'
|
|
556
|
+
|
|
557
|
+
# 1. 建模型 + 字段 + 表单(默认 dry-run 只列计划;加 --apply 才执行)
|
|
558
|
+
omc model-scaffold --code x_customer --name 客户 \
|
|
559
|
+
--fields '[{"name":"名称","code":"name","propertyType":"SHORT_TEXT"},{"name":"等级","code":"level","propertyType":"DROPDOWN_BOX","choices":["A","B"]}]' \
|
|
560
|
+
--env test --apply
|
|
561
|
+
|
|
562
|
+
# 2. 配业务规则(--node-graph 传规则图 JSON;保存成功才启用;默认 dry-run)
|
|
563
|
+
omc rule-save-enable --schema x_customer --rule-code customer-oncreate --name 创建客户后处理 \
|
|
564
|
+
--node-graph "$(cat rule-graph.json)" --env test --apply
|
|
565
|
+
|
|
566
|
+
# 3. 更新并发布审批流(--template 传流程模板 JSON;默认 dry-run 合成预览)
|
|
567
|
+
omc workflow-update-publish --schema x_customer --code customer_flow \
|
|
568
|
+
--template "$(cat workflow.json)" --env test --apply
|
|
569
|
+
|
|
570
|
+
# 4. 灌一条正式数据(无流程模型)
|
|
571
|
+
omc call data.submit --env test --args '{"schemaCode":"x_customer","formData":{"name":"甲","level":"A"}}'
|
|
572
|
+
|
|
573
|
+
# 5. 验收:读回、核对交付态、清理测试数据
|
|
574
|
+
omc call model.inspect --env test --args '{"schemaCode":"x_customer"}'
|
|
575
|
+
omc rollback list
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
## 6. 设计取舍:为什么是 CLI
|
|
579
|
+
|
|
580
|
+
### 6.1 初衷与一次转向
|
|
581
|
+
|
|
582
|
+
这套 CLI 的初衷很简单:**让二开更简单、更方便**。
|
|
583
|
+
|
|
584
|
+
让 AI 把散落在平台各处的配置、数据、触发和核对,串成一条链。
|
|
585
|
+
|
|
586
|
+
它最早不是这个形态。
|
|
587
|
+
|
|
588
|
+
最初想做的是**基于 dsh 的云枢专用 agent**:一套二开插件,把前后端改造、表单配置、环境配置、二开代码配置都收进去。
|
|
589
|
+
|
|
590
|
+
名字 **Oh My CpAgent / omc**,则受 **Oh My OpenAgent** 和 **Oh My Pi** 启发。
|
|
591
|
+
|
|
592
|
+
**放弃的原因有两个。**
|
|
593
|
+
|
|
594
|
+
- **分发性**。插件绑平台——所有人得先下客户端、再装插件。就像 AI 大赛上基于 dsh 发布的 **Authine X**,能力不错,但使用门槛是「先装一套东西」。我们要的是谁都能用。
|
|
595
|
+
- **版本成本**。dsh 迭代太快,接口几个月换一轮,插件跟着追版本是长期负债。
|
|
596
|
+
|
|
597
|
+
最后选了 **npm CLI**:装在本机,agent 有 shell 就能调用。
|
|
598
|
+
|
|
599
|
+
换模型、换客户端、换平台都不受影响。
|
|
600
|
+
|
|
601
|
+
将来要 MCP 或平台插件,可以在同一条治理管线上再包一层。
|
|
602
|
+
|
|
603
|
+
### 6.2 三条路都比过
|
|
604
|
+
|
|
605
|
+
**MCP:schema 常驻太贵。**
|
|
606
|
+
|
|
607
|
+
81 个工具的 schema 实测 208,985 B(约 53k tokens)。
|
|
608
|
+
|
|
609
|
+
同一条发现流程:MCP 约 214.5 KB,CLI 约 6 KB——约 35 倍、接近 97% 的缩减。
|
|
610
|
+
|
|
611
|
+
工具越多越明显。MCP 面已按 ADR-0004 移除。
|
|
612
|
+
|
|
613
|
+
**Skill:适合讲方法,不适合承担强制治理。**
|
|
614
|
+
|
|
615
|
+
cpdocs 用 Skill 承载编码知识,做得很好。
|
|
616
|
+
|
|
617
|
+
但「真正去改环境」如果只靠文档里的纪律,就依赖模型自觉。
|
|
618
|
+
|
|
619
|
+
CLI 把 writable、生产确认、写锁、幂等、读回做进**进程边界**。
|
|
620
|
+
|
|
621
|
+
结论是:**方法论放 Skill,执行放 CLI。**
|
|
622
|
+
|
|
623
|
+
**平台插件:可分发性最差。**
|
|
624
|
+
|
|
625
|
+
见上面 dsh 那段。
|
|
626
|
+
|
|
627
|
+
### 6.3 Token 治理:渐进式披露
|
|
628
|
+
|
|
629
|
+
**发现面分档,按需放大。**
|
|
630
|
+
|
|
631
|
+
- `next`:2–5 KB
|
|
632
|
+
- `commands --json --compact --lane`:约 1 KB
|
|
633
|
+
- `describe`:1.5–2.5 KB
|
|
634
|
+
- `commands --json`:约 20 KB(回退面)
|
|
635
|
+
|
|
636
|
+
先走小档,缺形状再放大。
|
|
637
|
+
|
|
638
|
+
**默认只回索引 / 摘要 / 形状。**
|
|
639
|
+
|
|
640
|
+
- `help` 回节索引(约 1 KB)
|
|
641
|
+
- `artifact get` 正文 > 8 KB 只回形状
|
|
642
|
+
- `usage` 只回汇总
|
|
643
|
+
|
|
644
|
+
**一步取值,不重复搬。**
|
|
645
|
+
|
|
646
|
+
- `--jq` / `--extract`
|
|
647
|
+
- `model.inspect` 替代六连调
|
|
648
|
+
- `script` / `--args-list` 一进程多调
|
|
649
|
+
|
|
650
|
+
**有基线守着。**
|
|
651
|
+
|
|
652
|
+
`eval:call-face` / `eval:intent-face` / `eval:discovery-cost` 都会跑固定任务;能力投影路线的发现调用约减半(20 → 10)。
|
|
653
|
+
|
|
654
|
+
### 6.4 方法论随包走
|
|
655
|
+
|
|
656
|
+
`omc help` 带 13 个 topic,默认只回节索引。
|
|
657
|
+
|
|
658
|
+
常用的有:
|
|
659
|
+
|
|
660
|
+
- `start-here` · `tool-selection` · `requirement-analysis`
|
|
661
|
+
- `capabilities` · `config-draft-review` · `five-piece-flow`
|
|
662
|
+
- `write-hazards` · `acceptance-criteria` · `refusals`
|
|
663
|
+
- `glossary` · `business-configuration`
|
|
664
|
+
|
|
665
|
+
写操作固定五段式:
|
|
666
|
+
|
|
667
|
+
> 发现现状 → 出草稿 → 过写入门 → 执行 → 读回/清理
|
|
668
|
+
|
|
669
|
+
### 6.5 和 cpdocs 的分工
|
|
670
|
+
|
|
671
|
+
**OMC 是操作低代码配置的「手脚」,cpdocs 是帮 AI 做编码开发的「知识库」。**
|
|
672
|
+
|
|
673
|
+
- cpdocs 负责:需求理解、方案与编码(Java 后端、Vue 前端、规范)。
|
|
674
|
+
- OMC 负责:把方案落到平台配置,并做读回、造数、验收。
|
|
675
|
+
|
|
676
|
+
两者重叠的模型 / 字段 / 表单 / 视图 / 规则 / 流程上,`cpdocs-guide` 会给出两个候选:`cp-model` 与 `omc`。
|
|
677
|
+
|
|
678
|
+
---
|
|
679
|
+
|
|
680
|
+
## 7. 治理与安全(每个写调用都过的管道)
|
|
681
|
+
|
|
682
|
+
```
|
|
683
|
+
语义门(字段族 / 规则图 dry-lint / 业务编码 / 表单布局 / 各工具 preflight,零 wire)
|
|
684
|
+
→ 覆盖门(清单声明;超界拒绝并引用条目)
|
|
685
|
+
→ 环境写入门(writable=false 拒绝;生产需 confirmProduction:true)
|
|
686
|
+
→ 会话 + 版本族门(缺版本证据即关闭)
|
|
687
|
+
→ dry-run / requestId 重放门
|
|
688
|
+
→ 写租约(同环境跨进程文件锁串行;冲突回 write-lock-held)
|
|
689
|
+
→ 执行 → 权威读回 → artifact 交付 + 人话 summary
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
- **stdout 恒为恰好一个 JSON envelope** `{ok,status,result,requestId,error{code,message,retryable}}`;人类诊断全在 stderr。
|
|
693
|
+
- **退出码族**:`0` ok · `10` invalid-input · `11` auth-config · `12` policy-refused · `14` uncertain · `15` internal;细分以 `error.code` 为准。
|
|
694
|
+
- **不确定性语义**:传输失败冻结为 `status:"uncertain", frozen:true`,绝不伪造成功。
|
|
695
|
+
- **人门在对话层**:机器管道只执行 writable 与 `confirmProduction` 检查;Agent 必须先出草稿并取得用户明确批准(`omc help omc-config-draft-review`)。
|
|
696
|
+
|
|
697
|
+
## 8. 不能做什么(边界)
|
|
698
|
+
|
|
699
|
+
这些是**明确答复**,不是要绕过的障碍:
|
|
700
|
+
|
|
701
|
+
| 面 | 状态 | 说明 |
|
|
702
|
+
|---|---|---|
|
|
703
|
+
| 通用权限 / 授权矩阵 | blocked | 授权矩阵不在配置面(流程发起权限、组织/角色写入另有工具) |
|
|
704
|
+
| 跨模型子表 / 关联联动 / 子到子 | blocked | 未取证,不猜写 |
|
|
705
|
+
| OCR / 电子签章 / 发票识别 | unsupported | 不在平台配置覆盖内 |
|
|
706
|
+
| 应用发布 / 环境上线 / 生产发布 | unsupported | CLI 只做配置,不做环境发布 |
|
|
707
|
+
| 在线后端编码(`/api/api/programming` Java 源码) | unsupported | 用二开扩展包,本 CLI 无工具 |
|
|
708
|
+
| 列表视图分组(queryLayer) | 未取证 | 别猜写 |
|
|
709
|
+
|
|
710
|
+
**两条补充:**
|
|
711
|
+
|
|
712
|
+
- **子表天生只有一级。** 一个主表可以有多个子表,但子表不能再套子表。所以「嵌套子表」不是 CLI 的能力缺口,而是平台不存在的形态,别按这个方向设计需求。
|
|
713
|
+
- **被挡不等于做不了。** `blocked / unsupported` 通常意味着行为要路由到另一个代码所有者(配置 + 后端扩展)。
|
|
714
|
+
|
|
715
|
+
## 9. 安装(npm)
|
|
716
|
+
|
|
717
|
+
包名:**`@stalfh233/omc-cli`**(命令仍是 `omc`)。
|
|
718
|
+
|
|
719
|
+
已发布到公共 npm registry:
|
|
720
|
+
<https://www.npmjs.com/package/@stalfh233/omc-cli>
|
|
721
|
+
|
|
722
|
+
环境要求:Node.js 22.13+(`omc-core` 使用内置 `node:sqlite`)。
|
|
723
|
+
|
|
724
|
+
```bash
|
|
725
|
+
# 全局安装(推荐)
|
|
726
|
+
npm install -g @stalfh233/omc-cli@latest
|
|
727
|
+
|
|
728
|
+
# 验证
|
|
729
|
+
omc --version # 当前基线 0.4.100
|
|
730
|
+
omc setup && omc doctor
|
|
731
|
+
|
|
732
|
+
# 查看 npm 上的最新版本
|
|
733
|
+
npm view @stalfh233/omc-cli version
|
|
734
|
+
|
|
735
|
+
# 固定 / 升级版本
|
|
736
|
+
npm install -g @stalfh233/omc-cli@0.4.100
|
|
737
|
+
npm update -g @stalfh233/omc-cli
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
也可以只在当前项目里安装、用 `npx` 调用:
|
|
741
|
+
|
|
742
|
+
```bash
|
|
743
|
+
npm install @stalfh233/omc-cli
|
|
744
|
+
npx omc setup && npx omc doctor
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
> `omc-core` 是内部依赖,会随 `@stalfh233/omc-cli` 自动安装,不需要单独装。
|
|
748
|
+
>
|
|
749
|
+
> 现在还在 `0.4.x` 的阶段,能力覆盖和部分形状还会继续扩、继续调——我们会跟着实际使用不断打磨、修问题。
|
|
750
|
+
>
|
|
751
|
+
> `1.0.0` 之前,别把它当成冻结的契约。
|
|
752
|
+
|
|
753
|
+
## 10. 上手速查
|
|
754
|
+
|
|
755
|
+
```bash
|
|
756
|
+
omc setup && omc doctor && omc commands --json
|
|
757
|
+
|
|
758
|
+
omc help # 命令清单 + 方法论 topic 清单
|
|
759
|
+
omc help --search "<词>" # 跨 topic 找具体事实
|
|
760
|
+
omc next "我想做一个审批流程" # 目标 → 工具一步定位
|
|
761
|
+
omc capabilities # 16 能力一张表
|
|
762
|
+
omc capability model --executable # 单能力完整执行包
|
|
763
|
+
omc describe <tool> # 单工具 schema + 可运行示例
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
**在什么目录运行?**
|
|
767
|
+
|
|
768
|
+
把 omc 当工具用时,请在**独立、干净的项目目录**里运行,不要放在 OMC 研发仓里。
|
|
769
|
+
|
|
770
|
+
否则 Agent 可能读到只属于研发的产物(`.scratch/`、`CONTEXT.md` 等),误当成使用指引。
|
|
771
|
+
|
|
772
|
+
## 11. 术语速记
|
|
773
|
+
|
|
774
|
+
- **覆盖清单(coverage manifest)**:随包的能力契约,`executable / partial / blocked / static-only / unsupported` 五态。
|
|
775
|
+
- **交付态(delivery state)**:写入后权威读回得到的真实状态,是「配好了」的唯一判据。
|
|
776
|
+
- **artifact**:大读回外置的、带 sha256 的 0600 文件。
|
|
777
|
+
- **plan / planHash**:intent 编译出的不可变复核对象。
|
|
778
|
+
- **写租约(write lease)**:同环境写入的跨进程互斥。
|
|
779
|
+
- **最小路径(minimal path)**:某类需求实际需要的最短发现→草稿→写→读回路线,是用量分析的对照基线。
|
|
780
|
+
|
|
781
|
+
## 12. 附录:全部工具清单
|
|
782
|
+
|
|
783
|
+
> 以 `omc commands --json` 为准;下面是按能力分组的当前快照(154 个)。
|
|
784
|
+
|
|
785
|
+
**元 / 治理(6)**
|
|
786
|
+
|
|
787
|
+
`coverage.manifest` · `get_status` · `setup.start` · `setup.commit` · `doctor` · `apply_changes`
|
|
788
|
+
|
|
789
|
+
**environment 环境治理(2)**
|
|
790
|
+
|
|
791
|
+
`discover_environment` · `environment.fingerprint`
|
|
792
|
+
|
|
793
|
+
**app 应用(4)**
|
|
794
|
+
|
|
795
|
+
`app.list` · `app.create` · `app.update` · `app.delete`
|
|
796
|
+
|
|
797
|
+
**folder 应用目录 / 自定义页面(12)**
|
|
798
|
+
|
|
799
|
+
`folder.tree` · `folder.create` · `folder.update` · `folder.delete` · `custompage.list` · `custompage.get` · `custompage.create` · `custompage.update` · `custompage.content.get` · `custompage.content.update` · `custompage.content.publish` · `custompage.delete`
|
|
800
|
+
|
|
801
|
+
**dictionary 数据字典(12)**
|
|
802
|
+
|
|
803
|
+
`dictionary.list` · `dictionary.type` · `dictionary.names` · `dictionary.get` · `dictionary.records` · `dictionary.save` · `dictionary.status` · `dictionary.usage` · `dictionary.parent` · `dictionary.classes` · `dictionary.class.save` · `dictionary.class.delete`
|
|
804
|
+
|
|
805
|
+
**model 业务模型(9)**
|
|
806
|
+
|
|
807
|
+
`model.list` · `model.inspect` · `model.create` · `model.delete` · `model.deleteMany` · `model.setSummary` · `model.update` · `model.move` · `configure_model`
|
|
808
|
+
|
|
809
|
+
**field 字段(5)**
|
|
810
|
+
|
|
811
|
+
`field.list` · `field.create` · `field.update` · `field.publish` · `field.delete`
|
|
812
|
+
|
|
813
|
+
**form 默认表单(5)**
|
|
814
|
+
|
|
815
|
+
`form.get` · `form.draft` · `form.publish` · `configure_form` · `form.runButton`
|
|
816
|
+
|
|
817
|
+
**listview 列表视图(5)**
|
|
818
|
+
|
|
819
|
+
`listview.get` · `listview.list` · `listview.create` · `listview.configure` · `listview.delete`
|
|
820
|
+
|
|
821
|
+
**datarule 字段级规则(4)**
|
|
822
|
+
|
|
823
|
+
`datarule.list` · `datarule.create` · `datarule.update` · `datarule.delete`
|
|
824
|
+
|
|
825
|
+
**businessrule 业务规则(5)**
|
|
826
|
+
|
|
827
|
+
`rule.list` · `rule.references` · `rule.get` · `rule.save` · `rule.node.update`
|
|
828
|
+
|
|
829
|
+
**rule-lifecycle 规则生命周期(6)**
|
|
830
|
+
|
|
831
|
+
`rule.enable` · `rule.disable` · `rule.delete` · `rule.run` · `rule.disableMany` · `configure_rule`
|
|
832
|
+
|
|
833
|
+
**workflow 流程模板(38)**
|
|
834
|
+
|
|
835
|
+
`workflow.get_draft` · `workflow.get_published` · `workflow.validate` · `workflow.create` · `workflow.update` · `workflow.publish` · `workflow.bindRule` · `workflow.setButtons` · `workflow.delete` · `configure_workflow` · `workitem.list` · `workflow.instanceActivity` · `workflow.permissions` · `workflow.addPermission` · `workflow.removePermission` · `org.role.list` · `org.department.list` · `org.user.search` · `org.role.users` · `org.role.userScope` · `org.roleGroup.create` · `org.role.create` · `org.department.create` · `org.department.update` · `org.department.delete` · `org.department.users` · `org.user.create` · `org.user.update` · `org.user.delete` · `org.user.info` · `org.user.departments` · `org.role.delete` · `org.roleGroup.delete` · `org.user.transferDepartment` · `org.role.update` · `org.role.addUsers` · `org.role.removeUsers` · `org.role.setUserScope`
|
|
836
|
+
|
|
837
|
+
**onlinejs 表单在线 JS(2)**
|
|
838
|
+
|
|
839
|
+
`onlinejs.get` · `onlinejs.compose`
|
|
840
|
+
|
|
841
|
+
**bizservice 业务集成(24)**
|
|
842
|
+
|
|
843
|
+
`service.get` · `service.list` · `method.get` · `method.update` · `method.create` · `method.delete` · `service.category.list` · `service.category.create` · `service.category.update` · `service.category.delete` · `service.dbconnpool.list` · `service.dbconnpool.create` · `service.dbconnpool.update` · `service.dbconnpool.delete` · `service.adapter_config` · `service.table_list` · `service.table_sql` · `service.register` · `service.update` · `service.delete` · `service.export` · `service.check` · `service.import` · `method.test`
|
|
844
|
+
|
|
845
|
+
**report 报表(9)**
|
|
846
|
+
|
|
847
|
+
`report.tree` · `report.get` · `report.chartdata` · `report.datasource.list` · `report.datasource.link` · `report.create` · `report.update` · `report.delete` · `report.configure`
|
|
848
|
+
|
|
849
|
+
**data 运行数据(6)**
|
|
850
|
+
|
|
851
|
+
`data.list` · `data.load` · `data.save` · `data.update` · `data.delete` · `data.submit`
|