@thinkingai/ae-cli 6.1.18 → 6.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +97 -38
  2. package/README.zh.md +101 -38
  3. package/dist/{auth-ROB2EDYV.js → auth-FUM37MHF.js} +241 -126
  4. package/dist/{capability-DKMYUTLC.js → capability-AXFQW5WM.js} +49 -35
  5. package/dist/{chunk-JHENBQ5B.js → chunk-4P355ZWB.js} +70 -1
  6. package/dist/chunk-6ZIQV5GW.js +26 -0
  7. package/dist/{chunk-TUKQZTMI.js → chunk-7K24F7T2.js} +2 -0
  8. package/dist/{chunk-OO6XR6LK.js → chunk-AMBFK2K3.js} +2 -0
  9. package/dist/chunk-ATSM5XAW.js +623 -0
  10. package/dist/{chunk-4XXOWOTA.js → chunk-BBEFP4SB.js} +31 -38
  11. package/dist/{chunk-BYYS3ANB.js → chunk-CZU3V3DQ.js} +5 -15
  12. package/dist/{chunk-VTWMIC5L.js → chunk-E2JKXMVO.js} +2 -0
  13. package/dist/chunk-ECBLHAZO.js +15 -0
  14. package/dist/{sync-HKIOZXQE.js → chunk-I4WQAEYB.js} +31 -540
  15. package/dist/{chunk-DWO43OIB.js → chunk-JQ3ENZZH.js} +2 -0
  16. package/dist/chunk-LNZBEQXW.js +25216 -0
  17. package/dist/{chunk-ZQ47LWTI.js → chunk-QJQZH5GQ.js} +49 -79
  18. package/dist/{chunk-QZ3AS4KK.js → chunk-RSG4ONOI.js} +9 -8
  19. package/dist/{chunk-4NN5IWVN.js → chunk-T6OSFQZD.js} +2 -0
  20. package/dist/{chunk-Y3LOALAV.js → chunk-TAL6CZH6.js} +8 -7
  21. package/dist/{chunk-3KWQYGYI.js → chunk-TKHSULJT.js} +2 -0
  22. package/dist/chunk-VXNMYUXU.js +202 -0
  23. package/dist/{chunk-3FY3RJ26.js → chunk-WZ6YVQSF.js} +15 -14
  24. package/dist/{chunk-6EIJSNBD.js → chunk-Y74WTIKJ.js} +2 -0
  25. package/dist/{community-report-client-C7WDGET3.js → community-report-client-XXWGSBSD.js} +3 -4
  26. package/dist/{config-BMYZX2UE.js → config-EXUGQN5T.js} +10 -10
  27. package/dist/{data-integration-QEKDWQDY.js → data-integration-4NZ53OMT.js} +920 -97
  28. package/dist/index.js +56 -81
  29. package/dist/{local-data-upload-client-4YYHSYD6.js → local-data-upload-client-KYOKVYZV.js} +3 -4
  30. package/dist/{memory-I2WXDTV2.js → memory-ATNKZNW5.js} +6 -7
  31. package/dist/{metadata-I4C2EWUN.js → metadata-VZVC7YMH.js} +10 -11
  32. package/dist/{model-HLHIEFMU.js → model-E4JMQ4V2.js} +8 -9
  33. package/dist/{personal-semantic-preference-LIPACBDX.js → personal-semantic-preference-7S2SQ3UV.js} +9 -10
  34. package/dist/{project-semantic-RT3R2VQD.js → project-semantic-2SZP2OPO.js} +13 -14
  35. package/dist/sync-YV3E66IF.js +520 -0
  36. package/dist/{te-agent-BR6VDBNX.js → te-agent-JB5T3PO7.js} +396 -92
  37. package/dist/{te-analysis-7VUNUYWZ.js → te-analysis-3YJAAT2D.js} +196 -43
  38. package/dist/{te-community-5DMNKJWY.js → te-community-UDBI672N.js} +12 -34
  39. package/dist/{te-dataops-6P5IKWNJ.js → te-dataops-ZLYOCXZ4.js} +480 -81
  40. package/dist/{te-engage-KZPR5R22.js → te-engage-4XG6OJML.js} +88 -16
  41. package/dist/{te-experiment-6BITX4RD.js → te-experiment-VXUWPINJ.js} +83 -12
  42. package/dist/te-kb-WYQWHFSC.js +1732 -0
  43. package/dist/{te-system-FXITO2JG.js → te-system-7G6F2LJA.js} +569 -35
  44. package/dist/{te-team-ADOC2ROP.js → te-team-E7FBBXMQ.js} +8 -7
  45. package/dist/{update-YCYCKJOO.js → update-D47BUG25.js} +8 -8
  46. package/package.json +22 -10
  47. package/skills/ae-agent/SKILL.md +30 -13
  48. package/skills/ae-agent/references/agent-distribution.md +94 -0
  49. package/skills/ae-agent/references/approval-request.md +4 -0
  50. package/skills/ae-agent/references/command_index.md +9 -2
  51. package/skills/ae-agent/references/create-automation.md +20 -2
  52. package/skills/ae-agent/references/get-agent-context.md +70 -0
  53. package/skills/ae-agent/references/list-automations.md +18 -3
  54. package/skills/ae-agent/references/list-mcp-credentials.md +1 -1
  55. package/skills/ae-agent/references/mcp-token.md +3 -3
  56. package/skills/ae-agent/references/set-mcp-credential.md +0 -1
  57. package/skills/ae-agent/references/update-automation.md +18 -0
  58. package/skills/ae-analysis/SKILL.md +11 -2
  59. package/skills/ae-analysis/references/adhoc_run.md +2 -0
  60. package/skills/ae-analysis/references/ai_models.md +23 -3
  61. package/skills/ae-analysis/references/analysis_gateway_assets.md +3 -3
  62. package/skills/ae-analysis/references/audience_models.md +18 -0
  63. package/skills/ae-analysis/references/command_index.md +9 -9
  64. package/skills/ae-analysis/references/cross_source_config.md +84 -0
  65. package/skills/ae-analysis/references/dashboard_update.md +1 -1
  66. package/skills/ae-analysis/references/project_timezone_update.md +13 -4
  67. package/skills/ae-analysis/references/property_create.md +2 -0
  68. package/skills/ae-analysis/references/super_metadata_batch_create.md +2 -0
  69. package/skills/ae-analysis/references/user_cluster_models.md +2 -0
  70. package/skills/ae-analysis/references/user_cluster_update.md +8 -4
  71. package/skills/ae-analysis/references/user_tag_create.md +30 -2
  72. package/skills/ae-analysis/references/user_tag_models.md +17 -3
  73. package/skills/ae-analysis/references/user_tag_update.md +14 -2
  74. package/skills/ae-data-integration/SKILL.md +3 -1
  75. package/skills/ae-data-integration/references/dimension-routing.md +36 -0
  76. package/skills/ae-data-integration/references/error-handling.md +54 -1
  77. package/skills/ae-data-integration/references/local-analysis.md +2 -0
  78. package/skills/ae-data-integration/references/source-inspect.md +18 -2
  79. package/skills/ae-data-integration/references/tracking-plan.md +1 -1
  80. package/skills/ae-data-integration/references/transform.md +4 -2
  81. package/skills/ae-data-integration/references/ue-mapping.md +5 -2
  82. package/skills/ae-data-integration/references/ue-routing.md +40 -1
  83. package/skills/ae-dataops/SKILL.md +11 -1
  84. package/skills/ae-dataops/references/dataops-backfill.md +135 -0
  85. package/skills/ae-engage/SKILL.md +5 -0
  86. package/skills/ae-engage/references/build-task-save-guide.md +5 -1
  87. package/skills/ae-engage/references/save-flow.md +37 -1
  88. package/skills/ae-engage/references/save-task.md +6 -0
  89. package/skills/ae-experiment/SKILL.md +6 -2
  90. package/skills/ae-experiment/references/save_metric.md +20 -8
  91. package/skills/ae-generate-tracking-plan/SKILL.md +25 -13
  92. package/skills/ae-generate-tracking-plan/references/business-dimension-mapping.md +1 -1
  93. package/skills/ae-kb/SKILL.md +218 -36
  94. package/skills/ae-kb/references/query-workflow.md +59 -29
  95. package/skills/ae-kb/references/versions.md +46 -0
  96. package/skills/ae-system/SKILL.md +29 -31
  97. package/skills/ae-system/references/channel-management.md +303 -0
  98. package/skills/ae-use-agent/SKILL.md +42 -0
  99. package/skills/ae-use-agent/references/local-agent.md +114 -0
  100. package/dist/auth-GBMV6TEJ.js +0 -14
  101. package/dist/capability-HYVVPG25.js +0 -352
  102. package/dist/chunk-EFH4XWYC.js +0 -556
  103. package/dist/chunk-J2DEBMRF.js +0 -313
  104. package/dist/chunk-JRJY5DMJ.js +0 -71
  105. package/dist/chunk-OMPRXM3V.js +0 -349
  106. package/dist/chunk-QNOLN2LJ.js +0 -509
  107. package/dist/chunk-RJDU7NYP.js +0 -1198
  108. package/dist/chunk-RNAALWJK.js +0 -98
  109. package/dist/chunk-SERWF6G5.js +0 -13
  110. package/dist/chunk-UW5UN47B.js +0 -70
  111. package/dist/chunk-ZQKDZXDO.js +0 -317
  112. package/dist/client-L2YDMHQ6.js +0 -203
  113. package/dist/memory-3ORCR7JH.js +0 -893
  114. package/dist/metadata-VUOQJE26.js +0 -339
  115. package/dist/model-UGRDX4MW.js +0 -139
  116. package/dist/personal-semantic-preference-OEISBRHM.js +0 -239
  117. package/dist/project-semantic-FFPWFPIW.js +0 -1114
  118. package/dist/sync-TFHU2UTG.js +0 -10261
  119. package/dist/te-agent-VLYOV7S4.js +0 -3894
  120. package/dist/te-analysis-4YGQL5RC.js +0 -9357
  121. package/dist/te-community-ISDQWJU7.js +0 -1859
  122. package/dist/te-dataops-CVULXNVB.js +0 -2209
  123. package/dist/te-engage-N5WI32H6.js +0 -4898
  124. package/dist/te-experiment-UVR4HLND.js +0 -988
  125. package/dist/te-kb-RCLSSH2Q.js +0 -935
  126. package/dist/te-system-K2GYMCTB.js +0 -2213
  127. package/skills/ae-agent/references/auto-provision-mcp-credentials.md +0 -57
