@thinkingai/ae-cli 6.1.16 → 6.1.18

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 (103) hide show
  1. package/README.md +5 -2
  2. package/README.zh.md +5 -2
  3. package/dist/{auth-2WTQOP77.js → auth-GBMV6TEJ.js} +3 -3
  4. package/dist/{auth-77BUFLGC.js → auth-ROB2EDYV.js} +12 -13
  5. package/dist/{capability-72DTW5M2.js → capability-DKMYUTLC.js} +50 -13
  6. package/dist/{capability-PJHNI4GJ.js → capability-HYVVPG25.js} +49 -12
  7. package/dist/chunk-3FY3RJ26.js +293 -0
  8. package/dist/{chunk-PTE56QPL.js → chunk-3KWQYGYI.js} +4 -0
  9. package/dist/{chunk-UOUS37JQ.js → chunk-4XXOWOTA.js} +3 -3
  10. package/dist/{chunk-GT46FPXN.js → chunk-BYYS3ANB.js} +17 -8
  11. package/dist/{chunk-YA6SMTXG.js → chunk-EFH4XWYC.js} +3 -3
  12. package/dist/{chunk-4SGZG4XY.js → chunk-J2DEBMRF.js} +9 -7
  13. package/dist/{chunk-LYVNONC4.js → chunk-JHENBQ5B.js} +35 -0
  14. package/dist/{chunk-VR3LCBHW.js → chunk-JRJY5DMJ.js} +5 -5
  15. package/dist/{chunk-ILIU36SU.js → chunk-OMPRXM3V.js} +3 -3
  16. package/dist/{chunk-VPKZ7I72.js → chunk-QNOLN2LJ.js} +2 -2
  17. package/dist/{chunk-SAU3QFIQ.js → chunk-QZ3AS4KK.js} +3 -3
  18. package/dist/chunk-RJDU7NYP.js +1198 -0
  19. package/dist/{chunk-4KVPKXFX.js → chunk-RNAALWJK.js} +2 -2
  20. package/dist/{chunk-C4MGVGJW.js → chunk-SERWF6G5.js} +1 -1
  21. package/dist/{chunk-RGKJGKT7.js → chunk-Y3LOALAV.js} +5 -5
  22. package/dist/{chunk-P3FGXJTU.js → chunk-ZQ47LWTI.js} +4 -4
  23. package/dist/chunk-ZQKDZXDO.js +317 -0
  24. package/dist/{client-TKG4WBHN.js → client-L2YDMHQ6.js} +5 -4
  25. package/dist/{community-report-client-FI4LNVYS.js → community-report-client-C7WDGET3.js} +1 -2
  26. package/dist/{config-RE6CMGPK.js → config-BMYZX2UE.js} +7 -6
  27. package/dist/{data-integration-2MYMANJI.js → data-integration-QEKDWQDY.js} +1741 -212
  28. package/dist/index.js +131 -1241
  29. package/dist/{local-data-upload-client-BWHSUQQK.js → local-data-upload-client-4YYHSYD6.js} +1 -2
  30. package/dist/{memory-CHRU2F7W.js → memory-3ORCR7JH.js} +6 -6
  31. package/dist/{memory-YK33G4T7.js → memory-I2WXDTV2.js} +5 -5
  32. package/dist/{metadata-XXR34N5P.js → metadata-I4C2EWUN.js} +10 -10
  33. package/dist/{metadata-UILXHBWF.js → metadata-VUOQJE26.js} +9 -9
  34. package/dist/{model-NR3JHFSJ.js → model-HLHIEFMU.js} +5 -5
  35. package/dist/{model-K3KLWIW6.js → model-UGRDX4MW.js} +6 -6
  36. package/dist/personal-semantic-preference-LIPACBDX.js +239 -0
  37. package/dist/personal-semantic-preference-OEISBRHM.js +239 -0
  38. package/dist/project-semantic-FFPWFPIW.js +1114 -0
  39. package/dist/project-semantic-RT3R2VQD.js +1114 -0
  40. package/dist/{sync-FCKOVWWS.js → sync-HKIOZXQE.js} +6 -6
  41. package/dist/{sync-DAVKYVMW.js → sync-TFHU2UTG.js} +7 -7
  42. package/dist/{te-agent-HLW4VTQK.js → te-agent-BR6VDBNX.js} +9 -8
  43. package/dist/{te-agent-4BKBODMF.js → te-agent-VLYOV7S4.js} +8 -7
  44. package/dist/{te-analysis-ZMNGOVNW.js → te-analysis-4YGQL5RC.js} +437 -38
  45. package/dist/{te-analysis-O6DCO6BS.js → te-analysis-7VUNUYWZ.js} +436 -37
  46. package/dist/{te-community-HLC43QKH.js → te-community-5DMNKJWY.js} +5 -5
  47. package/dist/{te-community-6HPBWJUZ.js → te-community-ISDQWJU7.js} +6 -6
  48. package/dist/{te-dataops-HDRUXY4K.js → te-dataops-6P5IKWNJ.js} +8 -7
  49. package/dist/{te-dataops-EJP56W3K.js → te-dataops-CVULXNVB.js} +7 -6
  50. package/dist/{te-engage-RAK5PESW.js → te-engage-KZPR5R22.js} +9 -9
  51. package/dist/{te-engage-FGBGQ4IY.js → te-engage-N5WI32H6.js} +8 -8
  52. package/dist/{te-experiment-SO5MPDMJ.js → te-experiment-6BITX4RD.js} +226 -8
  53. package/dist/{te-experiment-VZF7BT6G.js → te-experiment-UVR4HLND.js} +227 -9
  54. package/dist/{te-kb-APXBWBDY.js → te-kb-RCLSSH2Q.js} +251 -127
  55. package/dist/{te-system-Z77IKZFN.js → te-system-FXITO2JG.js} +5 -5
  56. package/dist/{te-system-YARIK4S5.js → te-system-K2GYMCTB.js} +6 -6
  57. package/dist/{te-team-EFKWYKMK.js → te-team-ADOC2ROP.js} +6 -6
  58. package/dist/{update-OGPSZM5A.js → update-YCYCKJOO.js} +7 -6
  59. package/package.json +2 -1
  60. package/skills/ae-agent/SKILL.md +3 -4
  61. package/skills/ae-agent/references/edit-skill.md +3 -0
  62. package/skills/ae-agent/references/get-skill-content.md +1 -1
  63. package/skills/ae-agent/references/rescan-skills.md +15 -13
  64. package/skills/ae-agent/references/upload-skill.md +7 -4
  65. package/skills/ae-analysis/SKILL.md +45 -4
  66. package/skills/ae-analysis/metadata_resolution.md +38 -4
  67. package/skills/ae-analysis/references/analysis_data_retrieval.md +29 -0
  68. package/skills/ae-analysis/references/asset_authentication_export.md +22 -0
  69. package/skills/ae-analysis/references/asset_authentication_list.md +18 -14
  70. package/skills/ae-analysis/references/asset_authentication_update.md +29 -14
  71. package/skills/ae-analysis/references/command_index.md +17 -9
  72. package/skills/ae-analysis/references/dashboard_get.md +18 -1
  73. package/skills/ae-analysis/references/dashboard_update.md +3 -0
  74. package/skills/ae-analysis/references/personal_semantic_preference_add.md +23 -0
  75. package/skills/ae-analysis/references/personal_semantic_preference_delete.md +17 -0
  76. package/skills/ae-analysis/references/personal_semantic_preference_get.md +19 -0
  77. package/skills/ae-analysis/references/personal_semantic_preference_list.md +21 -0
  78. package/skills/ae-analysis/references/personal_semantic_preference_update.md +19 -0
  79. package/skills/ae-data-integration/SKILL.md +23 -4
  80. package/skills/ae-data-integration/references/custom-layer.md +93 -0
  81. package/skills/ae-data-integration/references/error-handling.md +92 -0
  82. package/skills/ae-data-integration/references/handoff.md +77 -18
  83. package/skills/ae-data-integration/references/local-analysis.md +1 -1
  84. package/skills/ae-data-integration/references/reuse.md +9 -5
  85. package/skills/ae-data-integration/references/sink-upload.md +1 -1
  86. package/skills/ae-data-integration/references/source-inspect.md +32 -13
  87. package/skills/ae-data-integration/references/tracking-plan.md +7 -5
  88. package/skills/ae-data-integration/references/transform.md +10 -10
  89. package/skills/ae-data-integration/references/ue-mapping.md +33 -11
  90. package/skills/ae-engage/references/build-task-save-guide.md +9 -0
  91. package/skills/ae-engage/references/save-task.md +82 -0
  92. package/skills/ae-experiment/SKILL.md +8 -2
  93. package/skills/ae-experiment/references/manage_feature_whitelist.md +66 -0
  94. package/skills/ae-experiment/references/manage_guardrail_metrics.md +26 -0
  95. package/skills/ae-experiment/references/save_experiment.md +1 -1
  96. package/skills/ae-kb/SKILL.md +56 -51
  97. package/skills/ae-kb/references/query-workflow.md +112 -0
  98. package/skills/ae-kb-discovery/SKILL.md +105 -0
  99. package/skills/ae-project-semantic/SKILL.md +193 -0
  100. package/skills/ae-project-semantic/references/query-routing-v5.md +165 -0
  101. package/skills/ae-project-semantic/references/recommendation-quality.md +68 -0
  102. package/dist/chunk-QGM4M3NI.js +0 -37
  103. package/dist/chunk-ZZUOD757.js +0 -598
@@ -39,11 +39,11 @@ This is the exhaustive command and flag inventory for the analysis skill. Read t
39
39
  | `ae-cli analysis dashboard freeze` | analysis.dashboard.freeze | write | `--project-id` (number; required) — Numeric project ID.<br>`--dashboard-ids` (json; required) — Dashboard ID array.<br>`--freeze` (boolean; optional) — true to freeze, false to unfreeze. Default: true. | [dashboard_freeze.md](dashboard_freeze.md) |
40
40
  | `ae-cli analysis dashboard get` | analysis.dashboard.get | read | `--project-id` (number; required) — Numeric project ID.<br>`--dashboard-id` (number; required) — Dashboard ID.<br>`--use-cache` (boolean; optional) — Whether to use cached dashboard detail. Default: true. | [dashboard_get.md](dashboard_get.md) |
41
41
  | `ae-cli analysis dashboard handover` | analysis.dashboard.handover | write | `--project-id` (number; required) — Numeric project ID.<br>`--dashboard-ids` (json; required) — Dashboard ID array.<br>`--to-user-id` (number; required) — Target user ID. | [dashboard_handover.md](dashboard_handover.md) |
42
- | `ae-cli analysis dashboard list` | analysis.dashboard.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional projection field array. Supported fields: dashboard_id, dashboard_name, remark.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected. | [dashboard_list.md](dashboard_list.md) |
42
+ | `ae-cli analysis dashboard list` | analysis.dashboard.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional projection field array. Supported fields: dashboard_id, dashboard_name, remark.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected.<br>`--certification-scope` (string; optional, default="project") — Asset certification filter scope: project follows the project switch, certified returns only certified assets, all returns every asset. | [dashboard_list.md](dashboard_list.md) |
43
43
  | `ae-cli analysis dashboard share` | analysis.dashboard.share | write | `--project-id` (number; required) — Numeric project ID.<br>`--dashboard-id` (number; required) — Dashboard ID.<br>`--member-authorities` (json; optional) — Complete user authority map: {"<numeric_user_id>":"READ\|EDIT\|CREATOR\|MAINTAIN"}. An empty object removes all directly shared users.<br>`--payload` (json; optional) — Optional snake_case object for complex capability payload fields. | [dashboard_share.md](dashboard_share.md) |
