@wubaoqi/guancopilot 0.0.0-stage → 0.2.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.
- package/NOTICE.md +17 -0
- package/README.md +146 -2
- package/assets/coreutils.wasm +0 -0
- package/assets/find.wasm +0 -0
- package/assets/guanbi.wasm +4 -0
- package/assets/guancli.wasm +0 -0
- package/assets/guanhelm.wasm +0 -0
- package/assets/jq.wasm +0 -0
- package/assets/openskills.wasm +0 -0
- package/assets/rg.wasm +0 -0
- package/assets/sed.wasm +0 -0
- package/bin/guancopilot +0 -0
- package/bin/guanvm +0 -0
- package/bin/platforms.cjs +6 -0
- package/bin/run.cjs +39 -0
- package/bin/runtime.cjs +44 -0
- package/licenses/Go-LICENSE +27 -0
- package/licenses/browser-_speed-highlight_core-LICENSE +121 -0
- package/licenses/browser-_speed-highlight_core-package.json +14 -0
- package/licenses/browser-dompurify-LICENSE +202 -0
- package/licenses/browser-dompurify-LICENSE-MPL +373 -0
- package/licenses/browser-dompurify-package.json +10 -0
- package/licenses/browser-marked-LICENSE +44 -0
- package/licenses/browser-marked-package.json +10 -0
- package/licenses/coreutils-LICENSE +18 -0
- package/licenses/findutils-LICENSE +18 -0
- package/licenses/github.com_BurntSushi_toml_v1.6.0-COPYING +21 -0
- package/licenses/github.com_dustin_go-humanize_v1.0.1-LICENSE +21 -0
- package/licenses/github.com_google_jsonschema-go_v0.4.3-LICENSE +21 -0
- package/licenses/github.com_google_uuid_v1.6.0-LICENSE +27 -0
- package/licenses/github.com_jackc_pgpassfile_v1.0.0-LICENSE +22 -0
- package/licenses/github.com_jackc_pgservicefile_v0.0.0-20240606120523-5a60cdf6a761-LICENSE +22 -0
- package/licenses/github.com_jackc_pgx_v5_v5.11.0-LICENSE +22 -0
- package/licenses/github.com_jackc_puddle_v2_v2.2.2-LICENSE +22 -0
- package/licenses/github.com_mattn_go-isatty_v0.0.20-LICENSE +9 -0
- package/licenses/github.com_modelcontextprotocol_go-sdk_v1.8.0-LICENSE +216 -0
- package/licenses/github.com_ncruces_go-strftime_v1.0.0-LICENSE +21 -0
- package/licenses/github.com_remyoudompheng_bigfft_v0.0.0-20230129092748-24d4a6f8daec-LICENSE +27 -0
- package/licenses/github.com_santhosh-tekuri_jsonschema_v6_v6.0.3-LICENSE +175 -0
- package/licenses/github.com_segmentio_asm_v1.1.3-LICENSE +21 -0
- package/licenses/github.com_segmentio_encoding_v0.5.4-LICENSE +21 -0
- package/licenses/github.com_tetratelabs_wazero_v1.12.0-LICENSE +201 -0
- package/licenses/github.com_tetratelabs_wazero_v1.12.0-NOTICE +2 -0
- package/licenses/github.com_yosida95_uritemplate_v3_v3.0.2-LICENSE +25 -0
- package/licenses/golang.org_x_image_v0.44.0-LICENSE +27 -0
- package/licenses/golang.org_x_net_v0.58.0-LICENSE +27 -0
- package/licenses/golang.org_x_oauth2_v0.36.0-LICENSE +27 -0
- package/licenses/golang.org_x_sync_v0.22.0-LICENSE +27 -0
- package/licenses/golang.org_x_sys_v0.47.0-LICENSE +27 -0
- package/licenses/golang.org_x_text_v0.41.0-LICENSE +27 -0
- package/licenses/golang.org_x_time_v0.15.0-LICENSE +27 -0
- package/licenses/guanbi-skills-LICENSE +133 -0
- package/licenses/guanbi-skills-LICENSE.README.md +28 -0
- package/licenses/guanbi-skills-LICENSE.zh-CN +82 -0
- package/licenses/jq-COPYING +176 -0
- package/licenses/modernc.org_libc_v1.73.4-LICENSE +27 -0
- package/licenses/modernc.org_libc_v1.73.4-LICENSE-3RD-PARTY.md +305 -0
- package/licenses/modernc.org_mathutil_v1.7.1-LICENSE +27 -0
- package/licenses/modernc.org_memory_v1.11.0-LICENSE +27 -0
- package/licenses/modernc.org_memory_v1.11.0-LICENSE-GO +27 -0
- package/licenses/modernc.org_memory_v1.11.0-LICENSE-LOGO +1 -0
- package/licenses/modernc.org_memory_v1.11.0-LICENSE-MMAP-GO +25 -0
- package/licenses/modernc.org_sqlite_v1.53.0-LICENSE +26 -0
- package/licenses/mvdan.cc_sh_v3_v3.13.1-LICENSE +27 -0
- package/licenses/ripgrep-COPYING +3 -0
- package/licenses/ripgrep-LICENSE-MIT +21 -0
- package/licenses/sed-LICENSE +21 -0
- package/manifest.json +972 -0
- package/package.json +30 -4
- package/plugin/guancopilot.js +193 -0
- package/skills-bundle/.guanvm-skills-bundle +0 -0
- package/skills-bundle/_recipes/dashboard/gates/page_check.js +16 -0
- package/skills-bundle/_recipes/dashboard/gates/report_check.js +4 -0
- package/skills-bundle/_recipes/dashboard/knowledge/01.md +1 -0
- package/skills-bundle/_recipes/dashboard/knowledge/02.md +1 -0
- package/skills-bundle/_recipes/dashboard/knowledge/03.md +1 -0
- package/skills-bundle/_recipes/dashboard/knowledge/04.md +1 -0
- package/skills-bundle/_recipes/dashboard/knowledge/05.md +1 -0
- package/skills-bundle/_recipes/dashboard/knowledge/06.md +1 -0
- package/skills-bundle/_recipes/dashboard/template.json +41 -0
- package/skills-bundle/_recipes/etl/gates/etl_live_check.js +10 -0
- package/skills-bundle/_recipes/etl/gates/etl_report_check.js +3 -0
- package/skills-bundle/_recipes/etl/knowledge/01.md +1 -0
- package/skills-bundle/_recipes/etl/knowledge/02.md +9 -0
- package/skills-bundle/_recipes/etl/knowledge/03.md +1 -0
- package/skills-bundle/_recipes/etl/knowledge/04.md +1 -0
- package/skills-bundle/_recipes/etl/knowledge/05.md +1 -0
- package/skills-bundle/_recipes/etl/template.json +39 -0
- package/skills-bundle/_recipes/hints.json +46 -0
- package/skills-bundle/guancli/.commandface.json +155 -0
- package/skills-bundle/guancli/SKILL.md +342 -0
- package/skills-bundle/guancli/evals/evals.json +156 -0
- package/skills-bundle/guancli/evals/fixtures/metric-candidate-empty-search.json +13 -0
- package/skills-bundle/guancli/evals/fixtures/metric-candidate-prior-request.json +13 -0
- package/skills-bundle/guancli/evals/fixtures/metric-consumption-columns.json +46 -0
- package/skills-bundle/guancli/evals/fixtures/metric-consumption-metadata.json +36 -0
- package/skills-bundle/guancli/evals/fixtures/metric-consumption-query.json +18 -0
- package/skills-bundle/guancli/references/analysis-primitives.md +95 -0
- package/skills-bundle/guancli/references/auth-and-config.md +131 -0
- package/skills-bundle/guancli/references/examples/metric-date-in.json +7 -0
- package/skills-bundle/guancli/references/examples/metric-query-rows.py +83 -0
- package/skills-bundle/guancli/references/examples/metric-query.sh +6 -0
- package/skills-bundle/guancli/references/form-chatbi.md +199 -0
- package/skills-bundle/guancli/references/gateway.md +148 -0
- package/skills-bundle/guancli/references/metric-batch-query.md +82 -0
- package/skills-bundle/guancli/references/metric-commands.md +562 -0
- package/skills-bundle/guancli/references/metric-generic-query.md +215 -0
- package/skills-bundle/guancli/references/metric-json-migration.md +18 -0
- package/skills-bundle/guancli/references/metric-query-recipes.md +358 -0
- package/skills-bundle/guancli/references/preview-and-output.md +192 -0
- package/skills-bundle/guancli/references/resource-query.md +101 -0
- package/skills-bundle/guands/SKILL.md +281 -0
- package/skills-bundle/guands/references/calc-fields-boundaries-and-pitfalls.md +160 -0
- package/skills-bundle/guands/references/command-reference.md +267 -0
- package/skills-bundle/guands/references/incremental-and-schedule.md +157 -0
- package/skills-bundle/guands/references/workflows.md +256 -0
- package/skills-bundle/guanetl/SKILL.md +391 -0
- package/skills-bundle/guanetl/evals/evals.json +41 -0
- package/skills-bundle/guanetl/references/ETL_AI_DEVELOP.md +456 -0
- package/skills-bundle/guanmetric/SKILL.md +144 -0
- package/skills-bundle/guanmetric/evals/evals.json +117 -0
- package/skills-bundle/guanmetric/evals/fixtures/atomic-detail-read-model.json +18 -0
- package/skills-bundle/guanmetric/evals/fixtures/confirmed-template-summary.json +12 -0
- package/skills-bundle/guanmetric/evals/fixtures/create-result-unknown-state.json +13 -0
- package/skills-bundle/guanmetric/evals/forward-eval-2026-09-21.json +62 -0
- package/skills-bundle/guanmetric/references/metric-api-contract-examples.json +690 -0
- package/skills-bundle/guanmetric/references/metric-api-contract.schema.json +349 -0
- package/skills-bundle/guanmetric/references/metric-api-contracts.md +436 -0
- package/skills-bundle/guanmetric/references/metric-atomic-mutation.md +238 -0
- package/skills-bundle/guanmetric/references/metric-batch-status.md +71 -0
- package/skills-bundle/guanmetric/references/metric-business-dictionary-api-contract-examples.json +53 -0
- package/skills-bundle/guanmetric/references/metric-business-dictionary-api-contract.schema.json +26 -0
- package/skills-bundle/guanmetric/references/metric-business-dictionary.md +76 -0
- package/skills-bundle/guanmetric/references/metric-common-fields.md +246 -0
- package/skills-bundle/guanmetric/references/metric-composite-mutation.md +165 -0
- package/skills-bundle/guanmetric/references/metric-delete-mutation.md +70 -0
- package/skills-bundle/guanmetric/references/metric-derived-mutation.md +453 -0
- package/skills-bundle/guanmetric/references/metric-excel-template.md +365 -0
- package/skills-bundle/guanmetric/references/metric-expression-rules.md +146 -0
- package/skills-bundle/guanmetric/references/metric-flow-generate-example.json +79 -0
- package/skills-bundle/guanmetric/references/metric-flow-generate.schema.json +93 -0
- package/skills-bundle/guanmetric/references/metric-flow.md +218 -0
- package/skills-bundle/guanmetric/references/metric-hierarchy-api-contract-examples.json +171 -0
- package/skills-bundle/guanmetric/references/metric-hierarchy-api-contract.schema.json +167 -0
- package/skills-bundle/guanmetric/references/metric-hierarchy-api-contracts.md +193 -0
- package/skills-bundle/guanmetric/references/metric-mutation.md +155 -0
- package/skills-bundle/guanmetric/references/metric-public-dimension-api-contract-examples.json +62 -0
- package/skills-bundle/guanmetric/references/metric-public-dimension-api-contract.schema.json +47 -0
- package/skills-bundle/guanmetric/references/metric-public-dimension.md +155 -0
- package/skills-bundle/guanmetric/references/metric-tree-api-contract-examples.json +277 -0
- package/skills-bundle/guanmetric/references/metric-tree-api-contract.schema.json +263 -0
- package/skills-bundle/guanmetric/references/metric-tree-api-contracts.md +53 -0
- package/skills-bundle/guanmetric/references/metric-tree-mutation.md +500 -0
- package/skills-bundle/guanmetric/references/metric-validation-ownership.md +74 -0
- package/skills-bundle/guanvis/SKILL.md +333 -0
- package/skills-bundle/guanvis/evals/china_map/card_01_basic_map.js +13 -0
- package/skills-bundle/guanvis/evals/china_map/card_02_world_map.js +10 -0
- package/skills-bundle/guanvis/evals/china_map/card_03_point_map.js +12 -0
- package/skills-bundle/guanvis/evals/china_map/page.js +10 -0
- package/skills-bundle/guanvis/evals/china_map/schema.js +10 -0
- package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/README.md +30 -0
- package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/card_01_comparative_mvp.js +72 -0
- package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/page.js +6 -0
- package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/schema.js +22 -0
- package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/verify_default_roundtrip.sh +92 -0
- package/skills-bundle/guanvis/evals/complex_report_pro/card_01_monthly.js +63 -0
- package/skills-bundle/guanvis/evals/complex_report_pro/page.js +6 -0
- package/skills-bundle/guanvis/evals/complex_report_pro/schema.js +6 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/card_01_bar.js +13 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/card_02_pie.js +13 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/charts/bar.js +11 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/charts/pie.js +15 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/page.js +5 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/schema.js +9 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/card_01_level_nodes.js +19 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/charts/level_nodes.css +51 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/charts/level_nodes.html +1 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/charts/level_nodes.js +28 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/page.js +5 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/schema.js +7 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/card_01_dynamic_dataset.js +20 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/card_02_dynamic_metric_chart.js +16 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/metrics.js +19 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/page.js +9 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/schema.js +7 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/verify_default_roundtrip.sh +137 -0
- package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/README.md +26 -0
- package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/card_01_percentage_advcalc.js +44 -0
- package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/card_02_scroll_percentage.js +12 -0
- package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/page.js +6 -0
- package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/schema.js +22 -0
- package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/README.md +28 -0
- package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/card_01_rank_advcalc.js +59 -0
- package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/page.js +6 -0
- package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/schema.js +22 -0
- package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/verify_default_roundtrip.sh +135 -0
- package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/README.md +15 -0
- package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/card_01_running_total_advcalc.js +74 -0
- package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/page.js +6 -0
- package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/schema.js +22 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/card_01_revenue_column.js +10 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/card_02_trend_line.js +9 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/card_03_kpi.js +6 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/card_04_pie.js +9 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/card_05_calc_field_test.js +12 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/page.js +11 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/schema.js +14 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/selector_01_region.js +10 -0
- package/skills-bundle/guanvis/evals/split_charts/card_01_column_split.js +10 -0
- package/skills-bundle/guanvis/evals/split_charts/card_02_line_split.js +10 -0
- package/skills-bundle/guanvis/evals/split_charts/card_03_combo_split.js +11 -0
- package/skills-bundle/guanvis/evals/split_charts/page.js +10 -0
- package/skills-bundle/guanvis/evals/split_charts/schema.js +14 -0
- package/skills-bundle/guanvis/evals/tab_layout/card_00_total_revenue.js +6 -0
- package/skills-bundle/guanvis/evals/tab_layout/card_01_revenue.js +10 -0
- package/skills-bundle/guanvis/evals/tab_layout/card_02_trend.js +9 -0
- package/skills-bundle/guanvis/evals/tab_layout/card_03_story.js +11 -0
- package/skills-bundle/guanvis/evals/tab_layout/page.js +23 -0
- package/skills-bundle/guanvis/evals/tab_layout/schema.js +11 -0
- package/skills-bundle/guanvis/evals/tab_layout/selector_01_region.js +8 -0
- package/skills-bundle/guanvis/references/api-reference.md +476 -0
- package/skills-bundle/guanvis/references/builder-reference.md +1676 -0
- package/skills-bundle/guanvis/references/chart-properties.md +2101 -0
- package/skills-bundle/guanvis/references/checkout-editing.md +53 -0
- package/skills-bundle/guanvis/references/complex-report-pro-patterns.md +398 -0
- package/skills-bundle/guanvis/references/dir-and-page-management.md +48 -0
- package/skills-bundle/guanvis/references/metric-chart-reference.md +258 -0
- package/skills-bundle/guanvis/references/publish-and-constraints.md +60 -0
- package/skills-bundle/guanvis/references/selector-reference.md +431 -0
- package/skills-bundle/guanvis/references/tableau-migration.md +73 -0
- package/skills-bundle/guanvis/references/theme.md +123 -0
- package/skills-bundle/guanvis/references/troubleshooting.md +25 -0
- package/skills-bundle/guanvis/references/validation-and-chart-patterns.md +205 -0
- package/skills-bundle/guanwf/SKILL.md +543 -0
- package/skills-bundle/guanwf/references/ETL_AI_DEVELOP.md +456 -0
- package/skills-bundle/guanwf/references/TASK_NODE_CONTRACTS.md +64 -0
- package/skills-bundle/guanwf/references/WORKFLOW_DSL.md +536 -0
- package/skills-bundle/guanwf/references/WORKFLOW_NODES.md +166 -0
- package/skills-bundle/js/SKILL.md +145 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# 工作流数据流扩展节点参考
|
|
2
|
+
|
|
3
|
+
本文档描述工作流数据流中相对于 BI ETL 的超集节点类型。
|
|
4
|
+
通用 ETL 节点(INPUT_DATASET、OUTPUT_DATASET、SQL_SCRIPT 等)的用法参见 `ETL_AI_DEVELOP.md`(symlink 到 guanetl)。
|
|
5
|
+
|
|
6
|
+
## 透传节点(LoadNodeFromFile 模式)
|
|
7
|
+
|
|
8
|
+
以下节点在 `guanwf edit` 导入时自动保存为 `node_XXXX.json` 独立文件,`etl.go` 中通过 `LoadNodeFromFile` 引用。
|
|
9
|
+
这些节点配置复杂且与数据库连接紧密绑定,通常不需要手动修改。
|
|
10
|
+
|
|
11
|
+
### INPUT_DATASOURCE(数据源输入)
|
|
12
|
+
|
|
13
|
+
数据库直连输入,无上游 source。从关系型数据库中读取数据到数据流。
|
|
14
|
+
|
|
15
|
+
```go
|
|
16
|
+
// 透传模式(edit 路径推荐)
|
|
17
|
+
node_1001 := LoadNodeFromFile("node_1001.json")
|
|
18
|
+
|
|
19
|
+
// 结构化模式(create 路径)
|
|
20
|
+
node_1001 := BasicInputDatasource("id_1001", "数据库输入", InputDatasourceConfig{
|
|
21
|
+
BaseConfig: BaseConfig{Position: Position{X: 100, Y: 100}},
|
|
22
|
+
AcId: "ac_xxx",
|
|
23
|
+
CnId: "cn_yyy",
|
|
24
|
+
Sql: ReadSQLFile("input_query.sql"),
|
|
25
|
+
SourceType: "DIRECT_CONNECT",
|
|
26
|
+
})
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
配置说明:
|
|
30
|
+
- `AcId`: 数据账号 ID(通过 `guands account list` 获取)
|
|
31
|
+
- `CnId`: 数据连接 ID(通过 `guands account get <acId>` 获取)
|
|
32
|
+
- `Sql`: 查询 SQL(支持 ReadSQLFile 引用独立文件)
|
|
33
|
+
- `SourceType`: `DIRECT_CONNECT`(数据库直连)或 `DATASET`(引用数据集)
|
|
34
|
+
|
|
35
|
+
### OUTPUT_DATASOURCE(数据源输出)
|
|
36
|
+
|
|
37
|
+
数据回写到数据库,有上游 source。
|
|
38
|
+
|
|
39
|
+
```go
|
|
40
|
+
// 透传模式(edit 路径推荐)
|
|
41
|
+
node_1005 := LoadNodeFromFile("node_1005.json", node_1004)
|
|
42
|
+
|
|
43
|
+
// 结构化模式(create 路径)
|
|
44
|
+
node_1005 := BasicOutputDatasource("id_1005", "数据回写", node_1004, OutputDatasourceConfig{
|
|
45
|
+
BaseConfig: BaseConfig{Position: Position{X: 500, Y: 100}},
|
|
46
|
+
AcId: "ac_xxx",
|
|
47
|
+
CnId: "cn_yyy",
|
|
48
|
+
TargetTable: "target_table",
|
|
49
|
+
UpdateMode: UpdateModeOVERWRITE,
|
|
50
|
+
})
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
配置说明:
|
|
54
|
+
- `TargetTable`: 目标表名
|
|
55
|
+
- `UpdateMode`: `UpdateModeOVERWRITE`(覆盖)、`UpdateModeAPPEND`(追加)、`UpdateModeUPSERT`(更新插入);字面量 `"OVERWRITE"` 等仍可用,`guanetl lint` 会提示改用常量
|
|
56
|
+
- `Schema`: 目标 schema(可选)
|
|
57
|
+
- `PrimaryKeys`: UPSERT 模式的主键列
|
|
58
|
+
- `PreSql`/`PostSql`: 写入前/后执行的 SQL(可选)
|
|
59
|
+
|
|
60
|
+
### INCREMENT_OUTPUT_DATASET(增量输出数据集)
|
|
61
|
+
|
|
62
|
+
增量方式写入观远数据集(与 OUTPUT_DATASET 的区别是支持增量更新策略)。
|
|
63
|
+
|
|
64
|
+
```go
|
|
65
|
+
// 透传模式
|
|
66
|
+
node_1006 := LoadNodeFromFile("node_1006.json", node_1005)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
配置说明:
|
|
70
|
+
- `OutputDsId`: 输出数据集 ID(序列化为服务端的 `dsId` 键;绑定已有数据集时填写)
|
|
71
|
+
- `ParentDirID`: 输出数据集目录(DATA_SET 目录树 id,新建输出必填,缺失会导致运行期报错)
|
|
72
|
+
- `UpdateMode`: `UpdateModeAPPEND`(追加)或 `UpdateModeUPSERT`(更新插入)
|
|
73
|
+
- `PrimaryKeys`: UPSERT 模式的主键列
|
|
74
|
+
|
|
75
|
+
推荐优先使用透传模式(LoadNodeFromFile),可保留服务端节点的全部配置。
|
|
76
|
+
|
|
77
|
+
## 原生 DSL 节点
|
|
78
|
+
|
|
79
|
+
以下节点有结构化的 Go DSL 函数,import 后会生成可直接编辑的代码。
|
|
80
|
+
|
|
81
|
+
### TRIM_COLUMNS(去空格)
|
|
82
|
+
|
|
83
|
+
对指定列去除首尾空格。
|
|
84
|
+
|
|
85
|
+
```go
|
|
86
|
+
node := BasicTrimColumns("id_1002", "去空格", source, []string{"name", "address"}, Position{X: 300, Y: 100})
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
参数:
|
|
90
|
+
- `columnNames`: 要处理的列名列表(对应 BI 端 `columnNames` 字段)
|
|
91
|
+
|
|
92
|
+
### COMBINE_COLUMNS(合并列)
|
|
93
|
+
|
|
94
|
+
将多个列合并为一个新列。
|
|
95
|
+
|
|
96
|
+
```go
|
|
97
|
+
node := BasicCombineColumns("id_1005", "合并地址", source, "full_address", []string{"city", "street"}, ", ", false, Position{X: 600, Y: 100})
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
参数:
|
|
101
|
+
- `targetFieldName`: 新列名
|
|
102
|
+
- `fields`: 要合并的源列名列表
|
|
103
|
+
- `separator`: 分隔符
|
|
104
|
+
- `removeSelectedFields`: 是否删除源列
|
|
105
|
+
|
|
106
|
+
## 透传 DSL 节点(复杂 mappings 类)
|
|
107
|
+
|
|
108
|
+
以下节点因配置结构复杂(含嵌套数组/对象),import 时使用 `LoadNodeFromFile` 透传模式保存完整 JSON,确保往返保真。
|
|
109
|
+
|
|
110
|
+
### VALUE_MAPPER(值映射/值替换)
|
|
111
|
+
|
|
112
|
+
将指定列的值按映射表替换。
|
|
113
|
+
|
|
114
|
+
```go
|
|
115
|
+
// import 自动生成(透传模式)
|
|
116
|
+
node_1003 := LoadNodeFromFile("node_id_1003.json", source)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
配置说明(编辑 `node_*.json` 文件):
|
|
120
|
+
- `column`: 源列名
|
|
121
|
+
- `targetField`: 目标列名(可与源列相同)
|
|
122
|
+
- `mappings`: 映射规则数组
|
|
123
|
+
- `defaultValue`: 不匹配时的默认值
|
|
124
|
+
|
|
125
|
+
### SINGLE_VALUE_MAPPER(Null 值替换)
|
|
126
|
+
|
|
127
|
+
将指定列的 null 值替换为固定值。import 时使用 LoadNodeFromFile 透传模式。
|
|
128
|
+
|
|
129
|
+
```go
|
|
130
|
+
// import 自动生成(透传模式)
|
|
131
|
+
node_1004 := LoadNodeFromFile("node_id_1004.json", source)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
配置说明(编辑 `node_*.json` 文件中的 `mappings` 数组):
|
|
135
|
+
- `mappings`: 列值映射列表,每条包含:
|
|
136
|
+
- `colName`: 目标列名
|
|
137
|
+
- `origValue`: 原始值(`null` 表示匹配 null)
|
|
138
|
+
- `toValue`: 替换值
|
|
139
|
+
|
|
140
|
+
## SQL Fallback 节点
|
|
141
|
+
|
|
142
|
+
以下节点类型不做原生支持,import 时由 guanetl-server 生成等价 SQL 转为 `BasicSqlScript`:
|
|
143
|
+
|
|
144
|
+
| 节点类型 | 说明 |
|
|
145
|
+
|---|---|
|
|
146
|
+
| `COLLAPSE_COLUMNS` | 列转行 |
|
|
147
|
+
| `UNCOLLAPSE_COLUMNS` | 行转列 |
|
|
148
|
+
| `BENCHMARKING` | 智能对标 |
|
|
149
|
+
| `FREQ_PATTERN` | 关联性挖掘 |
|
|
150
|
+
| `DATA_INSIGHT` | 智能归因 |
|
|
151
|
+
|
|
152
|
+
## 不支持的节点类型
|
|
153
|
+
|
|
154
|
+
以下节点类型在当前版本中不支持 import,遇到时会报错:
|
|
155
|
+
|
|
156
|
+
| 节点类型 | 说明 |
|
|
157
|
+
|---|---|
|
|
158
|
+
| `SAP_ERP_INPUT` | SAP ERP 输入 |
|
|
159
|
+
| `FTP_INPUT` | FTP 输入 |
|
|
160
|
+
|
|
161
|
+
## LoadNodeFromFile 使用规则
|
|
162
|
+
|
|
163
|
+
1. **透传与结构化可互换**:用户可以把 `LoadNodeFromFile(...)` 替换为 `BasicInputDatasource(...)`(或反过来),框架不限制。
|
|
164
|
+
2. **修改透传节点**:直接编辑对应的 `node_XXXX.json` 文件即可。
|
|
165
|
+
3. **JSON 文件命名**:`node_` + 节点 ID(sanitize 后保留字母/数字/下划线/连字符)+ `.json`。
|
|
166
|
+
4. **sources 自动处理**:export 时 `LoadedNode.ToMap()` 会根据函数参数中的 sources 自动更新 `sources` 字段。
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: js
|
|
3
|
+
description: 在观远 BI 工作站内用 JavaScript 写多步数据加工、聚合分析与批量 BI 调用脚本。适用:带逻辑/循环/分组聚合的加工、批量调用 BI API(run("guancli", ["fetch", …]) 或 fetch --batch)、脚本中间穿插 shell 工具(run("date"/"jq"/"wc"/"rg"/"sed"/…))、JSONL 中间结果逐行处理、生成报告文件。跨技能路由:单步 JSON 变换直接用 jq 更省;创建/修改 BI 资源(ETL/卡片/数据集/指标/工作流)不要在 js 里做,回 shell 层用对应 CLI(先读 guanetl/guanvis/guands/guanmetric/guanwf 技能);只查单个资源详情直接用 guancli,不必套 js。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# js — 工作站 JavaScript 脚本引擎
|
|
7
|
+
|
|
8
|
+
goja 引擎,ES2020 级语法。定位:把"多次取数 → 加工 → 聚合 → 落盘/汇报"压缩成一条命令完成,中间数据不占对话上下文。
|
|
9
|
+
|
|
10
|
+
## 方言与限制(先读,避开 Node 惯性)
|
|
11
|
+
|
|
12
|
+
- 语法:async/await、可选链 `?.`、`??`、解构、模板字符串、BigInt 均可用。
|
|
13
|
+
- **无 ESM/require**:不要写 `import`/`export`/`require()`,单文件顶层代码直接写。
|
|
14
|
+
- **无 fetch/XMLHttpRequest**:BI 访问唯一通道是 `run("guancli", ["fetch", ...])`(`run()` 也能调 shell 工具,但**只有 guancli 能出网**)。
|
|
15
|
+
- **无 setTimeout/setInterval**:轮询用同步 `sleep(ms)`。所有内置 API 都是同步的,不返回 Promise(写 async 语法也能跑,但没有必要)。
|
|
16
|
+
- 脚本抛出未捕获异常(含 async 体内的未处理拒绝)→ 退出码 1,错误与 JS 栈打到 stderr。
|
|
17
|
+
- `js -e '{"a":1}'` 会把 `{...}` 解析为语句块(标准 JS 坑):对象字面量表达式请加括号 `({a:1})`。
|
|
18
|
+
|
|
19
|
+
## 执行形态
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
js /work/task.js arg1 arg2 # 脚本 + 参数(脚本内经 argv 读取)
|
|
23
|
+
js -e '1+1' # 单行表达式;结果非 undefined 时自动打印
|
|
24
|
+
cat rows.jsonl | js -e 'readStdin().trim().split("\n").length'
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**标准姿势:超过 3 行的脚本一律先 write_file 落盘再执行**(脚本成为工作区持久工件,失败后用 edit_block 小步修改重跑,不要整段重发);`-e` 只写单行;stdin 保留给数据管道(脚本内容不从 stdin 读)。
|
|
28
|
+
|
|
29
|
+
### -e 引号规则(实测,只记一条:外层单引号)
|
|
30
|
+
|
|
31
|
+
- **`-e` 的表达式一律用单引号包裹,JS 内部字符串用双引号或反引号**。单引号内一切字面传递:`"文本"`、正则 `\d+`、`||`、`${}` 模板串、JSON 字面量、甚至换行都安全。
|
|
32
|
+
- 表达式里需要单引号字符 → 不要玩 `'\''` 逃逸,直接让 JS 用双引号/反引号字符串。
|
|
33
|
+
- **不要裸写**:`js -e console.log(0||5)` 的 `||`/`|`/`>` 会被 shell 当算子切走(实测报"命令不存在: 5)")。
|
|
34
|
+
- **不要用双引号包表达式**:本 shell 在双引号内会把 `\n`/`\t`/`\\` 转成真实控制字符(与 bash 不同),JS 字符串转义 `"a\nb"` 会断行成 SyntaxError;除非双写 `\\n`,但这条规则太易错,直接用单引号回避。
|
|
35
|
+
|
|
36
|
+
## 内置 API(全部同步)
|
|
37
|
+
|
|
38
|
+
| API | 说明 |
|
|
39
|
+
|---|---|
|
|
40
|
+
| `console.log/info(...)` | 打印到 stdout(对象自动 JSON 序列化,空格分隔) |
|
|
41
|
+
| `console.error/warn(...)` | 打印到 stderr |
|
|
42
|
+
| `argv` | 脚本参数数组(不含脚本路径) |
|
|
43
|
+
| `env` | 环境变量对象(如 `env.GUANCLI_BASE_URL`) |
|
|
44
|
+
| `readFile(path)` | 读文件全文为字符串(路径一律 `/` 开头的绝对路径) |
|
|
45
|
+
| `writeFile(path, s)` / `appendFile(path, s)` | 写/追加文件(自动创建父目录) |
|
|
46
|
+
| `listDir(path)` | 目录项数组 `[{name, dir, size}, ...]` |
|
|
47
|
+
| `readStdin()` | 读入全部 stdin(管道数据入口;重复调用返回同一份) |
|
|
48
|
+
| `forEachLine(path, (line, i) => {...})` | 流式逐行处理;回调显式 `return false` 提前终止;返回已处理行数 |
|
|
49
|
+
| `sleep(ms)` | 同步休眠(轮询任务状态用) |
|
|
50
|
+
| `run(cmd, args, {stdin})` | 调用 shell 工具或只读 BI CLI,返回 `{code, stdout, stderr}`(见下节) |
|
|
51
|
+
|
|
52
|
+
## 调用外部命令:run()
|
|
53
|
+
|
|
54
|
+
`run()` 能调两类东西:**只读 BI 查询链**与**整条 shell 工具链**。
|
|
55
|
+
|
|
56
|
+
```javascript
|
|
57
|
+
// ① BI 只读查询
|
|
58
|
+
const r = run("guancli", ["fetch", "GET", "/api/user/profile"]);
|
|
59
|
+
if (r.code !== 0) throw new Error(r.stderr);
|
|
60
|
+
const profile = JSON.parse(r.stdout);
|
|
61
|
+
|
|
62
|
+
// ② shell 工具:算一半、取个值、接着算
|
|
63
|
+
const now = run("date", ["+%Y-%m-%d"]).stdout.trim();
|
|
64
|
+
const n = parseInt(run("wc", ["-l", "/data.csv"]).stdout, 10);
|
|
65
|
+
const ids = run("jq", ["-r", ".[].id", "/list.json"]).stdout.trim().split("\n");
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- **可调**:`guancli`、`guancli-kit`,以及全部 coreutils 子命令(`date`/`wc`/`sort`/`cut`/`head`/`tail`/`test`/`printf`/…)与独立工具 `jq`/`rg`/`sed`/`find`。写的是**命令名**,不是资产名——`run("coreutils", …)` 会被拒;`run("grep", …)` 也会被拒(`run()` 不做 grep→rg 翻译,直接写 `run("rg", …)`)。
|
|
69
|
+
- `run("rg", [pattern], {stdin})` 已自动补 `-`(WASI 下 rg 不认 stdin,不补会去搜整个工作区);显式给了文件参数时不补。
|
|
70
|
+
- **不可调,且是刻意设计,不要尝试绕过**:`guanetl`/`guanvis`/`guands`/`guanmetric`/`guanwf` 这些写操作 CLI(报"模块 js 不允许调用 …"),以及 js 自身。原因:写操作必须走各自技能的工作流约束(编辑红线、export→preview→save、dry-run),且每个写操作应是 shell 层一条可见命令,不能藏进脚本循环里批量执行。正确分工:**js 负责计算和产出参数/文件,写操作回 shell 层用对应 CLI 消费它们**。
|
|
71
|
+
- **批量仍然交给 shell**:`run()` 每次都要现起一个 wasm 实例,循环里调 100 次就是 100 次实例化。整列数据的过滤/排序/统计写成一条 shell 管道快得多;`run()` 用在"零星取一两个值"的场合。
|
|
72
|
+
- 命令自身失败经 `code`/`stderr` 表达;宿主协议层失败(白名单拒绝、响应超 8MB 等)抛异常,可 try/catch。
|
|
73
|
+
- BI 凭证由宿主自动注入,脚本内**不要**处理任何 token。
|
|
74
|
+
- 单次响应上限 8MB:大结果让 fetch 落文件(batch 协议的 `output` 字段,或 `fetch ... --output /work/big.json`),再 readFile/forEachLine 处理。
|
|
75
|
+
|
|
76
|
+
### 批量调用(一次 run 跑 N 个请求)
|
|
77
|
+
|
|
78
|
+
`fetch --batch` 走 JSONL 协议:请求逐行写入 stdin,结果逐行返回(严格串行、复用连接,对 BI 后端友好)。
|
|
79
|
+
|
|
80
|
+
```javascript
|
|
81
|
+
const ids = ["ds1", "ds2", "ds3"];
|
|
82
|
+
const reqs = ids.map((id, i) =>
|
|
83
|
+
JSON.stringify({ id: String(i), method: "GET", path: `/api/dataset/${id}` })
|
|
84
|
+
).join("\n");
|
|
85
|
+
const out = run("guancli", ["fetch", "--batch"], { stdin: reqs });
|
|
86
|
+
const results = out.stdout.trim().split("\n").map(JSON.parse); // {id, ok, body|error}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 大文件处理(重要)
|
|
90
|
+
|
|
91
|
+
中间结果约定用 **JSONL**(一行一个 JSON 对象),配合 `forEachLine` 逐行加工——**不要**对大文件整体 `JSON.parse`(实例内存有限,大对象树会 OOM):
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
let total = 0, byRegion = {};
|
|
95
|
+
forEachLine("/work/rows.jsonl", (line) => {
|
|
96
|
+
const row = JSON.parse(line);
|
|
97
|
+
total += row.amount;
|
|
98
|
+
byRegion[row.region] = (byRegion[row.region] || 0) + row.amount;
|
|
99
|
+
});
|
|
100
|
+
writeFile("/work/summary.json", JSON.stringify({ total, byRegion }, null, 2));
|
|
101
|
+
console.log("done:", total);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 完整示例:批量审计数据集字段
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
// /work/audit.js —— 用法: js /work/audit.js <目录ID>
|
|
108
|
+
const dirId = argv[0];
|
|
109
|
+
if (!dirId) throw new Error("用法: js /work/audit.js <目录ID>");
|
|
110
|
+
|
|
111
|
+
const list = run("guancli", ["fetch", "GET", `/api/directories/${dirId}/data-sources`]);
|
|
112
|
+
if (list.code !== 0) throw new Error(list.stderr);
|
|
113
|
+
const datasets = JSON.parse(list.stdout).result || [];
|
|
114
|
+
|
|
115
|
+
const reqs = datasets.map((ds, i) =>
|
|
116
|
+
JSON.stringify({ id: ds.dsId, method: "GET", path: `/api/datasets/${ds.dsId}` })
|
|
117
|
+
).join("\n");
|
|
118
|
+
const out = run("guancli", ["fetch", "--batch"], { stdin: reqs });
|
|
119
|
+
|
|
120
|
+
const report = out.stdout.trim().split("\n").map(JSON.parse).map((r) => {
|
|
121
|
+
if (!r.ok) return { dsId: r.id, error: r.error };
|
|
122
|
+
const d = JSON.parse(r.body).result;
|
|
123
|
+
return { dsId: r.id, name: d.name, cols: (d.schema || []).length };
|
|
124
|
+
}).sort((a, b) => (b.cols || 0) - (a.cols || 0));
|
|
125
|
+
|
|
126
|
+
writeFile("/work/audit_report.json", JSON.stringify(report, null, 2));
|
|
127
|
+
console.log(`审计完成 ${report.length} 个数据集,字段最多:`, report[0]);
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 坑与替代
|
|
131
|
+
|
|
132
|
+
| 惯性写法 | 替代 |
|
|
133
|
+
|---|---|
|
|
134
|
+
| `import x from "y"` / `require("y")` | 删掉,单文件顶层直接写 |
|
|
135
|
+
| `fetch(url)` / axios | `run("guancli", ["fetch", "GET", path])` |
|
|
136
|
+
| `run("guanetl"/"guanvis"/…)` 写操作 | 宿主白名单拒绝;js 只产出参数/文件,写操作回 shell 层执行 |
|
|
137
|
+
| `run("grep", …)` | 宿主白名单拒绝(不翻译);直接 `run("rg", …)` |
|
|
138
|
+
| 用 `run()` 循环处理整列数据 | 每次调用都是一次 wasm 实例化;整列加工写成 shell 管道,`run()` 只取零星值 |
|
|
139
|
+
| `run("coreutils", ["date"])` | 直接 `run("date", [...])`——白名单的键是命令名不是资产名 |
|
|
140
|
+
| `setTimeout(fn, ms)` | `sleep(ms)` 后直接调用 |
|
|
141
|
+
| `process.argv` / `process.env` | `argv` / `env` |
|
|
142
|
+
| `fs.readFileSync` | `readFile(path)` |
|
|
143
|
+
| 金额精确聚合用 float | 下推 SQL(guancli ds execute-sql / card preview)或 BigInt |
|
|
144
|
+
| 排序大数据集 | 下推 SQL ORDER BY;文本行管道用 shell `sort`;小数据 `arr.sort()` |
|
|
145
|
+
| 单步 JSON 变换套 js | 直接 `... \| jq '...'` 更省 |
|