@dazitech/cli 3.0.0

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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +104 -0
  3. package/dist/bin/dazi-app.cjs +4 -0
  4. package/dist/bin/dazi-flow.cjs +4 -0
  5. package/dist/bin/dazi-onto.cjs +4 -0
  6. package/dist/bin/dazi.cjs +4 -0
  7. package/dist/bin/run-cli-bin.cjs +62 -0
  8. package/dist/clis/dazi-app.js +16697 -0
  9. package/dist/clis/dazi-flow.js +6093 -0
  10. package/dist/clis/dazi-onto.js +3948 -0
  11. package/dist/clis/dazi.js +5677 -0
  12. package/dist/docs/app/app-init.md +69 -0
  13. package/dist/docs/app/build-upload.md +77 -0
  14. package/dist/docs/app/release-guide.md +51 -0
  15. package/dist/docs/app//344/270/273/350/246/201/350/264/242/345/212/241/346/214/207/346/240/207/345/244/215/346/235/202/346/212/245/350/241/250/345/274/200/345/217/221/345/256/236/350/267/265.md +261 -0
  16. package/dist/docs/auth/auth-login.md +41 -0
  17. package/dist/docs/auth/token-management.md +42 -0
  18. package/dist/docs/data/cube-guide.md +23 -0
  19. package/dist/docs/data/data-spaces.md +30 -0
  20. package/dist/docs/data/table-preview.md +41 -0
  21. package/dist/docs/flow/flow-project-guide.md +505 -0
  22. package/dist/docs/flow/flows-guide.md +302 -0
  23. package/dist/docs/flow/node-code-guide.md +399 -0
  24. package/dist/docs/flow/plan-guide.md +59 -0
  25. package/dist/docs/flow/run-guide.md +98 -0
  26. package/dist/docs/flow/source-guide.md +44 -0
  27. package/dist/docs/flow/variables-guide.md +406 -0
  28. package/dist/docs/flow//346/265/201/347/250/213/345/274/200/345/217/221/346/234/200/344/275/263/345/256/236/350/267/265-VS-flow0/346/241/210/344/276/213.md +344 -0
  29. package/dist/docs/guides/cli-invocation.md +93 -0
  30. package/dist/docs/guides/cli-reference.md +98 -0
  31. package/dist/docs/guides/mcp-setup.md +89 -0
  32. package/dist/docs/guides/migrate-v2-v3.md +54 -0
  33. package/dist/docs/guides/quickstart.md +77 -0
  34. package/dist/docs/guides/troubleshooting.md +82 -0
  35. package/dist/docs/guides/workspace-v3.md +53 -0
  36. package/dist/docs/index.json +204 -0
  37. package/dist/docs/onto/action-guide.md +48 -0
  38. package/dist/docs/onto/dazi_script_sdk_reference.md +168 -0
  39. package/dist/docs/onto/dazi_script_seed_data_guide.md +155 -0
  40. package/dist/docs/onto/function-guide.md +68 -0
  41. package/dist/docs/onto/rule-guide.md +52 -0
  42. package/dist/docs/onto/space-management.md +46 -0
  43. 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 +145 -0
  44. package/dist/docs/onto//346/234/254/344/275/223/350/247/204/345/210/222/346/214/207/345/215/227.md +131 -0
  45. 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 +541 -0
  46. package/dist/examples/index.json +36 -0
  47. package/dist/examples/onto/function/profit_fn_customer_segmentation.py +117 -0
  48. package/dist/examples/onto/function/profit_fn_mom_analysis.py +89 -0
  49. package/dist/examples/onto/function/profit_fn_top_products.py +89 -0
  50. package/dist/examples/onto/function/profit_fn_yoy_analysis.py +89 -0
  51. package/dist/examples/onto/setup/profit_ontology_init.py +388 -0
  52. package/dist/prompts/app/ui-design.md +48 -0
  53. package/dist/prompts/data/data-analysis.md +42 -0
  54. package/dist/prompts/data/sql-query.md +36 -0
  55. package/dist/prompts/flow/flow-design.md +77 -0
  56. package/dist/prompts/flow/plan-generate.md +61 -0
  57. package/dist/prompts/flow/run-debug.md +66 -0
  58. package/dist/prompts/flow/run-fix-loop.md +77 -0
  59. package/dist/prompts/general/ask-dazi.md +30 -0
  60. package/dist/prompts/general/code-review.md +31 -0
  61. package/dist/prompts/general/troubleshoot.md +41 -0
  62. package/dist/prompts/index.json +20 -0
  63. package/dist/prompts/onto/action-design.md +47 -0
  64. package/dist/prompts/onto/function-design.md +44 -0
  65. package/dist/prompts/onto/rule-seed.md +41 -0
  66. package/dist/prompts/onto/script-publish-run.md +146 -0
  67. package/package.json +27 -0
