@guandata/guancli 1.0.34 → 1.0.36

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 CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## @guandata/guancli 1.0.36 - 2026-06-24
4
+
5
+ - `metric` 增加指标主题和指标目录创建能力,便于直接准备指标管理结构。
6
+ - 补充 SuperApp 创建指导,帮助 Agent 按应用和页面场景组织 BI 配置。
7
+ - 页面资源搜索和结果展示增强,按名称或 ID 查找页面时结果更稳定、更易读。
8
+ - `install-skill` 适配 WorkBuddy 配置目录,提升本机编码助手安装兼容性。
9
+
10
+ ## @guandata/guancli 1.0.35 - 2026-06-17
11
+
12
+ - `metric by-dataset` 增强数据集下游指标查询,并补充指标创建/编辑参考说明。
13
+ - `login status` 使用服务端 profile 校验登录状态,减少本地缓存状态误判。
14
+ - 数据集字段输出增加 raw name、alias/displayName 疑似误用提示,便于 ETL 和指标配置前排查字段引用。
15
+
3
16
  ## @guandata/guancli 1.0.34 - 2026-06-15
4
17
 
5
18
  - `metric by-dataset` 支持按数据集 ID 反查直接原子指标,并沿指标血缘展开下游复合指标和衍生指标。
package/README.md CHANGED
@@ -39,9 +39,22 @@ guancli chatbi query --theme-name "经营主题" --message "最近30天营业收
39
39
 
40
40
  ## 版本更新
41
41
 
42
+ ### @guandata/guancli 1.0.36
43
+
44
+ - `metric` 增加指标主题和指标目录创建能力,便于直接准备指标管理结构。
45
+ - 补充 SuperApp 创建指导,帮助 Agent 按应用和页面场景组织 BI 配置。
46
+ - 页面资源搜索和结果展示增强,按名称或 ID 查找页面时结果更稳定、更易读。
47
+ - `install-skill` 适配 WorkBuddy 配置目录,提升本机编码助手安装兼容性。
48
+
49
+ ### @guandata/guancli 1.0.35
50
+
51
+ - `metric by-dataset` 增强数据集下游指标查询,并补充指标创建/编辑参考说明。
52
+ - `login status` 使用服务端 profile 校验登录状态,减少本地缓存状态误判。
53
+ - 数据集字段输出增加 raw name、alias/displayName 疑似误用提示,便于 ETL 和指标配置前排查字段引用。
54
+
42
55
  ### @guandata/guancli 1.0.34
43
56
 
44
- - `metric by-dataset` 支持按数据集 ID 反查直接原子指标,并沿指标血缘展开下游复合指标和衍生指标。
57
+ - `metric by-dataset` 优先使用后端批量接口按数据集 ID 反查直接原子指标和下游复合/衍生指标,旧版 BI 会自动回退到本地扫描逻辑。
45
58
 
46
59
  ### @guandata/guancli 1.0.33
47
60
 
package/bin/run.js CHANGED
@@ -51,20 +51,32 @@ function copyDirectory(src, dest) {
51
51
  }
52
52
  }
53
53
 