44
44
  | `ae-cli analysis dashboard share-info` | analysis.dashboard.share_info | read | `--project-id` (number; required) — Numeric project ID.<br>`--dashboard-id` (number; required) — Dashboard ID. | [dashboard_share_info.md](dashboard_share_info.md) |
45
45
  | `ae-cli analysis dashboard task-status` | analysis.dashboard.task_status | read | `--project-id` (number; required) — Numeric project ID.<br>`--dashboard-id` (number; required) — Dashboard ID. | [dashboard_task_status.md](dashboard_task_status.md) |
46
- | `ae-cli analysis dashboard update` | analysis.dashboard.update | write | `--project-id` (number; required) — Numeric project ID.<br>`--operation` (string; required) — Update operation: settings, note-upsert, or business-filter.<br>`--dashboard-id` (number; optional) — Dashboard ID for a single-dashboard update.<br>`--dashboard-ids` (json; optional) — Dashboard ID array for batch settings updates.<br>`--dashboard-name` (string; optional) — Dashboard name for single rename.<br>`--zone-offset` (number; optional) — Fixed dashboard time zone offset in hours. For example, UTC+8 is 8 and UTC-5 is -5. Valid range: -12 to 14.<br>`--refresh-type` (number; optional, min=0, max=1) — Dashboard refresh type: 0 real-time, 1 scheduled.<br>`--dashboard-status` (string; optional) — Dashboard status: normal or freeze.<br>`--note-id` (number; optional) — Dashboard note ID. Omit to create a new note.<br>`--note-title` (string; optional) — Dashboard note title.<br>`--description` (string; optional) — Dashboard note description.<br>`--ui-config` (string; optional) — Dashboard or note UI config string.<br>`--filter` (json; optional) — Dashboard-level business filter in snake_case QP form. Required with --operation business-filter. Pass {"junction_kind":"and","ta_filters":[]} to clear it.<br>`--payload` (json; optional) — Optional snake_case object for complex capability payload fields. | [dashboard_update.md](dashboard_update.md) |
46
+ | `ae-cli analysis dashboard update` | analysis.dashboard.update | write | `--project-id` (number; required) — Numeric project ID.<br>`--operation` (string; required) — Update operation: settings, note-upsert, default-filter, or business-filter.<br>`--dashboard-id` (number; optional) — Dashboard ID for a single-dashboard update.<br>`--dashboard-ids` (json; optional) — Dashboard ID array for batch settings updates.<br>`--dashboard-name` (string; optional) — Dashboard name for single rename.<br>`--zone-offset` (number; optional) — Fixed dashboard time zone offset in hours. For example, UTC+8 is 8 and UTC-5 is -5. Valid range: -12 to 14.<br>`--refresh-type` (number; optional, min=0, max=1) — Dashboard refresh type: 0 real-time, 1 scheduled.<br>`--dashboard-status` (string; optional) — Dashboard status: normal or freeze.<br>`--note-id` (number; optional) — Dashboard note ID. Omit to create a new note.<br>`--note-title` (string; optional) — Dashboard note title.<br>`--description` (string; optional) — Dashboard note description.<br>`--ui-config` (string; optional) — Dashboard or note UI config string.<br>`--filter-name` (string; optional) — Saved filter name. Required with --operation default-filter.<br>`--filter` (json; optional) — Saved filter in snake_case QP form. Required with --operation default-filter or business-filter. Pass {"junction_kind":"and","ta_filters":[]} to clear a business filter.<br>`--payload` (json; optional) — Optional snake_case object for complex capability payload fields. | [dashboard_update.md](dashboard_update.md) |
47
47
  | `ae-cli analysis dashboard-daily-report get` | analysis.dashboard_daily_report.get | read | `--project-id` (number; required) — Numeric project ID.<br>`--dashboard-id` (number; required) — Dashboard ID. | [dashboard_daily_report_get.md](dashboard_daily_report_get.md) |
48
48
  | `ae-cli analysis dashboard-daily-report send` | analysis.dashboard_daily_report.send | write | `--project-id` (number; required) — Numeric project ID.<br>`--dashboard-id` (number; required) — Dashboard ID.<br>`--need-csv` (boolean; optional) — Whether to include CSV attachment.<br>`--host-url` (string; optional) — Public host URL used in report links.<br>`--send-title` (string; optional) — Daily report title.<br>`--send-content` (string; optional) — Daily report content.<br>`--lang` (string; optional) — Report language.<br>`--screen-type` (string; optional) — Screenshot screen type.<br>`--zone-offset` (number; optional) — Time zone offset.<br>`--email-login-users` (string; optional) — Comma-separated login users for email.<br>`--email-new` (string; optional) — Comma-separated direct email addresses. The server selects company SMTP or the default mail service.<br>`--dd-url` (json; optional) — DingTalk webhook URL array, e.g. ["https://..."].<br>`--wx-url` (json; optional) — WeCom webhook URL array, e.g. ["https://..."].<br>`--feishu-info` (json; optional) — Feishu image upload and bot config, e.g. {"app_id":"cli_xxx","app_secret":"secret_xxx","webhook":["https://..."]}.<br>`--kim-url` (json; optional) — KIM/custom webhook URL array, e.g. ["https://..."].<br>`--slack-url` (json; optional) — Slack webhook URL array, e.g. ["https://..."].<br>`--payload` (json; optional) — Optional snake_case object for complex capability payload fields. | [dashboard_daily_report_send.md](dashboard_daily_report_send.md) |
49
49
  | `ae-cli analysis dashboard-daily-report send-status` | analysis.dashboard_daily_report.send_status | read | `--project-id` (number; required) — Numeric project ID.<br>`--task-id` (number; required) — Task ID returned by dashboard-daily-report send. | [dashboard_daily_report_send_status.md](dashboard_daily_report_send_status.md) |
@@ -93,8 +93,8 @@ This is the exhaustive command and flag inventory for the analysis skill. Read t
93
93
  | `ae-cli analysis report create` | analysis.report.create | write | `--project-id` (number; required) — Numeric project ID.<br>`--report-name` (string; required) — Report display name.<br>`--model-type` (string; required) — Supported AI-facing model_type values, 12 total. 9 common models: event (event analysis), retention (retention analysis), funnel (funnel conversion), distribution (distribution analysis), attribution (attribution analysis), interval (interval analysis), path (path analysis), prop_analysis (property analysis), sql (SQL analysis). 3 scenario models: heat_map (heat map analysis), rank_list (ranking analysis), revenue (revenue analysis). Tags and cohorts/clusters are separate capabilities and are not ad-hoc model_type values. Report create/update also supports tag for saved tag report data; use tag as the AI-facing spelling.<br>`--definition` (json; required) — AI-facing model definition JSON. Do not pass raw QP, events, event_view, visual_view, or analysis_query. Distribution filters must be attached to the corresponding distribution_metrics[].filters; do not use top-level filters or relation. For path definitions, global filters support user_property, cluster, and tag only; event_property is not supported. session_unit accepts second (1..999), minute (1..999), or hour (1..24). Do not use day; express one day as session_interval=24 and session_unit=hour. For SQL, a simple query is {"sql":"select ..."}; raw variables use ${name}, while typed params use ${Text:name}, ${Selector:name}, or ${PartDate:name}. PartDate expands to a complete predicate, so write WHERE ${PartDate:d}, not a column followed by the placeholder. A part_date parameter may set boolean use_timezone; it defaults to false and controls whether that parameter uses the query effective timezone. Selector value must match one options[].value. Trino identifiers containing #, $, @, spaces, punctuation, or a reserved word must be delimited with double quotes, for example SELECT "#user_id", "$part_event", "end" FROM ...; single quotes are string literals. For multiline SQL JSON, the decoded sql value must contain a real line break; do not submit a literal \n sequence outside quoted SQL text. Queries against an event table must include a date-partition predicate on the quoted "$part_date" column, for example WHERE "$part_date" BETWEEN '2026-07-01' AND '2026-07-07'; the backend rejects event-table SQL without it. The CLI preserves SQL text and never auto-quotes identifiers. For model_type=tag, pass a tag report intent such as {"tag":{"tag_name":"vip_users","time_range":{"mode":"recent","unit":"day","value":7}}}. Tags are supported for report create/update and report data, not ad-hoc analysis.<br>`--resolutions` (json; optional) — Optional user-confirmed metadata bindings keyed by compiler error path. Each value requires raw_value, resource_type, and resource_key. Reuse the unchanged definition and only pass values explicitly confirmed by the user. This option is not supported with --model-type tag.<br>`--report-desc` (string; optional) — Optional report description.<br>`--cache-seconds` (number; optional) — Optional cache duration in seconds.<br>`--query-duration-ms` (number; optional) — Optional last query duration in milliseconds.<br>`--dashboard-ids` (json; optional) — Optional dashboard ID array to associate after creation. | [report_create.md](report_create.md) |
94
94
  | `ae-cli analysis report delete` | analysis.report.delete | high-risk-write | `--project-id` (number; required) — Numeric project ID.<br>`--report-ids` (json; required) — Report ID array. | [report_delete.md](report_delete.md) |
95
95
  | `ae-cli analysis report get` | analysis.report.get | read | `--project-id` (number; required) — Numeric project ID.<br>`--report-id` (number; required) — Report ID. | [report_get.md](report_get.md) |