@@ -20,6 +20,7 @@ The AE Data Development and Operations domain provides capabilities for data war
20
20
  | `dataops_flow` | Flow creation, node deletion, and orchestration | `dataops-flow-create` |
21
21
  | `dataops_flow` | Flow execution and monitoring | `dataops-flow-monitor` |
22
22
  | `dataops_operations` | Operations instance search, details, and task logs | `dataops-flow-monitor` |
23
+ | `dataops_operations` | Backfill job creation, full draft update, deletion, execution, plans, stop, and rerun | `dataops-backfill` |
23
24
  | `dataops_ide` | Data exploration and SQL queries | `dataops-query` |
24
25
  | `dataops_integration` | Datasource and data integration | `dataops-integration` |
25
26
 
@@ -63,6 +64,7 @@ You must understand the following key concepts before use, otherwise errors are
63
64
  |----|--------|-------------|
64
65
  | **executeId** | Returned by `dataops_flow +execute_flow` | Early stop handle before the scheduler `flowInstanceId` is available |
65
66
  | **flowInstanceId** | Returned by `dataops_operations +search_flow_instances` | Operations perspective instance inspection and stop |
67
+ | **jobId** | Returned by `dataops_operations +create_backfill_job` or `+search_backfill_jobs` | Persistent backfill job detail and lifecycle actions |
66
68
 
67
69
  ### Environment and Defaults
68
70
 
@@ -73,6 +75,8 @@ You must understand the following key concepts before use, otherwise errors are
73
75
  | `dataops_operations +get_flow_instance_detail` | Instance detail | Inspect one instance DAG and task statuses |
74
76
  | `dataops_operations +get_task_instance_detail` | Task detail/logs | Inspect one task and include logs only when needed |
75
77
  | `dataops_operations +stop_flow_instance` | Instance stop | Stop by exactly one of `executeId` or `flowInstanceId` |
