@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,391 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: guanetl
|
|
3
|
+
description: 当用户要新建、修改、调试、定时调度、立即执行、保存发布观远 BI / Guandata 的 ETL,或给出 ETL ID、dataFlowId、etl.go、meta.json、SQL 节点、dsId、节点报错时,优先使用这个 skill。即使用户只说"帮我改一下这个 ETL""这个 ETL 导出失败""新建一个观远 ETL""把这个 ETL 配成每天 2 点跑""保存后立即执行并等完成",也要主动使用。它把线上 ETL 拉到本地工作目录,约束 AI 只编辑 etl/ 下文件,并完成 create/edit → export → preview → save → run/schedule 闭环。查 ETL/数据集元信息走 guancli;数据源/数据集 CRUD 走 guands。
|
|
4
|
+
compatibility: "Requires Node.js 14+. Install via npm link --foreground-scripts (local) or npm install -g --foreground-scripts @guandata/guanetl (from internal Nexus registry) so the AI skill refresh result is visible. CLI command: guanetl."
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# guanetl
|
|
8
|
+
|
|
9
|
+
这是一个执行型 skill,不是只读分析 skill。
|
|
10
|
+
|
|
11
|
+
- `guancli` 负责找 ETL / 数据集 / 字段上下文。
|
|
12
|
+
- `guanetl` 负责把 ETL 拉到本地、修改 `etl/`、再完成 `export -> preview -> save`。
|
|
13
|
+
|
|
14
|
+
## 何时使用
|
|
15
|
+
|
|
16
|
+
遇到这些任务就用:
|
|
17
|
+
|
|
18
|
+
- 新建观远 BI ETL。
|
|
19
|
+
- 修改已有 ETL 的节点、SQL、字段、输出。
|
|
20
|
+
- 用户给了 ETL ID / dataFlowId,希望直接拉下来改。
|
|
21
|
+
- 用户保存 ETL 后希望立即触发执行并等待完成。
|
|
22
|
+
- 用户希望配置 ETL 定时执行调度。
|
|
23
|
+
- 用户遇到 `export`、预览、保存失败,希望定位并修复。
|
|
24
|
+
- 用户提到 `etl.go`、`meta.json`、节点 ID、SQL 节点、输入输出数据集。
|
|
25
|
+
|
|
26
|
+
只查信息时不要单独用它:
|
|
27
|
+
|
|
28
|
+
- ETL 清单、目录树、节点详情、血缘、数据集结构、数据集预览,优先用 `guancli`。
|
|
29
|
+
|
|
30
|
+
## 固定工作方式
|
|
31
|
+
|
|
32
|
+
### 0. 先确认前置条件
|
|
33
|
+
|
|
34
|
+
- 确认底层 CLI 认证正常:普通 guancli profile 用 `GUANCLI_PROFILE=<profile> guancli auth status` 验证,后续命令继续使用同一 `GUANCLI_PROFILE`,仅用户明确要求切换机器级默认环境时才用 `auth use`;上游托管 OIDC Token 时在当前进程同时设置 `GUANCLI_OIDC_BASE_URL`/`GUANCLI_OIDC_ACCESS_TOKEN`,无需本地 profile;guancli-lite 设置 `GUANCLI_BASE_URL`/`GUANCLI_TOKEN`。
|
|
35
|
+
- 如果用户指定的资源(目录、数据集、ETL)搜索不到,先用 `guancli auth list` 列出所有可用环境,提示用户确认是否需要切换环境。
|
|
36
|
+
|
|
37
|
+
### Artifact contract(本地可测契约)
|
|
38
|
+
|
|
39
|
+
`guanetl` 是源文件驱动的 ETL 构建 harness。工作目录中只有 `etl/` 是可编辑事实源;导入、导出、保存过程产生的 JSON 都是系统状态或派生产物。
|
|
40
|
+
|
|
41
|
+
| 路径/产物 | 类型 | 规则 |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `etl/etl.go` | 可编辑事实源 | 定义 `DefineETL()`,只在这里表达节点、依赖、输出意图 |
|
|
44
|
+
| `etl/*.sql` | 可编辑事实源 | 仅供 `BasicSqlScript(..., ReadSQLFile(...))` 引用,新增 SQL 节点必须同步新增文件 |
|
|
45
|
+
| `etl/meta.json` | 可编辑事实源(谨慎) | 只有需要保留导入 ETL 的额外 metadata 时才改 |
|
|
46
|
+
| `_guanetl_state.json` | 系统状态 | 不手改;由 create/edit/export/preview 维护 |
|
|
47
|
+
| `_input.json` / `_base_etl.json` | 服务端快照 | 不手改;保存时会重新拉取线上 edit base 并合并 |
|
|
48
|
+
| `_exported.json` | 派生产物 | 不手改;由 `export` 从 `etl/` 重新生成 |
|
|
49
|
+
|
|
50
|
+
本地可测 gate:
|
|
51
|
+
|
|
52
|
+
1. `go test ./...` 覆盖 workspace、merge、runner helper、request/merge 逻辑。
|
|
53
|
+
2. 对 fixture 工作目录执行 `guanetl export --dir <fixture>`,比较 `_exported.json` 的关键节点、字段、SQL 文件引用和输出数据集配置。
|
|
54
|
+
3. `preview/save/run/schedule` 属于线上闭环:只有在认证、目标 ETL 和数据集明确后执行,并在汇报中说明是否实际跑到这些步骤。
|
|
55
|
+
|
|
56
|
+
失败修复顺序固定为:读失败输出 -> 判断是源代码/SQL/节点配置/线上任务问题 -> 修改 `etl/` 中最小责任文件 -> 重跑失败命令 -> 再重跑依赖的后续验证。不要为了修一个 export/preview 错误去重写整个 ETL。
|
|
57
|
+
|
|
58
|
+
### 开发态生成飞轮
|
|
59
|
+
|
|
60
|
+
当任务目标是“评估自然语言生成 ETL 的质量 / benchmark / 失败复跑 / 回灌规则”,不要把普通单次编辑流程硬扩成评估系统。使用仓库根目录的 `.skill/etl-generation-flywheel/`:运行证据放在 `etl_runs/<run-id>`,真正的 ETL 工作目录放在 `etl_workspaces/<run-id>`,再按 `export -> preview -> data_fit -> save/run -> final_judgment` 闭环推进。
|
|
61
|
+
|
|
62
|
+
### 1. 先分场景
|
|
63
|
+
|
|
64
|
+
- `编辑已有 ETL`
|
|
65
|
+
- `新建 ETL`
|
|
66
|
+
- `修复失败`
|
|
67
|
+
|
|
68
|
+
### 2. 缺上下文先查,不要猜
|
|
69
|
+
|
|
70
|
+
缺 ETL ID / dsId / 字段时,先用:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
guancli auth status
|
|
74
|
+
guancli etl search <关键词>
|
|
75
|
+
guancli etl get <etl_id>
|
|
76
|
+
guancli ds search <关键词>
|
|
77
|
+
guancli ds get <ds_id>
|
|
78
|
+
guancli ds preview <ds_id> --limit 20
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
多环境操作时,使用 `GUANCLI_PROFILE=<profile>` 固定当前进程链的目标环境,不修改机器级默认 profile。写操作会先按 `GUANCLI_PATH → PATH 中 guancli → PATH 中 guancli-lite` 解析实际底层 CLI,再在 stderr 回显对应目标:`guancli` 显示 profile,`guancli-lite` 显示脱敏后的 `GUANCLI_BASE_URL` 主机,自定义 shim 则明确提示目标由该 CLI 决定。执行前可用同一环境变量运行 `guancli auth status`,核对环境名和 URL:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
GUANCLI_PROFILE=dev33 guancli auth status
|
|
85
|
+
GUANCLI_PROFILE=dev33 guanetl create --name "ETL名称" --dir <work_dir>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 3. 真正改代码前先读这些
|
|
89
|
+
|
|
90
|
+
至少先读:
|
|
91
|
+
|
|
92
|
+
- `etl/etl.go`
|
|
93
|
+
- `etl/*.sql`
|
|
94
|
+
- `references/ETL_AI_DEVELOP.md`
|
|
95
|
+
|
|
96
|
+
必要时再读:
|
|
97
|
+
|
|
98
|
+
- `etl/meta.json`
|
|
99
|
+
- `guancli etl get <etl_id>` 的线上结构
|
|
100
|
+
|
|
101
|
+
### 4. 只改 `etl/`
|
|
102
|
+
|
|
103
|
+
只允许修改这些文件:
|
|
104
|
+
|
|
105
|
+
- `etl/etl.go`
|
|
106
|
+
- `etl/meta.json`
|
|
107
|
+
- `etl/*.sql`
|
|
108
|
+
|
|
109
|
+
不要手改这些系统文件:
|
|
110
|
+
|
|
111
|
+
- `_guanetl_state.json`
|
|
112
|
+
- `_base_etl.json`
|
|
113
|
+
- `_input.json`
|
|
114
|
+
- `_exported.json`
|
|
115
|
+
|
|
116
|
+
### 5. 改完永远按这个顺序
|
|
117
|
+
|
|
118
|
+
1. `export`
|
|
119
|
+
2. 需要看结果时再 `preview`
|
|
120
|
+
3. 确认无误后才 `save`
|
|
121
|
+
4. 需要立即执行时用 `run`
|
|
122
|
+
|
|
123
|
+
如果 `export` 没过,不要直接 `preview` 或 `save`。
|
|
124
|
+
|
|
125
|
+
## 三种场景的默认流程
|
|
126
|
+
|
|
127
|
+
### 编辑已有 ETL
|
|
128
|
+
|
|
129
|
+
1. 如 ETL ID 不明确,先用 `guancli` 查。
|
|
130
|
+
2. 执行:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
guanetl edit <etl_id> --dir <work_dir>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
3. 阅读 `etl/` 下文件并修改。
|
|
137
|
+
4. 执行:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
guanetl export --dir <work_dir>
|
|
141
|
+
# 保存闭环默认要求预览至少返回 1 行;明确允许合法空结果时可省略 --require-nonempty
|
|
142
|
+
# 多输出 ETL 一次传多个节点 ID:分批并行执行(默认同时最多 2 个任务,对齐 BI
|
|
143
|
+
# 单用户预览并发上限)、结果按序输出,不要逐节点调用;若网页端另有预览在跑
|
|
144
|
+
# 导致提交被拒,加 --max-parallel 1 串行重试
|
|
145
|
+
guanetl preview <node_id> [node_id...] --dir <work_dir> --require-nonempty
|
|
146
|
+
guanetl save --dir <work_dir> --dry-run
|
|
147
|
+
guanetl save --dir <work_dir>
|
|
148
|
+
guanetl run <etl_id> --wait # 可选:保存后触发执行并等待完成
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**再次修改已 save 过的 ETL 时**:即使本地还保留着上次的工作目录,也必须重新执行 `guanetl edit <etl_id> --dir <新目录>` 拉取服务端最新版本,不要在旧工作目录上直接改了再 save。原因:服务端版本可能已经变化,直接复用旧 base 会导致合并冲突(如"输出数据集目录中存在同名文件")。
|
|
152
|
+
|
|
153
|
+
`save` 会协调已保存 ETL 的输出身份:当本地 `OUTPUT_DATASET` 节点 id 变化,但它与服务端已绑定输出在同一目录、同名且双方唯一时,CLI 会自动恢复原节点 id 和 dsId,继续原地更新已有输出数据集。该协调不会修改本地 `_exported.json`,保存影响报告会显示 `save.output_binding_reconciled`。
|
|
154
|
+
|
|
155
|
+
**输出数据集落位语义(重要,勿用 dsId 判断输出是否创建)**:服务端保存时总会给每个输出补一个 `dataSource{dsId, created:false}`,但在该 ETL **首次成功运行**之前数据集实体并不存在,且每次 save/run 都会重新生成一个全新的临时 dsId。因此"保存后 dsId 非空"不代表输出已创建;判断依据是 `dataSource.created == true`。`save` 成功后 CLI 会回读服务端并输出两类诊断:`save.output_dir_rectified` 表示 `parentDirId` 无效、已被服务端静默纠正(通常纠正到数据集根目录,页面"保存至"可能显示"请选择")——必须修正 etl.go 中的目录 id 后重新保存;`save.output_pending_materialization` 表示输出尚未物化,dsId 是临时值,勿用于下游引用。`run --wait` 成功后 CLI 会校验输出 `created == true`,存在未创建的输出会直接报错,按错误提示排查目录与节点连线,不要循环重试 save/run。例外:仅以顶层 dsId 绑定已有数据集且无 `dataSource` 的增量输出无法自动核验,会以 `run.output_placement_unverified` 警告提示,需用 `guancli etl get <etl_id> --raw` 人工确认(默认渲染不显示 `dataSource.created` 字段)。
|
|
156
|
+
|
|
157
|
+
**维护约束(首次运行字段校验)**:新增或修改 CLI 的运行前校验时,只有 `dataSource.created == true` 的输出 dsId 才能当作可查询的既有数据集并读取 baseline。显式 `created:false` 表示首跑临时 dsId,运行前不得查询它、更不得因此阻断 `/api/etl/execute`;应保留输出节点 ID 与预期字段,在任务完成、输出落位校验通过后 fresh edit 回读稳定 dsId,再校验 metadata 和定向 preview。缺失 `created` 标记不等于首跑,必须保留既有的严格校验/失败语义,避免把旧 DATAFLOW 的字段注册漂移静默放行。
|
|
158
|
+
|
|
159
|
+
如果 `save` 在 direct-save 前提示输出数据集绑定风险,按提示处理,不要手动删除或重命名旧输出数据集。跨目录、重名歧义、删除旧输出或无法唯一匹配时,CLI 不会猜测并默认停止保存。修复优先级:重新 `edit` 到新目录、同步 `outputDsName`、确认输出目录;确实要替换已绑定输出时,设置新的节点 id、`outputDsName` 或 `parentDirId`,并显式加 `--allow-output-replacement`。该选项只放行保存,不会迁移任何下游 dsId 引用。
|
|
160
|
+
|
|
161
|
+
只追加输出列只是在输出绑定层面的安全例外:新增列、不改名、不删已有列、不改已有列类型,并保持输出名称和目录时,可以原地 `save`,保存前仍需 `preview` 目标输出确认结果;这**不代表**旧 DATAFLOW 数据集已注册该字段。`run --wait` 对本轮新增且透传到输出的 `BasicCalculator` 字段,会逐个输出等待其自身的 `lastExecution.endTime` 与 `datasourceModifyTime` 推进,并同时检查数据集 metadata 和实际 preview 返回字段。任一目标输出仍在产出,或字段没有注册/不可查询,命令会以错误结束;可用 `--timeout` 延长这段校验时间。改列名、删列、改类型、换输入数据集或重接输出链路仍按下游 schema 风险处理;输出节点 id 变化仅在唯一匹配时自动协调。
|
|
162
|
+
|
|
163
|
+
保存前优先执行 `save --dry-run` 查看影响报告;`--format json` 可用于自动化检查。dry-run 不调用 direct-save,若报告出现阻断风险,先修 `etl/` 后重新 `export -> preview -> save --dry-run`。
|
|
164
|
+
如果报告出现“输出字段风险”,表示同一输出数据集中的同名字段发生类型或来源变化,服务端可能重建该列 fdId;保存前先用 `guands dataset cards <输出dsId>` 看下游卡片,保存执行后再按列名核对并重绑页面卡片 fdId。
|
|
165
|
+
|
|
166
|
+
`preview` 和 `save` 会在远端调用前重新检查本地 `_exported.json`。启发式 warning(包括 JOIN 键类型不一致)会提示风险但继续执行;确定性 lint error 会在创建预览任务或保存请求前阻断。`save --dry-run --format json` 的 warning 写入 stderr,stdout 仍只输出结构化 JSON。
|
|
167
|
+
|
|
168
|
+
不要把“JOIN 键类型不一致”直接判断为零匹配。STRING 与 LONG/DOUBLE 等数值类型 JOIN 时,Spark 可能做隐式数值 coercion:纯数字字符串可能匹配,`"001"` 可能折叠后匹配数值 `1`,非数字值可能无法匹配,超长 ID 可能丢失精度。业务标识键应在 JOIN 前显式统一为 STRING。
|
|
169
|
+
|
|
170
|
+
### 新建 ETL
|
|
171
|
+
|
|
172
|
+
1. 先用 `guancli` 查输入数据集和字段。
|
|
173
|
+
2. **创建前必须先与用户确认目录**:ETL 本体目录(`--parent-dir`,来自 ETL 目录树)必填,缺失 `create` 直接拒绝(缺省会被服务端静默落到根目录,不符合目录管理规范);输出数据集目录(`--output-parent-dir`,来自 DATA_SET 目录树)在 `create` 时可选(纯中间产物 ETL 可以没有输出),但只要 etl.go 里有输出节点,`save` 前就必须为每个输出指定目录,所以有输出的 ETL 也在创建前一并确认。先用目录树查出候选目录的路径和 id,把"ETL 放在 <路径>、输出数据集放在 <路径>"交给用户确认;目录不存在时用 `guanetl mkdir` / `guanetl mkdir-pair` 显式创建,CLI 不会自动建目录。用户明确要求放根目录时显式传根目录 id。两棵树相互独立,同名目录的 id 也不同,不能把 `guancli etl get` 输出节点里的 ParentDirId 当作 `create --parent-dir` 使用。`guancli workflow tree` 返回的是工作流/经典数据流目录树,也不能用于智能 ETL 的 `create --parent-dir`。
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
guancli etl tree --max-depth 2 # ETL 所在目录,用于 create --parent-dir
|
|
177
|
+
guancli ds tree --max-depth 2 # 输出数据集目录,用于 create --output-parent-dir / BasicOutputDatasetInDir
|
|
178
|
+
# 目录树很大时用 --keyword 词 过滤;--max-depth 0(默认不传)为全量
|
|
179
|
+
guanetl mkdir-pair "ODS" --etl-parent <etl_parent_id> --ds-parent <ds_parent_id>
|
|
180
|
+
guanetl rmdir <dirId> --yes # 删空的 ETL 目录(非空拒绝并列出内容;物理删除不可恢复)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
3. 执行(可先 `--dry-run` 看落位计划:只校验目录并打印"路径 (id)",不申请 dataFlowId):
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
guanetl create --name "ETL名称" --dir <work_dir> --parent-dir <etl_dir_id> --output-parent-dir <dataset_dir_id> --dry-run
|
|
187
|
+
guanetl create --name "ETL名称" --dir <work_dir> --parent-dir <etl_dir_id> --output-parent-dir <dataset_dir_id>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
`create` 只向服务端申请 `dataFlowId` 并初始化本地工作区,不代表完整 ETL 已持久化。首次 `save` 成功前,服务端 `get/edit/move` 可能返回 ETL 不存在;完成 `etl.go -> export -> preview -> save` 后再执行这些服务端操作。
|
|
191
|
+
|
|
192
|
+
`create` / `save` 会校验目录 id 类型:`--parent-dir` 必须来自 ETL 树,输出数据集目录必须来自 DATA_SET 树。只有在确认目录 id 正确但当前账号无法读取目录树时,才使用 `--skip-dir-check`。
|
|
193
|
+
|
|
194
|
+
**`save` 的目录规则**:每个新建输出节点都必须带 DATA_SET 目录(`BasicOutputDatasetInDir`),无目录的新输出会在 direct-save 前被拒绝;首次保存还要求 ETL 本体目录(来自 `create --parent-dir`)。**已物化的输出(线上已有 dsId)一律沿用服务端绑定的 dsId 和目录**,落位计划按服务端 `dataSource` 展示并标注"不会改动",本地 `parentDirId` 意图不会覆盖它;要换目录属于替换/迁移,走既有的输出绑定风险流程。绑定已有数据集的增量输出不要求目录。`save --dry-run` 和真实保存都会打印"落位计划"(ETL 本体与每个输出的目标目录路径 + id,JSON 报告在 `saveImpact.placements`);修改已保存 ETL 时若落位计划中出现新目录或新输出,同样要先把落位计划交给用户确认再去掉 `--dry-run`。保存成功后会逐个输出数据集打印 `路径:` 与 `链接:`(尚未创建的输出只有路径,链接要等 `run --wait` 成功后 dsId 固定才会给出)。
|
|
195
|
+
如果错误提示目录 id 属于 `MASTER_FLOW`,说明拿到了工作流/经典数据流目录 id;智能 ETL 改用 `guancli etl tree` 查询,工作流/数据流创建改用 `guanwf create --parent-dir`。
|
|
196
|
+
|
|
197
|
+
移动已有智能 ETL 用 `move`,目标目录同样必须来自 `guancli etl tree`。可先加 `--dry-run` 查看将提交的 `/api/etl/move` 请求体;批量移动直接追加多个 ETL ID:
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
guanetl move <etl_id> --dir-id <etl_dir_id> --dry-run
|
|
201
|
+
guanetl move <etl_id1> <etl_id2> --dir-id <etl_dir_id>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
4. 在 `etl/` 中实现 ETL。
|
|
205
|
+
5. 再执行 `export -> preview -> save`。
|
|
206
|
+
6. 需要立即执行时:`run <etl_id> --wait`;需要先刷新可识别的智能 ETL 上游链路时,先用 `run <etl_id> --run-upstream --dry-run` 看计划,再用 `run <etl_id> --run-upstream` 执行。
|
|
207
|
+
|
|
208
|
+
### 修复失败
|
|
209
|
+
|
|
210
|
+
1. 先确认失败发生在 `export`、`preview` 还是 `save`。
|
|
211
|
+
2. 没有工作目录时,先 `edit` 或 `create` 恢复上下文。
|
|
212
|
+
3. 只做最小必要修改。
|
|
213
|
+
4. 从失败步骤往后重跑,不要整条链路乱重做。
|
|
214
|
+
|
|
215
|
+
## 保存与执行说明
|
|
216
|
+
|
|
217
|
+
### save 的工作机制
|
|
218
|
+
|
|
219
|
+
`save` 不是简单把本地 JSON 上传。它的内部流程是:
|
|
220
|
+
|
|
221
|
+
1. 读取本地 `_exported.json`(由 `export` 生成)
|
|
222
|
+
2. 从 BI 服务端拉取当前版本的 ETL 作为合并基准(edit API)
|
|
223
|
+
3. 将本地修改合并到服务端版本
|
|
224
|
+
4. 调用 direct-save API 写入
|
|
225
|
+
|
|
226
|
+
`save --dry-run` 只执行到合并和保存影响检查,不执行第 4 步。
|
|
227
|
+
|
|
228
|
+
新建 ETL 首次保存前,服务端还没有完整 ETL,因此 edit API 可能返回不存在。此时 `save` 会使用 `create` 生成的本地 `_base_etl.json`,并输出 `信息 [save.first_save_fallback]`;这是正常的首次保存路径,不代表 create 或 save 失败。其他服务端 edit 读取失败会输出 `警告 [save.edit_fallback]`,表示虽然已回退本地 base,但仍需确认网络、权限及本地基线是否可靠。
|
|
229
|
+
|
|
230
|
+
用户不需要手写服务端保存 payload。`export` 通过只表示本地产物可生成,保存仍由服务端校验。`direct-save` 返回 `success:false` 时,`save` 会非零退出并显示服务端原因与输入节点校验详情,不报告保存成功、不刷新本地 base;先处理失败原因,再重试保存,不要继续运行未保存的修改。
|
|
231
|
+
|
|
232
|
+
### run --wait、run --run-upstream 与任务状态
|
|
233
|
+
|
|
234
|
+
> **触发成功 ≠ ETL 执行成功**。`run` 返回 `✓ ETL 执行已触发` 仅表示后端接受了执行请求,ETL 可能在运行中失败。
|
|
235
|
+
|
|
236
|
+
- 不加 `--wait` 时,`run` 只触发后返回。**再次执行 `run` 会重新触发一次执行**(增量写入类 ETL 会重复产出数据);只有 ETL 仍在运行时,`run <etl_id> --wait` 才会被服务端拒绝重复提交并改为跟随当前执行。
|
|
237
|
+
- 加 `--wait` 后,CLI 会等待本次执行直到终态(FINISHED / FAILED / CANCELED),FAILED 时会展示真实错误消息。任务 ID 只在进程内部使用,不对外输出。
|
|
238
|
+
- 需要递归刷新智能 ETL 上游链路时,用 `run <etl_id> --run-upstream`。CLI 会读取目标 ETL 的输入数据集,按数据集的生产 ETL 继续向上解析,生成拓扑顺序后从最上游依次执行,包含目标 ETL;每个 ETL 都会等待终态,任一失败即停止并报告失败节点。
|
|
239
|
+
- 不确定上游范围时,先用 `run <etl_id> --run-upstream --dry-run` 输出执行计划;dry-run 只读拓扑,不触发任何 ETL。
|
|
240
|
+
- 触发前,`run` 会检查直接上游数据集状态;若发现上游处于 `FAILED`/`失败` 态,会先输出警告但继续触发执行。确认不需要检查时可加 `--skip-upstream-check`。
|
|
241
|
+
- `run <etl_id>` 还会读取服务端 edit 结构,按 JOIN 键类型组合提示隐式 coercion、精度或日期时间风险;`--run-upstream` 会在每个计划节点执行前做同样检查,检查失败不阻断执行。`preview` / `save` 会阻断明确不可用于行级 JOIN 的 aggregation/window 字段,并按服务端字段身份解析 JOIN predicate alias。批量自动化确认不需要运行前检查时可加 `--skip-join-type-check`。
|
|
242
|
+
- 如果不加 `--wait` 后想知道结果:用只读的 `guancli etl get <etl_id>`,默认输出的「最近执行」段落给出 status / 提交 / 开始 / 结束时间,不要再次 `run`。
|
|
243
|
+
|
|
244
|
+
### 排查执行失败
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
# 1. 触发执行并等待完成
|
|
248
|
+
guanetl run <etl_id> --wait
|
|
249
|
+
|
|
250
|
+
# 2. 如果已经触发但不知道结果,用只读元信息查看最近执行(不要再次 run,那会重新触发执行)
|
|
251
|
+
guancli etl get <etl_id>
|
|
252
|
+
|
|
253
|
+
# 3. 只有确认 ETL 仍在运行时,run --wait 才会跟随当前执行而不重复触发
|
|
254
|
+
guanetl run <etl_id> --wait
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
常见失败原因:
|
|
258
|
+
- 输入数据集权限不足(有读权限但缺少运行权限)
|
|
259
|
+
- SQL 语法错误(本地 preview 通过但全量数据触发不同的执行路径)
|
|
260
|
+
- 输出数据集目录冲突
|
|
261
|
+
- 上游数据集数据为空或 schema 变更
|
|
262
|
+
|
|
263
|
+
### preview 返回 0 行
|
|
264
|
+
|
|
265
|
+
preview 成功但行数为 0 是合法结果,**不一定代表有错误**。CLI 默认返回成功但会输出 warning,且不会再宣称“预览验证通过”。自动化发布或确认输出必须有数据时使用 `preview --require-nonempty`;零行将返回非零退出码,应停止后续 `save`。排查顺序:
|
|
266
|
+
1. 确认输入数据集本身有数据(用 `guancli ds preview <dsId> --limit 5`)
|
|
267
|
+
2. 如果节点有 FILTER_ROWS 或 WHERE 条件,临时简化筛选条件再 preview
|
|
268
|
+
|
|
269
|
+
## 调度配置(Schedule)
|
|
270
|
+
|
|
271
|
+
配置 ETL 的触发方式:定时执行(CRON)或上游数据集更新后触发。默认不开启,必须显式调用 `schedule` 命令。
|
|
272
|
+
|
|
273
|
+
### 触发模式(--trigger)
|
|
274
|
+
|
|
275
|
+
| trigger | API triggerType | 说明 |
|
|
276
|
+
|---|---|---|
|
|
277
|
+
| `cron`(默认) | `CRON` | 按配置的 cron 定时执行 |
|
|
278
|
+
| `upstream` | `AFTER_REFRESH` | 任一上游数据集更新完成后触发 |
|
|
279
|
+
| `upstream-all` | `AFTER_ALL_REFRESH` | 全部上游数据集更新完成后触发 |
|
|
280
|
+
|
|
281
|
+
### 定时触发示例
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
guanetl schedule <etl_id> --cron-type daily --hour 3 --minute 0 # 每天 03:00
|
|
285
|
+
guanetl schedule <etl_id> --cron-type hourly --interval 6 # 每 6 小时
|
|
286
|
+
guanetl schedule <etl_id> --cron-type minute --interval 30 # 每 30 分钟
|
|
287
|
+
guanetl schedule <etl_id> --cron-type weekly --day-of-week MON --hour 5 # 每周一 05:00
|
|
288
|
+
guanetl schedule <etl_id> --cron-type monthly --day-of-month 1 --hour 3 # 每月 1 号 03:00
|
|
289
|
+
guanetl schedule <etl_id> --disable # 关闭调度
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### 上游触发示例
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
# 任一上游数据集更新后执行
|
|
296
|
+
guanetl schedule <etl_id> --trigger upstream
|
|
297
|
+
guanetl schedule <etl_id> --trigger upstream --inputs <dsId1>,<dsId2>
|
|
298
|
+
|
|
299
|
+
# 全部上游数据集更新后执行
|
|
300
|
+
guanetl schedule <etl_id> --trigger upstream-all
|
|
301
|
+
guanetl schedule <etl_id> --trigger upstream-all --inputs <dsId1>,<dsId2>
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
不指定 `--inputs` 时,`guanetl` 会读取 ETL 当前输入数据集并默认全部监听;指定 `--inputs` 时只监听列出的 dsId。
|
|
305
|
+
|
|
306
|
+
### 定时调度类型说明
|
|
307
|
+
|
|
308
|
+
| cron-type | 参数 | 说明 |
|
|
309
|
+
|---|---|---|
|
|
310
|
+
| `daily` | `--hour`, `--minute` | 每天指定时间执行 |
|
|
311
|
+
| `hourly` | `--interval`, `--minute` | 每隔 N 小时执行 |
|
|
312
|
+
| `minute` | `--interval` | 每隔 N 分钟执行(最小 5) |
|
|
313
|
+
| `weekly` | `--day-of-week`, `--hour`, `--minute` | 每周指定日期时间执行 |
|
|
314
|
+
| `monthly` | `--day-of-month`, `--hour`, `--minute` | 每月指定日期时间执行 |
|
|
315
|
+
|
|
316
|
+
- `--day-of-week`: `MON`, `TUE`, `WED`, `THU`, `FRI`, `SAT`, `SUN`
|
|
317
|
+
- `--day-of-month`: `1`-`31` 或 `L`(最后一天)
|
|
318
|
+
|
|
319
|
+
**调度频率限制**:定时模式最高 5 分钟一次,低于 1 小时会输出性能警告。
|
|
320
|
+
|
|
321
|
+
## 执行结果与任务
|
|
322
|
+
|
|
323
|
+
- 没有独立的任务命令:不支持按任务 ID 查询、等待或取消任务。等待一律以 ETL ID 为入口(`run <etl_id> --wait`);查历史结果用只读的 `guancli etl get <etl_id>`。
|
|
324
|
+
- 并行触发多个 ETL 时,分别对每个 ETL 执行 `run <etl_id> --wait`(可并行起多个进程);`--run-upstream` 会按拓扑顺序逐个等待。
|
|
325
|
+
- 需要停止正在执行的 ETL 时,请到 BI 管理中心任务详情操作;CLI 不提供取消能力。
|
|
326
|
+
|
|
327
|
+
## 硬约束
|
|
328
|
+
|
|
329
|
+
- **编辑 ≠ 删除重建**:编辑已有 ETL 永远走 `edit → export → preview → save` 原地保存闭环,保留原 etlId/dataFlowId 和输出数据集 dsId。guanetl 没有提供 ETL 重命名和删除命令:用户要求给 ETL 改名或删除 ETL 时,直接说明 CLI 暂不支持;**禁止**用"新建一个 ETL 替代旧 ETL"来模拟编辑或改名——新 ETL 会创建新的输出数据集(dsId 变化),下游卡片、指标、其他 ETL 的输入引用全部断链,旧 ETL 的调度配置、权限和运行历史也不会迁移。只有用户明确指示"新建替代、再废弃旧的"时才允许,且执行前必须列出上述影响并获得确认。
|
|
330
|
+
- 不要改 `DefineETL()` 函数签名。
|
|
331
|
+
- 节点 ID 必须唯一,且是 `id_数字`。
|
|
332
|
+
- 节点顺序必须满足依赖顺序。
|
|
333
|
+
- 能用专用节点时,不要先写 `SQL_SCRIPT`。
|
|
334
|
+
- 等值 JOIN 优先 `JOIN_DATA`,不要用 SQL 模拟。
|
|
335
|
+
- 输入字段 schema 优先维护在 `BasicInputDataset(..., []Field{...})` 中。
|
|
336
|
+
- 新版 ETL 默认以输入字段 `alias` / 展示名作为算子列名;字段存在别名时,SQL 和直接列名算子优先使用展示名,raw name 只作为底层数据集元数据理解。
|
|
337
|
+
- ETL 执行时以真实数据集字段元数据为准;如果需要设置或确认展示名,先用 `guands dataset fields <dsId>` / `guands dataset alias <dsId> --fd-id <fdId> --alias "展示名"`,不要只在 `etl.go` 手写 alias 后假设服务端会采用。
|
|
338
|
+
- 本地字段解析优先级为 `alias -> displayName/showName/title -> name`;遇到同一来源下有效字段名重复,先消除歧义再继续写算子。
|
|
339
|
+
- 新增 SQL 节点时,要同步新增对应 `.sql` 文件。
|
|
340
|
+
- 对 `edit` 导入出来的 ETL,优先局部修改,不要为“重构”大面积推翻。
|
|
341
|
+
- **文件访问边界**:只允许访问以下路径,不要主动探索或读取用户未明确授权的其他目录:
|
|
342
|
+
- 当前工作目录(`--dir` 指定的目录或 cwd)
|
|
343
|
+
- 本 skill 的 `references/` 目录(如 `ETL_AI_DEVELOP.md`)
|
|
344
|
+
- `guancli` / `guanetl` CLI 工具的输出
|
|
345
|
+
- 用户在对话中明确提到或授权的路径
|
|
346
|
+
- 禁止为了"查找参考代码""寻找类似实现"而主动扫描用户机器上的其他项目目录,这会引起安全顾虑。
|
|
347
|
+
|
|
348
|
+
具体函数、枚举值和推荐骨架,都看 `references/ETL_AI_DEVELOP.md`。
|
|
349
|
+
|
|
350
|
+
## ETL 节点类型速查(详细用法见 references/ETL_AI_DEVELOP.md)
|
|
351
|
+
|
|
352
|
+
优先用专用节点,最后才用 SQL:
|
|
353
|
+
|
|
354
|
+
| 节点函数 | 用途 | 何时使用 | 关键约束 |
|
|
355
|
+
|---|---|---|---|
|
|
356
|
+
| `BasicInputDataset` | 引入数据集 | 每个 ETL 至少一个 | 必须提供 `[]Field` schema |
|
|
357
|
+
| `BasicOutputDataset` | 输出数据集 | 每个 ETL 至少一个,可有多个(叶子节点) | `DefineETL()` 返回值;多输出共享一次 save/run/schedule |
|
|
358
|
+
| `BasicSelectColumns` | 选列/重命名 | 只需要部分字段或改名 | - |
|
|
359
|
+
| `BasicFilterRows` | 行筛选 | 按条件过滤数据 | combineType: `AND`/`OR` |
|
|
360
|
+
| `BasicJoinData` | 等值 JOIN | 两表关联 | **优先用这个,不要写 SQL JOIN** |
|
|
361
|
+
| `BasicGroupBy` | 分组聚合 | SUM/COUNT/AVG 等 | 聚合类型: `SUM`/`COUNT`/`AVG`/`MIN`/`MAX` |
|
|
362
|
+
| `BasicCalculator` | 新增计算列 | 公式计算新字段 | `Formula` 必须包含 `Name`/`Type`/`Expr`/`Key`;字段引用用 `[展示名]` |
|
|
363
|
+
| `BasicRemoveDuplicates` | 去重 | 按指定列去重 | - |
|
|
364
|
+
| `BasicAppendRows` | 上下合并 | 多表 UNION | unionType: `INCLUDE_SHARED`/`INCLUDE_ALL` |
|
|
365
|
+
| `BasicSqlScript` | 自定义 SQL | 上述节点无法满足时 | SQL 放独立 `.sql` 文件,上游用 `input1`/`input2` 引用 |
|
|
366
|
+
|
|
367
|
+
## 最后怎么向用户汇报
|
|
368
|
+
|
|
369
|
+
至少说明这四件事:
|
|
370
|
+
|
|
371
|
+
- 处理的是哪个 ETL / 工作目录,并附上 `edit`/`save`/`move`/`mkdir` 输出里的 `链接:` 和 `路径:`(ETL 详情页为 `<BI 地址>/data-flow/<etlId>/details/datasets`,目录为 `<BI 地址>/data-center/data-flow/<dirId>`),让用户能直接在 BI 中打开而不是拿着 ID 自己找。`create` 申请到的 dataFlowId 在首次 `save` 成功前服务端尚未持久化,此时不要编造链接。
|
|
372
|
+
- 每个输出数据集的 `路径:` 和 `链接:`,取自 `save` 成功后的"输出数据集落位"段或 `run --wait` 成功后的逐输出输出(数据集详情页为 `<BI 地址>/data-source/<dsId>/details/overview`)。`save` 后仍标注"尚未创建"的输出不要编造链接,改为说明需要 `run --wait` 成功后再取。
|
|
373
|
+
- 改了哪些 `etl/` 文件。
|
|
374
|
+
- `export`、`preview`、`save`、`run` 哪些已经成功。
|
|
375
|
+
- 如果没闭环,卡在哪一步,下一步最小动作是什么。
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## VM 环境差异(观远 BI 工作站)
|
|
381
|
+
|
|
382
|
+
本技能在 MCP 虚拟工作站中运行,与本地 CLI 有以下差异:
|
|
383
|
+
|
|
384
|
+
- 命令名直接可用:在工作站里直接执行 `guancli` / `guanetl` / `guanvis` / `guands` / `guanmetric` / `guanwf`(无需安装)。
|
|
385
|
+
- 认证:BI 凭证由网关注入,**不要**执行 `auth login` 或设置 token,直接运行业务命令即可。
|
|
386
|
+
- 文件路径一律用以 `/` 开头的绝对路径(`/` 即工作区根,跨会话持久)。
|
|
387
|
+
- 本技能的参考文档在 `/skills/<技能名>/references/` 下、示例工程在 `/skills/<技能名>/evals/` 下(均只读),用 read_file 工具或 `cat` 按需阅读;正文引用 `references/xxx` / `evals/xxx` 时按此路径解析。
|
|
388
|
+
- 图片文件(png/jpg/gif/webp)用 read_file 工具读取,**不要**用 `cat`/`head` 读图片。默认部署下图片以图像内容返回、模型可直接查看;若 read_file 返回"当前部署已关闭图像内容返回"的提示(部署方接入的模型不支持图像理解),则只有文本元信息,此时不要做任何依赖看图的验证,改用数据类命令核对。
|
|
389
|
+
- 不支持 `cd`、`$VAR` 展开、命令替换 `$(...)`、glob 展开;需要组合时把中间结果写入文件。
|
|
390
|
+
- 文本搜索用 `rg`(工作站内无独立 grep 二进制,`grep`/`egrep`/`fgrep` 会自动转成 `rg` 执行,无需绕路)。
|
|
391
|
+
- `install-skill` / profile 切换 / npm 相关步骤在工作站内不适用,忽略即可。
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "guanetl",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "帮我修改一个观远 BI 的 ETL。ETL ID 是 etl_abcd1234,我要把订单表和用户表按 user_id 做等值关联,补出用户等级,再按订单日期筛选最近 30 天,最后输出到一个新的结果数据集。你直接拉下来改,并告诉我应该预览哪个节点。",
|
|
7
|
+
"expected_output": "代理应识别为编辑已有 ETL 场景,先获取并导入 ETL,再基于专用节点优先的规则修改 etl/ 下文件,执行 export,并建议或执行 preview 针对最终输出节点或关键中间节点。",
|
|
8
|
+
"files": [],
|
|
9
|
+
"expectations": [
|
|
10
|
+
"使用 guanetl 而不是只停留在 guancli 的只读分析",
|
|
11
|
+
"先执行 edit 获取本地工作目录,再修改 etl/ 文件",
|
|
12
|
+
"对等值关联优先选择 JOIN_DATA,而不是直接写 SQL_SCRIPT",
|
|
13
|
+
"在改动后执行 export 验证,并给出可预览的节点建议"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"prompt": "新建一个观远 ETL,名字叫“门店销售日报汇总”。输入来自两个数据集:一个是门店销量明细,一个是门店维表。我现在没有 dsId,你先帮我找,再把这个 ETL 建出来,最后输出每个门店每天的销售额和订单数。",
|
|
19
|
+
"expected_output": "代理应识别为新建 ETL 场景,先联动 guancli 查找合适数据集和字段,再使用 create 初始化工作目录,按照 ETL_AI_DEVELOP 约束编写 etl.go,最后进入 export、preview、save 流程。",
|
|
20
|
+
"files": [],
|
|
21
|
+
"expectations": [
|
|
22
|
+
"先通过 guancli 查找 dsId 和字段,而不是直接假设输入数据集",
|
|
23
|
+
"执行 create 创建新的工作目录",
|
|
24
|
+
"在真正编写节点前参考 ETL_AI_DEVELOP.md",
|
|
25
|
+
"输出中包含 export、preview、save 的后续闭环步骤"
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": 3,
|
|
30
|
+
"prompt": "我这个观远 ETL 本地 export 失败了,报错像是 SQL 校验不过。工作目录已经有了,你帮我定位问题并修掉,不要乱改根目录里的系统文件。",
|
|
31
|
+
"expected_output": "代理应聚焦修复失败场景,先确定工作目录和失败步骤,检查 etl/ 下的 etl.go、SQL 文件和相关约束,做最小必要修改,只重跑 export 以及后续需要的 preview/save 步骤。",
|
|
32
|
+
"files": [],
|
|
33
|
+
"expectations": [
|
|
34
|
+
"明确只修改 etl/ 子目录中的文件",
|
|
35
|
+
"先分析 export 报错和 SQL/节点配置问题,再做代码修改",
|
|
36
|
+
"修复后重新执行 export,而不是直接 save",
|
|
37
|
+
"避免修改 _base_etl.json、_input.json、_exported.json 等系统文件"
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|