96
- | `ae-cli analysis report list` | analysis.report.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional result field projection JSON array.<br>`--model-types` (json; optional) — Optional semantic report model JSON array, for example ["event","sql","tag","revenue"].<br>`--limit` (number; optional, min=1, max=200) — Report page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected. | [report_list.md](report_list.md) |
97
- | `ae-cli analysis report list-export` | analysis.report.list_export | read | `--project-id` (number; required) — Numeric project ID.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional result field projection JSON array.<br>`--model-types` (json; optional) — Optional semantic report model JSON array, for example ["event","sql","tag","revenue"].<br>`--request-id` (string; optional) — Optional caller-supplied cli_<32 lowercase hex> lifecycle ID. ae-cli generates and prints one before dispatch when omitted.<br>`--artifact-format` (string; optional) — Logical artifact format, usually jsonl or csv. This does not select compression; read format, compression, file_name, content_type, and content_encoding from the returned descriptor.<br>`--timeout-seconds` (number; optional, min=1, max=21600) — Async runtime in seconds. Default and max: 21600 (6 hours); cancel earlier with analysis query cancel --run-id <run_id>.<br>`--wait` (boolean; optional) — Wait for the remote run and artifact to reach a terminal state. Polling uses short inspect requests; interrupting does not cancel the remote run.<br>`--wait-timeout-seconds` (number; optional, min=1, max=21600) — Maximum time this CLI process waits. Default: 600 seconds; expiry never cancels the remote run.<br>`--output` (string; optional) — Wait, then stream the completed artifact to this local file. Implies --wait.<br>`--force` (boolean; optional) — Allow --output to atomically replace an existing file. Without this flag, existing paths are refused. | [report_list_export.md](report_list_export.md) |
96
+ | `ae-cli analysis report list` | analysis.report.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional result field projection JSON array.<br>`--model-types` (json; optional) — Optional semantic report model JSON array, for example ["event","sql","tag","revenue"].<br>`--limit` (number; optional, min=1, max=200) — Report page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected.<br>`--certification-scope` (string; optional, default="project") — Asset certification filter scope: project follows the project switch, certified returns only certified assets, all returns every asset. | [report_list.md](report_list.md) |
97
+ | `ae-cli analysis report list-export` | analysis.report.list_export | read | `--project-id` (number; required) — Numeric project ID.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional result field projection JSON array.<br>`--model-types` (json; optional) — Optional semantic report model JSON array, for example ["event","sql","tag","revenue"].<br>`--request-id` (string; optional) — Optional caller-supplied cli_<32 lowercase hex> lifecycle ID. ae-cli generates and prints one before dispatch when omitted.<br>`--artifact-format` (string; optional) — Logical artifact format, usually jsonl or csv. This does not select compression; read format, compression, file_name, content_type, and content_encoding from the returned descriptor.<br>`--timeout-seconds` (number; optional, min=1, max=21600) — Async runtime in seconds. Default and max: 21600 (6 hours); cancel earlier with analysis query cancel --run-id <run_id>.<br>`--certification-scope` (string; optional, default="project") — Asset certification filter scope: project follows the project switch, certified returns only certified assets, all returns every asset.<br>`--wait` (boolean; optional) — Wait for the remote run and artifact to reach a terminal state. Polling uses short inspect requests; interrupting does not cancel the remote run.<br>`--wait-timeout-seconds` (number; optional, min=1, max=21600) — Maximum time this CLI process waits. Default: 600 seconds; expiry never cancels the remote run.<br>`--output` (string; optional) — Wait, then stream the completed artifact to this local file. Implies --wait.<br>`--force` (boolean; optional) — Allow --output to atomically replace an existing file. Without this flag, existing paths are refused. | [report_list_export.md](report_list_export.md) |
98
98
  | `ae-cli analysis report update` | analysis.report.update | write | `--project-id` (number; required) — Numeric project ID.<br>`--report-id` (number; required) — Report ID to update.<br>`--report-version` (number; required) — Current report version from report get.<br>`--report-name` (string; optional) — New report display name.<br>`--report-desc` (string; optional) — New report description.<br>`--model-type` (string; optional) — Supported AI-facing model_type values, 12 total. 9 common models: event (event analysis), retention (retention analysis), funnel (funnel conversion), distribution (distribution analysis), attribution (attribution analysis), interval (interval analysis), path (path analysis), prop_analysis (property analysis), sql (SQL analysis). 3 scenario models: heat_map (heat map analysis), rank_list (ranking analysis), revenue (revenue analysis). Tags and cohorts/clusters are separate capabilities and are not ad-hoc model_type values. Report create/update also supports tag for saved tag report data; use tag as the AI-facing spelling.<br>`--definition` (json; optional) — AI-facing model definition JSON. Do not pass raw QP, events, event_view, visual_view, or analysis_query. Distribution filters must be attached to the corresponding distribution_metrics[].filters; do not use top-level filters or relation. For path definitions, global filters support user_property, cluster, and tag only; event_property is not supported. session_unit accepts second (1..999), minute (1..999), or hour (1..24). Do not use day; express one day as session_interval=24 and session_unit=hour. For SQL, a simple query is {"sql":"select ..."}; raw variables use ${name}, while typed params use ${Text:name}, ${Selector:name}, or ${PartDate:name}. PartDate expands to a complete predicate, so write WHERE ${PartDate:d}, not a column followed by the placeholder. A part_date parameter may set boolean use_timezone; it defaults to false and controls whether that parameter uses the query effective timezone. Selector value must match one options[].value. Trino identifiers containing #, $, @, spaces, punctuation, or a reserved word must be delimited with double quotes, for example SELECT "#user_id", "$part_event", "end" FROM ...; single quotes are string literals. For multiline SQL JSON, the decoded sql value must contain a real line break; do not submit a literal \n sequence outside quoted SQL text. Queries against an event table must include a date-partition predicate on the quoted "$part_date" column, for example WHERE "$part_date" BETWEEN '2026-07-01' AND '2026-07-07'; the backend rejects event-table SQL without it. The CLI preserves SQL text and never auto-quotes identifiers. For model_type=tag, pass a tag report intent such as {"tag":{"tag_name":"vip_users","time_range":{"mode":"recent","unit":"day","value":7}}}. Tags are supported for report create/update and report data, not ad-hoc analysis.<br>`--resolutions` (json; optional) — Optional user-confirmed metadata bindings keyed by compiler error path. Each value requires raw_value, resource_type, and resource_key. Reuse the unchanged definition and only pass values explicitly confirmed by the user. This option is not supported with --model-type tag.<br>`--cache-seconds` (number; optional) — Optional cache duration in seconds.<br>`--query-duration-ms` (number; optional) — Optional last query duration in milliseconds. | [report_update.md](report_update.md) |
99
99
  | `ae-cli analysis report-abnormal get` | analysis.report_abnormal.get | read | `--project-id` (number; required) — Numeric project ID.<br>`--report-id` (number; required) — Report ID. | [report_abnormal_get.md](report_abnormal_get.md) |
100
100
  | `ae-cli analysis report-change-log get` | analysis.report_change_log.get | read | `--project-id` (number; required) — Numeric project ID.<br>`--report-id` (number; required) — Report ID.<br>`--history-version` (number; optional) — Optional history version. Omit for latest. | [report_change_log_get.md](report_change_log_get.md) |
@@ -137,6 +137,9 @@ This is the exhaustive command and flag inventory for the analysis skill. Read t
137
137
  | `ae-cli analysis-governance asset batch-sql-export` | governance.asset.batch_export_sql | read | `--project-id` (number; required) — Numeric project ID.<br>`--node-ids` (json; optional) — Asset node ID JSON array.<br>`--reports-version` (number; optional) — Dashboard reports version.<br>`--zone-offset` (number; optional) — Dashboard zone offset.<br>`--schedule-ui-config` (json; optional) — Dashboard schedule UI config JSON.<br>`--dashboard-status` (string; optional) — Dashboard status.<br>`--refresh-type` (number; optional) — Dashboard refresh type: 1 enabled, 0 disabled.<br>`--cache-config` (json; optional) — Dashboard cache config JSON.<br>`--clear-history-tag` (number; optional) — Whether to clear tag history: 1 yes, 0 no.<br>`--payload` (json; optional) — Optional snake_case object for complex capability payload fields. | [asset_batch_sql_export.md](asset_batch_sql_export.md) |
138
138
  | `ae-cli analysis-governance asset export` | governance.asset.export | read | `--project-id` (number; required) — Numeric project ID.<br>`--query` (string; optional) — Optional keyword filter.<br>`--searchs` (json; optional) — Quick filter JSON array.<br>`--rule` (json; optional) — Governance Filter JSON object.<br>`--operation-type` (string; optional) — Batch operation type.<br>`--limit` (number; optional) — Optional inline result limit.<br>`--offset` (number; optional) — Optional zero-based result offset.<br>`--payload` (json; optional) — Optional snake_case object for complex capability payload fields. | [asset_export.md](asset_export.md) |
139
139
  | `ae-cli analysis-governance asset list` | governance.asset.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--query` (string; optional) — Optional keyword filter.<br>`--searchs` (json; optional) — Quick filter JSON array.<br>`--rule` (json; optional) — Governance Filter JSON object.<br>`--operation-type` (string; optional) — Batch operation type.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected.<br>`--payload` (json; optional) — Optional snake_case object for complex capability payload fields. | [asset_list.md](asset_list.md) |
140
+ | `ae-cli analysis-governance asset-authentication export` | governance.asset_authentication.export | read | `--project-id` (number; required) — Numeric project ID.<br>`--asset-types` (json; optional) — Optional JSON array of asset types. Omit for every supported type.<br>`--authentication-status` (number; optional, min=0, max=1) — Authentication status: 1 for authenticated or 0 for unauthenticated.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keywords matched against identity and display fields.<br>`--heat-count-gt` (number; optional, min=0) — Strict recent-90-day heat threshold.<br>`--user-count-gt` (number; optional, min=0) — Strict recent-90-day user threshold.<br>`--impact-degree-gt` (number; optional, min=0) — Strict governance impact threshold.<br>`--match` (string; optional, default="all") — Combine multiple numeric thresholds with any or all. Default: all.<br>`--fields` (json; optional) — Optional JSON array of output fields.<br>`--output` (string; required) — Local .jsonl output path. Integrity metadata is written to <output>.meta.json. | [asset_authentication_export.md](asset_authentication_export.md) |
141
+ | `ae-cli analysis-governance asset-authentication list` | governance.asset_authentication.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--asset-types` (json; optional) — Optional JSON array of asset types. Omit for every supported type.<br>`--authentication-status` (number; optional, min=0, max=1) — Authentication status: 1 for authenticated or 0 for unauthenticated.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keywords matched against identity and display fields.<br>`--heat-count-gt` (number; optional, min=0) — Strict recent-90-day heat threshold.<br>`--user-count-gt` (number; optional, min=0) — Strict recent-90-day user threshold.<br>`--impact-degree-gt` (number; optional, min=0) — Strict governance impact threshold.<br>`--match` (string; optional, default="all") — Combine multiple numeric thresholds with any or all. Default: all.<br>`--fields` (json; optional) — Optional JSON array of output fields.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected. | [asset_authentication_list.md](asset_authentication_list.md) |
142
+ | `ae-cli analysis-governance asset-authentication update` | governance.asset_authentication.update | write | `--project-id` (number; required) — Numeric project ID.<br>`--authentication-status` (number; required, min=0, max=1) — Target authentication status: 1 authenticates and 0 revokes.<br>`--asset-refs` (json; optional) — Inline JSON array of {resource_type,resource_key} asset references.<br>`--asset-file` (string; optional) — JSONL file whose rows contain resource_type and resource_key.<br>`--asset-type` (string; optional) — Convenience asset type used together with --asset-ids.<br>`--asset-ids` (json; optional) — Convenience JSON array of business keys used together with --asset-type.<br>`--expected-snapshot-hash` (string; optional) — Optional snapshot_hash from the export sidecar. A mismatch rejects the whole update.<br>`--request-id` (string; optional) — Optional caller-supplied cli_<32 lowercase hex> lifecycle ID. ae-cli generates and prints one before dispatch when omitted. | [asset_authentication_update.md](asset_authentication_update.md) |
140
143
  | `ae-cli analysis-governance asset-dependency list` | governance.asset_dependency.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--node-id` (string; optional) — Poseidon asset node ID.<br>`--query` (string; optional) — Optional keyword filter.<br>`--searchs` (json; optional) — Quick filter JSON array.<br>`--rule` (json; optional) — Governance Filter JSON object.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected.<br>`--payload` (json; optional) — Optional snake_case object for complex capability payload fields. | [asset_dependency_list.md](asset_dependency_list.md) |
141
144
  | `ae-cli analysis-governance asset-impact list` | governance.asset_impact.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--node-id` (string; optional) — Poseidon asset node ID.<br>`--query` (string; optional) — Optional keyword filter.<br>`--searchs` (json; optional) — Quick filter JSON array.<br>`--rule` (json; optional) — Governance Filter JSON object.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected.<br>`--payload` (json; optional) — Optional snake_case object for complex capability payload fields. | [asset_impact_list.md](asset_impact_list.md) |