78
+ | `dataops_operations +list_backfill_flows` | Backfill source discovery | Returns eligible PROD flows and whether ST is required |
79
+ | `dataops_operations +search_backfill_jobs` | Backfill job search | Filter persistent jobs and obtain `jobId` |
76
80
 
77
81
  ### Schema Naming Rules
78
82
 
@@ -92,6 +96,8 @@ You must understand the following key concepts before use, otherwise errors are
92
96
  Create DEV Flow → Create/Update DEV SQL, Integration, Workflow Instance Check, or Task Instance Check Tasks → Configure Dependencies/Schedule → Preview Release → Release to PROD → PROD Manual Execution / Operations Troubleshooting
93
97
  ```
94
98
 
99
+ Backfill lifecycle: Discover eligible PROD flow → Create or fully update DRAFT job → Run explicitly → Search / inspect plans → Stop or rerun the complete job; delete only after target inspection
100
+
95
101
  ### CRON Format (6 fields)
96
102
 
97
103
  `second minute hour day month weekday` — Note: one more "second" field than standard 5-field format.
@@ -115,6 +121,7 @@ Choose the appropriate scenario skill based on user intent to get complete step-
115
121
  | Create flow, add or delete nodes, configure schedule, release | `dataops-flow-create` | create flow, new workflow, configure schedule, add task node, delete task node, release, cron, scheduled execution |
116
122
  | View execution status, troubleshoot failures, view logs | `dataops-flow-monitor` | execute flow, running instance, monitor, logs, stop, DAG, troubleshoot |
117
123
  | Search operation instances across a space | `dataops-flow-monitor` | operations instance, flow instance search, status statistics, owner statistics |
124
+ | Create or operate a persistent multi-date backfill job | `dataops-backfill` | backfill, fill historical data, base date range, backfill plans, stop backfill, rerun backfill |
118
125
  | Create datasource, configure sync solution, execute sync | `dataops-integration` | datasource, sync, integration, field mapping, data ingestion, MySQL, ClickHouse, DatabricksJdbc |
119
126
  | Browse metadata, search tables, execute SQL queries | `dataops-query` | query, SQL, data exploration, search tables, view table structure, IDE, catalog, select |
120
127
  | Create tables and views | `dataops-table` | create table, table creation, view, data dictionary, table details, DDL |
@@ -155,13 +162,16 @@ Flow orchestration is divided into two scenario skills: **creation and configura
155
162
 
156
163
  **Lifecycle: DEV configuration and preview → Release to PROD → PROD manual execution and operations troubleshooting**
157
164
 
158
- Detailed creation/configuration commands live in [`references/dataops-flow-create.md`](references/dataops-flow-create.md). Detailed execution, monitoring, operation instance, task log, and stop commands live in [`references/dataops-flow-monitor.md`](references/dataops-flow-monitor.md).
165
+ Detailed creation/configuration commands live in [`references/dataops-flow-create.md`](references/dataops-flow-create.md). Detailed execution, monitoring, operation instance, task log, and stop commands live in [`references/dataops-flow-monitor.md`](references/dataops-flow-monitor.md). Persistent multi-date backfill jobs live in [`references/dataops-backfill.md`](references/dataops-backfill.md).
159
166
 
160
167
  Key constraints:
161
168
  - Create and update tasks in DEV, preview/release before PROD execution.
162
169
  - Treat `+delete_task` as high-risk: verify the target with `+get_flow_overview`, preview with `--dry-run`, and use `--yes` only after explicit user confirmation. Deletion affects DEV; release the flow to apply it to PROD.
163
170
  - `+execute_flow` always runs PROD; it returns `executeId` for early stop.
164
171
  - Prefer `flowInstanceId` from operations search for stable inspection and troubleshooting.
172
+ - A backfill job is persistent and batches multiple base dates; do not emulate it by looping `+execute_flow`.
173
+ - Create and run backfill jobs as separate steps. `+rerun_backfill_job` reruns the complete job, not only failed plans.
174
+ - `+update_backfill_job` replaces a DRAFT job's complete configuration; inspect the job first and do not treat it as a partial patch. Treat `+delete_backfill_job` as high-risk and preview it with `--dry-run` before confirmation.
165
175
  - Reference workspace parameters in task SQL as `${paramKey}`.
166
176
 
167
177
  ---
@@ -0,0 +1,135 @@
1
+ ---
2
+ name: dataops-backfill
3
+ version: 1.0.0
4
+ description: "Backfill job lifecycle: discover eligible PROD flows, create or update drafts, delete jobs, run jobs, inspect plans, stop running jobs, and rerun complete jobs."
5
+ metadata:
6
+ requires:
7
+ bins: ["ae-cli"]
8
+ ---
9
+
10
+ # DataOps Backfill Jobs
11
+
12
+ > **Prerequisites:** Read [`ae-dataops/SKILL.md`](../SKILL.md) for authentication, output, and safety rules.
13
+
14
+ A backfill job is a persistent operations object that runs one PROD task flow for multiple base dates. It is not a single manual flow execution and is not a retry of an existing failed flow instance.
15
+
16
+ ## Lifecycle
17
+
18
+ ### 1. Discover an eligible PROD flow
19
+
20
+ ```bash
21
+ ae-cli dataops_operations +list_backfill_flows --spaceCode "${spaceCode}"
22
+ ```
23
+
24
+ Use only a returned flow whose `completeDataInfo.canRun` is true. When `completeDataInfo.hasSt` is true, pass `--stTime` while creating the job.
25
+
26
+ ### 2. Create a draft
27
+
28
+ Always pass the backfill date range. For manual selection, also pass `--completeDates`; every selected date must be inside that inclusive range.
29
+
30
+ ```bash
31
+ # Range mode
32
+ ae-cli dataops_operations +create_backfill_job --spaceCode "${spaceCode}" \
33
+ --jobName "August backfill" --flowCode ${flowCode} \
34
+ --startDate "2026-08-01" --endDate "2026-08-07"
35
+
36
+ # Custom-date mode
37
+ ae-cli dataops_operations +create_backfill_job --spaceCode "${spaceCode}" \
38
+ --jobName "Selected dates" --flowCode ${flowCode} \
39
+ --startDate "2026-08-01" --endDate "2026-08-07" \
40
+ --completeDates '["2026-08-01","2026-08-03"]'
41
+ ```
42
+
43
+ Creation returns a `DRAFT` job and does not run it. Defaults are `jobType=TASK_ALL`, `failureStrategy=END`, `parallel=true`, `reverse=false`, `step=1`, and `unit=DAY`. For `TASK_ONLY`, `TASK_PRE`, or `TASK_POST`, also pass `--startNode`.
44
+
45
+ ### 3. Update a draft when needed
46
+
47
+ Update is a complete replacement, not a partial patch. Inspect the DRAFT job first, then pass `--jobId`, `--jobName`, `--flowCode`, and the complete date and strategy configuration just as for creation. Updating does not run the job.
48
+
49
+ ```bash
50
+ ae-cli dataops_operations +update_backfill_job --spaceCode "${spaceCode}" \
51
+ --jobId ${jobId} --jobName "Revised August backfill" --flowCode ${flowCode} \
52
+ --startDate "2026-08-01" --endDate "2026-08-10" \
53
+ --failureStrategy END --parallel true --reverse false
54
+ ```
55
+
56
+ ### 4. Run the draft explicitly
57
+
58
+ ```bash
59
+ ae-cli dataops_operations +run_backfill_job --spaceCode "${spaceCode}" \
60
+ --jobId ${jobId}
61
+ ```
62
+
63
+ ### 5. Search jobs and inspect plans
64
+
65
+ ```bash
66
+ ae-cli dataops_operations +search_backfill_jobs --spaceCode "${spaceCode}" \
67
+ --status "RUNNING,FAIL,SUCCESS" --pageNum 1 --pageSize 20
68
+
69
+ ae-cli dataops_operations +get_backfill_job_detail --spaceCode "${spaceCode}" \
70
+ --jobId ${jobId}
71
+ ```
72
+
73
+ Detail returns the job and its plans together. A draft has an empty plan list.
74
+
75
+ ### 6. Stop, rerun, or delete
76
+
77
+ Stopping affects every unfinished plan in the running job. Inspect the job, preview the request, obtain explicit confirmation, and then pass `--yes`.
78
+
79
+ ```bash
80
+ ae-cli dataops_operations +stop_backfill_job --spaceCode "${spaceCode}" \
81
+ --jobId ${jobId} --dry-run
82
+ # After explicit confirmation, execute the same target; the CLI prompts before dispatch.
83
+ ae-cli dataops_operations +stop_backfill_job --spaceCode "${spaceCode}" \
84
+ --jobId ${jobId}
85
+ ```
86
+
87
+ Rerun applies to every plan only when the job is `FAIL` or `STOP`. A `SUCCESS` job cannot be rerun. Rerun reuses the same job and does not create a new backfill job. The CLI does not support rerunning only failed plans.
88
+
89
+ ```bash
90
+ ae-cli dataops_operations +rerun_backfill_job --spaceCode "${spaceCode}" \
91
+ --jobId ${jobId} --dry-run
92
+ ae-cli dataops_operations +rerun_backfill_job --spaceCode "${spaceCode}" \
93
+ --jobId ${jobId}
94
+ ```
95
+
96
+ Deletion is high-risk. The server accepts only supported `DRAFT`, `FAIL`, or `SUCCESS` jobs. Inspect the exact target and preview the scoped request before confirmation; the CLI sends only `spaceCode` and `jobId` and does not pre-query or guess state.
97
+
98
+ ```bash
99
+ ae-cli dataops_operations +delete_backfill_job --spaceCode "${spaceCode}" \
100
+ --jobId ${jobId} --dry-run
101
+ ae-cli dataops_operations +delete_backfill_job --spaceCode "${spaceCode}" \
102
+ --jobId ${jobId}
103
+ ```
104
+
105
+ ## Command Reference
106
+
107
+ | Command | Purpose | Flags |
108
+ |---|---|---|
109
+ | `+list_backfill_flows` | List eligible PROD flows | `--spaceCode` |
110
+ | `+create_backfill_job` | Create a draft | `--spaceCode` `--jobName` `--flowCode` `--startDate` `--endDate`; optional in-range `--completeDates`, scope, failure, parallel, order, and ST flags |
111
+ | `+update_backfill_job` | Replace a DRAFT job's complete configuration | `--spaceCode` `--jobId` `--jobName` `--flowCode` and the same complete configuration as create |
112
+ | `+delete_backfill_job` | Delete a supported job | `--spaceCode` `--jobId`; high-risk, requires confirmation or `--yes` |
113
+ | `+run_backfill_job` | Run a draft | `--spaceCode` `--jobId` |
114
+ | `+search_backfill_jobs` | Search jobs | `--spaceCode` plus optional keyword, date, type, status, owner, sort, and paging filters |
115
+ | `+get_backfill_job_detail` | Get job and plans | `--spaceCode` `--jobId` |
116
+ | `+stop_backfill_job` | Stop a running job | `--spaceCode` `--jobId`; high-risk, requires confirmation or `--yes` |
117
+ | `+rerun_backfill_job` | Rerun the complete job | `--spaceCode` `--jobId` |
118
+
119
+ Statuses are `DRAFT`, `RUNNING`, `STOP`, `FAIL`, `SUCCESS`, and `READY_STOP`. Range units are `DAY`, `WEEK`, and `MONTH`. Custom dates must be a non-empty JSON array of unique `yyyy-MM-dd` strings inside the configured date range.
120
+
121
+ ## Transport Status
122
+
123
+ Transition status: transitional
124
+
125
+ Owning module: Gaia operations
126
+
127
+ Current transport: DataOps CLI REST
128
+
129
+ Covered tools: `operations_list_backfill_flows`, `operations_create_backfill_job`, `operations_update_backfill_job`, `operations_delete_backfill_job`, `operations_run_backfill_job`, `operations_search_backfill_jobs`, `operations_get_backfill_job_detail`, `operations_stop_backfill_job`, and `operations_rerun_backfill_job`
130
+
131
+ Gateway target: TBD after the DataOps operations Capability Gateway schema review
132
+
133
+ Review after: 2026-11-20
134
+
135
+ Exit condition: Migrate these commands after Gaia exposes equivalent capabilities and the command contract tests pass against the Capability Gateway transport.
@@ -398,6 +398,8 @@ When the user wants to "create a flow / generate a flow canvas / save a flow", d
398
398
  3. Build condition-related nodes with semantic `targetDefinitionRequest` and
399
399
  `triggerDefinition` objects. Resolve real event and property names through Analysis metadata;
400
400
  do not create an intermediate cluster merely to obtain persisted QP.
401
+ For `ab_split_flow` indicators, use `indicatorsDef[].eventDefinition`; always provide the
402
+ aggregate `operator`/`value` and every event-property filter's `operator`/`values`.
401
403
 
402
404
  4. Before building touchpoint nodes such as `message_push`, `wechat_push`, or `webhook_push`, you must call:
403
405
 
@@ -585,6 +587,9 @@ For task draft creation or update, use this workflow:
585
587
  and every-completion events use count/eq/1. Completion target and experiment main-goal event
586
588
  filters must not use properties whose metadata `select_type` is `datetime`. Never construct
587
589
  persisted QP fields.
590
+ Select the audience by delivery side: server-side channels allow custom (`1`) or existing (`2`)
591
+ and reject all users (`3`); `client_push` (`channelType=3`) allows custom (`1`) or all users (`3`)
592
+ and rejects existing (`2`). Do not infer audience support from `triggerType` alone.
588
593
  4. `ae-cli engage-task task save --project-id <projectId> --req '{...}'`
589
594
  5. `ae-cli engage-task task submit-approval --project-id <projectId> --task-id <taskId>`
590
595
 
@@ -36,12 +36,16 @@ compounds when reusing `definition_request`; flattening them changes audience se
36
36
  For the second sequence step, omit `relative_to_first` or set it to `false`; use `true` only
37
37
  from the third step onward when its window must be measured from step 1.
38
38
 
39
- For existing-cluster audiences (`targetClusterType=2`), you may copy server-authored definitions via:
39
+ For server-side existing-cluster audiences (`targetClusterType=2`), you may copy server-authored definitions via:
40
40
 
41
41
  ```bash
