@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.
- package/README.md +97 -38
- package/README.zh.md +101 -38
- package/dist/{auth-ROB2EDYV.js → auth-FUM37MHF.js} +241 -126
- package/dist/{capability-DKMYUTLC.js → capability-AXFQW5WM.js} +49 -35
- package/dist/{chunk-JHENBQ5B.js → chunk-4P355ZWB.js} +70 -1
- package/dist/chunk-6ZIQV5GW.js +26 -0
- package/dist/{chunk-TUKQZTMI.js → chunk-7K24F7T2.js} +2 -0
- package/dist/{chunk-OO6XR6LK.js → chunk-AMBFK2K3.js} +2 -0
- package/dist/chunk-ATSM5XAW.js +623 -0
- package/dist/{chunk-4XXOWOTA.js → chunk-BBEFP4SB.js} +31 -38
- package/dist/{chunk-BYYS3ANB.js → chunk-CZU3V3DQ.js} +5 -15
- package/dist/{chunk-VTWMIC5L.js → chunk-E2JKXMVO.js} +2 -0
- package/dist/chunk-ECBLHAZO.js +15 -0
- package/dist/{sync-HKIOZXQE.js → chunk-I4WQAEYB.js} +31 -540
- package/dist/{chunk-DWO43OIB.js → chunk-JQ3ENZZH.js} +2 -0
- package/dist/chunk-LNZBEQXW.js +25216 -0
- package/dist/{chunk-ZQ47LWTI.js → chunk-QJQZH5GQ.js} +49 -79
- package/dist/{chunk-QZ3AS4KK.js → chunk-RSG4ONOI.js} +9 -8
- package/dist/{chunk-4NN5IWVN.js → chunk-T6OSFQZD.js} +2 -0
- package/dist/{chunk-Y3LOALAV.js → chunk-TAL6CZH6.js} +8 -7
- package/dist/{chunk-3KWQYGYI.js → chunk-TKHSULJT.js} +2 -0
- package/dist/chunk-VXNMYUXU.js +202 -0
- package/dist/{chunk-3FY3RJ26.js → chunk-WZ6YVQSF.js} +15 -14
- package/dist/{chunk-6EIJSNBD.js → chunk-Y74WTIKJ.js} +2 -0
- package/dist/{community-report-client-C7WDGET3.js → community-report-client-XXWGSBSD.js} +3 -4
- package/dist/{config-BMYZX2UE.js → config-EXUGQN5T.js} +10 -10
- package/dist/{data-integration-QEKDWQDY.js → data-integration-4NZ53OMT.js} +920 -97
- package/dist/index.js +56 -81
- package/dist/{local-data-upload-client-4YYHSYD6.js → local-data-upload-client-KYOKVYZV.js} +3 -4
- package/dist/{memory-I2WXDTV2.js → memory-ATNKZNW5.js} +6 -7
- package/dist/{metadata-I4C2EWUN.js → metadata-VZVC7YMH.js} +10 -11
- package/dist/{model-HLHIEFMU.js → model-E4JMQ4V2.js} +8 -9
- package/dist/{personal-semantic-preference-LIPACBDX.js → personal-semantic-preference-7S2SQ3UV.js} +9 -10
- package/dist/{project-semantic-RT3R2VQD.js → project-semantic-2SZP2OPO.js} +13 -14
- package/dist/sync-YV3E66IF.js +520 -0
- package/dist/{te-agent-BR6VDBNX.js → te-agent-JB5T3PO7.js} +396 -92
- package/dist/{te-analysis-7VUNUYWZ.js → te-analysis-3YJAAT2D.js} +196 -43
- package/dist/{te-community-5DMNKJWY.js → te-community-UDBI672N.js} +12 -34
- package/dist/{te-dataops-6P5IKWNJ.js → te-dataops-ZLYOCXZ4.js} +480 -81
- package/dist/{te-engage-KZPR5R22.js → te-engage-4XG6OJML.js} +88 -16
- package/dist/{te-experiment-6BITX4RD.js → te-experiment-VXUWPINJ.js} +83 -12
- package/dist/te-kb-WYQWHFSC.js +1732 -0
- package/dist/{te-system-FXITO2JG.js → te-system-7G6F2LJA.js} +569 -35
- package/dist/{te-team-ADOC2ROP.js → te-team-E7FBBXMQ.js} +8 -7
- package/dist/{update-YCYCKJOO.js → update-D47BUG25.js} +8 -8
- package/package.json +22 -10
- package/skills/ae-agent/SKILL.md +30 -13
- package/skills/ae-agent/references/agent-distribution.md +94 -0
- package/skills/ae-agent/references/approval-request.md +4 -0
- package/skills/ae-agent/references/command_index.md +9 -2
- package/skills/ae-agent/references/create-automation.md +20 -2
- package/skills/ae-agent/references/get-agent-context.md +70 -0
- package/skills/ae-agent/references/list-automations.md +18 -3
- package/skills/ae-agent/references/list-mcp-credentials.md +1 -1
- package/skills/ae-agent/references/mcp-token.md +3 -3
- package/skills/ae-agent/references/set-mcp-credential.md +0 -1
- package/skills/ae-agent/references/update-automation.md +18 -0
- package/skills/ae-analysis/SKILL.md +11 -2
- package/skills/ae-analysis/references/adhoc_run.md +2 -0
- package/skills/ae-analysis/references/ai_models.md +23 -3
- package/skills/ae-analysis/references/analysis_gateway_assets.md +3 -3
- package/skills/ae-analysis/references/audience_models.md +18 -0
- package/skills/ae-analysis/references/command_index.md +9 -9
- package/skills/ae-analysis/references/cross_source_config.md +84 -0
- package/skills/ae-analysis/references/dashboard_update.md +1 -1
- package/skills/ae-analysis/references/project_timezone_update.md +13 -4
- package/skills/ae-analysis/references/property_create.md +2 -0
- package/skills/ae-analysis/references/super_metadata_batch_create.md +2 -0
- package/skills/ae-analysis/references/user_cluster_models.md +2 -0
- package/skills/ae-analysis/references/user_cluster_update.md +8 -4
- package/skills/ae-analysis/references/user_tag_create.md +30 -2
- package/skills/ae-analysis/references/user_tag_models.md +17 -3
- package/skills/ae-analysis/references/user_tag_update.md +14 -2
- package/skills/ae-data-integration/SKILL.md +3 -1
- package/skills/ae-data-integration/references/dimension-routing.md +36 -0
- package/skills/ae-data-integration/references/error-handling.md +54 -1
- package/skills/ae-data-integration/references/local-analysis.md +2 -0
- package/skills/ae-data-integration/references/source-inspect.md +18 -2
- package/skills/ae-data-integration/references/tracking-plan.md +1 -1
- package/skills/ae-data-integration/references/transform.md +4 -2
- package/skills/ae-data-integration/references/ue-mapping.md +5 -2
- package/skills/ae-data-integration/references/ue-routing.md +40 -1
- package/skills/ae-dataops/SKILL.md +11 -1
- package/skills/ae-dataops/references/dataops-backfill.md +135 -0
- package/skills/ae-engage/SKILL.md +5 -0
- package/skills/ae-engage/references/build-task-save-guide.md +5 -1
- package/skills/ae-engage/references/save-flow.md +37 -1
- package/skills/ae-engage/references/save-task.md +6 -0
- package/skills/ae-experiment/SKILL.md +6 -2
- package/skills/ae-experiment/references/save_metric.md +20 -8
- package/skills/ae-generate-tracking-plan/SKILL.md +25 -13
- package/skills/ae-generate-tracking-plan/references/business-dimension-mapping.md +1 -1
- package/skills/ae-kb/SKILL.md +218 -36
- package/skills/ae-kb/references/query-workflow.md +59 -29
- package/skills/ae-kb/references/versions.md +46 -0
- package/skills/ae-system/SKILL.md +29 -31
- package/skills/ae-system/references/channel-management.md +303 -0
- package/skills/ae-use-agent/SKILL.md +42 -0
- package/skills/ae-use-agent/references/local-agent.md +114 -0
- package/dist/auth-GBMV6TEJ.js +0 -14
- package/dist/capability-HYVVPG25.js +0 -352
- package/dist/chunk-EFH4XWYC.js +0 -556
- package/dist/chunk-J2DEBMRF.js +0 -313
- package/dist/chunk-JRJY5DMJ.js +0 -71
- package/dist/chunk-OMPRXM3V.js +0 -349
- package/dist/chunk-QNOLN2LJ.js +0 -509
- package/dist/chunk-RJDU7NYP.js +0 -1198
- package/dist/chunk-RNAALWJK.js +0 -98
- package/dist/chunk-SERWF6G5.js +0 -13
- package/dist/chunk-UW5UN47B.js +0 -70
- package/dist/chunk-ZQKDZXDO.js +0 -317
- package/dist/client-L2YDMHQ6.js +0 -203
- package/dist/memory-3ORCR7JH.js +0 -893
- package/dist/metadata-VUOQJE26.js +0 -339
- package/dist/model-UGRDX4MW.js +0 -139
- package/dist/personal-semantic-preference-OEISBRHM.js +0 -239
- package/dist/project-semantic-FFPWFPIW.js +0 -1114
- package/dist/sync-TFHU2UTG.js +0 -10261
- package/dist/te-agent-VLYOV7S4.js +0 -3894
- package/dist/te-analysis-4YGQL5RC.js +0 -9357
- package/dist/te-community-ISDQWJU7.js +0 -1859
- package/dist/te-dataops-CVULXNVB.js +0 -2209
- package/dist/te-engage-N5WI32H6.js +0 -4898
- package/dist/te-experiment-UVR4HLND.js +0 -988
- package/dist/te-kb-RCLSSH2Q.js +0 -935
- package/dist/te-system-K2GYMCTB.js +0 -2213
- 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
|
-
{
|
|
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
|
-
-
|
|
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":"
|
|
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
|
-
-
|
|
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
|
-
|
|
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
|
-
```
|
|
75
|
-
|
|
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
|
|
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 (
|
|
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`
|
|
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**:
|
|
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
|
|
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 |
|
|
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
|
|