142
145
  | `ae-cli analysis-governance asset-lineage get` | governance.asset_lineage.get | read | `--project-id` (number; required) — Numeric project ID.<br>`--node-id` (string; optional) — Poseidon asset node ID.<br>`--payload` (json; optional) — Optional snake_case object for complex capability payload fields. | [asset_lineage_get.md](asset_lineage_get.md) |
@@ -155,8 +158,8 @@ This is the exhaustive command and flag inventory for the analysis skill. Read t
155
158
  | `ae-cli analysis-meta asset-abnormal list` | metadata.asset_abnormal.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--resource-types` (string; required) — Resource types to query.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected. | [asset_abnormal_list.md](asset_abnormal_list.md) |
156
159
  | `ae-cli analysis-meta asset-authentication list` | metadata.asset_authentication.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected. | [asset_authentication_list.md](asset_authentication_list.md) |
157
160
  | `ae-cli analysis-meta asset-authentication update` | metadata.asset_authentication.update | write | `--project-id` (number; required) — Numeric project ID.<br>`--payload` (json; required) — Required snake_case capability payload. Read the dedicated command reference for its semantic shape; an empty object is not a generic valid payload. | [asset_authentication_update.md](asset_authentication_update.md) |
158
- | `ae-cli analysis-meta catalog export` | metadata.catalog.export | read | `--project-id` (number; required) — Numeric project ID.<br>`--request-id` (string; optional) — Optional caller-supplied cli_<32 lowercase hex> lifecycle ID. ae-cli generates and prints one before dispatch when omitted.<br>`--timeout-seconds` (number; optional, min=1, max=21600) — Async runtime in seconds. Default and max: 21600 (6 hours); cancel earlier with analysis query cancel --run-id <run_id>.<br>`--wait` (boolean; optional) — Wait for the remote run and artifact to reach a terminal state. Polling uses short inspect requests; interrupting does not cancel the remote run.<br>`--wait-timeout-seconds` (number; optional, min=1, max=21600) — Maximum time this CLI process waits. Default: 600 seconds; expiry never cancels the remote run.<br>`--output` (string; optional) — Wait, then stream the completed artifact to this local file. Implies --wait.<br>`--force` (boolean; optional) — Allow --output to atomically replace an existing file. Without this flag, existing paths are refused. | [catalog_export.md](catalog_export.md) |
159
- | `ae-cli analysis-meta catalog list` | metadata.catalog.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--resource-types` (json; optional) — Online search resource type filter JSON array. Use event, metric, event_property, user_property, cluster, or tag.<br>`--limit-per-type` (number; optional, min=1, max=200) — Maximum online search results per resource type. Default: 20, max: 200. | [catalog_list.md](catalog_list.md) |
161
+ | `ae-cli analysis-meta catalog export` | metadata.catalog.export | read | `--project-id` (number; required) — Numeric project ID.<br>`--request-id` (string; optional) — Optional caller-supplied cli_<32 lowercase hex> lifecycle ID. ae-cli generates and prints one before dispatch when omitted.<br>`--timeout-seconds` (number; optional, min=1, max=21600) — Async runtime in seconds. Default and max: 21600 (6 hours); cancel earlier with analysis query cancel --run-id <run_id>.<br>`--certification-scope` (string; optional, default="project") — Asset certification filter scope: project follows the project switch, certified returns only certified assets, all returns every asset.<br>`--wait` (boolean; optional) — Wait for the remote run and artifact to reach a terminal state. Polling uses short inspect requests; interrupting does not cancel the remote run.<br>`--wait-timeout-seconds` (number; optional, min=1, max=21600) — Maximum time this CLI process waits. Default: 600 seconds; expiry never cancels the remote run.<br>`--output` (string; optional) — Wait, then stream the completed artifact to this local file. Implies --wait.<br>`--force` (boolean; optional) — Allow --output to atomically replace an existing file. Without this flag, existing paths are refused. | [catalog_export.md](catalog_export.md) |
162
+ | `ae-cli analysis-meta catalog list` | metadata.catalog.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--resource-types` (json; optional) — Online search resource type filter JSON array. Use event, metric, event_property, user_property, cluster, or tag.<br>`--limit-per-type` (number; optional, min=1, max=200) — Maximum online search results per resource type. Default: 20, max: 200.<br>`--certification-scope` (string; optional, default="project") — Asset certification filter scope: project follows the project switch, certified returns only certified assets, all returns every asset. | [catalog_list.md](catalog_list.md) |
160
163
  | `ae-cli analysis-meta datatable columns-get` | metadata.data_table.columns_get | read | `--project-id` (number; required) — Numeric project ID.<br>`--table-ref` (string; required) — Project table reference. | [datatable_columns_get.md](datatable_columns_get.md) |
161
164
  | `ae-cli analysis-meta datatable influence-list` | metadata.data_table.influence_list | read | `--project-id` (number; required) — Numeric project ID.<br>`--datatable-id` (number; required) — Data table ID. | [datatable_influence_list.md](datatable_influence_list.md) |
162
165
  | `ae-cli analysis-meta datatable version-get` | metadata.data_table_version.get | read | `--project-id` (number; required) — Numeric project ID.<br>`--version-id` (number; required) — Data table version ID. | [datatable_version_get.md](datatable_version_get.md) |
@@ -168,7 +171,7 @@ This is the exhaustive command and flag inventory for the analysis skill. Read t
168
171
  | `ae-cli analysis-meta event get` | metadata.event.get | read | `--project-id` (number; required) — Numeric project ID.<br>`--event-name` (string; required) — Event name. | [event_get.md](event_get.md) |
169
172
  | `ae-cli analysis-meta event hide-update` | metadata.event.hide_update | write | `--project-id` (number; required) — Numeric project ID.<br>`--event-names` (json; required) — Event names JSON array, or a JSON string accepted by common-service.<br>`--is-hide` (boolean; required) — Whether to hide the events. | [event_hide_update.md](event_hide_update.md) |
170
173
  | `ae-cli analysis-meta event influence-list` | metadata.event.influence_list | read | `--project-id` (number; required) — Numeric project ID.<br>`--event-name` (string; required) — Event name. | [event_influence_list.md](event_influence_list.md) |
171
- | `ae-cli analysis-meta event list` | metadata.event.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional result field projection JSON array.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected.<br>`--authenticated-only` (boolean; optional) — When true, return only authenticated events. | [event_list.md](event_list.md) |
174
+ | `ae-cli analysis-meta event list` | metadata.event.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional result field projection JSON array.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected.<br>`--authenticated-only` (boolean; optional) — When true, return only authenticated events.<br>`--certification-scope` (string; optional, default="project") — Asset certification filter scope: project follows the project switch, certified returns only certified assets, all returns every asset. | [event_list.md](event_list.md) |
172
175
  | `ae-cli analysis-meta event relation-update` | metadata.event.relation_update | write | `--project-id` (number; required) — Numeric project ID.<br>`--payload` (json; required) — Required snake_case capability payload. Read the dedicated command reference for its semantic shape; an empty object is not a generic valid payload. | [event_relation_update.md](event_relation_update.md) |
173
176
  | `ae-cli analysis-meta event update` | metadata.event.update | write | `--project-id` (number; required) — Numeric project ID.<br>`--event-name` (string; required) — Event name.<br>`--event-desc` (string; optional) — Event display name.<br>`--remark` (string; optional) — Event remark. | [event_update.md](event_update.md) |
174
177
  | `ae-cli analysis-meta event-property-bundle export` | metadata.event_property_bundle.export | read | `--project-id` (number; required) — Numeric project ID.<br>`--request-id` (string; optional) — Optional cli_<32 lowercase hex> request ID. Generated when omitted.<br>`--timeout-seconds` (number; optional, min=1, max=21600) — Export timeout seconds. Default and max: 21600 (6 hours).<br>`--wait` (boolean; optional) — Wait for the remote run and artifact to reach a terminal state. Polling uses short inspect requests; interrupting does not cancel the remote run.<br>`--wait-timeout-seconds` (number; optional, min=1, max=21600) — Maximum time this CLI process waits. Default: 600 seconds; expiry never cancels the remote run.<br>`--output` (string; optional) — Wait, then stream the completed artifact to this local file. Implies --wait.<br>`--force` (boolean; optional) — Allow --output to atomically replace an existing file. Without this flag, existing paths are refused. | [event_property_bundle_export.md](event_property_bundle_export.md) |
@@ -182,7 +185,7 @@ This is the exhaustive command and flag inventory for the analysis skill. Read t
182
185
  | `ae-cli analysis-meta metric delete` | metadata.metric.delete | high-risk-write | `--project-id` (number; required) — Numeric project ID.<br>`--metric-id` (number; required) — Metric ID. | [metric_delete.md](metric_delete.md) |
183
186
  | `ae-cli analysis-meta metric export` | metadata.metric.export | read | `--project-id` (number; required) — Numeric project ID.<br>`--ignore-authentication` (boolean; optional) — Whether to skip asset authentication status decoration.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional result field projection JSON array.<br>`--authenticated-only` (boolean; optional) — When true, export only authenticated metrics.<br>`--output` (string; required) — Local .json output file for the complete matching metadata rows. | [metric_export.md](metric_export.md) |
184
187
  | `ae-cli analysis-meta metric get` | metadata.metric.get | read | `--project-id` (number; required) — Numeric project ID.<br>`--metric-id` (number; required) — Metric ID. | [metric_get.md](metric_get.md) |
185
- | `ae-cli analysis-meta metric list` | metadata.metric.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--ignore-authentication` (boolean; optional) — Whether to skip asset authentication status decoration.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional result field projection JSON array.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected.<br>`--authenticated-only` (boolean; optional) — When true, return only authenticated metrics. | [metric_list.md](metric_list.md) |
188
+ | `ae-cli analysis-meta metric list` | metadata.metric.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--ignore-authentication` (boolean; optional) — Whether to skip asset authentication status decoration.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional result field projection JSON array.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected.<br>`--authenticated-only` (boolean; optional) — When true, return only authenticated metrics.<br>`--certification-scope` (string; optional, default="project") — Asset certification filter scope: project follows the project switch, certified returns only certified assets, all returns every asset. | [metric_list.md](metric_list.md) |
186
189
  | `ae-cli analysis-meta metric update` | metadata.metric.update | write | `--project-id` (number; required) — Numeric project ID.<br>`--metric-id` (number; required) — Metric ID.<br>`--metric-name` (string; optional) — Metric technical name for full-definition update.<br>`--metric-desc` (string; optional) — Metric display name.<br>`--metric-remark` (string; optional) — Metric remark.<br>`--metric-mode` (number; optional) — Metric model mode for full-definition update.<br>`--model-type` (string; optional) — Semantic metric model type: event or retention. Prefer this over metric-mode.<br>`--metric-events` (json; optional) — Metric event-analysis QP JSON array for full-definition update.<br>`--metric-params` (json; optional) — Metric params JSON object. | [metric_update.md](metric_update.md) |
187
190
  | `ae-cli analysis-meta property changelog-list` | metadata.property.changelog_list | read | `--project-id` (number; required) — Numeric project ID.<br>`--table-type` (string; required) — Property table type.<br>`--prop-name` (string; required) — Property column name. | [property_changelog_list.md](property_changelog_list.md) |
188
191
  | `ae-cli analysis-meta property create` | metadata.property.create | write | `--project-id` (number; required) — Numeric project ID.<br>`--table-type` (string; required) — Property table type.<br>`--payload` (json; required) — Required snake_case capability payload. Read the dedicated command reference for its semantic shape; an empty object is not a generic valid payload. | [property_create.md](property_create.md) |
@@ -191,7 +194,7 @@ This is the exhaustive command and flag inventory for the analysis skill. Read t
191
194
  | `ae-cli analysis-meta property get` | metadata.property.get | read | `--project-id` (number; required) — Numeric project ID.<br>`--table-type` (string; required) — Property table type.<br>`--prop-name` (string; required) — Property column name. | [property_get.md](property_get.md) |
192
195
  | `ae-cli analysis-meta property hide-update` | metadata.property.hide_update | write | `--project-id` (number; required) — Numeric project ID.<br>`--table-type` (string; required) — Property table type.<br>`--prop-names` (json; required) — Property names JSON array, or a JSON string accepted by common-service.<br>`--is-hide` (boolean; required) — Whether to hide the properties. | [property_hide_update.md](property_hide_update.md) |
193
196
  | `ae-cli analysis-meta property influence-list` | metadata.property.influence_list | read | `--project-id` (number; required) — Numeric project ID.<br>`--table-type` (string; required) — Property table type.<br>`--prop-name` (string; required) — Property column name. | [property_influence_list.md](property_influence_list.md) |
194
- | `ae-cli analysis-meta property list` | metadata.property.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--table-type` (string; optional) — Optional property table type: event or user.<br>`--scope` (string; optional) — Optional property scope: event or user.<br>`--event-name` (string; optional) — Optional event name filter for event properties.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional result field projection JSON array.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected.<br>`--authenticated-only` (boolean; optional) — When true, return only authenticated properties. | [property_list.md](property_list.md) |
197
+ | `ae-cli analysis-meta property list` | metadata.property.list | read | `--project-id` (number; required) — Numeric project ID.<br>`--table-type` (string; optional) — Optional property table type: event or user.<br>`--scope` (string; optional) — Optional property scope: event or user.<br>`--event-name` (string; optional) — Optional event name filter for event properties.<br>`--queries` (json; optional) — Optional JSON array of 1 to 20 keyword filters. Results match any keyword.<br>`--fields` (json; optional) — Optional result field projection JSON array.<br>`--limit` (number; optional, min=1, max=200) — Directory page size. Default: 50, max: 200. Values outside 1..200 are rejected.<br>`--offset` (number; optional, min=0) — Zero-based directory page offset. Default: 0. Negative values are rejected.<br>`--authenticated-only` (boolean; optional) — When true, return only authenticated properties.<br>`--certification-scope` (string; optional, default="project") — Asset certification filter scope: project follows the project switch, certified returns only certified assets, all returns every asset. | [property_list.md](property_list.md) |
195
198
  | `ae-cli analysis-meta property related-events` | metadata.property.related_events | read | `--project-id` (number; required) — Numeric project ID.<br>`--prop-name` (string; required) — Event property column name. | [property_related_events.md](property_related_events.md) |