42
42
  ae-cli analysis user-cluster get --project-id <projectId> --cluster-names '["<cluster_name>"]'
43
43
  ```
44
44
 
45
+ Server-side channels allow custom (`1`) or existing (`2`) audiences and reject all users (`3`).
46
+ `client_push` (`channelType=3`) allows custom (`1`) or all users (`3`) and rejects existing (`2`).
47
+ Always pass `channelType` in `context` so the guide can validate this matrix.
48
+
45
49
  4. Build the final grouped `save_task.req`.
46
50
  5. Submit with `ae-cli engage-task task save --project-id <projectId> --req '{...}'`.
47
51
 
@@ -305,9 +305,45 @@ Fallback branch keeps only `branchId` + `branchType: 2`.
305
305
  #### `ab_split_flow`
306
306
 
307
307
  ```json
308
- { "branchList": [ { "branchId": "<branchId>", "branchName": "Control Group", "branchType": 1, "order": 1, "percentageInExperiment": 34 }, { "branchId": "<branchId>", "branchName": "Experiment Group A", "branchType": 2, "order": 2, "percentageInExperiment": 33 } ], "indicatorsDef": [], "activateIndicatorsDef": null }
308
+ {
309
+ "branchList": [
310
+ { "branchId": "control", "branchName": "Control Group", "branchType": 1, "order": 1, "percentageInExperiment": 50 },
311
+ { "branchId": "experiment_a", "branchName": "Experiment Group A", "branchType": 2, "order": 2, "percentageInExperiment": 50 }
312
+ ],
313
+ "indicatorsDef": [
314
+ {
315
+ "indicatorsUuid": "metric_1",
316
+ "name": "Maximum payment amount",
317
+ "desc": "",
318
+ "completionIndicatorType": 0,
319
+ "touch_cycle_num": 1,
320
+ "touch_cycle_num_unit": "day",
321
+ "eventDefinition": {
322
+ "type": "event",
323
+ "event": "payment",
324
+ "aggregation": "max",
325
+ "property": "pay_amount",
326
+ "operator": "gt",
327
+ "value": 0,
328
+ "filters": {
329
+ "relation": "and",
330
+ "items": [
331
+ { "field": "gold", "operator": "gt", "values": [20] }
332
+ ]
333
+ }
334
+ }
335
+ }
336
+ ],
337
+ "activateIndicatorsDef": null
338
+ }
309
339
  ```
310
340
 
341
+ Use `eventDefinition` for new Capability requests. Its top-level `operator` compares the aggregate
342
+ result with `value`; each `filters.items[].operator` compares an event property with its `values`.
343
+ Both comparison levels are explicit and must not be omitted. Do not construct persisted fields such
344
+ as `event`, `taPropQuota`, `uceCalcuSymbol`, `num`, `filts`, or `calcuSymbol`; Hermes compiles them.
345
+ Legacy `event` remains accepted temporarily for older clients, but never send both fields.
346
+
311
347
  #### `event_judge`
312
348
 
313
349
  ```json
