@dazitech/cli 3.0.7 → 3.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +1 -1
  2. package/dist/clis/dazi-app.js +1 -1
  3. package/dist/clis/dazi-flow.js +1 -1
  4. package/dist/clis/dazi-onto.js +73 -22
  5. package/dist/clis/dazi.js +266 -171
  6. package/dist/docs/flow/flow-project-guide.md +1 -1
  7. package/dist/docs/guides/quickstart.md +18 -4
  8. package/dist/docs/guides/troubleshooting.md +12 -1
  9. package/dist/docs/guides/workspace-v3.md +43 -23
  10. package/dist/docs/index.json +28 -3
  11. package/dist/docs/onto/action-guide.md +3 -3
  12. package/dist/docs/onto/dazi_script_sdk_reference.md +244 -174
  13. package/dist/docs/onto/dazi_script_seed_data_guide.md +158 -155
  14. package/dist/docs/onto/function-guide.md +82 -27
  15. package/dist/docs/onto/space-management.md +3 -1
  16. package/dist/docs/onto//346/234/254/344/275/223/345/210/206/347/261/273/350/247/204/345/210/222/344/270/216SDK/346/211/251/345/261/225/346/226/271/346/241/210.md +168 -0
  17. package/dist/docs/onto//346/234/254/344/275/223/345/221/275/345/220/215/350/247/204/350/214/203_/347/211/251/347/220/206/350/241/250Cube/344/270/216/345/257/271/350/261/241.md +402 -0
  18. package/dist/docs/onto//346/234/254/344/275/223/350/204/232/346/234/254/347/274/226/345/206/231/346/214/207/345/215/227.md +200 -34
  19. package/dist/docs/onto//346/234/254/344/275/223/350/247/204/345/210/222/346/214/207/345/215/227.md +188 -38
  20. package/dist/docs/onto//350/204/232/346/234/254/350/277/220/350/241/214/347/272/240/351/224/231_/345/225/206/345/212/241/346/210/220/346/234/254/346/226/271/346/241/210/345/274/200/345/217/221/350/277/207/347/250/213.md +213 -0
  21. package/dist/docs/onto//350/247/204/345/210/222/347/244/272/344/276/213_/344/272/247/345/223/201/351/224/200/345/224/256/346/234/254/344/275/223/350/247/204/345/210/222/346/226/271/346/241/210.md +620 -0
  22. package/dist/docs/onto//350/247/204/345/210/222/347/244/272/344/276/213_/345/210/251/346/266/246/345/210/206/346/236/220/346/234/254/344/275/223/346/226/271/346/241/210.md +680 -541
  23. package/dist/examples/index.json +208 -22
  24. package/dist/examples/onto/README.md +51 -0
  25. package/dist/examples/onto/_templates/ontology_function_template.py +50 -0
  26. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_account_breakdown.py +62 -0
  27. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_budget_vs_actual.py +69 -0
  28. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_cost_center_profit.py +64 -0
  29. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_get_summary.py +61 -0
  30. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_mom_analysis.py +82 -0
  31. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_top_accounts.py +61 -0
  32. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_yoy_analysis.py +79 -0
  33. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/save_test_arguments.ps1 +38 -0
  34. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.account_breakdown.json +1 -0
  35. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.budget_vs_actual.json +1 -0
  36. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.cost_center_profit.json +1 -0
  37. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.get_summary.json +1 -0
  38. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.mom_analysis.json +1 -0
  39. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.top_accounts.json +1 -0
  40. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.yoy_analysis.json +1 -0
  41. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/setup/profit_ontology_init.py +679 -0
  42. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/setup/profit_seed_data.py +216 -0
  43. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_channel_mix.py +89 -0
  44. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_customer_segmentation.py +121 -0
  45. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_get_summary.py +78 -0
  46. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_mom_analysis.py +89 -0
  47. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_region_breakdown.py +84 -0
  48. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_top_products.py +98 -0
  49. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_yoy_analysis.py +87 -0
  50. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/save_test_arguments.ps1 +38 -0
  51. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.channel_mix.json +5 -0
  52. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.customer_segmentation.json +5 -0
  53. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.get_summary.json +5 -0
  54. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.mom_analysis.json +5 -0
  55. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.region_breakdown.json +5 -0
  56. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.top_products.json +5 -0
  57. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.yoy_analysis.json +5 -0
  58. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/setup/sales_ontology_init.py +539 -0
  59. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/setup/sales_seed_data.py +163 -0
  60. package/dist/prompts/index.json +2 -2
  61. package/dist/prompts/onto/action-design.md +4 -1
  62. package/dist/prompts/onto/function-design.md +46 -19
  63. package/dist/prompts/onto/rule-seed.md +5 -1
  64. package/dist/prompts/onto/script-publish-run.md +87 -25
  65. package/package.json +1 -1
  66. package/dist/examples/onto/function/profit_fn_customer_segmentation.py +0 -117
  67. package/dist/examples/onto/function/profit_fn_mom_analysis.py +0 -89
  68. package/dist/examples/onto/function/profit_fn_top_products.py +0 -89
  69. package/dist/examples/onto/function/profit_fn_yoy_analysis.py +0 -89
  70. package/dist/examples/onto/setup/profit_ontology_init.py +0 -388