196
199
  | `ae-cli analysis-meta property relation-update` | metadata.property.relation_update | write | `--project-id` (number; required) — Numeric project ID.<br>`--table-type` (string; required) — Property table type.<br>`--payload` (json; required) — Required snake_case capability payload. Read the dedicated command reference for its semantic shape; an empty object is not a generic valid payload. | [property_relation_update.md](property_relation_update.md) |
197
200
  | `ae-cli analysis-meta property update` | metadata.property.update | write | `--project-id` (number; required) — Numeric project ID.<br>`--table-type` (string; required) — Property table type.<br>`--prop-name` (string; required) — Property column name.<br>`--prop-desc` (string; optional) — Property display name.<br>`--prop-remark` (string; optional) — Property remark. | [property_update.md](property_update.md) |
@@ -203,6 +206,11 @@ This is the exhaustive command and flag inventory for the analysis skill. Read t
203
206
  | `ae-cli analysis-meta virtual-property create` | metadata.virtual_property.create | write | `--project-id` (number; required) — Numeric project ID.<br>`--sql-expression` (string; required) — SQL expression used to calculate the virtual property.<br>`--v-prop` (json; optional) — Virtual property JSON object with property.column_name/property.table_type/property.select_type fields.<br>`--property-name` (string; optional) — Virtual property name. Must start with '#vp@'.<br>`--property-desc` (string; optional) — Virtual property display name.<br>`--table-type` (string; optional) — Property table type: event or user.<br>`--select-type` (string; optional) — Property value type: string, number, bool, or datetime.<br>`--property-remark` (string; optional) — Optional virtual property remark.<br>`--properties` (json; optional) — Dependent property JSON array.<br>`--sql-event-relation-type` (string; optional) — relation_default, relation_always, or relation_by_setting.<br>`--related-events` (json; optional) — Related events JSON array when using relation_by_setting.<br>`--tag-date-policies` (json; optional) — Optional tag date policies JSON array.<br>`--replace-remark` (string; optional) — Replacement remark.<br>`--replace-suggestion` (string; optional) — Replacement suggestion. | [virtual_property_create.md](virtual_property_create.md) |
204
207
  | `ae-cli analysis-meta virtual-property sql-rule-delete` | metadata.virtual_property.sql_rule_delete | high-risk-write | `--project-id` (number; required) — Numeric project ID.<br>`--v-prop-id` (number; required) — Virtual property ID.<br>`--operation` (string; optional) — Delete operation. Use revoke to revoke instead of delete. | [virtual_property_sql_rule_delete.md](virtual_property_sql_rule_delete.md) |
205
208
  | `ae-cli analysis-meta virtual-property sql-rule-update` | metadata.virtual_property.sql_rule_update | write | `--project-id` (number; required) — Numeric project ID.<br>`--sql-expression` (string; required) — SQL expression used to calculate the virtual property.<br>`--v-prop` (json; required) — Virtual property JSON object with prop_id beside property.<br>`--properties` (json; optional) — Dependent property JSON array.<br>`--sql-event-relation-type` (string; optional) — relation_default, relation_always, or relation_by_setting.<br>`--related-events` (json; optional) — Related events JSON array when using relation_by_setting.<br>`--tag-date-policies` (json; optional) — Optional tag date policies JSON array.<br>`--replace-remark` (string; optional) — Replacement remark.<br>`--replace-suggestion` (string; optional) — Replacement suggestion. | [virtual_property_sql_rule_update.md](virtual_property_sql_rule_update.md) |
209
+ | `ae-cli personal-semantic-preference add` | business_semantics.personal_context.add | write | `--project-id` (number; required, min=1) — Numeric project ID.<br>`--context-type` (string; required) — preference \| asset_context \| experience \| background.<br>`--title` (string; required, maxLength=255) — Short preference title.<br>`--summary` (string; required, maxLength=1000) — Compact preference summary.<br>`--content` (string; required, maxLength=20000) — Full personal semantic preference content.<br>`--keywords` (json; optional) — Optional JSON array of preference keywords.<br>`--resource-refs` (json; optional) — Ordered JSON asset references; required only for asset_context.<br>`--fresh-until-at` (string; optional) — Optional freshness expiration timestamp: yyyy-MM-dd HH:mm:ss.<br>`--request-id` (string; optional, maxLength=128) — Optional idempotency key; generated when omitted. | [personal_semantic_preference_add.md](personal_semantic_preference_add.md) |
210
+ | `ae-cli personal-semantic-preference delete` | business_semantics.personal_context.delete | high-risk-write | `--project-id` (number; required, min=1) — Numeric project ID.<br>`--id` (string; required) — Preference ID returned by list/add.<br>`--expected-revision` (number; required, min=1) — Revision returned by the latest read.<br>`--request-id` (string; optional, maxLength=128) — Optional idempotency key; generated when omitted. | [personal_semantic_preference_delete.md](personal_semantic_preference_delete.md) |
211
+ | `ae-cli personal-semantic-preference get` | business_semantics.personal_context.get | read | `--project-id` (number; required, min=1) — Numeric project ID.<br>`--id` (string; required) — Preference ID returned by list/add.<br>`--mark-used` (boolean; optional) — Count this preference as adopted and update its usage heat. | [personal_semantic_preference_get.md](personal_semantic_preference_get.md) |
212
+ | `ae-cli personal-semantic-preference list` | business_semantics.personal_context.list | read | `--project-id` (number; required, min=1) — Numeric project ID. | [personal_semantic_preference_list.md](personal_semantic_preference_list.md) |
213
+ | `ae-cli personal-semantic-preference update` | business_semantics.personal_context.update | write | `--project-id` (number; required, min=1) — Numeric project ID.<br>`--id` (string; required) — Preference ID returned by list/add.<br>`--expected-revision` (number; required, min=1) — Revision returned by the latest read.<br>`--context-type` (string; required) — preference \| asset_context \| experience \| background.<br>`--title` (string; required, maxLength=255) — Short preference title.<br>`--summary` (string; required, maxLength=1000) — Compact preference summary.<br>`--content` (string; required, maxLength=20000) — Full replacement content.<br>`--keywords` (json; optional) — Optional JSON array of preference keywords.<br>`--resource-refs` (json; optional) — Ordered JSON asset references; required only for asset_context.<br>`--fresh-until-at` (string; optional) — Optional freshness expiration timestamp: yyyy-MM-dd HH:mm:ss.<br>`--request-id` (string; optional, maxLength=128) — Optional idempotency key; generated when omitted. | [personal_semantic_preference_update.md](personal_semantic_preference_update.md) |
206
214
  | `ae-cli project access-detail get` | project.access_detail.get | read | `--company-id` (number; required) — Company ID. | [project_access_detail_get.md](project_access_detail_get.md) |
207
215
  | `ae-cli project data-power delete` | project.data_power.delete | high-risk-write | `--project-id` (number; required) — Numeric project ID.<br>`--data-power-id` (number; required) — Data power ID to delete.<br>`--new-data-power-id` (number; optional) — Optional replacement data power ID for affected users. | [project_data_power_delete.md](project_data_power_delete.md) |
208
216
  | `ae-cli project data-power get` | project.data_power.get | read | `--project-id` (number; required) — Numeric project ID.<br>`--data-power-id` (number; required) — Data power ID. | [project_data_power_get.md](project_data_power_get.md) |
@@ -1,6 +1,6 @@
1
1
  # analysis dashboard get
2
2
 