@@ -245,6 +245,12 @@ Use the guide to decide which audience shape applies:
245
245
  - `targetClusterType=2`: existing cluster, requires `clusterKey`
246
246
  - `targetClusterType=3`: all users, forbids `definitionRequest` and `clusterKey`
247
247
 
248
+ Audience availability depends on delivery side:
249
+
250
+ - Server-side channels support `targetClusterType=1` (custom) and `2` (existing), but not `3` (all users).
251
+ - `client_push` (`channelType=3`) supports `targetClusterType=1` (custom) and `3` (all users), but not `2` (existing).
252
+ - Determine the delivery side from the selected real channel; do not infer audience support from `triggerType` alone.
253
+
248
254
  For a custom audience, pass the semantic definition directly. Do not create an intermediate
249
255
  cluster or copy persisted QP.
250
256
 
@@ -33,10 +33,14 @@ Naming and response boundary:
33
33
  `targeting.definition_request`. Never generate or submit `targetConfig`.
34
34
  - Metric QP is semantic at the CLI boundary: write `metricDefinition`; read
35
35
  `metric_definition`. Never generate or submit `metricConfig`, `calcType`, or `Axxx` codes.
36
+ - Event-property comparisons belong in `metricDefinition.filters`, using
37
+ `{relation,items:[{field,operator,values}]}`. Never put comparison fields directly on
38
+ `metricDefinition`, and never submit raw `filts`, `calcuSymbol`, or `ftv` fields.
36
39
  - For metric aggregations `sum` / `avg` / `max` / `distinct_count`, `metricDefinition.property`