@@ -1,174 +1,244 @@
1
- # DaziScript SDK 参考
2
-
3
- **文档 ID**: `onto/dazi-script-sdk-reference`
4
- **适用**: dazi-vscode v3 + 搭子平台 DaziScript(ClickHouse 数据空间)
5
-
6
- > 给 LLM 与开发者提供精简、可执行的 SDK 规范。脚本目录、类型与 **`dazi onto script publish`** 等见 **[本体脚本编写指南](./本体脚本编写指南.md)**。
7
-
8
- ## 1. 工作区与脚本放置(dazi-vscode)
9
-
10
- | 用途 | 路径 |
11
- | -------------------- | ----------------------------------------------------------------------------------------------------------- |
12
- | **日常开发**(推荐) | `<工作区根>/项目/onto_<项目名>/脚本/*.py` |
13
- | **空间 ID** | `项目/onto_<项目名>/README.md` 中的数据空间 ID |
14
- | **参考示例** | `资源/examples/onto/setup/`、`资源/examples/onto/function/`(侧栏 **帮助 → 示例** 或 `dazi examples sync`) |
15
- | **本文档** | `资源/docs/onto/dazi_script_sdk_reference.md`(`dazi docs sync` 后) |
16
-
17
- - **禁止**将 `onto/<space_id>/editorial/` 作为 v3 本地开发约定(历史路径,仅 CLI `script sync` 可能拉回平台副本)。
18
- - 脚本入口仅需定义 **`main()`**;平台执行时自动调用,**不要**写 `if __name__ == "__main__":`。
19
-
20
- ## 2. 基本约束
21
-
22
- - 数据引擎:**ClickHouse**
23
- - 新建空间须显式指定(若脚本内创建空间):
24
- - `storage_engine="clickhouse"`
25
- - `connection_config={"database": "<db_name>"}`
26
- - 执行前确认已登录(`dazi auth whoami`)且 `dazi.serverUrl` 正确。
27
-
28
- ## 3. 顶层对象与推荐调用
29
-
30
- 常用对象:
31
-
32
- - `space`:空间管理与切换
33
- - `s.sql`:原始 SQL
34
- - `s.tables`:表注册与列同步
35
- - `s.register_cube(...)`:Cube 注册
36
- - `s.onto`:本体定义(对象、属性、链接、函数、活动)
37
- - `s.ontology`:对象中心能力(objects/features)
38
- - `s.ontology_rules`:规则集与规则
39
- - `s.scripts`:脚本记录管理
40
- - `output`:打印与成功提示(`output.print` / `output.success`)
41
-
42
- 命名规范(便于 LLM 推断):
43
-
44
- - 读操作:`exists_*`、`get_*`、`require_*`、`list_*`
45
- - 写操作:`create_*`、`ensure_*`、`update_*`、`delete_*`
46
- - 派生/同步:`create_from_*`、`sync_*`
47
-
48
- 推荐本体落库路径(与 **[本体规划指南](./本体规划指南.md)** 一致):
49
-
50
- 1. `s.onto.define_object_type` → `s.onto.bind_source(..., "dazi_cube", config={"cube": ...})`
51
- 2. `s.onto.define_property`(`dimension` / `measure` 须带与 Cube 成员一致的 `qualified_name`)
52
- 3. `s.onto.define_link_type`(两端为对象类型 **`code`**,非 Cube 名)
53
- 4. `s.onto.register_function` / `s.onto.define_action`
54
- 5. `s.ontology.features.attach(object_code, feature_type, feature_id)`(`feature_type`: `function | action | rule`)
55
-
56
- **关于 `s.ontology.objects.create_from_cubes`**:SDK 仍提供,**易与业务语义脱节**;规划文档、示例包与交付脚本**不应依赖**。仅隔离烟测按需使用。
57
-
58
- ## 4. 返回结构规范
59
-
60
- ### 4.1 批量派生返回(ResultBatch)
61
-
62
- ```json
63
- {
64
- "ok": true,
65
- "created": [],
66
- "updated": [],
67
- "skipped": [],
68
- "errors": [],
69
- "summary": {
70
- "requested": 0,
71
- "created": 0,
72
- "updated": 0,
73
- "skipped": 0,
74
- "errors": 0
75
- }
76
- }
77
- ```
78
-
79
- ### 4.2 特征绑定返回(示例)
80
-
81
- ```json
82
- {
83
- "ok": true,
84
- "id": "xxx",
85
- "created": true,
86
- "updated": false,
87
- "message": ""
88
- }
89
- ```
90
-
91
- ## 5. 模块速查
92
-
93
- ### 5.1 `space`
94
-
95
- - `s = space.create(name, space_id=None, storage_engine="clickhouse", connection_config={"database": ...}, ...)`
96
- - `s = space.get(name_or_id)`
97
- - `space.use(handle_or_name)`
98
-
99
- ### 5.2 `s.sql`
100
-
101
- - `s.sql.query(sql)` / `s.sql.query_one(sql)` / `s.sql.execute(sql)`
102
- - `s.sql.insert_rows(table, rows)`(`rows` 为 `list[dict]`)
103
-
104
- **ClickHouse:`INSERT ... VALUES` 与注释**
105
-
106
- - **`VALUES` 与各元组之间禁止 SQL 行注释 `--`**,否则易出现 `Code: 27` 等解析错误。
107
- - **推荐**:大批量灌数用 **`s.sql.insert_rows`**;详见 **[dazi_script_seed_data_guide](./dazi_script_seed_data_guide.md)**。
108
-
109
- ### 5.3 `s.tables`
110
-
111
- - `s.tables.register(table_name, label=...)`
112
- - `s.tables.sync_columns(table_name)`
113
- - `s.tables.list()` / `s.tables.discover()`
114
- - `s.tables.add_relationship(...)`
115
-
116
- ### 5.4 Cube
117
-
118
- - `s.register_cube(name, table, title, measures, dimensions)`
119
-
120
- ### 5.5 `s.onto`
121
-
122
- - `s.onto.define_object_type(code, name, ...)`
123
- - `s.onto.bind_source(object_type_code, "dazi_cube", config={"cube": "CubeName"})`
124
- - `s.onto.define_property(...)`
125
- - `s.onto.define_link_type(code, name, from_object_type_code, to_object_type_code, ...)`
126
- - `s.onto.register_function(function_id, adapter, ...)`
127
- - `s.onto.define_action(action_code, ...)`
128
-
129
- ### 5.6 `s.ontology` / `s.ontology_rules` / `s.scripts`
130
-
131
- 见上文;规则:`ensure_rule_set` + `upsert_rule`;脚本记录:`create` / `ensure` / `list` 等。
132
-
133
- ## 6. 标准初始化流程(建议)
134
-
135
- 1. 确认 `space_id`(项目 README)
136
- 2. 建表与灌数(`s.sql`;灌数规范见 seed 指南)
137
- 3. `s.tables.register` + `sync_columns`
138
- 4. `s.register_cube`
139
- 5. `s.onto` 定义对象、属性、链接
140
- 6. 注册函数/动作并 `features.attach`
141
- 7. 配置规则(如需要)
142
-
143
- ## 7. 在 dazi-vscode 中发布与运行
144
-
145
- 开发完成后,在工作区根目录:
146
-
147
- ```bash
148
- # 预检
149
- dazi onto script publish-preview 项目/onto_<项目名>/脚本/my_setup.py --space <space-id>
150
-
151
- # 发布(初始化/灌数类脚本)
152
- dazi onto script publish 项目/onto_<项目名>/脚本/my_setup.py --space <space-id>
153
-
154
- # 发布并注册为本体函数
155
- dazi onto script publish 项目/onto_<项目名>/脚本/my_func.py \
156
- --space <space-id> \
157
- --register-function-id my_func
158
-
159
- # 运行已入库函数
160
- dazi onto function run my_func --space <space-id> --params '{}'
161
- ```
162
-
163
- 亦可用侧栏 **Onto 本体** 发布函数 / 运行函数。
164
-
165
- ## 8. 回归与 JSON 摘要
166
-
167
- - 支持 `--json` 时,输出前缀统一:`__JSON_SUMMARY__`
168
- - 0 退出码即失败
169
- - 会改写数据的步骤须提供跳过/禁用开关
170
-
171
- **内置参考示例**(在用户工作区:**侧栏 帮助 → 示例 → 下载所有示例**,或执行 `dazi examples sync`,得到 **`资源/examples/`**;可复制到 **`项目/<onto_项目名>/脚本/`** 再改,勿直接改写同步下来的只读备份):
172
-
173
- - 初始化:**`<工作区根>/资源/examples/onto/setup/profit_ontology_init.py`**
174
- - 函数样例:**`<工作区根>/资源/examples/onto/function/profit_fn_*.py`**
1
+ # DaziScript SDK 参考
2
+
3
+ **文档 ID**: `onto/dazi-script-sdk-reference`
4
+ **适用**: dazi-vscode v3 + 搭子平台 DaziScript(ClickHouse 数据空间)
5
+
6
+ > 给 LLM 与开发者提供精简、可执行的 SDK 规范。脚本目录、类型与 **`dazi onto script publish`** 等见 **[本体脚本编写指南](./本体脚本编写指南.md)**。
7
+ > **执行脚本前必读(强制)**:[脚本运行纠错](./脚本运行纠错_商务成本方案开发过程.md)。
8
+
9
+ ## 1. 工作区与脚本放置(dazi-vscode)
10
+
11
+ | 用途 | 路径 |
12
+ | -------------------- | ----------------------------------------------------------------------------------------------------------- |
13
+ | **日常开发**(推荐) | `<工作区根>/项目/<业务名>/本体/ontos/<实现名>/setup/*.py`(初始化、灌数) |
14
+ | | `<工作区根>/项目/<业务名>/本体/ontos/<实现名>/functions/*.py`(本体函数、动作) |
15
+ | **空间 ID** | `项目/<业务名>/本体/ontos/<实现名>/README.md` 中的数据空间 ID |
16
+ | **参考示例** | **`资源/examples/onto/利润示例/`**、**`资源/examples/onto/销售示例/`**(侧栏 **帮助 → 示例** 或 `dazi examples sync`;总览 `onto/README.md`) |
17
+ | **本文档** | `资源/docs/onto/dazi_script_sdk_reference.md`(`dazi docs sync` 后) |
18
+
19
+ - **禁止**将 `onto/<space_id>/editorial/` 作为 v3 本地开发约定(历史路径,仅 CLI `script sync` 可能拉回平台副本)。
20
+ - 脚本入口仅需定义 **`main()`**;平台执行时自动调用,**不要**写 `if __name__ == "__main__":`。
21
+
22
+ ## 2. 基本约束
23
+
24
+ - 数据引擎:**ClickHouse**
25
+ - 新建空间须显式指定(若脚本内创建空间):
26
+ - `storage_engine="clickhouse"`
27
+ - `connection_config={"database": "<db_name>"}`
28
+ - 执行前确认已登录(`dazi auth whoami`)且 `dazi.serverUrl` 正确。
29
+
30
+ ## 3. 顶层对象与推荐调用
31
+
32
+ 常用对象:
33
+
34
+ - `space`:空间管理与切换
35
+ - `s.sql`:原始 SQL
36
+ - `s.tables`:表注册与列同步
37
+ - `s.register_cube(...)`:Cube 注册
38
+ - `s.onto`:本体定义(对象、属性、链接、函数、活动)
39
+ - `s.ontology`:对象中心能力(objects/features)
40
+ - `s.ontology_rules`:规则集与规则
41
+ - `s.scripts`:脚本记录管理
42
+ - `output`:打印与成功提示(`output.print` / `output.success`)
43
+
44
+ 命名规范(便于 LLM 推断):
45
+
46
+ - 读操作:`exists_*`、`get_*`、`require_*`、`list_*`
47
+ - 写操作:`create_*`、`ensure_*`、`update_*`、`delete_*`
48
+ - 派生/同步:`create_from_*`、`sync_*`
49
+
50
+ 推荐本体落库路径(与 **[本体规划指南](./本体规划指南.md)** 一致):
51
+
52
+ 1. `s.onto.define_object_type` `s.onto.bind_source(..., "dazi_cube", config={"cube": ...})`
53
+ 2. `s.onto.define_property`(`dimension` / `measure` 须带与 Cube 成员一致的 `qualified_name`)
54
+ 3. `s.onto.define_link_type`(两端为对象类型 **`code`**,非 Cube 名)
55
+ 4. `s.onto.register_function` / `s.onto.define_action`
56
+ 5. `s.ontology.features.attach(object_code, feature_type, feature_id)`(`feature_type`: `function | action | rule`)
57
+
58
+ **关于 `s.ontology.objects.create_from_cubes`**:SDK 仍提供,**易与业务语义脱节**;规划文档、示例包与交付脚本**不应依赖**。仅隔离烟测按需使用。
59
+
60
+ ## 4. 返回结构规范
61
+
62
+ ### 4.1 批量派生返回(ResultBatch)
63
+
64
+ ```json
65
+ {
66
+ "ok": true,
67
+ "created": [],
68
+ "updated": [],
69
+ "skipped": [],
70
+ "errors": [],
71
+ "summary": {
72
+ "requested": 0,
73
+ "created": 0,
74
+ "updated": 0,
75
+ "skipped": 0,
76
+ "errors": 0
77
+ }
78
+ }
79
+ ```
80
+
81
+ ### 4.2 特征绑定返回(示例)
82
+
83
+ ```json
84
+ {
85
+ "ok": true,
86
+ "id": "xxx",
87
+ "created": true,
88
+ "updated": false,
89
+ "message": ""
90
+ }
91
+ ```
92
+
93
+ ## 5. 模块速查
94
+
95
+ ### 5.1 `space`
96
+
97
+ - `s = space.create(name, space_id=None, storage_engine="clickhouse", connection_config={"database": ...}, ...)`
98
+ - `s = space.get(name_or_id)`
99
+ - `space.use(handle_or_name)`
100
+
101
+ ### 5.2 `s.sql`
102
+
103
+ - `s.sql.query(sql)` / `s.sql.query_one(sql)` / `s.sql.execute(sql)`
104
+ - `s.sql.insert_rows(table, rows)`(`rows` 为 `list[dict]`)
105
+
106
+ **`query_one` 与多列聚合**
107
+
108
+ - `query_one` 适合 `SELECT count()` 等**单列标量**;对 `SELECT sum(a), count(b) ...` 等多列聚合,**勿**对返回值调用 `.get()`(可能得到 float 而非 dict)。
109
+ - **推荐**:`rows = s.sql.query(sql); row = rows[0] if rows else {}`(函数脚本内为 `p.sql.query`)。详见 [脚本运行纠错](./脚本运行纠错_商务成本方案开发过程.md#2-函数聚合查询返回类型错误)。
110
+
111
+ ### 5.2.1 本体函数输出(`ontology_function`)
112
+
113
+ setup/seed 不同,本体函数运行时平台注入 `ctx`、`space`、`onto`:
114
+
115
+ | 要点 | 说明 |
116
+ | ---- | ---- |
117
+ | 入口 | `def main():`(**无** `params` 形参) |
118
+ | 入参 | `ctx.params` `p.get_params()` |
119
+ | 出参 | **`return p.function_result(columns=..., data=..., row_count=...)`** |
120
+ | 禁止 | `output.print_json()`(`OutputModule` 无此方法)、裸 `return {"k": v}` |
121
+
122
+ 标准模板:`资源/examples/onto/_templates/ontology_function_template.py`。详见 [function-guide](./function-guide.md#函数脚本结构标准模板)、[脚本运行纠错 §3](./脚本运行纠错_商务成本方案开发过程.md#3-函数输出方式错误outputprint_json)
123
+
124
+ **ClickHouse:`INSERT ... VALUES` 与注释**
125
+
126
+ - **`VALUES` 与各元组之间禁止 SQL 行注释 `--`**,否则易出现 `Code: 27` 等解析错误。
127
+ - **推荐**:大批量灌数用 **`s.sql.insert_rows`**;详见 **[dazi_script_seed_data_guide](./dazi_script_seed_data_guide.md)**。
128
+
129
+ ### 5.3 `s.tables`
130
+
131
+ - `s.tables.register(table_name, display_name=..., description=..., label=..., category_347=...)` `label` `display_name` 简写别名;已注册时可刷新表显示名与说明;`category_347` 为 347 标准中文名(如 `"维度表"`),注册后**即时挂载**平台分类
132
+ - `s.tables.sync_columns(table_name)` — 从物理库同步列;未显式传入元数据时仅**推断** `display_name`(token 词典),**不**写入业务 `description`
133
+ - `s.tables.set_column_meta(table_name, columns=[{name, display_name, description, business_role}], force=False)` — 批量写入列显示名与说明(须先 register + sync_columns)
134
+ - `s.tables.register_with_meta(table_name, display_name=..., description=..., columns=[...], force_column_meta=False, category_347=...)` — 上三者合一(**推荐** setup 脚本使用)
135
+ - `s.tables.list()` / `s.tables.discover()`
136
+ - `s.tables.add_relationship(from_table, to_table, join_sql, relationship_type="many_to_one", join_keys=None, description=None, category_347=...)` — 注册**数据空间表间关系**(幂等);`category_347` 如 `"主数据关联"`、`"时间关联"`
137
+
138
+ ### 5.4 Cube
139
+
140
+ - `s.register_cube(name, table, title, measures, dimensions, category_347=...)``category_347` 如 `"流程型"`、`"主体型"`
141
+
142
+ ### 5.5 `s.onto`
143
+
144
+ - `s.onto.define_object_type(code, name, ..., category_347=...)` — 如 `category_347="主数据"`
145
+ - `s.onto.bind_source(object_type_code, "dazi_cube", config={"cube": "CubeName"})`
146
+ - `s.onto.define_property(...)`
147
+ - `s.onto.define_link_type(code, name, from_object_type_code, to_object_type_code, ..., category_347=...)` — 如 `category_347="归属关系"`
148
+ - `s.onto.register_function(function_id, adapter, ..., category_347=...)` — 如 `category_347="总览分析"`
149
+ - `s.onto.define_action(action_code, ...)`
150
+
151
+ **常见误用**(setup 脚本):不存在 `s.onto.sync_metrics()`、`s.cubes.upsert`;`define_object_type` 第二参数为 `name` 非 `label`;链接类型参数为 `from_object_type_code` / `to_object_type_code`。对照表见 [脚本运行纠错](./脚本运行纠错_商务成本方案开发过程.md#1-setup-脚本-api-误用多次尝试才正确)。
152
+
153
+ ### 5.6 `s.categories`(347 对齐分类)
154
+
155
+ 挂载到 `ads_categories` 默认根下的平级目录,桥表关联表/Cube/对象/关系/链接/函数。分类名必须与 [347 规范](./本体命名规范_物理表Cube与对象.md) 标准中文名一致。详见 [349 方案](./本体分类规划与SDK扩展方案.md)。
156
+
157
+ - `s.categories` — `CategoryManager` 实例(按空间懒加载)
158
+ - `s.categories.ensure_347(kind, category)` — 确保平级分类目录存在(幂等);`kind` 支持 `table` / `cube` / `object` / `relation` / `link` / `function`
159
+ - `s.categories.assign_table(category, table_name)` — 挂载物理表
160
+ - `s.categories.assign_cube(category, cube_name)` 挂载 Cube
161
+ - `s.categories.assign_object(category, object_type_code)` — 挂载对象类型
162
+ - `s.categories.assign_relation(category, from_table, to_table)` — 挂载表间关系
163
+ - `s.categories.assign_link(category, link_code)` 挂载链接类型
164
+ - `s.categories.assign_function(category, function_id)` — 挂载本体函数(如 `profit.fn.get_summary`)
165
+ - `s.categories.auto_assign_tables(table_names)` 按表名前缀自动推断 347 类别并挂载
166
+ - `s.categories.apply_registry(CATEGORY_REGISTRY, skip_missing=True)` — 批量应用 init 顶部注册表
167
+
168
+ **`CATEGORY_REGISTRY` 结构**(与规划附录 B 对齐):
169
+
170
+ ```python
171
+ CATEGORY_REGISTRY = {
172
+ "table": {"维度表": ["dim_account"], "事实表": ["fact_gl_journal_entry"]},
173
+ "cube": {"流程型": ["ActualCube"], "主体型": ["AccountActualCube"]},
174
+ "object": {"主数据": ["Account"], "事务": ["JournalEntry"], "分析": ["ProfitAnalysis"]},
175
+ "relation": {"时间关联": [("fact_x", "dim_date")], "主数据关联": [("fact_x", "dim_y")]},
176
+ "link": {"归属关系": ["entry_belongs_account"], "分析归因": ["analysis_by_account"]},
177
+ "function": {"总览分析": ["profit.fn.get_summary"]}, # 函数未注册时须 skip_missing=True
178
+ }
179
+ ```
180
+
181
+ **两种用法**(可并存,挂载幂等):
182
+
183
+ 1. **批量**(推荐 init 末尾):`s.categories.apply_registry(CATEGORY_REGISTRY, skip_missing=True)`
184
+ 2. **内联**(注册时即时挂载):
185
+
186
+ ```python
187
+ s.tables.register_with_meta("dim_product", display_name="产品维表", category_347="维度表", ...)
188
+ s.register_cube("SalesCube", table=fact, title="...", category_347="流程型", ...)
189
+ s.onto.define_object_type("Product", "产品", category_347="主数据")
190
+ s.tables.add_relationship(..., category_347="主数据关联")
191
+ s.onto.define_link_type("order_contains_product", "...", ..., category_347="归属关系")
192
+ ```
193
+
194
+ ### 5.7 `s.ontology` / `s.ontology_rules` / `s.scripts`
195
+
196
+ 见上文;规则:`ensure_rule_set` + `upsert_rule`;脚本记录:`create` / `ensure` / `list` 等。
197
+
198
+ ## 6. 标准初始化流程(建议)
199
+
200
+ 1. 确认 `space_id`(实现单元 README)
201
+ 2. 建表与灌数(`s.sql`;灌数规范见 seed 指南)
202
+ 3. `s.tables.register_with_meta`(`TABLE_REGISTRY` 含表/列 `display_name`、`description`)
203
+ 4. **`s.tables.add_relationship`**(与规划「表间关系」一致;**勿省略**)
204
+ 5. `s.register_cube`
205
+ 6. `s.onto` 定义对象、属性、链接
206
+ 7. 注册函数/动作并 `features.attach`;**发布后** CLI `save-test-arguments` 写入 `test_arguments`(见 [function-guide](./function-guide.md))
207
+ 8. `s.categories.apply_registry(CATEGORY_REGISTRY, skip_missing=True)`(347 对齐分类)
208
+ 9. 配置规则(如需要)
209
+
210
+ ## 7. 在 dazi-vscode 中发布与运行
211
+
212
+ 开发完成后,在工作区根目录:
213
+
214
+ ```bash
215
+ # 预检
216
+ dazi onto script publish-preview 项目/<业务名>/本体/ontos/<实现名>/setup/my_setup.py --space <space-id>
217
+
218
+ # 发布(初始化/灌数类脚本)
219
+ dazi onto script publish 项目/<业务名>/本体/ontos/<实现名>/setup/my_setup.py --space <space-id>
220
+
221
+ # 发布并注册为本体函数
222
+ dazi onto script publish 项目/<业务名>/本体/ontos/<实现名>/functions/my_func.py \
223
+ --space <space-id> \
224
+ --register-function-id my_func
225
+
226
+ # 运行已入库函数
227
+ dazi onto function run my_func --space <space-id> --params '{}'
228
+ ```
229
+
230
+ 亦可用侧栏 **Onto 本体** → 发布函数 / 运行函数。
231
+
232
+ ## 8. 回归与 JSON 摘要
233
+
234
+ - 支持 `--json` 时,输出前缀统一:`__JSON_SUMMARY__`
235
+ - 非 0 退出码即失败
236
+ - 会改写数据的步骤须提供跳过/禁用开关
237
+
238
+ **内置参考示例**(在用户工作区:**侧栏 帮助 → 示例 → 下载所有示例**,或执行 `dazi examples sync`,得到 **`资源/examples/`**;可复制到 **`项目/<业务名>/本体/ontos/<实现名>/setup/`** 或 **`functions/`** 再改,勿直接改写同步下来的只读备份):
239
+
240
+ - **规划全文(推荐)**:**`资源/docs/onto/规划示例_产品销售本体规划方案.md`**(含表间关系、test_arguments)
241
+ - **完整落地参考**(init / seed / 7 个 sales 函数):**`项目/潘达石化/本体/ontos/产品销售本体方案/`**
242
+ - **利润示例(GL 域)**:`资源/examples/onto/利润示例/setup/profit_ontology_init.py`、`profit_seed_data.py`、`functions/profit_fn_*.py`、`functions/test_arguments/`
243
+ - **销售示例(推荐,含表间关系 + test_arguments)**:`资源/examples/onto/销售示例/setup/sales_ontology_init.py`、`sales_seed_data.py`、`functions/sales_fn_*.py`
244
+ - **脚本运行纠错(实录)**:`资源/docs/onto/脚本运行纠错_商务成本方案开发过程.md` — setup API、`query_one`、CLI test_arguments 踩坑