3
- Use when the user needs one dashboard detail or when an agent needs the business context for dashboard report data. The detail includes location, creator and create/update time, settings, reports, notes, and sharing information.
3
+ Use when the user needs one dashboard detail or when an agent needs the effective settings, saved filter configuration, and business context for dashboard report data.
4
4
 
5
5
  Do not use to query report result data. Use `dashboard-report-data run` or `dashboard-report-data export`.
6
6
 
@@ -18,4 +18,21 @@ Output is the gateway envelope. `data` contains the dashboard detail returned by
18
18
  - `location` always contains `space_id`, `space_name`, `folder_id`, and `folder_name`; values are null when that level does not apply. `folder_name` is the immediate parent folder.
19
19
  - `notes` is an array whose items contain `note_id`, `note_title`, and `description`.
20
20
 
21
+ Prefer `effective_settings` over raw storage fields in `settings` when interpreting behavior:
22
+
23
+ - `approximate_calculation.enabled` says whether report queries use approximate calculation.
24
+ - `fixed_timezone.enabled` says whether the dashboard locks its timezone. When enabled, use `zone_offset`; otherwise `timezone_source=current_user_or_project_default` means the query follows the current user timezone or project default.
25
+ - `scheduled_precompute.enabled`, `schedule_hour`, and `zone_offset` describe scheduled precomputation.
26
+ - `cache.applicable`, `value`, `unit`, and `source` describe effective cache behavior. A `source` of `scheduled_precompute` means custom cache duration does not apply.
27
+
28
+ `filter_config` separates filters by source:
29
+
30
+ - `fixed_time` is the saved dashboard time range. Explicit supported `start_time` and `end_time` on a dashboard data command take precedence.
31
+ - `dashboard_default` is the dashboard-wide default filter; it excludes the current caller's personal default filter.
32
+ - `dashboard_business` is the mandatory business filter configured on the dashboard.
33
+ - `space_business` is the mandatory business filter inherited from the project space.
34
+ - `merge_relation=and` means these saved sources and any call-time `--filters` are combined with AND. Treat saved filters as already applied; do not copy them into `--filters`.
35
+
36
+ Each saved source has `enabled` and a semantic `definition`. Read conditions from `definition.relation` and `definition.items`; fields and operators are Agent-facing names rather than raw QP codes. If a condition has `supported=false`, report that its legacy definition could not be fully mapped instead of claiming that no filter exists.
37
+
21
38
  When this detail is fetched before a dashboard data query, preserve non-empty `location.folder_name`, `dashboard_name`, `remark`, and `notes[].note_title/description` as dashboard context. Use them to interpret the report results, but distinguish this authored context from conclusions observed in the queried data.
@@ -10,6 +10,7 @@ Command:
10
10
  ae-cli analysis dashboard update --project-id <project_id> --operation settings --dashboard-ids '[1001,1002]' [--zone-offset 8] [--payload '{...}']
11
11
  ae-cli analysis dashboard update --project-id <project_id> --operation settings --dashboard-id <dashboard_id> --refresh-type 1 --dashboard-status normal --payload '{"dashboard_job_schedule":"0 0 8 * * ?","time_config_open":true,"time_config":{},"cache_config":{},"schedule_ui_config":{}}'
12
12
  ae-cli analysis dashboard update --project-id <project_id> --operation note-upsert --dashboard-id <dashboard_id> [--note-id <note_id>] [--note-title <title>] [--description <text>]
13
+ ae-cli analysis dashboard update --project-id <project_id> --operation default-filter --dashboard-id <dashboard_id> --filter-name <name> --filter '{"junction_kind":"and","ta_filters":[...]}'
13
14
  ae-cli analysis dashboard update --project-id <project_id> --operation business-filter --dashboard-id <dashboard_id> --filter '{"junction_kind":"and","ta_filters":[...]}'
14
15
  ```
15
16
 
@@ -23,6 +24,8 @@ For `operation=settings`:
23
24
 
24
25
  For `operation=note-upsert`, pass `dashboard_id`; omit `note_id` to create a note or pass it to update an existing note. Do not mix note fields with batch settings fields.
25
26
 
27
+ For `operation=default-filter`, pass one `dashboard_id`, `filter_name`, and `filter`. This saves a favorite filter and enables it as the dashboard-wide default filter; it is distinct from the current caller's personal default filter.
28
+
26
29
  For `operation=business-filter`, pass one `dashboard_id` and a `filter` object in snake_case QP form. This replaces the dashboard-level business filter saved in `ta_dashboard_business_filter`; it is not a condition-filter favorite or a space-level filter. Each simple condition uses fields such as `filter_type`, `column_name`, `table_type`, `column_type`, `select_type`, `calcu_symbol`, `ftv`, and `lack_value`. A condition with `lack_value=true` is saved as a selectable field but does not restrict query data. Pass `{"junction_kind":"and","ta_filters":[]}` to clear all dashboard-level business-filter conditions.
27
30
 
28
31
  Output is the gateway envelope. `data` contains the update result.
@@ -0,0 +1,23 @@
1
+ # personal-semantic-preference add
2
+
3
+ Add one personal semantic preference for the authenticated user in one project.
4
+
5
+ Use this when the user explicitly asks to save a personal semantic preference, or when the current project task contains an explicit stable statement, correction, or confirmation that should become a reusable current-user preference. A current-user working definition remains eligible even when the same content may benefit other users. A second "save" confirmation is not required after that evidence gate is met, unless the target meaning is ambiguous.
6
+
7
+ Command:
8
+
9
+ ```bash
10
+ ae-cli personal-semantic-preference add --project-id <project_id> --context-type <context_type> --title <title> --summary <summary> --content <content> [--keywords '["keyword"]'] [--resource-refs '[{"resource_type":"report","resource_key":"101","display_name":"Revenue daily report"}]'] [--fresh-until-at "yyyy-MM-dd HH:mm:ss"] [--request-id <id>]
11
+ ```
12
+
13
+ Use `preference` for durable interpretation/output preferences, `asset_context` for durable wording or intent bound to exact assets, `experience` for confirmed reusable work methods, and `background` for stable personal context. `--resource-refs` is required and non-empty only for `asset_context`; for every other type it must be absent or empty.
14
+
15
+ `--resource-refs` accepts 1 to 50 ordered objects. Each object contains exactly `resource_type`, string `resource_key`, and `display_name`; `(resource_type, resource_key)` must be unique. `resource_type` is generic lower snake_case rather than a report-only enum, so events, properties, metrics, tags, clusters, reports, dashboards, data tables, and later asset types share the same shape. Array order is the user's intended priority.
16
+
17
+ `--request-id` is an idempotency key; omit it for ordinary interactive use and the CLI will generate one.
18
+
19
+ This command creates only a current-user preference; it never creates or approves a project semantic. Do not reject an otherwise valid personal preference merely because the same content may benefit other users, and do not imply that the saved preference is shared authority. Keep project-candidate recommendation separate: after personal capture, ask whether to recommend broadly reusable content as a project semantic candidate, and submit nothing without that choice.
20
+
21
+ Store only the present working preference. Do not append future governance or lifecycle instructions. Do not use this command for company knowledge, standalone metadata facts, reports, dashboards, transient task details, one-off analysis results, or automatic stale/expired preference handling.
22
+
23
+ Output is the gateway envelope. `data.preference` contains the full created preference, current revision, and complete ordered `resource_refs`. A separate readback is unnecessary unless a later step needs to refresh the record.
@@ -0,0 +1,17 @@
1
+ # personal-semantic-preference delete
2
+
3
+ Soft-delete one personal semantic preference using optimistic locking.
4
+
5
+ Use this only after explicit user confirmation to remove a saved personal preference.
6
+
7
+ Command:
8
+
9
+ ```bash
10
+ ae-cli personal-semantic-preference delete --project-id <project_id> --id <preference_id> --expected-revision <revision> [--request-id <id>] --yes
11
+ ```
12
+
13
+ Read the current item first and pass its revision as `--expected-revision`. This is a high-risk write; use `--dry-run` when the target is ambiguous.
14
+
15
+ Do not use this command for automatic stale/expired preference handling. Stale or low-freshness personal preferences are hidden by list filtering and backend maintenance.
16
+
17
+ Output is the gateway envelope. `data.deleted` identifies the deleted preference and status. After deletion, it should no longer appear in `personal-semantic-preference list`.
@@ -0,0 +1,19 @@
1
+ # personal-semantic-preference get
2
+
3
+ Get one personal semantic preference by ID.
4
+
5
+ Use this command after `personal-semantic-preference list` identifies a likely current-user preference. Pass `--mark-used` when the preference is adopted for the answer, query path, or as the matched target for an update.
6
+
7
+ Command:
8
+
9
+ ```bash
10
+ ae-cli personal-semantic-preference get --project-id <project_id> --id <preference_id> [--mark-used]
11
+ ```
12
+
13
+ Input uses `project_id`, `id`, and optional `mark_used`. `id` must be the exact `preference_<id>` value returned by list/add.
14
+
15
+ Do not use this command as a keyword search, project semantics lookup, or asset catalog lookup. Do not call it repeatedly for every catalog row. Do not use `--mark-used` for a candidate that turns out not to match the user's intent or is only inspected and then rejected.
16
+
17
+ When a published project semantic conflicts with the personal item, the project semantic is the formal definition. Fetch and mark the personal item only when it materially affects the response, such as an explicitly requested non-formal alternative; never silently use it to override the project semantic.
18
+
19
+ Output is the gateway envelope. `data.preference` contains the full personal preference, including content, complete ordered `resource_refs`, and revision. When `--mark-used` is set, the backend increments `heat_count` and updates `last_used_at` for that record.
@@ -0,0 +1,21 @@
1
+ # personal-semantic-preference list
2
+
3
+ List the authenticated user's active personal semantic preference catalog for one project.
4
+
5
+ Use this command once per host, authenticated user, project, and conversation after resolving the project. Keep the returned directory in conversation context for later questions where user-specific wording or preferences may change interpretation.
6
+
7
+ Command:
8
+
9
+ ```bash
10
+ ae-cli personal-semantic-preference list --project-id <project_id>
11
+ ```
12
+
13
+ Input uses `project_id` only. Do not add pagination parameters: the backend returns a compact catalog intended for agent context.
14
+
15
+ Do not use this command for project semantics, shared knowledge, metadata catalogs, report/dashboard lists, or complete asset discovery. It only returns the current user's personal semantic preferences in the current project.
16
+
17
+ Output is the gateway envelope. `data.items[]` contains only `id`, `context_type`, `title`, truncated `summary`, limited `keywords`, `resource_ref_count`, distinct `resource_types`, and `revision`; it deliberately omits content, full asset references, heat, and timestamps. `data.returned_count` is at most 200, `data.truncated` says whether entries were omitted, and `data.selection_policy` is `HOT_160_PLUS_RECENT_40`: up to 160 highest-heat items plus up to 40 recently changed items not already selected. The backend may return fewer items to keep the data payload within 64 KiB.
18
+
19
+ If one returned item is actually adopted to interpret the user's request, call `ae-cli personal-semantic-preference get --project-id <project_id> --id <preference_id> --mark-used` before using its full content. Do not mark an item used when it was only inspected or rejected.
20
+
21
+ Compare a likely match with the published project semantic catalog. Published project semantics remain the formal project-wide authority; personal items provide current-user defaults and working interpretations. If they conflict, use the project semantic for the formal result, explicitly disclose the personal difference, and do not mark the personal item used unless the user explicitly adopts it as a labeled alternative.
@@ -0,0 +1,19 @@
1
+ # personal-semantic-preference update
2
+
3
+ Update one personal semantic preference using optimistic locking.
4
+
5
+ Use this when the user explicitly asks to change an existing personal preference, or when the current project task provides an explicit stable correction or confirmation that should replace a matching saved current-user preference. A current-user working definition remains eligible even when the same content may benefit other users. First read the matched current item with `personal-semantic-preference get --mark-used` and pass the returned revision as `--expected-revision`.
6
+
7
+ Command:
8
+
9
+ ```bash
10
+ ae-cli personal-semantic-preference update --project-id <project_id> --id <preference_id> --expected-revision <revision> --context-type <context_type> --title <title> --summary <summary> --content <content> [--keywords '["keyword"]'] [--resource-refs '[{"resource_type":"event","resource_key":"$login","display_name":"Login event"}]'] [--fresh-until-at "yyyy-MM-dd HH:mm:ss"] [--request-id <id>]
11
+ ```
12
+
13
+ The update replaces all editable fields. Include the full intended `title`, `summary`, `content`, keywords, and asset bindings rather than a partial patch. `asset_context` requires 1 to 50 complete ordered `resource_refs`; other context types cannot contain non-empty refs.
14
+
15
+ This command updates only the current-user preference; it does not update, approve, or publish project semantics. Do not block the update merely because the same content may benefit other users, and do not imply that the saved preference is shared authority. Keep project-candidate recommendation separate and ask before submitting it.
16
+
17
+ Keep future governance and lifecycle handling out of the stored content. Do not use this command for shared knowledge, standalone metadata facts, reports, dashboards, transient task details, one-off analysis results, or automatic stale/expired preference handling.
18
+
19
+ Output is the gateway envelope. `data.preference` contains the full updated preference and new revision. If the revision is stale, read the latest record and ask the user how to merge rather than overwriting silently.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ae-data-integration
3
- description: "Bring local CSV, TSV, TXT, JSON, JSONL (NDJSON), XLS, and XLSX files into AE end-to-end: identify the source's business meaning, generate and confirm a tracking plan, transform rows into UE records, and upload. Also supports privacy-preserving local analysis and handing a small file to AE Agent. Use whenever a user wants to import offline/local data into AE or analyze a file without uploading it."
3
+ description: "Bring local CSV, TSV, TXT, JSON, JSONL (NDJSON), XLS, and XLSX files into AE end-to-end: identify the source's business meaning, generate and confirm a tracking plan, transform rows into UE records, and upload. Also supports privacy-preserving local analysis and handing a small file to AE Agent. Use whenever a user wants to import offline/local data into AE or analyze a file without uploading it. Trigger words: 本地数据导入 / 离线数据 / 数据文件 / 文件导入 / 文件上报 / CSV 导入 / Excel 导入 / TSV 导入 / JSON 导入 / 导入到 AE / 导入到 ThinkingData / local data import / import local file."
4
4
  ---
5
5
 
6
6
  # AE Data Integration
@@ -23,16 +23,35 @@ Two entrances lead here: the AE Agent dialog (attach / plus-button upload) and `
23
23
  - If a batch times out or loses the network, treat that batch as unknown. Stop. Ask the user to verify receiver/AE data before the user chooses `--resume-from`; never resume automatically.