37
40
  is **required** and must be a concrete available event property from Analysis metadata.
38
41
  Never create property aggregations without `property` (for example `metric_avg_no_property_*`).
39
- - Event-count aggregations `total_count` / `user_count` / `active_days` omit `property`.
42
+ - Preset event aggregations `total_count` / `user_count` / `active_days` omit `property`.
43
+ - Experiment metric creation does not support `avg_per_user` / `A105`.
40
44
  - Resolve event and property names with Analysis metadata before saving semantic definitions.
41
45
  - Lists return `data.items` and `data.total`; detail commands return `data.item`.
42
46
  - Readiness returns `data.readiness`; reports return `data.report`; save guides return `data.guide`; save dry-run validation returns `data.validation`; writes return `data.result`.
@@ -72,7 +76,7 @@ If an experiment save returns `error_code: METRIC_NOT_FOUND`, list metrics for t
72
76
  ```bash
73
77
  ae-cli experiment experiment get --project-id 1 --exp-id exp_123
74
78
  ae-cli experiment experiment save --project-id 1 --req '{"expName":"Demo"}' --dry-run
75
- ae-cli experiment metric save --project-id 1 --req '{"metricId":"login_users","metricName":"Login users","createType":"event","goalDirection":"up","metricDesc":"Users who logged in","metricDefinition":{"type":"event","event":"login","aggregation":"user_count"}}' --dry-run
79
+ ae-cli experiment metric save --project-id 1 --req '{"metricId":"payment_gold_sum","metricName":"Payment gold sum","createType":"event","goalDirection":"up","metricDesc":"Gold sum for payments above 10","metricDefinition":{"type":"event","event":"payment","aggregation":"sum","property":"gold","filters":{"relation":"and","items":[{"field":"gold","operator":"gt","values":[10]}]}}}' --dry-run
76
80
  ae-cli experiment report metric-trend --project-id 1 --exp-id exp_123 --metric-id metric_1 --start-time 2026-07-01 --end-time 2026-07-07
77
81
  ```
78
82
 
@@ -21,9 +21,13 @@ See [`save_build_guide.md`](save_build_guide.md) / [`save_validate.md`](save_val
21
21
  - Supply metric QP as `req.metricDefinition`.
22
22
  - Never submit internal `metricConfig`, `calcType`, or an `Axxx` calculation code.
23
23
  - Experiment metrics currently accept event definitions only.
24
+ - Event-property comparisons belong in `metricDefinition.filters`. Each item uses
25
+ `field`, `operator`, and `values`; do not place `operator` or `value` directly on
26
+ `metricDefinition`.
24
27
  - Supported aggregations:
25
- - Event-count (no property): `total_count`, `user_count`, `active_days`
28
+ - Preset event metrics (omit `property`): `total_count`, `user_count`, `active_days`
26
29
  - Property-based (**`property` REQUIRED**): `sum`, `avg`, `max`, `distinct_count`
30
+ - `avg_per_user` (`A105`) is not supported for experiment metric creation.
27
31
 
28
32
  ### Property rule (mandatory)
29
33
 
@@ -38,6 +42,12 @@ When `aggregation` is `sum`, `avg`, `max`, or `distinct_count`:
38
42
 
39
43
  When `aggregation` is `total_count`, `user_count`, or `active_days`, omit `property`.
40
44
 
45
+ ### Preset event metric example (no property)
46
+
47
+ ```bash
48
+ ae-cli experiment metric save --project-id 1 --req '{"metricId":"payment_users","metricName":"Payment users","createType":"event","goalDirection":"up","metricDesc":"Users who triggered payment","metricDefinition":{"type":"event","event":"payment","aggregation":"user_count"}}'
49
+ ```
50
+
41
51
  ### Correct example (avg with property)
42
52
 
43
53
  ```bash
@@ -51,7 +61,11 @@ ae-cli experiment metric save --project-id 1 --req '{
51
61
  "type":"event",
52
62
  "event":"payment",
53
63
  "aggregation":"avg",
54
- "property":"amount"
64
+ "property":"amount",
65
+ "filters":{
66
+ "relation":"and",
67
+ "items":[{"field":"amount","operator":"gt","values":[10]}]
68
+ }
55
69
  }
56
70
  }'
57
71
  ```
@@ -69,11 +83,9 @@ ae-cli experiment metric save --project-id 1 --req '{
69
83
  }
70
84
  ```
71
85
 
72
- ### Event-count example (no property)
86
+ Filters use the semantic `filters` tree with `relation=and|or` and items containing
87
+ `field`, `operator`, and `values`. For the frontend example `gold > 10`, use:
73
88
 
74
- ```bash
75
- ae-cli experiment metric save --project-id 1 --req '{"metricId":"purchase_users","metricName":"Purchase users","createType":"event","goalDirection":"up","metricDesc":"Unique purchasers","metricDefinition":{"type":"event","event":"purchase","aggregation":"user_count"}}'
89
+ ```json
90
+ {"filters":{"relation":"and","items":[{"field":"gold","operator":"gt","values":[10]}]}}
76
91
  ```
77
-
78
- Filters use the semantic `filters` tree with `relation=and|or` and items containing
79
- `field`, `operator`, and `values`.
@@ -79,7 +79,7 @@ Phase 0 → 1 → 2 → 3 → 4, do not skip steps.
79
79
  > CLI messages, and auto-track/i18n-owned labels must come from `src/tracking/i18n` via `AE_LANG=<user_lang>` and `draft.meta.lang`.
80
80
  > When a localized label is needed, inspect `src/tracking/i18n` and use the existing resource key/value; do not invent translations from the model.
81
81
  > If template business text needs localization and the CLI/i18n resources do not provide it, preserve the imported text and ask the user before rewriting business semantics.
