@guandata/guanwf 0.1.5 → 0.1.6
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/CHANGELOG.md +4 -0
- package/README.md +4 -0
- package/bin/run.js +26 -14
- package/binaries/guanwf-darwin-arm64 +0 -0
- package/binaries/guanwf-darwin-x64 +0 -0
- package/binaries/guanwf-linux-arm64 +0 -0
- package/binaries/guanwf-linux-x64 +0 -0
- package/binaries/guanwf-win32-x64.exe +0 -0
- package/package.json +1 -1
- package/skills/guanwf/references/ETL_AI_DEVELOP.md +39 -1
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
package/bin/run.js
CHANGED
|
@@ -51,20 +51,32 @@ function copyDirectory(src, dest) {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
function
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
54
|
+
function installBuddySkills(pkgRoot, skill) {
|
|
55
|
+
const srcDir = path.join(pkgRoot, "skills", skill);
|
|
56
|
+
if (!fs.existsSync(path.join(srcDir, "SKILL.md"))) {
|
|
57
|
+
console.warn(`Warning: skipping buddy install; skill not found: ${srcDir}`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
61
60
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
const targets = [
|
|
62
|
+
{
|
|
63
|
+
name: "CodeBuddy",
|
|
64
|
+
configDir: process.env.CODEBUDDY_CONFIG_DIR || path.join(os.homedir(), ".codebuddy"),
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: "WorkBuddy",
|
|
68
|
+
configDir: process.env.WORKBUDDY_CONFIG_DIR || path.join(os.homedir(), ".workbuddy"),
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
for (const target of targets) {
|
|
73
|
+
try {
|
|
74
|
+
const destDir = path.join(target.configDir, "skills", skill);
|
|
75
|
+
copyDirectory(srcDir, destDir);
|
|
76
|
+
console.log(`Installed ${skill} to ${target.name}: ${destDir}`);
|
|
77
|
+
} catch (err) {
|
|
78
|
+
console.warn(`Warning: ${target.name} install failed for ${skill}: ${err.message}`);
|
|
79
|
+
}
|
|
68
80
|
}
|
|
69
81
|
}
|
|
70
82
|
|
|
@@ -91,7 +103,7 @@ if (process.argv[2] === "install-skill") {
|
|
|
91
103
|
const result = spawnSync("npx", args, { stdio: "inherit", env: process.env, shell: true });
|
|
92
104
|
if (result.error) throw result.error;
|
|
93
105
|
const status = result.status || 0;
|
|
94
|
-
if (status === 0)
|
|
106
|
+
if (status === 0) installBuddySkills(pkgRoot, "guanwf");
|
|
95
107
|
process.exit(status);
|
|
96
108
|
}
|
|
97
109
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -62,12 +62,48 @@ orders := BasicInputDataset("id_1001", "订单", "ds_orders", []Field{
|
|
|
62
62
|
- `meta.json` 主要保留 ETL 名称等元信息。
|
|
63
63
|
- 字段相关报错时,优先检查 `[]Field`,不要先怀疑 `meta.json`。
|
|
64
64
|
|
|
65
|
+
## ODS 展示格式字符串先解析再声明数值
|
|
66
|
+
|
|
67
|
+
`guancli ds get` 只能告诉你字段声明类型;ODS / mock / 平台导出表可能把 UI 展示值原样存成 `STRING`,例如 `"13小时31分"`、`"27.69%"`、`"90"`。写 DWD 前先执行 `guancli ds preview <dsId>` 看样本;如果 preview 提示 STRING 样本像展示格式,不能在 `BasicInputDataset` 里直接把该字段声明成 `DOUBLE` / `LONG` 后聚合。
|
|
68
|
+
|
|
69
|
+
`guanetl export` 会通过数据集详情接口校验输入字段 schema:服务端字段是 `STRING` 时,`BasicInputDataset` 不能把它声明成 `DOUBLE` / `LONG` / `DATE` 等非 STRING 类型。
|
|
70
|
+
|
|
71
|
+
推荐先用 `BasicCalculator` 或 SQL 显式解析成新的数值列,再让下游聚合引用新列:
|
|
72
|
+
|
|
73
|
+
```go
|
|
74
|
+
calc := BasicCalculator("id_1002", "解析展示格式度量", inputA, []Formula{
|
|
75
|
+
{
|
|
76
|
+
Name: "下单转化率_数值",
|
|
77
|
+
Type: "DOUBLE",
|
|
78
|
+
Expr: "CAST(REPLACE([下单转化率], \"%\", \"\") AS DOUBLE) / 100",
|
|
79
|
+
Key: "formula_order_rate_value",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
Name: "营业时长_分钟",
|
|
83
|
+
Type: "DOUBLE",
|
|
84
|
+
Expr: "CAST(IF(REGEXP_EXTRACT([营业时长], \"([0-9.]+)小时\", 1) = \"\", \"0\", REGEXP_EXTRACT([营业时长], \"([0-9.]+)小时\", 1)) AS DOUBLE) * 60 + CAST(IF(REGEXP_EXTRACT([营业时长], \"([0-9.]+)分\", 1) = \"\", \"0\", REGEXP_EXTRACT([营业时长], \"([0-9.]+)分\", 1)) AS DOUBLE)",
|
|
85
|
+
Key: "formula_open_minutes",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
Name: "店铺分_数值",
|
|
89
|
+
Type: "DOUBLE",
|
|
90
|
+
Expr: "CAST([店铺分] AS DOUBLE)",
|
|
91
|
+
Key: "formula_store_score_value",
|
|
92
|
+
},
|
|
93
|
+
}, Position{X: 320, Y: 100})
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
- 百分比字符串先去 `%`,再确认业务语义是 `27.69` 还是 `0.2769`。
|
|
97
|
+
- 中文时长要统一成明确单位,例如分钟或秒。
|
|
98
|
+
- 纯数字字符串可能是编码 / ID;确认不是维度编码后再 cast。
|
|
99
|
+
|
|
65
100
|
## 字段 name / alias / showName 规则
|
|
66
101
|
|
|
67
102
|
后端 ETL 的展示名语义主要来自字段 `alias`,有些接口或前端上下文会叫 `displayName` / `showName`。
|
|
68
103
|
|
|
69
104
|
- 新版 ETL 默认使用输入字段别名:如果数据集字段有 `alias`,进入 ETL 算子后的列名通常是 `alias`;没有 `alias` 时才是原始 `name`。
|
|
70
105
|
- 输入字段别名的事实源是数据集字段元数据;可用 `guands dataset fields <dsId>` 回读,用 `guands dataset alias <dsId> --fd-id <fdId> --alias "展示名"` 更新。`BasicInputDataset(..., []Field{...})` 中的字段 schema 主要用于导入/导出和本地 lint,不会把一个未设置过数据集 alias 的字段强制变成展示名列。
|
|
106
|
+
- 本地校验按 `alias -> displayName/showName/title -> name` 解析有效字段名;同一来源下两个字段解析成相同有效名会被视为歧义,建模前应先改名或明确上游输出。
|
|
71
107
|
- SQL 节点使用上游表 `input1`、`input2` 的当前列名。字段有中文展示名时,SQL 里应写展示名并用反引号,例如 ``SELECT `门店ID` FROM input1``。
|
|
72
108
|
- `SELECT_COLUMNS`、`FILTER_ROWS`、`REMOVE_DUPLICATES`、`GROUP_BY` 等直接列名算子,也以当前上游列名为准。
|
|
73
109
|
- 底层数据集读取和数据集元数据仍保留原始 `name`,所以 `guancli` / `guands` 输出字段时要同时关注 `name` 和 `alias`。
|
|
@@ -304,7 +340,8 @@ func DefineETL() []Node {
|
|
|
304
340
|
|
|
305
341
|
1. `go run ./cmd/guanetl export --dir <work_dir>`
|
|
306
342
|
2. 需要看结果时:`go run ./cmd/guanetl preview <node_id> --dir <work_dir>`
|
|
307
|
-
3.
|
|
343
|
+
3. 保存前先看影响:`go run ./cmd/guanetl save --dir <work_dir> --dry-run`
|
|
344
|
+
4. 确认无误后:`go run ./cmd/guanetl save --dir <work_dir>`
|
|
308
345
|
|
|
309
346
|
如果 `export` 没过,不要直接 `save`。
|
|
310
347
|
|
|
@@ -319,6 +356,7 @@ func DefineETL() []Node {
|
|
|
319
356
|
- 不要为了绕过同名错误手动删除旧输出数据集;旧输出通常仍被 ETL 依赖。
|
|
320
357
|
- 如果确实要创建新输出数据集,必须同时更换 `OUTPUT_DATASET` 节点 id,并设置新的 `outputDsName` 或 `parentDirId`;只改名称会被视为已有输出绑定风险。
|
|
321
358
|
- `save` 如果在 direct-save 前提示输出绑定风险,先修本地 `etl.go` / `meta.json`,再重新 `export -> preview -> save`。
|
|
359
|
+
- `save --dry-run` 只生成保存影响报告,不调用 direct-save;需要机器可读结果时加 `--format json`。报告里出现阻断级输出绑定风险时,必须先修本地定义,不能继续真实 `save`。
|
|
322
360
|
|
|
323
361
|
## Appendix: Framework Surface
|
|
324
362
|
|