24
24
  - Local analysis stays local. AE Agent attachment is a separate, confirmed branch with a 50 MB per-file limit.
25
25
 
26
+ ## When to use / When NOT to use
27
+
28
+ Use this skill when the user wants to bring a **local data file** (CSV/TSV/TXT/JSON/JSONL/XLS/XLSX) into AE, or analyze such a file locally without uploading.
29
+
30
+ | User intent | Use this instead |
31
+ | --- | --- |
32
+ | How to integrate the SDK / tracking code / LogBus2 config / reporting-error triage (usage Q&A, no local file) | ae-data-integration-helper |
33
+ | Database / datasource direct sync (MySQL, DataX, data warehouse, data-dev platform) | ae-dataops |
34
+ | Community content (posts / comments / chat / WeCom groups) insight or submission | ae-community |
35
+ | Generate / upload a project-level tracking plan (source material is PRD / chat / template / code; deliverable is a real platform tracking plan) | ae-generate-tracking-plan |
36
+ | Upload documents / URLs to a knowledge base | ae-kb |
37
+ | Reports / dashboards / queries / governance on data already in AE | ae-analysis |
38
+
39
+ This skill also produces a tracking-plan draft (`source_type: data`) as a governance prerequisite; that draft is an input to ae-generate-tracking-plan, not a substitute for its five-phase platform plan.
40
+
26
41
  ## Workflow
27
42
 
28
43
  Walk the four submodules in order. Each submodule is its own reference; follow it and come back here for the next step.
29
44
 
30
45
  1. **Source — business identification.** Read [references/source-inspect.md](references/source-inspect.md). Profile every file fully, infer its business meaning using business-doc / user-prompt priors, then pick a branch via [references/ue-routing.md](references/ue-routing.md).
31
- 2. **Reuse check.** If a `.ae-data-integration/index.json` exists and the profile is `ue_eligible`, read [references/reuse.md](references/reuse.md) and match the recommended mapping against the handoff index. A match proposes a frozen package; after one explicit confirmation, run the returned `transform.mjs` command and jump to Sink (step 5). No match → continue.
32
- 3. **Tracking plan.** Read [references/tracking-plan.md](references/tracking-plan.md). Generate the event/property plan from the profile and get a single explicit confirmation from the user before touching data. The plan is a separate, required deliverable from the transform mapping: a user who supplies a column→field mapping directly has **not** completed this step, so build the plan from the confirmed mapping anyway. `user_set` still requires a plan (no events; every property becomes a user property). This step runs for **every** file: a second or later file merges its new events and properties into the existing project plan (tracking-plan.md step 4) — an existing plan is never a reason to skip it.
46
+ 2. **Reuse check.** If the profile is `ue_eligible`, read [references/reuse.md](references/reuse.md) and match the recommended mapping against the handoff index. `reuse` searches the current directory's `.ae-cli/data-integration/` upward, then `~/.ae-cli/data-integration/`, so a package written elsewhere is still found. A match proposes a frozen package; after one explicit confirmation, run the returned `transform.mjs` command and jump to Sink (step 5). No match → continue.
47
+ 3. **Tracking plan.** Read [references/tracking-plan.md](references/tracking-plan.md). The plan is generated from the mapping (`plan --mapping`), so confirm the recommended mapping's key system fields with the user first — `mode`, `#account_id`/`#distinct_id`, `#time` + timezone, `#event_name`, `#ip`/`#uuid` (see [references/transform.md](references/transform.md) steps 1–5) — then generate the event/property plan and get a single explicit confirmation from the user before touching data. The plan is a separate, required deliverable from the transform mapping: a user who supplies a column→field mapping directly has **not** completed this step, so build the plan from the confirmed mapping anyway. `user_set` still requires a plan (no events; every property becomes a user property). This step runs for **every** file: a second or later file merges its new events and properties into the existing project plan (tracking-plan.md step 4) — an existing plan is never a reason to skip it.
33
48
  4. **Transform.** Read [references/transform.md](references/transform.md). Map columns to AE system fields and properties, convert, and quarantine dirty rows per [references/ue-mapping.md](references/ue-mapping.md).
34
49
  5. **Sink — upload.** Read [references/sink-upload.md](references/sink-upload.md). Resolve the destination, dry-run, confirm, then upload per [references/sync-json-upload.md](references/sync-json-upload.md). `receiver_accepted` is not persistence: after a ~1-minute ingestion delay, verify the data landed with ae-cli (`tracking live-data list` / `tracking ingest summary` / `tracking ingest-error list`) rather than telling the user to check the console.
35
- 6. **Handoff.** Read [references/handoff.md](references/handoff.md). Export the reusable package (frozen mapping + transform script + plan reference) so the next same-shape file skips the full pipeline.
50
+ 6. **Handoff.** Read [references/handoff.md](references/handoff.md). Export the reusable package (pipeline descriptor + frozen mappings + stage executors + docs) and a shareable zip; in the completion response, state the absolute zip path, the package directory, and the one-line way to run the next same-shape file.
51
+
52
+ ## Error handling
53
+
54
+ When a step fails, classify the failure before acting — see [references/error-handling.md](references/error-handling.md). A quarantined row, a ragged line, and a disk-full are three different problems with three different responses: match on the error `code`, never retry a parse failure by guessing the encoding, and never report a program failure as a data problem.
36
55
 
37
56
  ## Local analysis branch
38
57
 