82
- > Only identifier fields like `event_name`, `prop_name` remain in English snake_case (canonical format).
82
+ > Only identifier fields like `event_name`, `prop_name` remain in English. Property names are `snake_case`; event names are lowercase by default, uppercase only when the user asks to preserve it.
83
83
  > This skill only cares about command behavior, not internal implementation.
84
84
 
85
85
  ---
@@ -111,7 +111,7 @@ If **not** in a sandbox environment, ask exactly:
111
111
  ```text
112
112
  Choose your source material (up to 2):
113
113
 
114
- 1 - Product document (local path, image file, or folder) — Extract events and properties from product docs; supports md/pdf/docx/URL/images (png/jpg/jpeg/webp)
114
+ 1 - Product document (local path, image file, or folder) — Extract events and properties from product docs; supports md/pdf/docx/xlsx/pptx/URL/images (png/jpg/jpeg/webp)
115
115
  2 - Detailed description (conversational) — Describe app business flow, core features, user behaviors, monetization model, etc.
116
116
  3 - Codebase (local project path; hidden in sandbox) — Analyze source code to extract events and properties
117
117
  4 - Pre-built template (built-in industry and game genre templates) — Select a built-in template
@@ -126,7 +126,7 @@ If in a sandbox environment, ask exactly:
126
126
  ```text
127
127
  Choose your source material (up to 2):
128
128
 
129
- 1 - Product document (sandbox workspace path, uploaded attachment, URL, image file, or folder) — Extract events and properties from product docs; supports md/pdf/docx/URL/images (png/jpg/jpeg/webp). You can attach/upload relevant files here.
129
+ 1 - Product document (sandbox workspace path, uploaded attachment, URL, image file, or folder) — Extract events and properties from product docs; supports md/pdf/docx/xlsx/pptx/URL/images (png/jpg/jpeg/webp). You can attach/upload relevant files here.
130
130
  2 - Detailed description (conversational) — Describe app business flow, core features, user behaviors, monetization model, etc.
131
131
  3 - Pre-built template (built-in industry and game genre templates) — Select a built-in template
132
132
  4 - Modify existing tracking plan (sandbox workspace path) — Import an existing tracking plan xlsx as baseline for modification; can be combined with Product doc / Description, but NOT with Pre-built template
@@ -142,7 +142,7 @@ User can multi-select (max 2). Interpret numbers by the **visible list shown to
142
142
 
143
143
  Canonical source material options (non-sandbox numbering):
144
144
 
145
- 1. **Product document** ****(****local path, sandbox workspace path, uploaded attachment, URL, image file, or folder) — Extract events and properties from product docs; supports md/pdf/docx/URL/images (png/jpg/jpeg/webp)
145
+ 1. **Product document** ****(****local path, sandbox workspace path, uploaded attachment, URL, image file, or folder) — Extract events and properties from product docs; supports md/pdf/docx/xlsx/pptx/URL/images (png/jpg/jpeg/webp)
146
146
  2. **Detailed description** (conversational) — Describe app business flow, core features, user behaviors, monetization model, etc.
147
147
  3. **Codebase** (local project path; hidden in sandbox) — Analyze source code to extract events and properties
148
148
  4. **Pre-built template** (built-in industry and game genre templates) — Select a built-in template (run `AE_LANG=<user_lang> ae-cli tracking plan list-templates --json` to see available templates)
@@ -210,7 +210,7 @@ Based on user selection, determine source material type and record to `meta.sour
210
210
  | Severity | Examples | Handling | User Action |
211
211
  |---|---|---|---|
212
212
  | 🔧 **Minor** (auto-fixable) | `display_name` duplicate, `array_row` sub-property inconsistency, event name duplicate | `--fix` auto-fixes, writes to `draft.json`. Inform user of what was fixed. | None (informed) |
213
- | ⚠️ **Medium** (needs confirmation) | snake_case violation, property name duplicate, invalid property type, nested property parent is not a composite type | List each issue with current value → suggested fix. User confirms item by item before writing to `draft.json`. | Confirm each fix |
213
+ | ⚠️ **Medium** (needs confirmation) | property name snake_case violation, property name duplicate, invalid property type, nested property parent is not a composite type | List each issue with current value → suggested fix. User confirms item by item before writing to `draft.json`. | Confirm each fix |
214
214
  | 🛑 **Severe** | File cannot be parsed, or events array is empty after import | Reject. Tell user the specific issue. User fixes **original file** and re-imports. | Fix original file |
215
215
 
216
216
  **Medium issue confirmation format**:
@@ -219,7 +219,7 @@ Based on user selection, determine source material type and record to `meta.sour
219
219
 
220
220
  | # | Issue | Location | Current | Suggested |
221
221
  |---|-------|----------|---------|------------|
222
- | 1 | snake_case | event_name | UserLogin | user_login |
222
+ | 1 | snake_case | event_name | UserLogin | user_login (keep UserLogin only if the user asked to preserve case) |
223
223
  | 2 | snake_case | prop_name | vipLevel | vip_level |
224
224
  | 3 | invalid type | property "level" | integer | number |
225
225
 
@@ -242,7 +242,7 @@ Based on user selection, determine source material type and record to `meta.sour
242
242
  - **Events**: Player interaction actions (click/swipe/trigger), scene transitions, game state changes (start/pause/end), business flow nodes (purchase/upgrade/unlock)
243
243
  - **Event Properties**: Action parameters (bullet type/enemy level/item ID), state values (score/HP/coins), context (level ID/difficulty/mode)
244
244
  - **User Properties**: Persistent state (level/experience/VIP/cumulative spend)
245
- 5. Map extracted results to AE naming conventions (`snake_case` event names + `display_name` in user's language)
245
+ 5. Map extracted results to AE naming conventions (event names lowercase by default, uppercase only on request; property names `snake_case`; + `display_name` in user's language)
246
246
  6. Confirm extracted results with user, supplement missing items
247
247
 
248
248
  **Business Dimension Confirmation**:
@@ -386,7 +386,7 @@ When the user selects the **Data sample / file profile** option (`source_type =
386
386
  3. **Column → property mapping draft**:
387
387
  - Identify system columns first: time field, `distinct_id` / `account_id`, event-name column, user-property-name column.
388
388
  - Map the remaining columns to event properties / user properties / super properties.