@@ -0,0 +1,399 @@
1
+ # 节点代码编写指南
2
+
3
+ **文档 ID**: `flow/node-code-guide`
4
+ **适用**: `项目/flow_*/流程/<名>/节点/<节点名>/code.*`
5
+ **前置**: [数据流程项目开发指南](./flow-project-guide.md)、[流程变量系统指南](./variables-guide.md)、**[Flow 文档索引 §流程节点组件](./flows-guide.md#流程节点组件)**(全部可用节点)
6
+
7
+ ---
8
+
9
+ ## 1. 哪些节点有代码文件
10
+
11
+ > 完整 **14 种** 可用 `data.type`(含无代码节点)见 [flows-guide §流程节点组件](./flows-guide.md#流程节点组件)。
12
+
13
+ | 业务类型 `data.type` | 本地文件 | 平台存储 |
14
+ |---------------------|----------|----------|
15
+ | `sql-query` | `code.sql` | `flow_nodes.code_body` |
16
+ | `database-source` | `code.sql` | 同上 |
17
+ | `dataspace-source` | `code.sql` | 同上 |
18
+ | `python-script` | `code.py` | 同上 |
19
+ | `excel-python` | `code.py` | 同上 |
20
+ | `condition` | `code.py` | 同上 |
21
+ | `data-quality-check` | `code.py`(键 `dqPythonCode`) | 同上 |
22
+
23
+ 纯配置节点(如 `database-sink`、`dataspace-sink`、`excel-import`、`delay`、`file-source` 等)**无** `code.*`,只在 `flow.json` 的 `data` 里配置;完整列表见 [flows-guide](./flows-guide.md#流程节点组件)。
24
+
25
+ **编辑入口**
26
+
27
+ - 资源管理器:右键 `节点/<名>/` → **打开节点代码**
28
+ - 设计器:选中节点 → **打开代码文件**
29
+ - 直接打开 `code.sql` / `code.py`
30
+
31
+ **提交入口**
32
+
33
+ - 右键 `code.*` → **提交节点** → `flow node push --node <node_uuid>`
34
+ - 或 **提交流程**(批量提交所有脏代码节点)
35
+
36
+ ---
37
+
38
+ ## 2. 修改代码的标准流程
39
+
40
+ ```powershell
41
+ # 1. 进入流程目录(dazi-work 根下)
42
+ cd "项目\flow_xxx\流程\MyFlow"
43
+
44
+ # 2. 编辑 节点/SQL查询/code.sql 等
45
+
46
+ # 3. 查看是否有本地改动
47
+ .\scripts\dazi.ps1 flow project status
48
+
49
+ # 4. 单节点测试(会先 GET debug-run,再 POST 单节点运行)
50
+ .\scripts\dazi.ps1 flow run node-exec --node <node_uuid> --dir .
51
+
52
+ # 5. 提交代码到平台
53
+ .\scripts\dazi.ps1 flow node push --node <node_uuid> --dir .
54
+ ```
55
+
56
+ `node_uuid` 在 `flow.meta.json` → `nodes.<uuid>`,或设计器属性面板、 `node.info.json` 中查看。
57
+ **单节点运行 API 使用语义 `nodeId`(画布 `id` 字段)**,CLI 的 `node-exec` 会用 meta 自动翻译。
58
+
59
+ 测试失败时阅读 **`_run/<节点名>.last-error.md`**(含错误分类与修复指引),确认后再交给 AI。
60
+
61
+ ---
62
+
63
+ ## 3. `sql-query` / `database-source` / `dataspace-source`(SQL)
64
+
65
+ **文件**: `code.sql`
66
+ **画布配置**(`flow.json` → 节点 `data`):
67
+
68
+ | 类型 | 关键字段 |
69
+ |------|----------|
70
+ | `database-source` | `connectionId`、`output_variable_name` |
71
+ | `dataspace-source` | `spaceId`、`output_variable_name` |
72
+ | `sql-query` | `output_variable_name`(消费上游表变量) |
73
+
74
+ > **变量用法**:`sql-query` 在 SQL 里把 **上游 `output_variable_name`** 当作 **表名**;`database-source` / `dataspace-source` 只 **产出** 变量、不消费 Run 内变量。详见 [流程变量系统指南 §6.1–6.2](./variables-guide.md#61-sql-queryduckdb-内存-sql)。
75
+
76
+ **约定**
77
+
78
+ - SQL 写在 **`code.sql`**,不要塞进 `flow.json` 的 `data.sql`(pull 后会剥离到文件)。
79
+ - `connectionId` 为 **`ads_connections` 的字符串 id**,用 `dazi-flow source list` 核对。
80
+ - `spaceId` 为 **`ads_dataspaces` 的 id**,用 `dazi-flow dataspace list` 核对。
81
+ - 执行结果以 **`output_variable_name`** 为名写入调试 Run(表变量)。
82
+
83
+ **模板(database-source:外部库 → 表变量)**
84
+
85
+ ```sql
86
+ -- output_variable_name = dim_product
87
+ SELECT product_id, product_name, category
88
+ FROM dim_product
89
+ WHERE is_active = 1
90
+ LIMIT 50000;
91
+ ```
92
+
93
+ **模板(dataspace-source:数据空间 DuckDB/ClickHouse → 表变量)**
94
+
95
+ ```sql
96
+ -- spaceId 在 flow.json;SQL 针对空间内已注册表
97
+ -- output_variable_name = sales_raw
98
+ SELECT *
99
+ FROM sales_fact
100
+ WHERE dt >= '2025-01-01'
101
+ LIMIT 100000;
102
+ ```
103
+
104
+ **模板(sql-query:消费上游表变量 → 新表变量)**
105
+
106
+ ```sql
107
+ -- 上游 output_variable_name = excel_raw
108
+ -- 本节点 output_variable_name = sales_agg
109
+ SELECT
110
+ 产品类别,
111
+ SUM(销售金额) AS 合计金额
112
+ FROM excel_raw
113
+ GROUP BY 产品类别;
114
+ ```
115
+
116
+ **多表 JOIN(变量名即表名)**
117
+
118
+ ```sql
119
+ -- 上游已产出 orders、customers
120
+ SELECT o.order_id, c.customer_name, o.amount
121
+ FROM orders o
122
+ JOIN customers c ON o.customer_id = c.customer_id;
123
+ ```
124
+
125
+ **测试**: 右键 → 测试运行节点;成功后用设计器 📊 或 `flow variable pull --name <output_variable_name>` 查看结果。
126
+
127
+ ---
128
+
129
+ ## 4. `python-script`(表 → 表)
130
+
131
+ **文件**: `code.py`
132
+ **画布**: 配置 **`output_variable_name`**(主输出表变量名)。
133
+
134
+ > **变量用法**:单节点测试用 **`get_variable('上游 output_variable_name')`**;整图跑时入边 **`df`** 可能有值。完整说明与多表示例见 [流程变量系统指南 §6.3](./variables-guide.md#63-python-script最常用)。
135
+
136
+ **运行时注入**
137
+
138
+ | 符号 | 说明 |
139
+ |------|------|
140
+ | `pd` | pandas |
141
+ | `df` | 来自入边 Parquet(整图跑时通常非空) |
142
+ | `get_variable("名")` | 从调试 Run 读上游表(**单节点测试时优先用这个**) |
143
+ | `set_table_output(name, df)` | 多表输出 |
144
+ | `result_df` | 主输出 DataFrame(与 `output_variable_name` 对应) |
145
+ | `output.print(...)` | 运行日志(**勿用裸 `print`**) |
146
+
147
+ **单节点测试要点**
148
+
149
+ 整图运行时 `df` 可能有值;**单节点调试**时常无入边 Parquet,`df` 为空,应:
150
+
151
+ ```python
152
+ # -*- coding: utf-8 -*-
153
+ # 上游 sql-query 的 output_variable_name = sales_agg
154
+ # 本节点 output_variable_name = py_result
155
+ import pandas as pd
156
+
157
+ output.print("[python-script] 开始")
158
+
159
+ df = get_variable("sales_agg") # 变量名须与上游画布配置完全一致
160
+ output.print(f"输入 shape={df.shape}, columns={list(df.columns)}")
161
+
162
+ result_df = df.groupby("产品类别", as_index=False)["合计金额"].sum()
163
+ output.print(f"输出 shape={result_df.shape}")
164
+ ```
165
+
166
+ **多表 + 入边回退**
167
+
168
+ ```python
169
+ import pandas as pd
170
+
171
+ if df is None or df.empty:
172
+ df = get_variable("sales_agg")
173
+ ref = get_variable("dim_product")
174
+ result_df = df.merge(ref, on="product_id", how="left")
175
+ set_table_output("merged_preview", result_df.head(100)) # 可选附加表
176
+ ```
177
+
178
+ **日志规范**(与平台约定一致)
179
+
180
+ - 开始 / 输入信息 / 关键变换 / 输出结果 / 结束 均用 `output.print`
181
+ - `except` 里先 `output.print` 再 `raise`
182
+
183
+ ---
184
+
185
+ ## 5. `excel-python`(Excel 开发 · **默认首选**)
186
+
187
+ > **选型**:文件上传管理中的 **`.xlsx` / `.xls`**(有 `managed_file_id`)**优先本节点**,**禁止**用 `file-source`(不解析 Excel)。仅极简单单 Sheet 零代码时才考虑 `excel-import`。
188
+
189
+ **文件**: `code.py`
190
+ **画布**(`flow.json` → 节点 `data`,**不是写在 code.py 里**):
191
+
192
+ | 字段 | 说明 |
193
+ |------|------|
194
+ | **`managed_file_id`** | 平台「文件上传管理」登记的 **UUID**(见 `资源/files/<名>_<id8>/文件信息.json` → `file_id`) |
195
+ | **`output_variable_name`** | 主输出表变量名;**必须与** `set_table_output` 第一个参数 **完全一致** |
196
+
197
+ ### 分工(AI 必守)
198
+
199
+ | 谁配置 | 配什么 | 禁止 |
200
+ |--------|--------|------|
201
+ | **`flow.json` / 设计器** | `managed_file_id` = UUID | 不要用文件名、相对路径、data upload 的 `id` |
202
+ | **`code.py`** | 用 **`excel_source_path`** 读 Excel | 不要 `open("xxx.xlsx")`、`pd.read_excel("D:/...")`、不要猜路径 |
203
+
204
+ 引擎根据 `managed_file_id` 查库得到物理路径,执行前注入:
205
+
206
+ | 变量 | 说明 |
207
+ |------|------|
208
+ | **`excel_source_path`** | 服务端 Excel **绝对路径**(代码里唯一正确的读文件方式) |
209
+ | **`excel_original_filename`** | 登记显示名(仅用于 `output.print` 日志) |
210
+ | `pd` | pandas |
211
+ | `set_table_output(name, df)` | 产出表变量(**必须**调用,主表名 = `output_variable_name`) |
212
+ | `output.print(...)` | 运行日志 |
213
+
214
+ **获取 `managed_file_id`**
215
+
216
+ 1. 侧栏 **数据资源 → 文件上传管理** → 拉取到 `资源/files/.../文件信息.json`
217
+ 2. 或 CLI:`.\scripts\dazi.ps1 flow managed-files list` / `managed-files pull --file-id <uuid>`
218
+
219
+ **`flow.json` 示例(画布配置)**
220
+
221
+ ```json
222
+ {
223
+ "id": "n-excel-1",
224
+ "type": "custom",
225
+ "data": {
226
+ "label": "Excel解析",
227
+ "type": "excel-python",
228
+ "managed_file_id": "51853ede-9e6b-4a3a-aa7a-060cbead0862",
229
+ "output_variable_name": "成本统计报表"
230
+ }
231
+ }
232
+ ```
233
+
234
+ > `managed_file_id` 是 **UUID 字符串**,与 `Excel成本报表08.xlsx` 等文件名 **无关**;文件名只出现在注释/`excel_original_filename` 日志中。
235
+
236
+ ---
237
+
238
+ ### 示例 A:单 Sheet、复杂表头(推荐模板)
239
+
240
+ 对应真实流程「成本报表数据08」:表头不在第 1 行时用 `header=None` + `skiprows` + `names`。
241
+
242
+ ```python
243
+ # -*- coding: utf-8 -*-
244
+ # 画布:managed_file_id = <UUID>(见 flow.json,勿在代码里写文件名)
245
+ # 画布:output_variable_name = 成本统计报表
246
+ import pandas as pd
247
+
248
+ OUTPUT_VAR = "成本统计报表" # 必须与 output_variable_name 一致
249
+ DATA_START_ROW = 4 # 0-based,Excel 第 5 行起为数据
250
+
251
+ COLUMN_NAMES = [
252
+ "基本信息_组织", "基本信息_年度", "基本信息_月度", "基本信息_项目",
253
+ "成本项_管理费", "成本项_间接成本", "成本项_税金",
254
+ # ... 按实际列继续
255
+ ]
256
+
257
+ output.print("[excel-python] 开始")
258
+ output.print(f"source={excel_original_filename or excel_source_path}")
259
+
260
+ # ✅ 正确:读引擎注入的路径
261
+ raw = pd.read_excel(
262
+ excel_source_path,
263
+ sheet_name="Sheet1",
264
+ header=None,
265
+ skiprows=DATA_START_ROW,
266
+ usecols="A:P",
267
+ names=COLUMN_NAMES,
268
+ )
269
+ table = raw.dropna(how="all")
270
+
271
+ output.print(f"{OUTPUT_VAR} shape={table.shape}")
272
+ set_table_output(OUTPUT_VAR, table) # 主输出,名称必须与 output_variable_name 一致
273
+ output.print("[excel-python] 完成")
274
+ ```
275
+
276
+ ---
277
+
278
+ ### 示例 B:多 Sheet 产出多张表变量
279
+
280
+ 对应 VS-flow0:一个 Excel 解析出 `销售表`、`产品表`、`规格表`。
281
+
282
+ ```python
283
+ # -*- coding: utf-8 -*-
284
+ # 画布:managed_file_id = <UUID>
285
+ # 画布:output_variable_name = 销售表(主输出,须 set_table_output 同名)
286
+ import pandas as pd
287
+
288
+ SHEETS = {
289
+ "销售表": {"sheet_name": "销售表", "header": 0, "usecols": "A:H"},
290
+ "产品表": {"sheet_name": "产品表", "header": 1, "usecols": "A:C"},
291
+ "规格表": {"sheet_name": "规格表", "header": 1, "usecols": "A:C"},
292
+ }
293
+
294
+ output.print("[excel-python] 开始")
295
+ output.print(f"source={excel_original_filename or excel_source_path}")
296
+
297
+ for var_name, kwargs in SHEETS.items():
298
+ raw = pd.read_excel(excel_source_path, **kwargs) # ✅ 只用 excel_source_path
299
+ table = raw.dropna(how="all")
300
+ output.print(f"{var_name} shape={table.shape}")
301
+ set_table_output(var_name, table)
302
+
303
+ output.print("[excel-python] 完成")
304
+ ```
305
+
306
+ 下游 `sql-query` 可直接 `FROM 销售表 JOIN 产品表 ...`。
307
+
308
+ ---
309
+
310
+ ### 反例(AI 禁止)
311
+
312
+ ```python
313
+ # ❌ 错误:臆造本地/相对路径
314
+ pd.read_excel("Excel成本报表08.xlsx")
315
+ pd.read_excel("./uploads/xxx.xlsx")
316
+ pd.read_excel(r"D:\src2025\...\成本报表.xlsx")
317
+
318
+ # ❌ 错误:在 code.py 里写 managed_file_id 或 open 文件
319
+ open(managed_file_id)
320
+
321
+ # ❌ 错误:主输出未 set_table_output,或名称与 output_variable_name 不一致
322
+ result_df = pd.read_excel(excel_source_path)
323
+ # 缺少 set_table_output("与画布同名", result_df)
324
+ ```
325
+
326
+ ---
327
+
328
+ ### 提交与测试
329
+
330
+ 1. 改 **`managed_file_id` / `output_variable_name`** → `project push --canvas`
331
+ 2. 改 **`code.py`** → `node push` → `node-exec` 或整流程 `flow-exec`
332
+ 3. 多表时单节点测试可能只有主表;全表变量用 **`flow-exec --type debug`** 后 `variable sync`
333
+
334
+ 详见 [flow-project-guide §6.1 文件上传管理](./flow-project-guide.md#61-文件上传管理excel-等流程数据源)、[流程开发最佳实践 §6.1](./流程开发最佳实践-VS-flow0案例.md#61-excel-多表解析节选)。
335
+
336
+ ---
337
+
338
+ ## 6. `condition`(条件分支)
339
+
340
+ **文件**: `code.py`
341
+ 逻辑脚本决定分支;使用 `output.print` 记录判断依据。测试方式同 `python-script`。
342
+
343
+ ---
344
+
345
+ ## 7. `data-quality-check`(数据质量)
346
+
347
+ **文件**: `code.py`(平台键 `dqPythonCode`)
348
+
349
+ **注入**
350
+
351
+ | 符号 | 说明 |
352
+ |------|------|
353
+ | `df` | 入边 Parquet;单节点时可能为空 |
354
+ | `get_variable("名")` | 调试 Run 中的附加表 |
355
+ | `quality_config` | 与画布 `qualityConfig` 对齐 |
356
+ | `set_scalar_output(name, value)` | 综合分等标量 |
357
+ | `result_df` | 质检报告表 |
358
+
359
+ **推荐**:`df.empty` 时用 `get_variable` 补主表(变量名与 `attached_variables` / 上游输出一致)。
360
+
361
+ 规则从 `quality_config["rules"]` 读取,避免魔法数。端到端质检案例见 [流程开发最佳实践(VS-flow0 案例)](./流程开发最佳实践-VS-flow0案例.md)。
362
+
363
+ ---
364
+
365
+ ## 8. 画布配置 vs 代码分工
366
+
367
+ | 改什么 | 改哪里 | 怎么提交 |
368
+ |--------|--------|----------|
369
+ | SQL / Python 正文 | `code.sql` / `code.py` | `node push` |
370
+ | 连线、坐标、节点增删 | `flow.json`(设计器) | `project push --canvas` |
371
+ | connectionId、表名、output_variable_name | 设计器属性 → `flow.json` | `project push --canvas` |
372
+
373
+ **不要**在 `flow.json` 里硬塞大段 `pythonCode`/`sql`:pull 会剥离到 `code.*`,push 代码走 `flow-nodes` 接口。
374
+
375
+ ---
376
+
377
+ ## 9. 查看输出变量
378
+
379
+ 变量模型、`debug_run_id`、本地 **`变量/<名>.json`** 详见 **[流程变量系统指南](./variables-guide.md)**。
380
+
381
+ ```powershell
382
+ # 拉取单个变量(schema + 前 10 行)到 变量/<name>.json
383
+ .\scripts\dazi.ps1 flow variable pull --name sales_df --dir .
384
+
385
+ # 同步全部调试变量
386
+ .\scripts\dazi.ps1 flow variable sync --dir .
387
+ ```
388
+
389
+ 设计器:选中节点 → 属性 **`output_variable_name`** → 点击 **📊**。
390
+
391
+ ---
392
+
393
+ ## 10. AI 协作建议
394
+
395
+ 1. 让 AI 阅读 **`code.*`** + **`flow.json` 中该节点 `data`** + 失败时的 **`_run/*.last-error.md`**
396
+ 2. **Agent 模式**(用户委托改流程):AI 应主动执行「改 → `node-exec`/`flow-exec` → 读 `last-error.md` → 再改 → 再跑」循环(默认最多 3 轮),详见流程目录 **`快速启动_<流程名>.md` §AI 自主运行与改错闭环** 或提示词 **`flow/run-fix-loop`**
397
+ 3. **对话模式**(用户仅粘贴错误):用户确认后再改代码 → 测试 → `node push`
398
+ 4. 需要查上游表结构时,先 **运行上游** 或 **`variable pull`**,把 `变量/<名>.json` 交给 AI
399
+ 5. MCP:`dazi-flow mcp serve`(工具含 `flow_run_node`、`flow_node_get_code`、`flow_node_set_code` 等,写操作需 `--allow-write`)
@@ -0,0 +1,59 @@
1
+ # Flow 执行计划
2
+
3
+ **文档 ID**: `flow/plan-guide`
4
+
5
+ ## 编译计划
6
+
7
+ ```bash
8
+ dazi-flow plan compile <flow-id>
9
+
10
+ # 带输入参数
11
+ dazi-flow plan compile <flow-id> --input '{"date": "2026-01-01"}'
12
+ ```
13
+
14
+ 计划保存到 `flows/<flow-id>/plans/plan.json`。
15
+
16
+ ## 应用计划
17
+
18
+ ```bash
19
+ # 验证(dry-run)
20
+ dazi-flow plan apply <flow-id> --dry-run
21
+
22
+ # 执行应用
23
+ dazi-flow plan apply <flow-id>
24
+ ```
25
+
26
+ ## 导出 Markdown 文档
27
+
28
+ ```bash
29
+ # 摘要文档
30
+ dazi-flow plan markdown <flow-id> --type summary
31
+
32
+ # 详细文档
33
+ dazi-flow plan markdown <flow-id> --type detail
34
+
35
+ # 流程图(Mermaid)
36
+ dazi-flow plan markdown <flow-id> --type diagram
37
+ ```
38
+
39
+ ## 生成 LLM 引导文档
40
+
41
+ 生成供 Cursor/LLM 理解 Flow 结构的文档:
42
+
43
+ ```bash
44
+ dazi-flow plan llm-guide <flow-id>
45
+ ```
46
+
47
+ 保存到 `flows/<flow-id>/plans/llm-guide.md`,内容包括:
48
+ - Flow 目的说明
49
+ - 节点功能描述
50
+ - 数据流向
51
+ - 关键配置项
52
+
53
+ ## 生成数据库脚手架
54
+
55
+ 根据 Flow 的数据模型生成建表 DDL:
56
+
57
+ ```bash
58
+ dazi-flow plan scaffold-database <flow-id> --dialect clickhouse
59
+ ```
@@ -0,0 +1,98 @@
1
+ # Flow 运行与测试
2
+
3
+ **文档 ID**: `flow/run-guide`
4
+
5
+ **命令前缀**(`dazi-work` 根):`.\scripts\dazi.ps1 flow …`
6
+ **流程项目**:在 `项目/flow_*/流程/<名>/` 下执行,或使用 `--dir <流程目录>`。
7
+
8
+ ---
9
+
10
+ ## 1. 流程项目:单节点测试(最常用)
11
+
12
+ ```powershell
13
+ cd "项目\flow_xxx\流程\MyFlow"
14
+
15
+ # 按 node_uuid 测试(CLI 内部翻译为语义 nodeId)
16
+ .\scripts\dazi.ps1 flow run node-exec --node <node_uuid> --dir .
17
+ ```
18
+
19
+ **行为**
20
+
21
+ 1. `GET /flows/{id}/debug-run` — 确保 `ads_flows.debug_run_id` 已绑定调试 Run
22
+ 2. `POST /flows/{id}/nodes/{nodeId}/run` — 执行单节点
23
+ 3. 成功时同步该节点 `output_variable_name` 到 **`变量/<名>.json`**
24
+ 4. 失败时写入 **`_run/<节点名>.last-error.md`**(扩展会自动打开)
25
+
26
+ 扩展:右键 **节点/** 或 **code.*** → **测试运行节点**。
27
+
28
+ ---
29
+
30
+ ## 2. 流程项目:整流程运行
31
+
32
+ ```powershell
33
+ .\scripts\dazi.ps1 flow run flow-exec --dir . --type debug
34
+ # preview:清空调试变量后全新运行
35
+ .\scripts\dazi.ps1 flow run flow-exec --dir . --type preview
36
+ ```
37
+
38
+ 成功后 **`flow variable sync`** 同步全部变量到 `变量/` 目录。
39
+
40
+ 扩展:右键 **flow.json** / 流程目录 → **运行整流程**。
41
+
42
+ ---
43
+
44
+ ## 3. 查看运行期变量
45
+
46
+ 变量存储在 **`flow_runs` + `flow_run_variables`**,通过 **`flows.debug_run_id`** 关联。
47
+ **变量模型、代码节点读写方式**见 [流程变量系统指南](./variables-guide.md)。
48
+
49
+ ```powershell
50
+ # 拉取单个变量(schema + 前 10 行)→ 变量/<name>.json
51
+ .\scripts\dazi.ps1 flow variable pull --name sales_df --dir .
52
+
53
+ # 同步全部调试 Run 变量
54
+ .\scripts\dazi.ps1 flow variable sync --dir .
55
+ ```
56
+
57
+ 设计器:节点 **`output_variable_name`** 旁 **📊** 按钮。
58
+
59
+ 扩展:右键 **`变量/`** → 同步;右键 **`变量/*.json`** → 刷新。
60
+
61
+ ---
62
+
63
+ ## 4. 平台级 Run API(脚本 / 自动化)
64
+
65
+ ```powershell
66
+ # 启动 Run
67
+ .\scripts\dazi.ps1 flow run start <flow-id> --input '{}'
68
+
69
+ # 列表
70
+ .\scripts\dazi.ps1 flow run list <flow-id> --limit 10
71
+
72
+ # 调试信息(最近 Run)
73
+ .\scripts\dazi.ps1 flow run debug <flow-id>
74
+
75
+ # 变量列表(需 --flow)
76
+ .\scripts\dazi.ps1 flow run variables-list <runId> --flow <flow-id>
77
+ ```
78
+
79
+ 流程项目日常开发优先用 **§1–§3** 的 `node-exec` / `flow-exec` / `variable pull`。
80
+
81
+ ---
82
+
83
+ ## 5. 失败分析
84
+
85
+ ```powershell
86
+ # 拉取 failure-bundle 落盘
87
+ .\scripts\dazi.ps1 flow run failure --run <runId> --dir .
88
+ ```
89
+
90
+ 流程项目测试失败时,优先看 **`_run/*.last-error.md`**(含错误分类:缺上游变量、配置缺失、代码错误等)。
91
+
92
+ ---
93
+
94
+ ## 6. 相关文档
95
+
96
+ - [流程变量系统指南](./variables-guide.md) — 变量模型与代码示例
97
+ - [数据流程项目开发指南](./flow-project-guide.md) — debug_run_id、开发循环
98
+ - [节点代码编写指南](./node-code-guide.md) — 单节点脚本约定
@@ -0,0 +1,44 @@
1
+ # 数据源管理
2
+
3
+ **文档 ID**: `flow/source-guide`
4
+
5
+ ## 列出数据源
6
+
7
+ ```bash
8
+ dazi-flow source list
9
+ dazi-flow source list --space <space-id>
10
+ ```
11
+
12
+ ## 查看数据源中的表
13
+
14
+ ```bash
15
+ dazi-flow source tables <source-id>
16
+
17
+ # 过滤 schema
18
+ dazi-flow source tables <source-id> --schema public
19
+ ```
20
+
21
+ ## 查看表结构
22
+
23
+ ```bash
24
+ dazi-flow source table-structure <source-id> <table-name>
25
+ ```
26
+
27
+ 输出示例:
28
+ ```
29
+ 表: public.orders
30
+ 列名 类型 可空 说明
31
+ ────────────────────────────────────────────────────────────────
32
+ id bigint false 主键
33
+ user_id bigint false 用户ID
34
+ amount decimal(10,2) false 金额
35
+ created_at timestamp false 创建时间
36
+ ```
37
+
38
+ ## 保存表结构到工作区
39
+
40
+ ```bash
41
+ dazi-flow source table-workspace <source-id> <table-name> --flow <flow-id>
42
+ ```
43
+
44
+ 表结构保存到 `flows/<flow-id>/data/<table-name>.schema.json`,可供 Cursor 读取作为上下文。