@@ -0,0 +1,93 @@
1
+ # Project custom layer (verify + salvage overlays)
2
+
3
+ The handoff package is deliberately **standard flow only**: it ships the generic
4
+ stage executors and never embeds environment-specific workarounds such as SQL
5
+ direct queries or multi-round salvage loops. Some projects need those — a hard
6
+ per-event persistence judge, or a repeated salvage loop for a dirty source. Add
7
+ them as a **custom layer next to the package**, never by editing the generic
8
+ package itself.
9
+
10
+ ## When to add a layer
11
+
12
+ - **Hard persistence judge.** `bin/verify.py` is a soft check: it computes the
13
+ submit window and expected counts from the local UE output, then shows the
14
+ `tracking ingest summary` payload before and after for comparison. It does not
15
+ parse that payload into per-event counts — the capability's `data` shape is
16
+ server-defined, and a shared project's window delta cannot be attributed to one
17
+ import. When the project requires an automated per-event ✓/✗ verdict, overlay a
18
+ SQL layer that reads the project's event/user tables directly.
19
+ - **Multi-round salvage.** `bin/run.sh` already prints a single-round salvage
20
+ hint when `invalid.rows.jsonl` is non-empty. For sources that fail in layers,
21
+ wrap that command in a loop that re-feeds each round's quarantine into the next
22
+ `--salvage-from` until nothing fails or the user stops.
23
+
24
+ ## Rules
25
+
26
+ 1. Put overlays in a sibling directory (e.g. `custom/`) under the package root,
27
+ and reference `../pipeline.json` / `../index.json` — never modify the frozen
28
+ mappings, `bin/`, or the generated docs.
29
+ 2. Keep every existing confirmation gate. A custom layer may add gates; it must
30
+ not remove the `--confirm` upload gate or the plan/shape gates.
31
+ 3. Keep secrets in `.local/target.env`. Never write APPID, endpoints, tokens, or
32
+ raw data values into an overlay file.
33
+ 4. An overlay is project-specific. Do not copy it into another project's package
34
+ without re-confirming the environment assumptions (table names, APPID, host).
35
+
36
+ ## Skeleton 1 — SQL verify (hard per-event judge)
37
+
38
+ The reference deployment queries the ingested tables directly. **Table and
39
+ column names vary by deployment** (`v_event_1` / `v_user_1` and `$part_date` /
40
+ `$part_event` are examples only) — confirm them against the project's receiver
41
+ schema before use, and keep the query read-only.
42
+
43
+ ```bash
44
+ # custom/verify.sh — hard judge; requires the SQL capability to be available.
45
+ # usage: custom/verify.sh <run-dir> [--baseline|--check]
46
+ # Reuses bin/verify.py's window/count computation idea, but answers the question
47
+ # "did exactly these events land?" with a direct count over the event table.
48
+ ```
49
+
50
+ The query shape (adapt table/column names):
51
+
52
+ ```text
53
+ select <event_column>, count(*)
54
+ from <event_table>
55
+ where <date_partition_column> between '<window-start>' and '<window-end>'
56
+ group by 1
57
+ ```
58
+
59
+ Compare the per-event delta (after upload minus before upload) against the
60
+ expected counts from `valid.ue.jsonl`. User-profile rows are overwrite-writes,
61
+ so a zero user-table delta is normal; compare event rows per event, not totals.
62
+
63
+ Keep this layer read-only and non-blocking: report the verdict, never retransmit
64
+ automatically on a mismatch — first check `tracking ingest-error list` for the
65
+ silent-drop reason.
66
+
67
+ ## Skeleton 2 — multi-round salvage loop
68
+
69
+ `bin/run.sh` prints the one-round hint. Wrap it into a loop that re-processes each
70
+ round's quarantine against the fixed mapping until clean or the user stops:
71
+
72
+ ```bash
73
+ # custom/salvage.sh <run-dir> — re-process quarantined rows round by round.
74
+ # Each round's valid.ue.jsonl is disjoint from earlier rounds', so upload each
75
+ # round independently (same --confirm and --allow-clean-subset gates).
76
+ round=1
77
+ while [ -s "<run-dir>/invalid.rows.jsonl" ]; do
78
+ ae-cli data-integration convert \
79
+ --input-file '<same-source>' \
80
+ --mapping '<fixed-mapping.json>' \
81
+ --salvage-from "<run-dir>/invalid.rows.jsonl" \
82
+ --output-dir "<run-dir>-salvage-$round"
83
+ round=$((round + 1))
84
+ # stop condition is the user's: a row that still fails after a fix is a real
85
+ # data defect, not a code bug.
86
+ done
87
+ ```
88
+
89
+ See [transform.md](transform.md) for the `--salvage-from` semantics (single-file
90
+ only; the source must be the same file that produced the quarantine) and
91
+ [handoff.md](handoff.md) for the package the overlay attaches to. Persistence
92
+ verification always follows [sink-upload.md](sink-upload.md): `receiver_accepted`
93
+ is not durability.
@@ -0,0 +1,92 @@
1
+ # Error handling
2
+
3
+ Failures in the data-integration pipeline split into three classes. Each class has a distinct
4
+ response; an agent that mixes them up wastes retries and misleads the user.
5
+
6
+ | Class | What it is | Response |
7
+ | --- | --- | --- |
8
+ | Abnormal data | Rows or fields that do not meet UE rules | Quarantine the row or skip the field, report counts, salvage |
9
+ | File parsing exception | The source cannot be read as its detected format | Surface the parse error, do not retry by guessing; fix the file or format |
10
+ | Program execution exception | The program itself failed (disk, permissions, output dir, mapping mismatch) | Surface the exact error, fix the environment/inputs, re-run |
11
+
12
+ Every error leaves the CLI as the standard envelope `{ ok, data, error: { type, code, message, hint } }`
13
+ (JSON on stdout; progress and warnings on stderr). The `code` is the stable identifier an agent
14
+ branches on; `hint` is human-readable guidance.
15
+
16
+ ## Class 1 — Abnormal data
17
+
18
+ Happens inside `convert`. Two severities:
19
+
20
+ - **Whole-row quarantine.** Any error on a row — identity, time, event name, record type, or a
21
+ single property (type coercion, size/limit) — drops the entire row. The row is written to
22
+ `invalid.rows.jsonl` with its error codes and counted in `manifest.output.invalid_records`; the
23
+ manifest becomes `blocked`. Row-level codes: `MISSING_USER_ID`, `USER_ID_TOO_LONG`,
24
+ `INVALID_RECORD_TYPE`, `INVALID_TIME`, `TIME_OUT_OF_RANGE`, `INVALID_EVENT_NAME`,
25
+ `INVALID_ZONE_OFFSET`, `PROPERTY_TYPE_CONFLICT`, `PROPERTY_LIMIT_EXCEEDED`.
26
+ - **Field skip.** A `#ip` or `#uuid` value that violates its spec drops only that field and keeps
27
+ the row. Counts land in `manifest.output.skipped_fields`; private/LAN IPs are kept but counted in
28
+ `manifest.output.lan_ip_records`. Field-skip codes: `INVALID_IP`, `INVALID_UUID`. Never quarantined.
29
+
30
+ Responses:
31
+
32
+ - A blocked manifest is not a failure to retry blindly. Fix the mapping, then re-run `convert
33
+ --salvage-from <invalid.rows.jsonl>` to re-process only the quarantined rows (never re-send the
34
+ rows that already passed). Repeat the salvage loop until no rows fail or the user stops.
35
+ - An empty source (zero data rows) blocks with the reason `The source contained no data rows.` —
36
+ a distinct, clearer message than a failed validation run. Do not re-run the same command on the
37
+ same empty file expecting a different result.
38
+ - Ragged delimited rows (a CSV/TSV row whose column count differs from the header) are tolerated:
39
+ extra fields are dropped and missing fields are treated as empty, and a stderr warning reports
40
+ how many rows were ragged. A row that becomes missing its identity/time because a field was
41
+ absent is then quarantined normally. Treat the warning as a data-quality signal for the user.
42
+
43
+ ## Class 2 — File parsing exceptions
44
+
45
+ The source cannot be parsed as its detected format. The agent's job is to report precisely and let
46
+ the user decide — never to guess an encoding or structure and retry silently.
47
+
48
+ | Code | Meaning | What to do |
49
+ | --- | --- | --- |
50
+ | `LOCAL_DATA_INPUT_NOT_FOUND` | Path is not a readable file | Ask for the correct path |
51
+ | `LOCAL_DATA_FILE_TOO_LARGE` | XLS over 1 GB | Convert to XLSX or split the workbook |
52
+ | `LOCAL_DATA_INPUT_INVALID` | Generic parse failure (malformed CSV/TSV/JSON/XLS) | Verify encoding and structure, then retry without changing the source |
53
+ | `LOCAL_DATA_JSONL_INVALID` | A JSONL line is not valid JSON (`location.record` names the line) | Point at the offending record |
54
+ | `LOCAL_DATA_JSON_ROOT_INVALID` | JSON root is not an object or array | Check the file's top-level shape |
55
+ | `LOCAL_DATA_XLSX_INVALID` | Workbook metadata missing / no readable sheets / worksheet entry missing | Re-export the workbook |
56
+ | `LOCAL_DATA_SET_NOT_FOUND` / `LOCAL_DATA_SET_REQUIRED` | Sheet or JSON Path not found / ambiguous | Ask which `--data-set` to use |
57
+
58
+ A parse error is never a reason to change the mapping or the tracking plan. Report the code and
59
+ hint verbatim, and ask the user to fix the file (re-export, re-encode, or split).
60
+
61
+ ## Class 3 — Program execution exceptions
62
+
63
+ The program itself failed; the source data is usually fine. These must never be mislabeled as
64
+ parse errors: a per-row callback failure (for example a disk that filled up mid-convert) propagates
65
+ as itself, not as `LOCAL_DATA_INPUT_INVALID`.
66
+
67
+ | Code | Meaning | What to do |
68
+ | --- | --- | --- |
69
+ | `LOCAL_DATA_OUTPUT_NOT_EMPTY` | The output directory must be new or empty | Point convert at a fresh `<run-id>` directory |
70
+ | `LOCAL_DATA_SOURCE_CHANGED` / `LOCAL_DATA_SOURCE_FORMAT_CHANGED` | The source no longer matches the mapping fingerprint/format | Re-run inspect and review a new mapping |
71
+ | `LOCAL_DATA_MAPPING_INVALID` / `LOCAL_DATA_MAPPING_INVALID_JSON` / `LOCAL_DATA_MAPPING_NOT_FOUND` | The mapping cannot be read or validated | Re-read the mapping reference, fix the mapping file |
72
+ | `LOCAL_DATA_SALVAGE_INVALID` / `LOCAL_DATA_SALVAGE_EMPTY` / `LOCAL_DATA_SALVAGE_NO_MATCH` | The salvage file is not a valid quarantine file, is empty, or lists no rows from this source | Point at the correct `invalid.rows.jsonl` from the same source |
73
+ | `LOCAL_DATA_TYPE_CONFLICTS_UNRESOLVED` / `LOCAL_DATA_TYPE_RESOLUTIONS_INVALID` | Cross-file column type conflicts need explicit resolutions | Build `--type-resolutions` |
74
+ | `LOCAL_DATA_PLAN_INVALID_EVENT_NAME` / `LOCAL_DATA_PLAN_EVENT_NAMES_REQUIRED` / `LOCAL_DATA_PLAN_INVALID_LANG` | Tracking-plan draft inputs are invalid | Fix the event name(s) or `--lang` |
75
+ | `LOCAL_DATA_HANDOFF_INDEX_INVALID` / `LOCAL_DATA_HANDOFF_PLAN_NOT_FOUND` / `LOCAL_DATA_HANDOFF_PLAN_INVALID` | Handoff index/plan cannot be read | Point at a valid handoff directory/plan file |
76
+ | `LOCAL_DATA_ENDPOINT_INVALID` / `LOCAL_DATA_APPID_INVALID` / `LOCAL_DATA_BATCH_SIZE_INVALID` / `LOCAL_DATA_COMPRESS_INVALID` / `LOCAL_DATA_RESUME_INVALID` / `LOCAL_DATA_RESUME_OUT_OF_RANGE` | Upload arguments are invalid | Fix the flag before uploading |
77
+ | `LOCAL_DATA_MANIFEST_INVALID` / `LOCAL_DATA_UE_FILE_INVALID` / `LOCAL_DATA_UE_FILE_NOT_FOUND` / `LOCAL_DATA_UE_FILE_CHANGED` / `LOCAL_DATA_UE_COUNT_MISMATCH` / `LOCAL_DATA_MANIFEST_FILE_MISMATCH` | Upload preconditions fail | Re-check the manifest and UE file pairing |
78
+ | `LOCAL_DATA_CLEAN_SUBSET_CONFIRMATION_REQUIRED` | Uploading from a blocked manifest needs a separate clean-subset decision | Confirm the subset explicitly before `--allow-clean-subset` |
79
+
80
+ Write failures (disk full `ENOSPC`, permission denied `EACCES`) do not hang the command: the
81
+ output streams fail with a clear `Failed to write "<path>"` message telling the user to check disk
82
+ space and directory permissions. Fix the environment, then re-run into a fresh output directory.
83
+
84
+ ## Cross-cutting rules
85
+
86
+ - Classify first, act second. Match on `code`, not on message text.
87
+ - A parse error is not a data problem; a program error is not a parse error. Do not conflate them
88
+ when reporting back to the user.
89
+ - Never retry a parse failure by guessing the encoding, delimiter, or header layout. Show the
90
+ error and ask.
91
+ - After any fix, re-run from the start of the step that failed; do not resume a half-written run
92
+ or reuse a partially populated output directory.