54
- function installCodeBuddySkill(pkgRoot, skill) {
55
- try {
56
- const srcDir = path.join(pkgRoot, "skills", skill);
57
- if (!fs.existsSync(path.join(srcDir, "SKILL.md"))) {
58
- console.warn(`Warning: skipping CodeBuddy/WorkBuddy install; skill not found: ${srcDir}`);
59
- return;
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
- const configDir = process.env.CODEBUDDY_CONFIG_DIR || path.join(os.homedir(), ".codebuddy");
63
- const destDir = path.join(configDir, "skills", skill);
64
- copyDirectory(srcDir, destDir);
65
- console.log(`Installed ${skill} to CodeBuddy/WorkBuddy: ${destDir}`);
66
- } catch (err) {
67
- console.warn(`Warning: CodeBuddy/WorkBuddy install failed for ${skill}: ${err.message}`);
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) installCodeBuddySkill(pkgRoot, "guancli");
106
+ if (status === 0) installBuddySkills(pkgRoot, "guancli");
95
107
  process.exit(status);
96
108
  }
97
109
 
Binary file
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guandata/guancli",
3
- "version": "1.0.34",
3
+ "version": "1.0.36",
4
4
  "description": "观远 BI 命令行工具 - 通过 API 操作 ETL、数据集、页面、表单等资源,并提供 ChatBI 问数/洞察能力",
5
5
  "bin": {
6
6
  "guancli": "bin/run.js"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: guancli
3
- description: 当用户要分析观远 BI / Guandata 的 ETL、数据集、页面/仪表板、卡片、血缘、节点 SQL、资源树、目录、表单填报数据、指标 metric、公共维度 public dimension、指标树归因 metric_attribution、指标泛化查询参数,或给出 ETL ID、dsId、page ID、card ID、metric ID、metric tree ID、公共维度 ID 想看现有内容/查询数据时,主动使用这个 skill。用户要创建、新建、编辑、删除指标或公共维度,尤其是“创建原子指标”“创建复合指标”“创建衍生指标”“新增 metric”“基于数据集建指标”“用两个指标算一个指标”“做同比/环比/最近N天/累计/期末值指标”“新建公共维度”“把几个数据集字段关联成公共维度”时,也要使用这个 skill 并读取对应写操作指引。即使用户只说"看一下这个 page""贴一下这个 ETL 的 SQL""搜个叫 X 的数据集""这个数据集长啥样""页面卡片用了哪些 ds""帮我查这个指标""生成指标泛化查询命令""帮我创建一个原子指标""帮我创建一个复合指标""帮我创建一个同比指标""帮我创建一个公共维度",也要触发。它直接调用 BI HTTP API 拉数据并整理成 AI 友好的中文结论,定位是 BI 查询分析 + 表单填报 CRUD + 指标/公共维度写操作引导。修改 ETL 走 guanetl;新建/改 Card/Page 走 guanvis;数据源/数据集 CRUD/增量/调度走 guands;页面 PNG 视觉验证走 guanvis screenshot;管理员级 SVC SQL / 动态码走 guanadmin。若用户希望直接分析 BI 项目而不是手工点页面,或希望直接通过 ChatBI 进行主题问数/洞察分析,也应优先使用这个 skill。
3
+ description: 当用户要分析观远 BI / Guandata 的 ETL、数据集、页面/仪表板、卡片、血缘、节点 SQL、资源树、目录、表单填报数据、指标 metric、公共维度 public dimension、指标树归因 metric_attribution、指标泛化查询参数,或给出 ETL ID、dsId、page ID、card ID、metric ID、metric tree ID、公共维度 ID 想看现有内容/查询数据时,主动使用这个 skill。用户要创建、新建、编辑、删除指标或公共维度,或创建指标主题/指标目录,尤其是“创建原子指标”“创建复合指标”“创建衍生指标”“新增 metric”“基于数据集建指标”“用两个指标算一个指标”“做同比/环比/最近N天/累计/期末值指标”“新建指标主题”“新建指标目录”“新建公共维度”“把几个数据集字段关联成公共维度”时,也要使用这个 skill 并读取对应写操作指引。用户提到“创建超级应用”“创建 SuperApp”“新建 SuperApp 项目”“SuperApp 模板项目”时,也要使用这个 skill,并引导使用 `guancli app create`。即使用户只说"看一下这个 page""贴一下这个 ETL 的 SQL""搜个叫 X 的数据集""这个数据集长啥样""页面卡片用了哪些 ds""帮我查这个指标""生成指标泛化查询命令""帮我创建一个原子指标""帮我创建一个复合指标""帮我创建一个同比指标""帮我创建一个指标主题""帮我创建一个指标目录""帮我创建一个公共维度""帮我创建一个超级应用",也要触发。它直接调用 BI HTTP API 拉数据并整理成 AI 友好的中文结论,定位是 BI 查询分析 + 表单填报 CRUD + 指标/公共维度写操作引导 + SuperApp 模板项目创建。修改 ETL 走 guanetl;新建/改 Card/Page 走 guanvis;数据源/数据集 CRUD/增量/调度走 guands;页面 PNG 视觉验证走 guanvis screenshot;管理员级 SVC SQL / 动态码走 guanadmin。若用户希望直接分析 BI 项目而不是手工点页面,或希望直接通过 ChatBI 进行主题问数/洞察分析,也应优先使用这个 skill。
4
4
  compatibility: Requires Node.js 14+. Install via npm install -g @guandata/guancli.
5
5
  ---
6
6
 
@@ -17,9 +17,11 @@ compatibility: Requires Node.js 14+. Install via npm install -g @guandata/guancl
17
17
  - 用户要搜索指标、获取指标详情、查询指标数据、查看指标目录、执行指标树归因,或让你生成/解释指标泛化查询命令。
18
18
  - 用户给出数据集 ID,想查看该数据集创建或影响到的所有指标,包括直接原子指标以及下游复合指标、衍生指标。
19
19
  - 用户要创建、新建、编辑或删除指标;当前指标写操作指引先覆盖原子指标、复合指标、衍生指标的创建和编辑前校验。
20
+ - 用户要创建指标主题或指标目录。
20
21
  - 用户要查询、新建、编辑、转移责任人或删除指标公共维度。
22
+ - 用户要创建超级应用 / SuperApp / SuperApp 模板项目。
21
23
 
22
- 如果用户只想生成页面 PNG 截图成品,不要用本 skill,改用 `guanvis screenshot`。页面截图不要再走 `guanexport`;移动端页面/卡片导出仍暂用 `guanexport` legacy 功能。
24
+ 如果用户只想生成页面 PNG 截图成品,不要用本 skill,改用 `guanvis screenshot`。
23
25
 
24
26
  ## 数据获取方式
25
27
 
@@ -81,7 +83,7 @@ ChatBI 统一复用当前 profile 的 `base_url` 和 `uIdToken`。
81
83
 
82
84
  ## 能力边界
83
85
 
84
- guancli 是 BI 资源的**查询分析入口**,并支持少量明确边界的写操作(Form 表单填报 CRUD、指标写操作引导)。其他写入类任务由专用 skill 负责:
86
+ guancli 是 BI 资源的**查询分析入口**,并支持少量明确边界的写操作(Form 表单填报 CRUD、指标写操作引导)和 SuperApp 模板项目创建。其他写入类任务由专用 skill 负责:
85
87
 
86
88
  | 任务 | 应使用的工具 |
87
89
  |------|-------------|
@@ -91,6 +93,20 @@ guancli 是 BI 资源的**查询分析入口**,并支持少量明确边界的
91
93
 
92
94
  > guancli 能显示 ETL 的节点定义和 SQL,但 ETL 的新建、修改、保存、执行闭环应通过 `guanetl` 完成。
93
95
 
96
+ ## SuperApp 项目创建
97
+
98
+ 当用户提到创建超级应用、创建 SuperApp、新建 SuperApp 项目或基于 SuperApp 模板初始化项目时,使用 `guancli app create`。
99
+
100
+ ```bash
101
+ guancli app create --name <project_name> --path <parent_dir>
102
+ ```
103
+
104
+ 关键规则:
105
+
106
+ - `--name` 是项目名称,`--path` 是项目所在的父目录;信息不全时先确认项目名称和目标目录。
107
+ - 该命令会下载 SuperApp 模板并创建项目目录,随后尝试复制 `.env.template`、更新 `package.json` 名称、初始化 git,并根据模板情况执行 `setup.sh` 或 `npm install` + 启动本地 dev server。
108
+ - 如果用户只是要创建本地 SuperApp 模板项目,不需要先做 BI 资源查询;直接给出或执行 `guancli app create`。
109
+
94
110
  ## 先做判断
95
111
 
96
112
  1. 先用 `auth status` 确认认证是否有效。
@@ -117,7 +133,9 @@ guancli 是 BI 资源的**查询分析入口**,并支持少量明确边界的
117
133
  关键规则:
118
134
 
119
135
  - 普通指标数据查询用 `guancli metric query <metric_id>`,可加 `--dim`、`--filter`、排序、列筛选、输出格式等。
120
- - 按数据集反查指标用 `guancli metric by-dataset <ds_id>`;该命令会先定位使用该数据集的原子指标,再沿指标下游血缘展开复合指标和衍生指标,适合回答“这个数据集关联了哪些指标 / 改这个数据集会影响哪些指标”。如果已知指标主题,可加 `-d <metric_topic_id>` 缩小搜索范围;需要结构化结果时用 `-f json`。
136
+ - 创建指标主题用 `guancli metric project-create <name>`;创建后后端会同步创建主题根目录。默认图标与 Web 新建主题一致,可用 `--icon`、`--icon-color` 覆盖;真实提交前可加 `--dry-run` 查看请求体。
137
+ - 创建指标目录用 `guancli metric dir-create <name> --project-id <metric_topic_id>`,也可用 `--project-name <name>` 按主题名称解析;默认创建在该主题根目录下。创建子目录优先传 `--parent-dir-id <dir_id>`,也可用 `--parent-dir-name <name>` 按父目录名称解析;真实提交前可加 `--dry-run` 查看请求体。信息不全时先用 `guancli metric project` 和 `guancli metric tree` 定位主题 ID、目录 ID。若用户只给主题名称且当前环境下有重复主题名,必须让用户从候选主题 ID 中指定一个;若用户只给父目录名称且同一主题下有重复目录名,必须让用户从候选目录 ID 中指定一个,不要自行猜测。
138
+ - 按数据集反查指标用 `guancli metric by-dataset <ds_id>`;新版 BI 会走后端批量接口直接返回直接指标和下游指标,旧版 BI 会兼容回退为先定位使用该数据集的原子指标、再沿指标下游血缘展开复合指标和衍生指标。适合回答“这个数据集关联了哪些指标 / 改这个数据集会影响哪些指标”。如果已知指标主题,可加 `-d <metric_topic_id>` 缩小范围;需要结构化结果时用 `-f json`。
121
139
  - 只要传入 `--compare`、`--compare-value`、`--xtd`、`--last`、`--recent`、`--recent-base`、`--percentage`、`--percentage-dim`、`--rank-top`、`--rank-order`、`--rank-dim`、`--adv-calc-json` 任一参数,就进入指标泛化查询模式。
122
140
  - 泛化查询要求 BI 版本 `>= 8.2.1`;如需确认环境版本,先执行 `guancli server-version --profile <profile>`。
123
141
  - 当用户要创建或编辑原子指标、复合指标、衍生指标时,先读取 `references/metric-mutation.md` 判断类型,再读取 `references/metric-common-fields.md`,最后只读取对应类型文件:原子指标读 `references/metric-atomic-mutation.md`,复合指标读 `references/metric-composite-mutation.md`,衍生指标读 `references/metric-derived-mutation.md`。如果涉及原子指标表达式 `formulaField.fdFormula`、复合指标 `formula` 或组合衍生 `deriveSetting.formula`,必须同时读取 `references/metric-expression-rules.md`,按当前前后端支持的表达式形态生成。默认使用当前已登录环境,不询问 profile;按必填项、数据格式 `format` 和启用的指标业务属性配置逐步查询/确认,生成 JSON 文件并先做 dry-run/人工摘要。用户确认后仍需按 Web 同款保存前校验执行:原子指标上线前跑 save-precheck,编辑态跑 validate-update-impact;复合指标和衍生指标编辑态跑 validate-update-impact。校验通过或二次确认后才真实提交。
@@ -63,17 +63,31 @@
63
63
  - `SUM([fd_id])`、`COUNT([fd_id])`
64
64
  - 多个聚合项加减:`SUM([fd_a]) - SUM([fd_b])`
65
65
  - 条件聚合:`SUM(CASE WHEN ... THEN ... ELSE ... END)`
66
- - 一个顶层比值:`SUM([fd_a]) / COUNT([fd_b])` 或 `(SUM([fd_a]) + SUM([fd_b])) / SUM([fd_c])`
67
66
 
68
67
  不要把 `AVG/MAX/MIN/FIRST/LAST/ANY_VALUE` 主动写进 `formulaField.fdFormula`;如果用户要平均值、最大值、最小值,优先走“来源字段 + `aggrType`”。表达式中字段必须写 `[fdId]`,不要提交字段中文名。
69
68
 
69
+ ### 计算表达式确认
70
+
71
+ 遇到计算表达式时,不要直接替用户决定创建原子表达式还是复合指标。先说明两种方案并询问:
72
+
73
+ - 原子表达式:直接在当前数据集字段上生成 `formulaField.fdFormula`。
74
+ - 复合指标:先创建或复用表达式中的基础原子指标,再用 `[metricId]` 公式创建复合指标。
75
+
76
+ 用户选择复合指标后,再拆解基础度量。例如 `SUM([attributed_sales_fd]) / SUM([spend_amount_fd])` 可先创建或复用“归因销售额”“广告花费”两个原子指标,再创建复合指标:
77
+
78
+ ```text
79
+ [metric_attributed_sales] / [metric_ad_spend]
80
+ ```
81
+
82
+ 用户选择原子表达式,或明确要求“数据集字段表达式原子指标”时,才使用 `formulaField.fdFormula`。
83
+
70
84
  ## 信息收集
71
85
 
72
86
  如果用户只说“帮我创建一个原子指标”,先收集:
73
87
 
74
88
  1. 指标主题和保存目录。
75
89
  2. 来源数据集和来源字段。
76
- 3. 计算方式:来源字段 + 聚合方式,还是表达式;如果是表达式,按 `metric-expression-rules.md` 校验支持形态。
90
+ 3. 计算方式:来源字段 + 聚合方式,还是表达式;如果是表达式,先询问用户是否改用复合指标。用户选择原子表达式时,再按 `metric-expression-rules.md` 校验支持形态。
77
91
  4. 指标名称、业务口径、适用维度、时间维度、是否保存并上线。
78
92
  5. 数据格式:默认、数值、货币、百分比;如需指定,确认小数位、千分位、货币符号/前后缀、数量级单位、百分比是否除以 100。
79
93
  6. 责任人是否用当前登录用户。
@@ -140,28 +154,29 @@
140
154
 
141
155
  ## 创建步骤
142
156
 
143
- 1. 生成 `/tmp/atomic_metric.json`。
144
- 2. 先 dry-run:
157
+ 1. 先输出指标创建计划,按 `metric-mutation.md` 的“指标创建计划”要求展示环境、主题、目录、来源数据集/字段、聚合方式或表达式、适用维度/时间维度、格式、业务属性和保存方式。
158
+ 2. 用户确认计划后,生成 `/tmp/atomic_metric.json`。
159
+ 3. 先 dry-run:
145
160
 
146
161
  ```bash
147
162
  guancli metric create --file /tmp/atomic_metric.json --dry-run
148
163
  ```
149
164
 
150
- 3. 按 `metric-common-fields.md` 向用户摘要并确认。
151
- 4. 如果 `publish=true`,先跑 save-precheck:
165
+ 4. 按 `metric-common-fields.md` 向用户摘要并确认。
166
+ 5. 如果 `publish=true`,先跑 save-precheck:
152
167
 
153
168
  ```bash
154
169
  guancli fetch POST /api/metric-platform/metrics/atomic-metrics/save-precheck --stdin < /tmp/atomic_metric.json
155
170
  ```
156
171
 
157
- 5. 如果返回 `conflicts` 且非空,展示冲突指标、冲突口径、适用维度差异,等待用户二次确认。
158
- 6. 校验通过或二次确认后提交:
172
+ 6. 如果返回 `conflicts` 且非空,展示冲突指标、冲突口径、适用维度差异,等待用户二次确认。
173
+ 7. 校验通过或二次确认后提交:
159
174
 
160
175
  ```bash
161
176
  guancli metric create --file /tmp/atomic_metric.json -f json
162
177
  ```
163
178
 
164
- 7. 响应返回指标 ID 后回读:
179
+ 8. 响应返回指标 ID 后回读:
165
180
 
166
181
  ```bash
167
182
  guancli metric get <metric_id> --brief
@@ -35,6 +35,8 @@ guancli metric [command]
35
35
  | `by-dataset` | 按数据集 ID 获取直接和下游关联指标 |
36
36
  | `query` | 查询指标数据 |
37
37
  | `tree` | 获取指标目录树 |
38
+ | `project-create` | 创建指标主题 |
39
+ | `dir-create` | 创建指标目录 |
38
40
  | `create` | 新建原子指标(JSON 文件驱动) |
39
41
  | `edit` | 编辑原子指标(JSON patch / replace) |
40
42
  | `delete` | 删除指标(先执行删除影响校验) |
@@ -59,6 +61,30 @@ guancli metric project 经营 --profile default -f json
59
61
  guancli metric project 经营 --profile default --raw
60
62
  ```
61
63
 
64
+ ### metric project-create
65
+
66
+ 创建指标主题。主题创建成功后,后端会同步创建该主题根目录。默认图标和颜色与 Web 新建主题一致,可按需覆盖。
67
+
68
+ ```bash
69
+ guancli metric project-create <name> [flags]
70
+ ```
71
+
72
+ 专属参数:
73
+
74
+ | 参数 | 默认值 | 说明 |
75
+ | --- | --- | --- |
76
+ | `--icon string` | `finance_subject` | 主题图标 |
77
+ | `--icon-color string` | `#1A827F` | 主题图标颜色 |
78
+ | `--dry-run` | `false` | 只输出请求方法和请求体,不提交 |
79
+
80
+ 示例:
81
+
82
+ ```bash
83
+ guancli metric project-create 经营指标 --profile default --dry-run
84
+ guancli metric project-create 经营指标 --profile default
85
+ guancli metric project-create 经营指标 --profile default --icon finance_subject --icon-color '#1A827F'
86
+ ```
87
+
62
88
  ### metric search
63
89
 
64
90
  搜索指标;传关键词时后台用 `%keyword%` 模糊匹配,不传关键词返回所有指标。
@@ -183,6 +209,36 @@ guancli metric tree --profile default -f json
183
209
  guancli metric tree --profile default --raw
184
210
  ```
185
211
 
212
+ ### metric dir-create
213
+
214
+ 创建指标目录。默认在指定主题根目录下创建;可用 `--project-id` 指定主题 ID,也可用 `--project-name` 按主题名称解析。创建子目录时可用 `--parent-dir-id` 指定父目录 ID,也可用 `--parent-dir-name` 按父目录名称解析。
215
+ 如果当前环境下存在多个同名主题,CLI 会阻断创建并列出候选 ID,此时应让用户指定 `--project-id`。
216
+ 如果同一主题下存在多个同名父目录,CLI 会阻断创建并列出候选路径和 ID,此时应让用户指定 `--parent-dir-id`。
217
+
218
+ ```bash
219
+ guancli metric dir-create <name> (--project-id <metric_topic_id> | --project-name <metric_topic_name>) [flags]
220
+ ```
221
+
222
+ 专属参数:
223
+
224
+ | 参数 | 默认值 | 说明 |
225
+ | --- | --- | --- |
226
+ | `--project-id string` | 无 | 指标主题 ID;与 `--project-name` 二选一 |
227
+ | `--project-name string` | 无 | 指标主题名称;同名主题重复时改用 `--project-id` |
228
+ | `--parent-dir-id string` | 无 | 父目录 ID;为空时 CLI 自动使用主题根目录 |
229
+ | `--parent-dir-name string` | 无 | 父目录名称;同名目录重复时改用 `--parent-dir-id` |
230
+ | `--dry-run` | `false` | 只输出请求方法和请求体,不提交 |
231
+
232
+ 示例:
233
+
234
+ ```bash
235
+ guancli metric dir-create 广告分析 --profile default --project-id <metric_topic_id> --dry-run
236
+ guancli metric dir-create 广告分析 --profile default --project-id <metric_topic_id>
237
+ guancli metric dir-create 广告分析 --profile default --project-name 经营指标
238
+ guancli metric dir-create 投放效果 --profile default --project-id <metric_topic_id> --parent-dir-id <dir_id>
239
+ guancli metric dir-create 投放效果 --profile default --project-name 经营指标 --parent-dir-name 广告分析
240
+ ```
241
+
186
242
  ### metric create
187
243
 
188
244
  新建原子指标。写入流程先读 `metric-mutation.md` 和 `metric-common-fields.md`,原子字段、问询流程和 JSON 模板见 `metric-atomic-mutation.md`。复合指标和衍生指标创建当前使用 `guancli fetch POST /api/metric-platform/metrics/<type>-metrics --stdin`,分别见 `metric-composite-mutation.md` 和 `metric-derived-mutation.md`。
@@ -153,8 +153,10 @@ guancli fetch GET /api/metric-attr-config
153
153
 
154
154
  ## 保存与确认
155
155
 
156
- - 先生成 JSON 文件并做 dry-run 或人工摘要,不直接提交。
157
- - 摘要至少包含:当前环境、主题、目录、指标类型、名称、核心计算方式、适用维度/时间维度、数据格式、业务属性、保存方式。
156
+ - 先输出“指标创建计划”让用户 review;计划确认前不生成最终提交 JSON,不执行真实创建。
157
+ - 用户确认计划后,再生成 JSON 文件并做 dry-run 或人工摘要,不直接提交。
158
+ - 计划/摘要至少包含:当前环境、主题、目录、指标类型、名称、核心计算方式、依赖顺序、复用/新建指标、适用维度/时间维度、数据格式、业务属性、保存方式。
159
+ - 如果适用维度中存在时间字段但时间维度为空,计划必须标记为待确认,不能继续提交。
158
160
  - 用户确认后按类型执行 save-precheck 或 validate-update-impact。
159
161
  - 如果校验返回冲突或影响下游资源,展示冲突指标、受影响指标、受影响卡片,并等待二次确认。
160
162
  - 写入成功后回读 `guancli metric get <metric_id> --brief`。
@@ -6,6 +6,7 @@
6
6
 
7
7
  - 用户说“创建复合指标”“基于多个指标算一个指标”。
8
8
  - 用户描述的口径是已有指标之间的四则运算。
9
+ - 用户给出数据集字段计算表达式后,确认希望先创建/复用基础原子指标,再创建复合指标。
9
10
  - 用户要编辑一个 `subType=COMPOSITE` 的指标。
10
11
 
11
12
  ## 创建必填信息
@@ -43,11 +44,21 @@
43
44
 
44
45
  - 涉及复合指标 `formula` 时,先读取 `metric-expression-rules.md`。
45
46
  - 先用 `guancli metric search <关键词> -d <projectId> -f json` 查询公式中的指标,再用 `guancli metric get <metric_id> --brief` 核对名称、类型、状态和适用维度。
47
+ - 如果用户只提供数据集字段级公式,先询问是否要创建复合指标。用户确认后,再识别公式里的基础度量,创建或复用基础原子指标,并把公式改写为 `[metricId]`。
46
48
  - 公式只能引用数值型指标;不要引用当前正在编辑的指标本身。
47
49
  - 公式支持 `+`、`-`、`*`、`/`、括号、数字和 `[指标ID]`;不要主动生成函数、窗口函数或 SQL 片段。
48
50
  - 公式中的 `[xxx]` 会被后端解析为上游指标 ID,并参与循环引用校验。
49
51
  - 如果用户用中文名描述公式,先转换成 ID 公式,再把“中文公式”和“ID 公式”都展示给用户确认。
50
52
 
53
+ 用户确认创建复合指标后的字段公式改写示例:
54
+
55
+ | 用户口径 | 建模方式 |
56
+ | --- | --- |
57
+ | `SUM([销售额字段]) / COUNT([订单ID字段])` | 先建“销售额”“订单数”原子指标,再建复合指标 `[metric_sales] / [metric_order_count]` |
58
+ | `SUM([归因销售额字段]) / SUM([广告花费字段])` | 先建“归因销售额”“广告花费”原子指标,再建复合指标 ROAS |
59
+ | `SUM([点击量字段]) / SUM([曝光量字段])` | 先建“点击量”“曝光量”原子指标,再建复合指标 CTR |
60
+ | `COUNT(CASE WHEN ... THEN 1 ELSE NULL END) / COUNT([ID字段])` | 先判断分子是否应建为条件计数原子指标或业务限定衍生指标,再创建复合比率指标 |
61
+
51
62
  ## 适用维度
52
63
 
53
64
  复合指标的适用维度来自公式中引用指标的共有维度:
@@ -103,17 +114,18 @@
103
114
 
104
115
  `guancli metric create` 当前是原子指标专用 endpoint;复合指标创建使用 `guancli fetch`。
105
116
 
106
- 1. 生成 `/tmp/composite_metric.json`。
107
- 2. 本地/人工检查 JSON、公式引用指标、共有适用维度、必填业务属性。
108
- 3. 按 `metric-common-fields.md` 向用户摘要并确认。
109
- 4. 用户确认后,不调用原子指标 `save-precheck`;复合指标 Web 创建没有 save-precheck。
110
- 5. 提交真实创建:
117
+ 1. 先输出指标创建计划,按 `metric-mutation.md` 的“指标创建计划”要求展示环境、主题、目录、将复用或新建的基础指标、复合公式、共有适用维度/时间维度、格式、业务属性和保存方式。
118
+ 2. 用户确认计划后,生成 `/tmp/composite_metric.json`。
119
+ 3. 本地/人工检查 JSON、公式引用指标、共有适用维度、必填业务属性。
120
+ 4. 按 `metric-common-fields.md` 向用户摘要并确认。
121
+ 5. 用户确认后,不调用原子指标 `save-precheck`;复合指标 Web 创建没有 save-precheck。
122
+ 6. 提交真实创建:
111
123
 
112
124
  ```bash
113
125
  guancli fetch POST /api/metric-platform/metrics/composite-metrics --stdin < /tmp/composite_metric.json
114
126
  ```
115
127
 
116
- 6. 响应返回指标 ID 后回读:
128
+ 7. 响应返回指标 ID 后回读:
117
129
 
118
130
  ```bash
119
131
  guancli metric get <metric_id> --brief
@@ -345,17 +345,18 @@
345
345
 
346
346
  `guancli metric create` 当前是原子指标专用 endpoint;衍生指标创建使用 `guancli fetch`。
347
347
 
348
- 1. 生成 `/tmp/derived_metric.json`。
349
- 2. 本地/人工检查 JSON、基础指标或公式引用指标、时间维度、衍生配置、必填业务属性。
350
- 3. 按 `metric-common-fields.md` 向用户摘要并确认。
351
- 4. 用户确认后,不调用原子指标 `save-precheck`;衍生指标 Web 创建没有 save-precheck。
352
- 5. 提交真实创建:
348
+ 1. 先输出指标创建计划,按 `metric-mutation.md` 的“指标创建计划”要求展示环境、主题、目录、基础指标或组合衍生引用指标、衍生配置、时间维度、格式、业务属性和保存方式。
349
+ 2. 用户确认计划后,生成 `/tmp/derived_metric.json`。
350
+ 3. 本地/人工检查 JSON、基础指标或公式引用指标、时间维度、衍生配置、必填业务属性。
351
+ 4. 按 `metric-common-fields.md` 向用户摘要并确认。
352
+ 5. 用户确认后,不调用原子指标 `save-precheck`;衍生指标 Web 创建没有 save-precheck。
353
+ 6. 提交真实创建:
353
354
 
354
355
  ```bash
355
356
  guancli fetch POST /api/metric-platform/metrics/derived-metrics --stdin < /tmp/derived_metric.json
356
357
  ```
357
358
 
358
- 6. 响应返回指标 ID 后回读确认。
359
+ 7. 响应返回指标 ID 后回读确认。
359
360
 
360
361
  ## 编辑步骤
361
362
 
@@ -19,6 +19,8 @@
19
19
 
20
20
  原子指标选择“使用表达式”时,表达式走数据集公式编辑器和后端数据集派生字段校验。后端会把公式当成数据集计算字段检查,并要求最终字段是聚合表达式;没有聚合函数会报“原子指标表达式必须包含聚合函数”。
21
21
 
22
+ 遇到计算表达式时,先询问用户是否希望创建复合指标。用户确认创建复合指标后,再创建或复用表达式中的基础原子指标,并用 `[metricId]` 生成复合指标公式。用户选择原子表达式或明确要求数据集字段表达式时,才在 `formulaField.fdFormula` 中使用 `[fdId]`。
23
+
22
24
  ### 推荐支持形态
23
25
 
24
26
  | 形态 | 示例 | 说明 |
@@ -29,14 +31,13 @@
29
31
  | 聚合内部加减 | `SUM([fd_price] + [fd_tax] - [fd_discount])` | 字段先加减再聚合 |
30
32
  | 条件聚合 | `SUM(CASE WHEN [fd_status] = 'paid' THEN [fd_amount] ELSE 0 END)` | 支持 `CASE WHEN`、比较、`AND/OR/NOT` |
31
33
  | 条件计数 | `COUNT(CASE WHEN [fd_status] = 'paid' THEN 1 ELSE 0 END)` | 条件计数 |
32
- | 顶层比值 | `SUM([fd_amount]) / COUNT([fd_order_id])` | 只建议一个顶层 `/` |
33
- | 分子/分母加减后相除 | `(SUM([fd_a]) + SUM([fd_b])) / (SUM([fd_c]) + COUNT([fd_d]))` | 分子、分母内部仅用加减和推荐聚合 |
34
34
  | 动态参数 | `SUM(CASE WHEN [fd_amount] > [DYNAMIC_PARAMS.N] THEN [fd_amount] ELSE 0 END)` | 同时在顶层 `dynamicParameters` 写默认值 |
35
35
 
36
36
  ### 避免生成
37
37
 
38
38
  - 无聚合表达式:`[fd_amount] + [fd_tax]`。
39
39
  - 乘法:`SUM([fd_price] * [fd_qty])`、`SUM([fd_a]) * SUM([fd_b])`。
40
+ - 在未询问用户前,直接把可拆分的最终计算指标写成原子表达式。应先确认是否改用基础原子指标 + 复合指标。
40
41
  - 非顶层除法:`SUM([fd_a]) + SUM([fd_b]) / SUM([fd_c])`。
41
42
  - 多重除法:`SUM([fd_a]) / SUM([fd_b]) / SUM([fd_c])`。
42
43
  - `AVG/MAX/MIN/FIRST/LAST/ANY_VALUE` 等聚合函数表达式;如果用户要平均值、最大值、最小值,优先走“来源字段 + `aggrType=AVG/MAX/MIN`”。
@@ -28,24 +28,79 @@
28
28
 
29
29
  - “新建一个指标,基于某数据集/某字段”:通常是原子指标。
30
30
  - “客单价 = 销售额 / 订单数”:通常是复合指标。
31
+ - “用数据集字段计算一个表达式指标”:先按下方“表达式建模确认”询问用户是否改为复合指标。
31
32
  - “给销售额做月环比/最近 7 天/本月累计/华东限定”:通常是衍生指标。
32
33
 
34
+ ## 表达式建模确认
35
+
36
+ 只要用户要创建的是计算表达式指标,不要直接替用户决定用原子表达式还是复合指标。先向用户确认:
37
+
38
+ ```text
39
+ 这个指标需要计算表达式。是否希望我先创建/复用表达式中的基础原子指标,再创建一个复合指标?
40
+ 如果选择否,我会按数据集字段表达式创建原子指标。
41
+ ```
42
+
43
+ 用户选择“是”时:
44
+
45
+ 1. 拆出表达式中的基础度量。
46
+ 2. 先搜索是否已有对应基础原子指标;已有则复用。
47
+ 3. 缺失基础指标时,先按 `metric-atomic-mutation.md` 创建基础原子指标。
48
+ 4. 再按 `metric-composite-mutation.md` 创建复合指标,公式使用 `[metricId]`,不要使用 `[fdId]`。
49
+
50
+ 用户选择“否”或明确要求数据集字段表达式时,才走原子指标 `formulaField.fdFormula`。
51
+
33
52
  ## 总体流程
34
53
 
35
54
  1. 使用当前已登录环境,不主动询问 profile;写操作前可执行 `guancli auth status`。
36
55
  2. 信息不全时先查 ID,不凭空猜:
37
56
  - 指标主题:`guancli metric project [keyword] -f json`
38
57
  - 指标目录:`guancli metric tree -f json`
58
+ - 新建指标主题:`guancli metric project-create <name> --dry-run`,确认后去掉 `--dry-run`
59
+ - 新建指标目录:`guancli metric dir-create <name> --project-id <metric_topic_id> --dry-run`,也可用 `--project-name <metric_topic_name>`;确认后去掉 `--dry-run`。创建子目录可传 `--parent-dir-id`,也可传 `--parent-dir-name`。若主题名称重复必须让用户指定主题 ID;若父目录名称重复必须让用户指定目录 ID
39
60
  - 指标详情:`guancli metric search <keyword> -f json`、`guancli metric get <metric_id> --brief`
40
61
  - 数据集字段:`guancli ds search <keyword>`、`guancli ds get <dsId> --brief`
41
62
  3. 读取启用的指标业务属性配置,补齐必填 `bizAttrs`。
42
- 4. 生成 JSON 文件,先做 dry-run 或人工摘要,向用户确认当前环境、目标目录、指标口径、计算配置、业务属性和保存方式。
43
- 5. 用户确认后,仍需按 Web 同款交互执行保存前校验或影响校验。
44
- 6. 校验通过、无对应校验,或用户对冲突/影响完成二次确认后,才提交真实创建或编辑。
45
- 7. 写入成功后用 `guancli metric get <metric_id> --brief` 回读确认。
63
+ 4. 生成“指标创建计划”,让用户 review;用户确认计划前,不生成最终提交 JSON,不执行 dry-run/precheck/真实创建。
64
+ 5. 用户确认计划后,生成 JSON 文件,先做 dry-run 或人工摘要,向用户确认当前环境、目标目录、指标口径、计算配置、业务属性和保存方式。
65
+ 6. 用户确认后,仍需按 Web 同款交互执行保存前校验或影响校验。
66
+ 7. 校验通过、无对应校验,或用户对冲突/影响完成二次确认后,才提交真实创建或编辑。
67
+ 8. 写入成功后用 `guancli metric get <metric_id> --brief` 回读确认。
46
68
 
47
69
  不要把“dry-run 成功”“precheck 通过”或“影响校验无阻塞”描述成指标已经创建/编辑成功。
48
70
 
71
+ ## 指标创建计划
72
+
73
+ 创建指标前必须先输出一个计划供用户 review,尤其是一个需求会创建多个基础原子指标和复合指标时。计划确认前不得提交真实创建请求。
74
+
75
+ 计划至少包含:
76
+
77
+ - 当前环境和目标主题。
78
+ - 目标目录路径和目录 ID。
79
+ - 将创建的指标清单,按依赖顺序排序;每个指标标明临时序号、名称、类型、保存方式。
80
+ - 每个指标的核心口径:原子指标写数据集、字段、聚合方式或表达式;复合指标写中文公式和 `[metricId]` 公式草案;衍生指标写基础指标和衍生配置。
81
+ - 适用维度和时间维度;如果存在时间字段但时间维度为空,计划必须标记为待确认,不能进入提交步骤。
82
+ - 数据格式、业务负责人、必填业务属性。
83
+ - 将复用的已有指标和将新建的基础指标。
84
+ - 后续会执行的校验:dry-run、save-precheck、validate-update-impact 或本地引用检查。
85
+
86
+ 计划示例:
87
+
88
+ ```markdown
89
+ ### 指标创建计划
90
+
91
+ 环境:demo-guandata
92
+ 主题:跨境电商指标体系 (ida4...)
93
+ 目录:广告分析 / 投放效果 (dir_xxx)
94
+
95
+ | 步骤 | 动作 | 指标名称 | 类型 | 核心口径 | 时间维度 | 保存方式 |
96
+ | --- | --- | --- | --- | --- | --- | --- |
97
+ | 1 | 复用 | 归因销售额 | 原子指标 | SUM(attributed_sales) | updated_at | 在线 |
98
+ | 2 | 复用 | 广告花费 | 原子指标 | SUM(spend_amount) | updated_at | 在线 |
99
+ | 3 | 新建 | ROAS | 复合指标 | [归因销售额] / [广告花费] | updated_at | 草稿 |
100
+
101
+ 确认后我会生成 JSON、执行 dry-run/必要校验,再提交创建。
102
+ ```
103
+
49
104
  ## 校验入口速查
50
105
 
51
106
  | 操作 | 校验规则 |