389
- - Naming: `snake_case` event/property names + `display_name` + `desc` + `event_tag` (language follows the user's input).
389
+ - Naming: `snake_case` property names, event names lowercase by default (uppercase only on request) + `display_name` + `desc` + `event_tag` (language follows the user's input).
390
390
  - Type inference: CSV columns default to `string`; infer `number` / `bool` / `datetime` / enum from field name + value distribution + business doc/prompt priors. **Uncertain or conflicting columns are marked "to-confirm" and asked only inside the gate** (do not ask column-by-column beforehand).
391
391
  4. **Single confirmation gate** (replaces Phase 2, see below).
392
392
  5. **Merge with existing plan** (reuse Phase 4.1/4.2 conflict detection).
@@ -656,7 +656,7 @@ Draft
656
656
  **Property types** (enum): `string` / `number` / `bool` / `datetime` /
657
657
  `object` (single object, with sub-properties) / `array_row` (object array, supports `parent.child` nesting) / `array_string` (string array)
658
658
 
659
- **Naming rules**: Event names / property names must be `snake_case`; use `display_name` field for human-readable names.
659
+ **Naming rules**: Property names must be `snake_case`; event names are lowercase by default, and uppercase is kept only when the user asks to preserve it. Use `display_name` for human-readable names.
660
660
 
661
661
  ### 1.2 Merge Source Materials
662
662
 
@@ -674,9 +674,20 @@ Earlier sources take precedence — same-name events keep the earlier version, l
674
674
  - ⚠️ **No model-invented translations for template labels**: When replacing or explaining a localized template-owned label, use the exact value from `src/tracking/i18n` resources. If no corresponding resource exists, preserve the template text and ask the user before changing semantics.
675
675
  - ⚠️ **event_tag is not free-form model translation**: Do not manually map `业务事件`/`系统事件` to another language. Preserve template tags, or rely on `src/tracking/i18n` and autotrack generation for system labels when the CLI owns them.
676
676
  - **codebase**: Scan project source directory, extract events/properties from business logic; **same-name events merge prop_names without overwriting existing fields**; new items `source: "codebase"`
677
- - **prd**: Read all user-provided product documents (md / pdf / docx / URL / images), extract events and properties from each file; **same-name events merge prop_names without overwriting existing fields**; image files analyzed via multimodal interpretation of UI elements and interaction flows; all new items `source: "prd"`
677
+ - **prd**: Read all user-provided product documents (md / pdf / docx / xlsx / pptx / URL / images), extract events and properties from each file; **same-name events merge prop_names without overwriting existing fields**; image files analyzed via multimodal interpretation of UI elements and interaction flows; all new items `source: "prd"`
678
+ - **Read each format with the table below.** Preferred tool first; when it is missing, fall back rather than fail the read.
679
+ | Format | Read via |
680
+ |---|---|
681
+ | md | read directly |
682
+ | docx | `pandoc -t markdown <file>`; fallback `markitdown <file>` (`pip install markitdown` if missing); last resort `unzip -p <file> word/document.xml` and read the text |
683
+ | pdf (text) | extract text (native Read or a PDF text extractor) |
684
+ | pdf (scanned) | render pages to images, then read with vision |
685
+ | xlsx | read rows/columns with a structure-preserving reader (`openpyxl` / `pandas`, `pip install` if missing); a tracking table's row/column layout carries meaning — do NOT rely on a flattened markdown dump |
686
+ | pptx | `markitdown <file>` (`pip install markitdown` if missing) |
687
+ | png/jpg/jpeg/webp | multimodal interpretation, analyze UI elements and interaction flows |
688
+ - **xlsx is a third source-material path, distinct from the two existing xlsx flows.** A human-readable tracking table (event / property / type rows) is read row-by-row here. An **AE-format tracking-plan xlsx** goes through `import-template`; a **CSV/Excel data sample** goes through the data path (`ae-cli data-integration inspect`). Never route one into another's flow.
678
689
  - **prd path is a folder**: Recursively scan all files in the directory:
679
- - md/pdf/docx → read text content, extract events/properties
690
+ - md/pdf/docx/xlsx/pptx → read per the table above, extract events/properties
680
691
  - png/jpg/jpeg/webp → multimodal interpretation, analyze UI elements and interaction flows
681
692
  - subdirectories → recurse
682
693
  - other files → skip
@@ -817,7 +828,8 @@ AE_LANG=<user_lang> ae-cli tracking plan draft --in .ae-cli/draft.json --out .ae
817
828
  |---|---|---|
818
829
  | Display name uniqueness | Within same property pool, `display_name` must not repeat | ✅ Add distinguishing prefix |
819
830
  | Object array consistency | Same `array_row` across different events must have identical sub-properties | ✅ Fill missing sub-properties |
820
- | snake_case | Event/property names must match `^[a-z][a-z0-9_]*$` | ❌ Manual fix needed |
831
+ | Property name snake_case | Property names must match `^[a-z][a-z0-9_]*$` | ❌ Manual fix needed |
832
+ | Event name format | Event names match `^[A-Za-z][A-Za-z0-9_]*$`; lowercase by default, uppercase kept on request | ❌ Manual fix needed |
821
833
  | Property name uniqueness | Property names must not repeat | ❌ Manual fix needed |
822
834
  | Event name uniqueness | Event names must not repeat | ✅ Remove later duplicates |
823
835
 
@@ -1255,7 +1267,7 @@ Continue append (without fixing) / Modify draft / Switch to replace?
1255
1267
 
1256
1268
  #### Conflict Type B: Same-name events (advisory)
1257
1269
 
1258
- AE merge-by-name: Same-name events are not overwritten; new-name events are added.
1270
+ AE merge-by-name: Same-name events are not overwritten; new-name events are added. Event names are case-sensitive (`Purchase` ≠ `purchase`) — changing only the case creates a new event, not a rename.
1259
1271
 
1260
1272
  **Detection logic**:
1261
1273
 
@@ -434,7 +434,7 @@
434
434
 
435
435
  - 必须有 ≥2 个自定义属性
436
436
  - 必须标注事件标签(模块归属)和采集端
437
- - 命名符合 snake_case
437
+ - 命名符合 snake_case(事件名默认小写,用户要求保留大写时按用户要求)
438
438
 
439
439
  ---
440
440