@thinkingai/ae-cli 6.1.19 → 6.1.21

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 (370) hide show
  1. package/README.md +96 -38
  2. package/README.zh.md +96 -38
  3. package/dist/{auth-QPEVVBKT.js → auth-XZNXFRJS.js} +236 -127
  4. package/dist/{capability-ASI62I4A.js → capability-FYTU3X6L.js} +80 -37
  5. package/dist/{chunk-QL6R6TSK.js → chunk-4NRCTUZJ.js} +27045 -477
  6. package/dist/{chunk-JYMGHGCE.js → chunk-57RRFUEZ.js} +42 -15
  7. package/dist/chunk-6ZIQV5GW.js +26 -0
  8. package/dist/{chunk-KZ6ZHF5J.js → chunk-7FTTULED.js} +14 -14
  9. package/dist/chunk-7XGFSUOM.js +623 -0
  10. package/dist/chunk-CCS66K4K.js +155 -0
  11. package/dist/{chunk-B5HMQAOM.js → chunk-DVMLWQD4.js} +8 -186
  12. package/dist/{chunk-KEWVSO64.js → chunk-DX5CDO34.js} +28 -18
  13. package/dist/chunk-EQ255HKO.js +38248 -0
  14. package/dist/{chunk-6QK7SYYY.js → chunk-HBGADCKA.js} +29 -37
  15. package/dist/{chunk-GJXRF7Y6.js → chunk-HFGZGYCG.js} +54 -81
  16. package/dist/chunk-JOCDD4ON.js +15 -0
  17. package/dist/{chunk-TKHSULJT.js → chunk-KPQY44JQ.js} +6 -0
  18. package/dist/{chunk-FR2EDAQM.js → chunk-MAPZ7VB6.js} +90 -2
  19. package/dist/chunk-V2NUHPXF.js +196 -0
  20. package/dist/{chunk-S5PONFBM.js → chunk-VYXXOKYS.js} +9 -9
  21. package/dist/{community-report-client-6OL6GBQW.js → community-report-client-CU22W53K.js} +2 -4
  22. package/dist/{config-XNMACCKX.js → config-XO3LI3SA.js} +8 -9
  23. package/dist/context-IFJI3LIT.js +46 -0
  24. package/dist/{data-integration-4NZGZ45E.js → data-integration-HNGUKFIC.js} +55 -44
  25. package/dist/index.js +122 -112
  26. package/dist/{local-data-upload-client-EFHDLXFG.js → local-data-upload-client-GTRIT64F.js} +4 -5
  27. package/dist/{memory-HBJQ2GC5.js → memory-QGPSNCQS.js} +4 -6
  28. package/dist/{metadata-62EWBEIG.js → metadata-DI5BMYFU.js} +8 -10
  29. package/dist/{model-BHLJ2QMT.js → model-RNPQXIBI.js} +4 -6
  30. package/dist/{personal-semantic-preference-JBVMAI7L.js → personal-semantic-preference-5C3WUXFI.js} +11 -10
  31. package/dist/{project-semantic-BQ4MPUS5.js → project-semantic-3LF6Q6JZ.js} +29 -25
  32. package/dist/{sync-MUWPRM5I.js → sync-O45NXEQY.js} +7 -8
  33. package/dist/{te-agent-WQZTMEK4.js → te-agent-K5MSPNHJ.js} +393 -90
  34. package/dist/{te-analysis-MNCG65LU.js → te-analysis-AISWCOOZ.js} +1175 -377
  35. package/dist/{te-community-BNE6KREL.js → te-community-4OYU3BDA.js} +10 -33
  36. package/dist/{te-dataops-TXLKM2W6.js → te-dataops-NFIPB6FX.js} +19 -20
  37. package/dist/{te-engage-TPKLRVTL.js → te-engage-BAM3GBFX.js} +13 -15
  38. package/dist/{te-experiment-6BYKTCY7.js → te-experiment-GUTZXZ5Z.js} +132 -16
  39. package/dist/te-kb-3TS73NO6.js +1992 -0
  40. package/dist/{te-system-44LZJDTQ.js → te-system-STMHLS5J.js} +12 -9
  41. package/dist/{te-team-XMP47YXE.js → te-team-3I5AOX3N.js} +6 -8
  42. package/dist/{update-UODFOZ4P.js → update-RZXLPCRH.js} +7 -8
  43. package/package.json +29 -19
  44. package/skills/ae-agent/SKILL.md +30 -13
  45. package/skills/ae-agent/references/agent-distribution.md +94 -0
  46. package/skills/ae-agent/references/approval-request.md +4 -0
  47. package/skills/ae-agent/references/command_index.md +9 -2
  48. package/skills/ae-agent/references/create-automation.md +20 -2
  49. package/skills/ae-agent/references/get-agent-context.md +70 -0
  50. package/skills/ae-agent/references/list-automations.md +18 -3
  51. package/skills/ae-agent/references/list-mcp-credentials.md +1 -1
  52. package/skills/ae-agent/references/mcp-token.md +3 -3
  53. package/skills/ae-agent/references/set-mcp-credential.md +0 -1
  54. package/skills/ae-agent/references/update-automation.md +18 -0
  55. package/skills/ae-analysis/SKILL.md +101 -79
  56. package/skills/ae-analysis/references/adhoc_export.md +11 -18
  57. package/skills/ae-analysis/references/adhoc_run.md +17 -7
  58. package/skills/ae-analysis/references/agent_review_detail.md +11 -0
  59. package/skills/ae-analysis/references/agent_review_evidence.md +46 -0
  60. package/skills/ae-analysis/references/agent_review_list.md +9 -0
  61. package/skills/ae-analysis/references/agent_review_preflight.md +96 -0
  62. package/skills/ae-analysis/references/agent_review_priorities_comparisons.md +76 -0
  63. package/skills/ae-analysis/references/agent_review_records.md +9 -0
  64. package/skills/ae-analysis/references/agent_review_retry.md +12 -0
  65. package/skills/ae-analysis/references/agent_review_review.md +16 -0
  66. package/skills/ae-analysis/references/agent_review_submit_to_page.md +184 -0
  67. package/skills/ae-analysis/references/ai_models/attribution.md +29 -0
  68. package/skills/ae-analysis/references/ai_models/distribution.md +40 -0
  69. package/skills/ae-analysis/references/ai_models/event.md +108 -0
  70. package/skills/ae-analysis/references/ai_models/funnel.md +46 -0
  71. package/skills/ae-analysis/references/ai_models/heat_map.md +26 -0
  72. package/skills/ae-analysis/references/ai_models/interval.md +20 -0
  73. package/skills/ae-analysis/references/ai_models/path.md +38 -0
  74. package/skills/ae-analysis/references/ai_models/prop_analysis.md +39 -0
  75. package/skills/ae-analysis/references/ai_models/rank_list.md +25 -0
  76. package/skills/ae-analysis/references/ai_models/retention.md +70 -0
  77. package/skills/ae-analysis/references/ai_models/revenue.md +28 -0
  78. package/skills/ae-analysis/references/ai_models/sql.md +74 -0
  79. package/skills/ae-analysis/references/ai_models/tag.md +19 -0
  80. package/skills/ae-analysis/references/ai_models.md +32 -453
  81. package/skills/ae-analysis/references/alert_create.md +7 -7
  82. package/skills/ae-analysis/references/alert_delete.md +4 -6
  83. package/skills/ae-analysis/references/alert_detail_list.md +7 -9
  84. package/skills/ae-analysis/references/alert_get.md +5 -7
  85. package/skills/ae-analysis/references/alert_job_list.md +4 -6
  86. package/skills/ae-analysis/references/alert_list.md +6 -8
  87. package/skills/ae-analysis/references/alert_notice_config_list.md +4 -6
  88. package/skills/ae-analysis/references/alert_start.md +5 -7
  89. package/skills/ae-analysis/references/alert_stop.md +5 -7
  90. package/skills/ae-analysis/references/alert_update.md +8 -8
  91. package/skills/ae-analysis/references/analysis_data_export.md +72 -0
  92. package/skills/ae-analysis/references/analysis_data_retrieval.md +32 -196
  93. package/skills/ae-analysis/references/analysis_gateway_assets.md +23 -180
  94. package/skills/ae-analysis/references/analysis_interpretation.md +37 -17
  95. package/skills/ae-analysis/references/asset_abnormal_get.md +0 -1
  96. package/skills/ae-analysis/references/asset_abnormal_list.md +0 -1
  97. package/skills/ae-analysis/references/asset_authentication_export.md +4 -0
  98. package/skills/ae-analysis/references/asset_authentication_list.md +7 -1
  99. package/skills/ae-analysis/references/asset_authentication_update.md +5 -1
  100. package/skills/ae-analysis/references/asset_batch_dashboard_schedule_freeze.md +8 -6
  101. package/skills/ae-analysis/references/asset_batch_delete.md +6 -6
  102. package/skills/ae-analysis/references/asset_batch_disable_auto_backup.md +4 -5
  103. package/skills/ae-analysis/references/asset_batch_disable_auto_update.md +5 -6
  104. package/skills/ae-analysis/references/asset_batch_handover.md +4 -5
  105. package/skills/ae-analysis/references/asset_batch_info_export.md +4 -5
  106. package/skills/ae-analysis/references/asset_batch_sql_export.md +5 -6
  107. package/skills/ae-analysis/references/asset_dependency_list.md +4 -5
  108. package/skills/ae-analysis/references/asset_export.md +4 -5
  109. package/skills/ae-analysis/references/asset_impact_list.md +5 -9
  110. package/skills/ae-analysis/references/asset_lineage_get.md +5 -6
  111. package/skills/ae-analysis/references/asset_list.md +4 -5
  112. package/skills/ae-analysis/references/asset_query_history_list.md +4 -8
  113. package/skills/ae-analysis/references/asset_recent_list.md +0 -1
  114. package/skills/ae-analysis/references/asset_search.md +12 -9
  115. package/skills/ae-analysis/references/asset_url_get.md +3 -4
  116. package/skills/ae-analysis/references/bi_panel_copy.md +2 -2
  117. package/skills/ae-analysis/references/bi_panel_page_data_export.md +4 -12
  118. package/skills/ae-analysis/references/bi_panel_page_data_run.md +2 -0
  119. package/skills/ae-analysis/references/catalog_export.md +4 -17
  120. package/skills/ae-analysis/references/catalog_list.md +4 -4
  121. package/skills/ae-analysis/references/check_delete.md +5 -7
  122. package/skills/ae-analysis/references/check_export.md +11 -11
  123. package/skills/ae-analysis/references/check_get.md +8 -10
  124. package/skills/ae-analysis/references/check_list.md +4 -6
  125. package/skills/ae-analysis/references/check_retry.md +8 -10
  126. package/skills/ae-analysis/references/check_run.md +2 -4
  127. package/skills/ae-analysis/references/command_index.md +46 -28
  128. package/skills/ae-analysis/references/cross_source_config.md +84 -0
  129. package/skills/ae-analysis/references/dashboard_report_data_export.md +5 -13
  130. package/skills/ae-analysis/references/dashboard_report_data_run.md +1 -1
  131. package/skills/ae-analysis/references/dashboard_update.md +15 -4
  132. package/skills/ae-analysis/references/datatable_columns_get.md +0 -1
  133. package/skills/ae-analysis/references/datatable_influence_list.md +0 -1
  134. package/skills/ae-analysis/references/datatable_version_get.md +0 -1
  135. package/skills/ae-analysis/references/datatable_version_list.md +0 -1
  136. package/skills/ae-analysis/references/debug_device_add.md +1 -2
  137. package/skills/ae-analysis/references/drilldown_entities_export.md +3 -3
  138. package/skills/ae-analysis/references/drilldown_events_export.md +3 -2
  139. package/skills/ae-analysis/references/drilldown_user_events_export.md +2 -2
  140. package/skills/ae-analysis/references/entity_detail_export.md +3 -2
  141. package/skills/ae-analysis/references/entity_detail_run.md +1 -0
  142. package/skills/ae-analysis/references/event_blacklist_add.md +5 -7
  143. package/skills/ae-analysis/references/event_blacklist_list.md +4 -6
  144. package/skills/ae-analysis/references/event_blacklist_update.md +6 -8
  145. package/skills/ae-analysis/references/event_changelog_list.md +0 -1
  146. package/skills/ae-analysis/references/event_create.md +0 -1
  147. package/skills/ae-analysis/references/event_detail_export.md +3 -2
  148. package/skills/ae-analysis/references/event_detail_run.md +1 -0
  149. package/skills/ae-analysis/references/event_export.md +0 -1
  150. package/skills/ae-analysis/references/event_get.md +0 -1
  151. package/skills/ae-analysis/references/event_hide_update.md +0 -1
  152. package/skills/ae-analysis/references/event_influence_list.md +0 -1
  153. package/skills/ae-analysis/references/event_list.md +0 -1
  154. package/skills/ae-analysis/references/event_property_bundle_export.md +5 -14
  155. package/skills/ae-analysis/references/event_property_bundle_import.md +2 -6
  156. package/skills/ae-analysis/references/event_relation_update.md +0 -1
  157. package/skills/ae-analysis/references/event_update.md +0 -1
  158. package/skills/ae-analysis/references/exchange_config_update.md +0 -1
  159. package/skills/ae-analysis/references/exchange_rate_refresh.md +0 -1
  160. package/skills/ae-analysis/references/exchange_rule_list.md +0 -1
  161. package/skills/ae-analysis/references/exchange_rule_update.md +0 -1
  162. package/skills/ae-analysis/references/exchange_rule_validate.md +0 -1
  163. package/skills/ae-analysis/references/governance_recommendation_decisions.md +23 -0
  164. package/skills/ae-analysis/references/governance_recommendation_export.md +108 -0
  165. package/skills/ae-analysis/references/governance_recommendation_submit.md +41 -0
  166. package/skills/ae-analysis/references/history_tag_data_drilldown_export.md +4 -4
  167. package/skills/ae-analysis/references/history_tag_data_export.md +3 -3
  168. package/skills/ae-analysis/references/ingest_error_list.md +7 -9
  169. package/skills/ae-analysis/references/ingest_summary.md +6 -8
  170. package/skills/ae-analysis/references/live_data_export.md +10 -10
  171. package/skills/ae-analysis/references/live_data_list.md +7 -9
  172. package/skills/ae-analysis/references/metadata_resolution.md +78 -0
  173. package/skills/ae-analysis/references/metric_export.md +0 -1
  174. package/skills/ae-analysis/references/metric_get.md +0 -1
  175. package/skills/ae-analysis/references/metric_list.md +4 -5
  176. package/skills/ae-analysis/references/metric_update.md +0 -1
  177. package/skills/ae-analysis/references/operation_record_export.md +4 -5
  178. package/skills/ae-analysis/references/operation_record_list.md +4 -5
  179. package/skills/ae-analysis/references/personal_semantic_preference_list.md +18 -1
  180. package/skills/ae-analysis/references/plan_change_log_export.md +10 -10
  181. package/skills/ae-analysis/references/plan_change_log_list.md +4 -6
  182. package/skills/ae-analysis/references/plan_delete_items.md +2 -4
  183. package/skills/ae-analysis/references/plan_export.md +9 -9
  184. package/skills/ae-analysis/references/plan_generate.md +2 -4
  185. package/skills/ae-analysis/references/plan_get.md +4 -6
  186. package/skills/ae-analysis/references/plan_import_excel.md +6 -8
  187. package/skills/ae-analysis/references/plan_save_items.md +2 -4
  188. package/skills/ae-analysis/references/plan_sync_from_meta.md +4 -6
  189. package/skills/ae-analysis/references/project_access_detail_get.md +0 -1
  190. package/skills/ae-analysis/references/project_data_power_get.md +0 -1
  191. package/skills/ae-analysis/references/project_data_power_list.md +0 -1
  192. package/skills/ae-analysis/references/project_data_power_upsert.md +0 -1
  193. package/skills/ae-analysis/references/project_entity_create.md +0 -1
  194. package/skills/ae-analysis/references/project_entity_event_list.md +0 -1
  195. package/skills/ae-analysis/references/project_entity_get.md +0 -1
  196. package/skills/ae-analysis/references/project_entity_list.md +0 -1
  197. package/skills/ae-analysis/references/project_entity_update.md +0 -1
  198. package/skills/ae-analysis/references/project_function_list.md +0 -1
  199. package/skills/ae-analysis/references/project_info_get.md +0 -1
  200. package/skills/ae-analysis/references/project_info_list.md +0 -1
  201. package/skills/ae-analysis/references/project_info_update.md +0 -1
  202. package/skills/ae-analysis/references/project_mark_time_create.md +0 -1
  203. package/skills/ae-analysis/references/project_mark_time_list.md +0 -1
  204. package/skills/ae-analysis/references/project_mark_time_update.md +0 -1
  205. package/skills/ae-analysis/references/project_member_add.md +6 -5
  206. package/skills/ae-analysis/references/project_member_batch_update.md +0 -1
  207. package/skills/ae-analysis/references/project_member_candidate_list.md +4 -3
  208. package/skills/ae-analysis/references/project_member_handover_run.md +2 -3
  209. package/skills/ae-analysis/references/project_member_list.md +0 -1
  210. package/skills/ae-analysis/references/project_member_receiver_list.md +0 -1
  211. package/skills/ae-analysis/references/project_member_update.md +0 -1
  212. package/skills/ae-analysis/references/project_owner_update.md +0 -1
  213. package/skills/ae-analysis/references/project_permission_binding_list.md +0 -1
  214. package/skills/ae-analysis/references/project_role_function_list.md +0 -1
  215. package/skills/ae-analysis/references/project_role_get.md +0 -1
  216. package/skills/ae-analysis/references/project_role_list.md +0 -1
  217. package/skills/ae-analysis/references/project_role_upsert.md +32 -2
  218. package/skills/ae-analysis/references/project_role_user_list.md +0 -1
  219. package/skills/ae-analysis/references/project_semantic_knowledge_wiki.md +214 -0
  220. package/skills/ae-analysis/references/project_semantic_knowledge_wiki_plan_schema.md +93 -0
  221. package/skills/ae-analysis/references/project_timezone_get.md +0 -1
  222. package/skills/ae-analysis/references/project_timezone_overview.md +0 -1
  223. package/skills/ae-analysis/references/project_timezone_update.md +0 -1
  224. package/skills/ae-analysis/references/project_user_id_items_update.md +0 -1
  225. package/skills/ae-analysis/references/property_changelog_list.md +0 -1
  226. package/skills/ae-analysis/references/property_create.md +0 -1
  227. package/skills/ae-analysis/references/property_export.md +0 -1
  228. package/skills/ae-analysis/references/property_get.md +0 -1
  229. package/skills/ae-analysis/references/property_hide_update.md +0 -1
  230. package/skills/ae-analysis/references/property_influence_list.md +0 -1
  231. package/skills/ae-analysis/references/property_list.md +3 -4
  232. package/skills/ae-analysis/references/property_related_events.md +0 -1
  233. package/skills/ae-analysis/references/property_relation_update.md +0 -1
  234. package/skills/ae-analysis/references/property_update.md +0 -1
  235. package/skills/ae-analysis/references/report_create.md +4 -2
  236. package/skills/ae-analysis/references/report_data_export.md +11 -9
  237. package/skills/ae-analysis/references/report_data_run.md +14 -7
  238. package/skills/ae-analysis/references/report_get.md +5 -3
  239. package/skills/ae-analysis/references/report_list.md +2 -0
  240. package/skills/ae-analysis/references/report_update.md +5 -3
  241. package/skills/ae-analysis/references/rule_create.md +5 -6
  242. package/skills/ae-analysis/references/rule_delete.md +5 -5
  243. package/skills/ae-analysis/references/rule_list.md +3 -4
  244. package/skills/ae-analysis/references/rule_schema.md +3 -4
  245. package/skills/ae-analysis/references/rule_update.md +5 -6
  246. package/skills/ae-analysis/references/sdk_sample_generate.md +2 -4
  247. package/skills/ae-analysis/references/sql_table_columns.md +1 -1
  248. package/skills/ae-analysis/references/super_metadata_batch_create.md +1 -1
  249. package/skills/ae-analysis/references/super_metadata_batch_edit.md +1 -1
  250. package/skills/ae-analysis/references/system_member_add.md +1 -2
  251. package/skills/ae-analysis/references/system_member_status_update.md +1 -1
  252. package/skills/ae-analysis/references/system_ops_alert_contact_list.md +1 -1
  253. package/skills/ae-analysis/references/system_ops_alert_contact_test.md +0 -1
  254. package/skills/ae-analysis/references/system_query_monitor_overview.md +3 -3
  255. package/skills/ae-analysis/references/system_query_task_export.md +4 -14
  256. package/skills/ae-analysis/references/system_query_task_get.md +1 -1
  257. package/skills/ae-analysis/references/system_query_task_list.md +5 -6
  258. package/skills/ae-analysis/references/system_receiver_address_upsert.md +3 -3
  259. package/skills/ae-analysis/references/system_receiver_detection_get.md +1 -1
  260. package/skills/ae-analysis/references/system_third_party_login_disable.md +1 -1
  261. package/skills/ae-analysis/references/system_usage_trend_export.md +3 -12
  262. package/skills/ae-analysis/references/user_cluster_list.md +1 -1
  263. package/skills/ae-analysis/references/user_cluster_member_export.md +4 -4
  264. package/skills/ae-analysis/references/user_tag_create.md +23 -1
  265. package/skills/ae-analysis/references/user_tag_list.md +1 -1
  266. package/skills/ae-analysis/references/user_tag_member_export.md +4 -4
  267. package/skills/ae-analysis/references/user_tag_models.md +9 -1
  268. package/skills/ae-analysis/references/user_tag_update.md +14 -2
  269. package/skills/ae-analysis/references/virtual_event_create.md +10 -5
  270. package/skills/ae-analysis/references/virtual_event_get.md +0 -1
  271. package/skills/ae-analysis/references/virtual_property_create.md +0 -1
  272. package/skills/ae-analysis/references/virtual_property_sql_rule_update.md +0 -1
  273. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/build-project-semantic-wiki.mjs +1054 -0
  274. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/company-kb.mjs +112 -0
  275. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/default-compile-rules.md +30 -0
  276. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/generate-build-ir.mjs +2735 -0
  277. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/package-wiki-source-zip.mjs +376 -0
  278. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/plan-kb-source-sync.mjs +264 -0
  279. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/precompiled-source.mjs +49 -0
  280. package/skills/ae-analysis/scripts/project-semantic-knowledge-wiki/upload-kb-sources-concurrently.mjs +200 -0
  281. package/skills/ae-analysis/scripts/read_results.py +197 -0
  282. package/skills/ae-analysis-global/SKILL.md +1 -1
  283. package/skills/ae-capability/SKILL.md +1 -1
  284. package/skills/ae-community/SKILL.md +1 -1
  285. package/skills/ae-current-context/SKILL.md +53 -0
  286. package/skills/ae-data-integration/SKILL.md +6 -4
  287. package/skills/ae-data-integration/references/dimension-routing.md +36 -0
  288. package/skills/ae-data-integration/references/lark-bitable-source.md +288 -0
  289. package/skills/ae-data-integration/references/lark-sheet-source.md +130 -0
  290. package/skills/ae-data-integration/references/local-analysis.md +2 -0
  291. package/skills/ae-data-integration/references/manual-export-source.md +83 -0
  292. package/skills/ae-data-integration/references/reuse.md +2 -0
  293. package/skills/ae-data-integration/references/sink-upload.md +32 -0
  294. package/skills/ae-data-integration/references/source-inspect.md +1 -1
  295. package/skills/ae-data-integration/references/tracking-plan.md +5 -2
  296. package/skills/ae-data-integration/references/transform.md +1 -1
  297. package/skills/ae-data-integration/references/ue-mapping.md +7 -4
  298. package/skills/ae-data-integration/references/ue-routing.md +17 -1
  299. package/skills/ae-data-integration-helper/SKILL.md +5 -5
  300. package/skills/ae-data-integration-helper/references/android_sdk_faq.md +3 -3
  301. package/skills/ae-data-integration-helper/references/c_sdk_faq.md +3 -3
  302. package/skills/ae-data-integration-helper/references/cocoscreator_sdk_faq.md +1 -1
  303. package/skills/ae-data-integration-helper/references/cpp_server_sdk_faq.md +3 -3
  304. package/skills/ae-data-integration-helper/references/ios_sdk_faq.md +1 -1
  305. package/skills/ae-data-integration-helper/references/java_sdk_faq.md +3 -3
  306. package/skills/ae-data-integration-helper/references/javascript_sdk_faq.md +1 -1
  307. package/skills/ae-data-integration-helper/references/logbus2_guide.md +1 -1
  308. package/skills/ae-data-integration-helper/references/logbus2_parser_plugin.md +2 -2
  309. package/skills/ae-data-integration-helper/references/minigame_sdk_faq.md +2 -2
  310. package/skills/ae-data-integration-helper/references/miniprogram_sdk_faq.md +1 -1
  311. package/skills/ae-data-integration-helper/references/python_sdk_faq.md +2 -2
  312. package/skills/ae-data-integration-helper/references/restful_api_notes.md +2 -2
  313. package/skills/ae-data-integration-helper/references/sdk_log_guide.md +3 -3
  314. package/skills/ae-data-integration-helper/references/sdk_usage_notes.md +11 -11
  315. package/skills/ae-data-integration-helper/references/unity_sdk_faq.md +1 -1
  316. package/skills/ae-dataops/SKILL.md +1 -1
  317. package/skills/ae-engage/SKILL.md +4 -3
  318. package/skills/ae-engage/references/build-task-save-guide.md +3 -0
  319. package/skills/ae-engage/references/flow-metric-update.md +115 -1
  320. package/skills/ae-engage/references/save-flow.md +3 -0
  321. package/skills/ae-engage/references/save-task.md +21 -0
  322. package/skills/ae-engage/references/task-metric-update.md +151 -0
  323. package/skills/ae-experiment/SKILL.md +14 -7
  324. package/skills/ae-experiment/references/save_submit_external_experiment.md +52 -0
  325. package/skills/ae-experiment-design/SKILL.md +3 -3
  326. package/skills/ae-experiment-design/references/platform-operations.md +1 -1
  327. package/skills/ae-experiment-insight/SKILL.md +2 -2
  328. package/skills/ae-experiment-insight/references/platform-operations.md +1 -1
  329. package/skills/ae-generate-tracking-code/SKILL.md +2 -1
  330. package/skills/ae-generate-tracking-code/references/client-sdk-insert.md +1 -1
  331. package/skills/ae-generate-tracking-code/references/datax-config.md +1 -1
  332. package/skills/ae-generate-tracking-code/references/logbus-config.md +1 -1
  333. package/skills/ae-generate-tracking-code/references/modes.md +1 -1
  334. package/skills/ae-generate-tracking-code/references/server-sdk-insert.md +5 -5
  335. package/skills/ae-generate-tracking-code/references/snippet-delivery.md +3 -3
  336. package/skills/ae-generate-tracking-plan/SKILL.md +27 -15
  337. package/skills/ae-generate-tracking-plan/references/business-dimension-mapping.md +1 -1
  338. package/skills/ae-generate-tracking-plan/references/te-api.md +1 -0
  339. package/skills/ae-generate-tracking-plan/references/xlsx-schema.md +3 -2
  340. package/skills/ae-kb/SKILL.md +147 -37
  341. package/skills/ae-kb/references/analysis-workflow.md +292 -0
  342. package/skills/ae-kb/references/query-workflow.md +59 -29
  343. package/skills/ae-kb/references/source-mutations.md +95 -0
  344. package/skills/ae-kb/references/versions.md +46 -0
  345. package/skills/ae-kb-discovery/SKILL.md +5 -1
  346. package/skills/ae-metadata/SKILL.md +1 -1
  347. package/skills/ae-migrate-tracking-code/SKILL.md +195 -0
  348. package/skills/ae-migrate-tracking-code/references/ae-preset-properties.md +76 -0
  349. package/skills/ae-migrate-tracking-code/references/ir.md +167 -0
  350. package/skills/ae-migrate-tracking-code/references/mapping-framework.md +112 -0
  351. package/skills/ae-migrate-tracking-code/references/providers/README.md +58 -0
  352. package/skills/ae-migrate-tracking-code/references/providers/amplitude.md +208 -0
  353. package/skills/ae-migrate-tracking-code/references/providers/firebase.md +160 -0
  354. package/skills/ae-migrate-tracking-code/references/providers/ga4.md +92 -0
  355. package/skills/ae-migrate-tracking-code/references/providers/mixpanel.md +150 -0
  356. package/skills/ae-migrate-tracking-code/references/providers/sensors-data.md +146 -0
  357. package/skills/ae-project-semantic/SKILL.md +1 -1
  358. package/skills/ae-system/SKILL.md +5 -5
  359. package/skills/ae-team/SKILL.md +2 -2
  360. package/skills/ae-use-agent/SKILL.md +42 -0
  361. package/skills/ae-use-agent/references/local-agent.md +114 -0
  362. package/dist/auth-UMJAA72O.js +0 -15
  363. package/dist/chunk-533JK3YX.js +0 -72
  364. package/dist/chunk-DKEXH6Q5.js +0 -72
  365. package/dist/chunk-O6K2ODUE.js +0 -318
  366. package/dist/chunk-RWXIXOZG.js +0 -326
  367. package/dist/client-N7NGZUNI.js +0 -204
  368. package/dist/te-kb-BUD6N3NI.js +0 -1222
  369. package/skills/ae-agent/references/auto-provision-mcp-credentials.md +0 -57
  370. package/skills/ae-analysis/metadata_resolution.md +0 -184
@@ -0,0 +1,58 @@
1
+ # Provider Adapter Contract
2
+
3
+ > **Terminology**: 适配器 = adapter | 识别模式 = recognition pattern | 映射 = mapping | 依赖标识 = dependency identifier | 自动采集 = auto-track | 保留字 = reserved word/prefix
4
+
5
+ A provider adapter is a single Markdown file `references/providers/<provider>.md`. It carries **only** the provider-specific knowledge the migration engine needs. The core algorithm lives in `mapping-framework.md` and must stay provider-agnostic.
6
+
7
+ ## How to add a new provider
8
+
9
+ 1. Copy `firebase.md` as a template.
10
+ 2. Fill every section below.
11
+ 3. Add one row to the Provider Registry table in `SKILL.md`.
12
+ 4. Do **not** modify `SKILL.md` phases or `mapping-framework.md`.
13
+
14
+ ## Required sections
15
+
16
+ ### 1. Recognition
17
+
18
+ How to detect the provider and pin its version variant. Include:
19
+
20
+ - Import / dependency signatures (web, Android, iOS, Flutter/RN where relevant).
21
+ - The exact call signatures for each call kind (event / identity / user property).
22
+ - Version variants and how to tell them apart (e.g. Firebase v8 namespaced vs v9 modular; Amplitude legacy `getInstance().logEvent` vs 2.x `amplitude.track`).
23
+
24
+ ### 2. Event mapping rules
25
+
26
+ - The event call → AE `track()` shape.
27
+ - Event-name constraints (max length, allowed charset, must start with letter) and reserved prefixes that must be stripped or renamed before snake_case conversion.
28
+ - Params/properties: max count, max name/value length, and how non-literal values (variables) are resolved.
29
+ - How source auto-track events are treated (mapped to AE `ta_*` switches or dropped).
30
+
31
+ ### 3. Identity mapping
32
+
33
+ Source identity call(s) → AE `login(accountId)`. Note length limits and whether multiple identifiers exist (user id vs group id).
34
+
35
+ ### 4. User property mapping
36
+
37
+ Source user-property operations → AE user property methods. Use this table shape:
38
+
39
+ | Source operation | AE method | Notes |
40
+ |---|---|---|
41
+ | `setUserProperty(k, v)` | `user_set` | overwrite |
42
+
43
+ Cover `user_set` / `user_setOnce` / `user_add` / `user_append` / `user_unset` equivalents, and group-identify handling (AE has no direct group concept — mark `needs decision`).
44
+
45
+ ### 5. Auto-track decision
46
+
47
+ Which source auto-collected events exist, and whether each maps to an AE auto-track event or is dropped. AE auto-track events must match `ae-generate-tracking-plan`'s autotrack list (`ta_app_install`, `ta_app_start`, `ta_page_show`, ...).
48
+
49
+ ### 6. Dependency identifiers
50
+
51
+ Package/module names used to add or remove the source SDK:
52
+
53
+ - `add` mode: AE SDK dependency (resolved via the AE wiki, not here).
54
+ - `switch` mode: source SDK identifiers to remove (e.g. `firebase/analytics`, `@amplitude/analytics-browser`), split by platform.
55
+
56
+ ### 7. Official docs
57
+
58
+ Authoritative links for the adapter author and for the user when manual confirmation is needed (never fetched at runtime; the agent reads this adapter, not the remote site).
@@ -0,0 +1,208 @@
1
+ # Amplitude Adapter
2
+
3
+ > **Terminology**: 事件 = event | 属性 = event property / user property | 用户 ID = user id | 分组 = group | Identify 操作 = Identify operation | 自动采集 = auto-track
4
+
5
+ ## 1. Recognition
6
+
7
+ Official Amplitude SDKs (verified against `docs.developers.amplitude.com`): **Browser (2.x)**, **Web legacy (`amplitude-js`)**, **Node.js**, **Python**, **Go**, **Java**, **Android (Kotlin)**, **iOS (Swift)**, **React Native**, **Flutter**, **Unity**. Amplitude has **no official Ruby / .NET / PHP SDK** (those are community projects — do not treat them as first-party).
8
+
9
+ ### Web legacy (`amplitude-js`)
10
+
11
+ | Call kind | Signature |
12
+ |---|---|
13
+ | event | `amplitude.getInstance().logEvent('EVENT_NAME', { prop: value })` |
14
+ | identity | `amplitude.getInstance().setUserId('id')` |
15
+ | user props | `amplitude.getInstance().setUserProperties({ k: v })` |
16
+ | identify | `amplitude.getInstance().identify(new amplitude.Identify().set('k', v).add('k', n).setOnce('k', v))` |
17
+ | group | `amplitude.getInstance().setGroup('groupType', 'groupName')` |
18
+
19
+ ### Browser 2.x (`@amplitude/analytics-browser`)
20
+
21
+ | Call kind | Signature |
22
+ |---|---|
23
+ | init | `amplitude.init(API_KEY, user_id?, options?)` |
24
+ | event | `amplitude.track('event_name', { prop: value })` (legacy `logEvent` deprecated) |
25
+ | identity | `amplitude.setUserId('id')` / `setDeviceId('id')` / `setSessionId(ms)` / `setIdentity(idObj)` |
26
+ | identify | `amplitude.identify(new Identify().set('k', v).add('k', n).setOnce('k', v).append('k', v).prepend('k', v).postInsert('k', v).remove('k', v).unset('k').clearAll())` |
27
+ | group | `amplitude.setGroup('groupType', 'groupName')` / `groupIdentify('groupType', 'groupName', identify)` |
28
+ | revenue | `const rev = new Revenue().setPrice(9.99).setProductId('id'); amplitude.revenue(rev)` |
29
+ | opt out | `amplitude.setOptOut(bool)` / `getOptOut()` |
30
+ | flush / reset | `amplitude.flush()` / `reset()` / `extendSession()` |
31
+ | others | `amplitude.remove()` (wipe local data), `trackVideo(...)`, `setTransport(...)`, `createInstance()` |
32
+
33
+ ### React Native (`@amplitude/analytics-react-native`)
34
+
35
+ | Call kind | Signature |
36
+ |---|---|
37
+ | init | `amplitude.init(API_KEY)` |
38
+ | event | `amplitude.logEvent('event_name', { prop: value })` — **RN uses `logEvent`, not `track`** |
39
+ | identity | `amplitude.setUserId('id')` |
40
+ | user props | `amplitude.setUserProperties({ k: v })` |
41
+ | identify | `amplitude.identify(new Identify().set('k', v).add('k', n))` |
42
+ | group | `amplitude.setGroup('groupType', 'groupName')` / `groupIdentify(...)` |
43
+ | opt out | `amplitude.setOptOut(bool)` |
44
+
45
+ ### Node.js (`@amplitude/analytics-node`)
46
+
47
+ | Call kind | Signature |
48
+ |---|---|
49
+ | init | `amplitude.init(apiKey, options?)` |
50
+ | event | `amplitude.track(event, eventOptions?)` — user_id / device_id ride on the event, not a global setter; `logEvent(...)` is a deprecated alias |
51
+ | identify | `amplitude.identify(new Identify().set('k', v), eventOptions?)` |
52
+ | group | `amplitude.setGroup(...)` / `groupIdentify(...)` |
53
+ | revenue | `amplitude.revenue(revenueObj, eventOptions?)` |
54
+ | flush / opt-out | `amplitude.flush()` / `setOptOut(bool)` |
55
+
56
+ ### Python (`amplitude-analytics` on PyPI, `from amplitude import Amplitude`)
57
+
58
+ | Call kind | Signature |
59
+ |---|---|
60
+ | init | `amp = Amplitude(api_key=...)` |
61
+ | event | `amp.track(BaseEvent(event_type=..., user_id=..., event_properties={...}))` — `user_id` / `device_id` ride on the event, not a global setter |
62
+ | identify | `amp.identify(Identify().set('k', v), EventOptions(user_id=...), event_properties=None)` — `Identify()` is an empty constructor; identity goes on `EventOptions` |
63
+ | group | `amp.set_group(group_type, group_name, EventOptions(...))` / `group_identify(group_type, group_name, identify_obj, ...)` |
64
+ | revenue | `amp.revenue(Revenue(price=...), EventOptions(...))` |
65
+ | flush / stop | `amp.flush()` / `shutdown()` / `add(plugin)` / `remove(plugin)` |
66
+
67
+ ### Go (`github.com/amplitude/analytics-go/amplitude`)
68
+
69
+ | Call kind | Signature |
70
+ |---|---|
71
+ | init | `client := amplitude.NewClient(amplitude.NewConfig("api-key"))` — `NewConfig` takes the API key |
72
+ | event | `client.Track(amplitude.Event{EventType: "...", UserID: "..."})` — one of `UserID` / `DeviceID` required |
73
+ | identify | `client.Identify(amplitude.Identify{...}, amplitude.EventOptions{UserID: ...})` |
74
+ | group | `client.SetGroup(groupType, []string{groupName}, EventOptions{...})` / `client.GroupIdentify(...)` |
75
+ | revenue | `client.Revenue(amplitude.Revenue{...}, EventOptions{...})` |
76
+ | flush / stop | `client.Flush()` / `Shutdown()` / `Add(plugin)` / `Remove(name)` |
77
+
78
+ ### Java (server, `com.amplitude:java-sdk`)
79
+
80
+ | Call kind | Signature |
81
+ |---|---|
82
+ | init | `Amplitude.getInstance().init(apiKey)` |
83
+ | event | `amplitude.logEvent(new Event("event_type", userId))` — **Java server uses `logEvent`, not `track`**; `userId` / `deviceId` are `Event` constructor args (at least one required, `userId` ≥ 5 chars) |
84
+ | props / groups | `event.setEventProperties(map)` / `setUserProperties(map)` / `setGroups(map)` / `setGroupProperties(map)` |
85
+ | flush / stop | `flushEvents()` / `shutdown()`; config: `setServerUrl(...)` / `useBatchMode(...)` |
86
+
87
+ No `identify` / `setGroup` / `groupIdentify` / `revenue` client methods — the Java server SDK is `logEvent`-only; groups and revenue are set as properties on the `Event` object.
88
+
89
+ ### Android (Kotlin, `com.amplitude:analytics-android`)
90
+
91
+ - `amplitude.track("event_name", mapOf("k" to v))`, `amplitude.identify(Identify().set("k", v))`, `amplitude.setUserId("id")`, `setDeviceId("id")`, `setSessionId(ms)`, `setGroup(type, name)`, `groupIdentify(...)`, `setOptOut(bool)`, `revenue(...)`, `flush()`, `reset()`, `remove()`.
92
+
93
+ ### iOS (Swift, `Amplitude`)
94
+
95
+ - `amplitude.track(eventType: "event_name", eventProperties: ["k": v])`, `amplitude.identify(identify: Identify().set(property: "k", value: v))`, `amplitude.setUserId(userId: "id")`, `setDeviceId(deviceId: "id")`, `setSessionId(ms)`, `setGroup(groupType:groupName:)`, `groupIdentify(...)`, `revenue(...)`, `flush()`, `reset()`, `remove()`.
96
+
97
+ ### Flutter (`amplitude_flutter`)
98
+
99
+ - `amplitude.track('event_name', {'k': v})`, `amplitude.identify(Identify()..set('k', v))`, `amplitude.setUserId('id')`, `setDeviceId('id')`, `setGroup(type, name)`, `groupIdentify(...)`, `revenue(...)`, `reset()`, `flush()`.
100
+
101
+ ### Unity (legacy API — `logEvent`, not `track`)
102
+
103
+ - Init: `amplitude.init(API_KEY)`.
104
+ - Event: `amplitude.logEvent("event_name", propertiesDict)`.
105
+ - Identity: `amplitude.setUserId("id")`.
106
+ - User property: `setUserProperty("k", v)` / `setUserProperties({...})` / `setOnceUserProperty("k", v)` / `unsetUserProperty("k")` / `clearUserProperties()` / `appendUserProperty("k", [v])` / `addUserProperty("k", v)` / `addUserPropertyDict(...)`.
107
+ - Group: `setGroup("groupType", "groupName")`.
108
+ - Revenue: `logRevenue(...)`.
109
+ - Misc: `trackSessionEvents(bool)`, `setServerUrl(...)`, `setServerZone(...)`, `setEventUploadPeriodSeconds(...)`.
110
+
111
+ ### Server-side → AE landing architecture
112
+
113
+ Amplitude server SDKs upload directly over HTTP. AE server SDKs default to **LoggerConsumer + LogBus2** (write to local logs → LogBus2 syncs to AE) — the reliable, no-data-loss path. `switch` mode therefore requires deploying LogBus2, not just replacing the calls. If the customer insists on direct HTTP upload and accepts the data-loss risk, use the `restful` standalone option (`ae-generate-tracking-code` → `references/restful-call.md`) — do **not** switch to BatchConsumer.
114
+
115
+ | Amplitude server SDK | AE server SDK |
116
+ |---|---|
117
+ | Node.js `@amplitude/analytics-node` | Node.js SDK |
118
+ | Python `amplitude-analytics` (PyPI) | Python SDK |
119
+ | Go `github.com/amplitude/analytics-go` | Golang SDK |
120
+ | Java `com.amplitude:java-sdk` | Java SDK |
121
+
122
+ ## 2. Event mapping rules
123
+
124
+ > **Forward compatibility**: preserve event/property names verbatim (skip snake_case — AE matches names case-sensitively) when historical Amplitude data has been (or will be) imported into AE offline and must join with new SDK data; transform only hard-constraint violations, matching the names the offline import used. See `mapping-framework.md` §1.
125
+
126
+ - `logEvent(type, props)` / `track(type, props)` → `track(snake_case(type), props)`.
127
+ - Amplitude event names are free-form; convert to AE `snake_case` (lowercase, underscores, start with a letter). Amplitude convention is often PascalCase or snake_case — normalize both.
128
+ - **Reserved prefix**: Amplitude reserves property / user-property names starting with `[Amplitude]` (case-insensitive) for its internal system properties. A custom name with this prefix must be renamed (strip the prefix) and surfaced to the user for confirmation.
129
+ - Event properties: map each key to an AE property with a type inferred per `mapping-framework.md`. Amplitude allows nested objects and arrays — map objects to AE `object`, object arrays to `array_row`, string arrays to `array_string`.
130
+ - Amplitude truncates very long event/property names and has large property limits (2000 event props / 1000 user props) — no renaming needed for length, only snake_case normalization.
131
+ - `Revenue` / `revenue(...)` / `logRevenue(...)` → AE has **no payment/revenue API and no revenue auto-track event** — revenue is an ordinary event the app reports itself. Map to a user-chosen AE payment event (e.g. `pay_order` / `purchase`) via `track(...)` with **custom** `amount` (numeric) + `currency` (ISO 4217 string) properties. Never emit `#`-prefixed money names (`#amount` / `#currency` are not valid AE preset properties — rejected at ingestion). The event name and the amount/currency property names are a user decision.
132
+
133
+ ## 3. Identity mapping
134
+
135
+ - Client `setUserId(id)` → AE `login(accountId)` (account_id_source `user_account`).
136
+ - Client `setDeviceId(id)` → AE visitor identity (`#distinct_id`); SDK-managed by default. **Forward compatibility**: map Amplitude's default anonymous `device_id` to AE `#distinct_id` via the AE visitor-id API (`setDistinctId` / `identify`) once at init, before any event; see `mapping-framework.md` §4. Only when the device id is a stable business id should it become `login(accountId)`.
137
+ - **Server SDKs**: user_id / device_id ride on each event (Node/Python/Go/Java) or on the `Identify` object (Python) — map to AE per-event `#account_id` / account_id_source, not a client `login()` call.
138
+ - `setSessionId(ms)` → AE session management is SDK-managed; drop.
139
+ - `reset()` / `remove()` → AE `logout()` (clear login state); `remove()` also wipes local data — treat as a hard reset, confirm with user.
140
+ - `setOptOut(bool)` → AE has no init-then-toggle switch: its consent model is to **initialize the SDK only after the user accepts the privacy policy** (the official sample code gates init behind `if (consented)` — see the AE client-SDK FAQ, e.g. `android_sdk_faq.md` / `ios_sdk_faq.md`). In `switch` mode, gate the AE init behind the same consent check rather than emitting an opt-out call. A **runtime** opt-out toggle (the user revokes consent mid-session) maps to AE's runtime pause API `enableTracking` (the compliance/GDPR doc describes it as suspending all data reporting; CocosCreator's variant is `setTrackStatus(PAUSE/STOP/SAVE_ONLY/NORMAL)`) — read the exact signature from the target platform's SDK doc; otherwise mark `needs decision`.
141
+ - `setGroup(groupType, groupName)` / `groupIdentify` → AE has no direct group concept. Map to a user property or the AE account/role system; **mark `needs decision`** and ask the user.
142
+
143
+ ## 4. User property mapping
144
+
145
+ Identify operations map 1:1 to AE user property methods:
146
+
147
+ | Amplitude Identify operation | AE method | Notes |
148
+ |---|---|---|
149
+ | `set(k, v)` | `user_set` | overwrite |
150
+ | `setOnce(k, v)` | `user_setOnce` | first-write-wins |
151
+ | `add(k, n)` | `user_add` | numeric accumulate |
152
+ | `append(k, v)` | `user_append` | array append |
153
+ | `unset(k)` | `user_unset` | remove property |
154
+ | `prepend` / `preInsert` / `postInsert` / `remove` | — | no AE equivalent; map to `user_set` with the full array or mark `needs decision` |
155
+ | `clearAll()` | — | clears all pending ops in the Identify object; migrate the ops the object still contains, not the `clearAll` itself |
156
+
157
+ Legacy `setUserProperties({k: v})` (amplitude-js / RN / Unity) → `user_set`.
158
+ Unity `setOnceUserProperty(k, v)` → `user_setOnce`; `unsetUserProperty(k)` → `user_unset`; `appendUserProperty`/`addUserProperty` → `user_append`; `clearUserProperties()` → `needs decision` (no direct AE equivalent).
159
+
160
+ > Amplitude has **no** common-property (super property) API: `setUserProperties` is a **user** property, not an event property attached to every event — do not map it to AE `setSuperProperties`.
161
+
162
+ > `user_append` / `user_unset` are code-level only — they do not enter the AE plan (`update_type` is `user_set` / `user_setOnce` / `user_add`); see `mapping-framework.md` §5.
163
+
164
+ ## 5. Auto-track decision
165
+
166
+ Amplitude auto-collects session start/end and (in some SDKs) screen/page views:
167
+
168
+ | Amplitude auto-track | Decision |
169
+ |---|---|
170
+ | session start | drop (AE `ta_app_start` / `ta_page_show` cover lifecycle; confirm with user) |
171
+ | session end | drop |
172
+ | page/screen view | map to AE `ta_page_show` (web) / `ta_app_view` (native) switch |
173
+ | Unity `trackSessionEvents(bool)` | drop the call; enable AE auto-track switches via init instead |
174
+
175
+ Enable via the AE SDK init switch, never as manual `track()`.
176
+
177
+ ## 6. Dependency identifiers
178
+
179
+ | Platform | Remove in `switch` mode | Notes |
180
+ |---|---|---|
181
+ | Web legacy | `amplitude-js` | |
182
+ | Web 2.x | `@amplitude/analytics-browser` | |
183
+ | React Native | `@amplitude/analytics-react-native` | |
184
+ | Node | `@amplitude/node` (legacy) / `@amplitude/analytics-node` | npm |
185
+ | Python | `amplitude-analytics` (PyPI; import `amplitude`) | pip |
186
+ | Go | `github.com/amplitude/analytics-go` | Go module |
187
+ | Java | `com.amplitude:java-sdk` | Maven/Gradle |
188
+ | Android | `com.amplitude:analytics-android` | Gradle |
189
+ | iOS | `Amplitude` (SPM/CocoaPods) | |
190
+ | Flutter | `amplitude_flutter` | pubspec |
191
+ | Unity | Amplitude Unity package (`.unitypackage`) | not a package-manager dependency; remove from the Unity project |
192
+
193
+ AE SDK dependency is resolved via the AE wiki (`ae-generate-tracking-code` → `references/sdk-index.md`), not here.
194
+
195
+ ## 7. Official docs
196
+
197
+ - SDK overview: https://www.docs.developers.amplitude.com/data/sdks/
198
+ - Browser 2.x: https://www.docs.developers.amplitude.com/data/sdks/browser-2/
199
+ - Node.js: https://www.docs.developers.amplitude.com/data/sdks/node/
200
+ - Python: https://www.docs.developers.amplitude.com/data/sdks/python/
201
+ - Go: https://www.docs.developers.amplitude.com/data/sdks/go/
202
+ - Java: https://www.docs.developers.amplitude.com/data/sdks/java/
203
+ - Android (Kotlin): https://www.docs.developers.amplitude.com/data/sdks/android-kotlin/
204
+ - iOS: https://www.docs.developers.amplitude.com/data/sdks/ios/
205
+ - React Native: https://www.docs.developers.amplitude.com/data/sdks/react-native/
206
+ - Flutter: https://www.docs.developers.amplitude.com/data/sdks/flutter/
207
+ - Unity: https://www.docs.developers.amplitude.com/data/sdks/unity/
208
+ - Server SDK source (API verified): https://github.com/amplitude/Amplitude-TypeScript (Node), https://github.com/amplitude/Amplitude-Python, https://github.com/amplitude/analytics-go, https://github.com/amplitude/Amplitude-Java
@@ -0,0 +1,160 @@
1
+ # Firebase Analytics Adapter
2
+
3
+ > **Terminology**: 事件 = event | 参数 = param / event parameter | 用户属性 = user property | 用户 ID = user id | 自动采集 = auto-track | 保留前缀 = reserved prefix
4
+
5
+ ## 1. Recognition
6
+
7
+ ### Web (JavaScript)
8
+
9
+ | Variant | Import | Event call |
10
+ |---|---|---|
11
+ | v8 namespaced | `import firebase from 'firebase/app'; import 'firebase/analytics';` | `firebase.analytics().logEvent('event_name', { param: value })` |
12
+ | v9 modular | `import { getAnalytics, logEvent } from 'firebase/analytics';` | `const analytics = getAnalytics(app); logEvent(analytics, 'event_name', { param: value })` |
13
+
14
+ Identity / user property calls (web):
15
+
16
+ | Call | v8 | v9 |
17
+ |---|---|---|
18
+ | set user id | `firebase.analytics().setUserId(id)` | `setUserId(analytics, id)` |
19
+ | set user properties | `firebase.analytics().setUserProperties({ k: v })` | `setUserProperties(analytics, { k: v })` |
20
+ | set default event params (common event properties) | `firebase.analytics().setDefaultEventParameters({ k: v })` | `setDefaultEventParameters(analytics, { k: v })` |
21
+ | toggle collection | `firebase.analytics().setAnalyticsCollectionEnabled(bool)` | `setAnalyticsCollectionEnabled(analytics, bool)` |
22
+
23
+ ### Android
24
+
25
+ - Import: `com.google.firebase.analytics.FirebaseAnalytics`
26
+ - `mFirebaseAnalytics = FirebaseAnalytics.getInstance(context)`
27
+ - Event: `mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle)` (bundle keys often `FirebaseAnalytics.Param.*` constants)
28
+ - Identity: `mFirebaseAnalytics.setUserId(id)`
29
+ - User property: `mFirebaseAnalytics.setUserProperty(name, value)`
30
+
31
+ ### iOS
32
+
33
+ - Import: `FirebaseAnalytics` (`import FirebaseAnalytics` in Swift / `@import FirebaseAnalytics;` in Objective-C)
34
+ - Event: `Analytics.logEvent("event_name", parameters: [AnalyticsParameterItemID: "id"])` / ObjC `[FIRAnalytics logEventWithName:name parameters:params]`
35
+ - Identity: `Analytics.setUserID("id")` / ObjC `[FIRAnalytics setUserID:userID]`
36
+ - User property: `Analytics.setUserProperty(value, forName: name)` / ObjC `[FIRAnalytics setUserPropertyString:value forName:name]`
37
+
38
+ ### Flutter
39
+
40
+ - `FirebaseAnalytics.instance.logEvent(name: 'event_name', parameters: {...})`
41
+ - `FirebaseAnalytics.instance.setUserId(id)`
42
+ - `FirebaseAnalytics.instance.setUserProperty(name: 'k', value: 'v')`
43
+
44
+ ### React Native
45
+
46
+ - Import: `import analytics from '@react-native-firebase/analytics'`
47
+ - Event: `await analytics().logEvent('event_name', { param: value })`
48
+ - Identity: `await analytics().setUserId(id)`
49
+ - User property: `await analytics().setUserProperty('name', value)` / `setUserProperties({ k: v })`
50
+ - Screen: no `setCurrentScreen` — `screen_view` is auto-collected; to report a screen manually use `logEvent('screen_view', { screen_name, screen_class })`
51
+ - Toggle collection: `await analytics().setAnalyticsCollectionEnabled(bool)`
52
+ - Reset: `await analytics().resetAnalyticsData()` (e.g. on sign-out)
53
+ - Other: `getAppInstanceId()`, `setSessionTimeoutDuration(ms)`, `setConsent({...})`
54
+
55
+ ### Unity
56
+
57
+ - Import: `using Firebase.Analytics;`
58
+ - Event: `FirebaseAnalytics.LogEvent(string eventName, Parameter[] parameters)` where each param is `new Parameter("method", "phone")`; event constant `Firebase.Analytics.FirebaseAnalytics.EventSelectContent`
59
+ - Identity: `FirebaseAnalytics.SetUserId(id)`
60
+ - User property: `FirebaseAnalytics.SetUserProperty("k", "v")`
61
+ - Other: `SetAnalyticsCollectionEnabled(bool)`, `SetSessionTimeoutDuration(ms)`, `GetAnalyticsInstanceId()`
62
+
63
+ ### C++
64
+
65
+ - Import: `#include "firebase/analytics.h"` plus `firebase/analytics/event_names.h`, `firebase/analytics/parameter_names.h`, `firebase/analytics/user_property_names.h`
66
+ - Event: `firebase::analytics::LogEvent(name, parameters, parameter_count)` where `parameters` is `firebase::analytics::Parameter[]`; event constant `firebase::analytics::kEventSelectContent`
67
+ - Identity: `firebase::analytics::SetUserId(id)` — official examples also pass `analytics::Parameter("user_id", mUserId)` inside the event params
68
+ - User property: `firebase::analytics::SetUserProperty("k", "v")`
69
+ - Other: `SetAnalyticsCollectionEnabled(bool)`, `SetSessionTimeoutDuration(ms)`, `GetAnalyticsInstanceId()`
70
+
71
+ ### Constant names (Android / iOS / Unity / C++)
72
+
73
+ Firebase defines event constants in UPPER_SNAKE (e.g. `SELECT_CONTENT`, `ADD_PAYMENT_INFO`, `TUTORIAL_BEGIN`), Unity in PascalCase (`EventSelectContent`), and C++ in `kEvent`-prefixed form (`kEventSelectContent`); param constants likewise (`ITEM_ID`, `VALUE`, `CURRENCY`). Map them all to lowercase snake_case in AE (`select_content`, `add_payment_info`, `item_id`, `value`, `currency`).
74
+
75
+ ### Firebase ↔ GA4
76
+
77
+ Firebase Analytics and GA4 are the same data stream (GA4 is Firebase's web layer; one measurement ID is both). If `logEvent(...)` (Firebase) and `gtag(...)` (GA4) coexist in one project, merge them into a single migration run rather than two providers (see SKILL.md Phase 0).
78
+
79
+ ## 2. Event mapping rules
80
+
81
+ > **Forward compatibility**: preserve event/property names verbatim (skip snake_case — AE matches names case-sensitively) when historical Firebase data has been (or will be) imported into AE offline and must join with new SDK data; transform only hard-constraint violations, matching the names the offline import used. See `mapping-framework.md` §1.
82
+
83
+ - `logEvent(eventName, params)` → `track(snake_case(eventName), props)`.
84
+ - **Event name constraints**: ≤ 40 chars; only alphanumeric + underscore; must start with a letter; no spaces. Violations are already impossible for valid Firebase calls, but snake_case conversion must still lower-case the constant forms — web literals, Android/iOS `Event.*`, Unity `EventXxx`, C++ `kEventXxx` (see Section 1).
85
+ - **Reserved prefixes** (cannot be custom events/params): `firebase_`, `google_`, `ga_`. If found, strip the prefix and flag for user confirmation.
86
+ - **Params**: ≤ 25 per event; param name ≤ 40 chars; param value ≤ 100 chars. Map each param to an AE property with a type inferred per `mapping-framework.md`.
87
+ - **Reserved events** (e.g. `screen_view`, `session_start`, `first_open`, `in_app_purchase`, `purchase`, `tutorial_begin`, `tutorial_complete`, `sign_up`, `login`) — do NOT rename; map `purchase`/`in_app_purchase` to a payment event and let the user decide the AE event name, drop analytics-internal ones per Section 6.
88
+ - Non-literal param values (variables): read the surrounding code to resolve the property name/type; mark unresolved ones for confirmation.
89
+
90
+ ## 3. Identity mapping
91
+
92
+ - `setUserId(id)` → AE `login(accountId)` (account_id_source `user_account`).
93
+ - Firebase user id has no strict length documented; treat as opaque string.
94
+ - **Forward compatibility**: Firebase's auto anonymous id is `app_instance_id` on **native** platforms (Android/iOS/Flutter/Unity/C++/React Native — read it via `getAppInstanceId()` / `appInstanceID` / `GetAnalyticsInstanceId()` per platform), but on **web** (v8/v9) the JS SDK has **no** `getAppInstanceId()` — the anonymous id there is the GA4 `client_id`, read via `getGoogleAnalyticsClientId(analytics)` (v9) / `firebase.analytics().getGoogleAnalyticsClientId()` (v8); it is the same stream as §1 Firebase ↔ GA4. When imported historical data must join with new data, map it to AE `#distinct_id` via the AE visitor-id API (`setDistinctId` / `identify`, name varies by SDK — read the wiki main doc) once at init, before any event; see `mapping-framework.md` §4.
95
+ - `setAnalyticsCollectionEnabled(bool)` → AE's consent model is to **initialize the SDK only after the user accepts the privacy policy** (gate the AE init behind the consent check — see the AE client-SDK FAQ, e.g. `android_sdk_faq.md` / `ios_sdk_faq.md`), not an init-then-toggle switch. A runtime toggle maps to AE's runtime pause API `enableTracking` (the compliance/GDPR doc describes it as suspending all data reporting; CocosCreator's variant is `setTrackStatus(PAUSE/STOP/SAVE_ONLY/NORMAL)`) — read the exact signature from the target platform's SDK doc.
96
+ - `setConsent({...})` (React Native) → **`needs decision`**: Firebase consent is per-purpose (analytics vs ads storage, ad personalization, …), finer-grained than AE's single tracking switch. Map an analytics-storage denial to the consent-gated AE init where the semantics match; other purposes have no AE equivalent — confirm with the user.
97
+
98
+ ## 4. User property mapping
99
+
100
+ | Source operation | AE method | Notes |
101
+ |---|---|---|
102
+ | `setUserProperties({ k: v })` / `setUserProperty(k, v)` | `user_set` | overwrite; defaults to `user_set`. Use `user_setOnce` when the source property is first-time-only (e.g. first_open channel) |
103
+ | numeric accumulate intent | `user_add` | only when the surrounding code reads-then-writes an increasing counter |
104
+
105
+ **Reserved user property names** (cannot be used): Firebase SDK reserves `Age`, `Gender`, `Interest`; GA4 additionally reserves `first_open_time`, `first_visit_time`, `last_deep_link_referrer`, `user_id`, `first_open_after_install`.
106
+
107
+ **User property name constraints**: ≤ 24 chars; names cannot begin with `firebase_`, `google_`, `ga_`, or `_`. Ensure the AE property name is snake_case and registered.
108
+
109
+ ## 5. Super property mapping
110
+
111
+ Firebase `setDefaultEventParameters({...})` (web v8/v9, React Native, Unity) attaches default params to **every subsequent event** — they are event properties, never user properties. Map them to AE common event properties (`setSuperProperties`).
112
+
113
+ | Source operation | AE method | Notes |
114
+ |---|---|---|
115
+ | `setDefaultEventParameters({k:v})` | `set_super_properties` (`setSuperProperties({...})`) | static common event property; lands in `draft.json` `common_event_properties` |
116
+
117
+ > `setDefaultEventParameters` **accumulates** across calls, but AE `setSuperProperties` **overwrites** the whole set each call. Multiple call sites must be merged into a single `setSuperProperties` (or flagged for the user) so earlier keys are not silently dropped.
118
+
119
+ ## 6. Auto-track decision
120
+
121
+ Firebase auto-collected events (not call sites) — map or drop:
122
+
123
+ | Firebase auto-track | Decision |
124
+ |---|---|
125
+ | `session_start` | drop (AE `ta_app_start` / `ta_page_show` cover lifecycle; confirm with user) |
126
+ | `first_open` | map to AE `ta_app_install` switch |
127
+ | `screen_view` | map to AE `ta_page_show` switch (web) or drop on native (AE `ta_app_view` optional) |
128
+ | `app_remove`, `app_update` | drop |
129
+ | `app_clear_data`, `app_exception`, `app_store_refund`, `os_update`, `ad_*`, `notification_*`, `dynamic_link_*` | drop (no AE auto-track equivalent) |
130
+ | `in_app_purchase` | map to an AE payment event (auto-collected, but revenue must become a `track()` with a **custom** amount property, e.g. `amount` — never a `#`-prefixed name: `#amount` is NOT a valid AE preset property and is rejected at ingestion, see `references/ae-preset-properties.md`) |
131
+
132
+ Enable the chosen AE auto-track via the SDK init switch (see `ae-generate-tracking-code`), never as manual `track()`.
133
+
134
+ ## 7. Dependency identifiers
135
+
136
+ | Platform | Remove in `switch` mode | Notes |
137
+ |---|---|---|
138
+ | Web v8 | `firebase/app`, `firebase/analytics` | also the global `firebase.analytics` usage |
139
+ | Web v9 | `firebase/analytics` | keep `firebase/app` only if used elsewhere |
140
+ | Android | `com.google.firebase:firebase-analytics` | Gradle dependency |
141
+ | iOS | `Firebase/Analytics` (CocoaPods) / `FirebaseAnalytics` (SPM) | |
142
+ | Flutter | `firebase_analytics` | pubspec |
143
+ | React Native | `@react-native-firebase/analytics` | package.json |
144
+ | Unity | Firebase Analytics package (`.unitypackage`) | not a package-manager dependency; remove the package from the Unity project |
145
+ | C++ | `firebase::analytics` | remove the linked Firebase Analytics library from CMake / build config |
146
+
147
+ AE SDK dependency is resolved via the AE wiki (`ae-generate-tracking-code` → `references/sdk-index.md`), not here.
148
+
149
+ ## 8. Official docs
150
+
151
+ - Get started: https://firebase.google.com/docs/analytics/get-started
152
+ - Web logEvent reference: https://firebase.google.com/docs/reference/js/analytics
153
+ - Android events: https://firebase.google.com/docs/analytics/android/events
154
+ - iOS events: https://firebase.google.com/docs/analytics/ios/events
155
+ - Android user properties: https://firebase.google.com/docs/analytics/android/user-properties
156
+ - iOS user properties: https://firebase.google.com/docs/analytics/ios/user-properties
157
+ - User properties: https://firebase.google.com/docs/analytics/user-properties
158
+ - Unity `FirebaseAnalytics` reference: https://firebase.google.com/docs/reference/unity/class/firebase/analytics/firebase-analytics
159
+ - C++ `firebase::analytics` reference: https://firebase.google.com/docs/reference/cpp/namespace/firebase/analytics
160
+ - Auto-collected events: https://support.google.com/firebase/answer/9234069
@@ -0,0 +1,92 @@
1
+ # Google Analytics 4 (gtag.js) Adapter
2
+
3
+ > **Terminology**: 事件 = event | 参数 = event parameter | 用户属性 = user property | 用户 ID = user id | 自动采集 = enhanced measurement | 保留前缀 = reserved prefix | 服务端上报 = Measurement Protocol
4
+
5
+ ## 1. Recognition
6
+
7
+ ### Web (gtag.js)
8
+
9
+ | Call kind | Signature |
10
+ |---|---|
11
+ | init | `gtag('js', new Date())` then `gtag('config', 'G-XXXXXXX', { ... })` |
12
+ | event | `gtag('event', 'event_name', { param: value })` |
13
+ | user id | `gtag('set', 'user_id', 'id')` or `gtag('config', 'G-XXXXXXX', { user_id: 'id' })` |
14
+ | user properties | `gtag('set', 'user_properties', { k: { value: v } })` |
15
+ | consent | `gtag('consent', 'default', { ... })` |
16
+
17
+ ### dataLayer variant
18
+
19
+ - `dataLayer.push({ 'event': 'event_name', param: value })` — the same events pushed through a plain JS array; recognize `dataLayer` pushes alongside `gtag` calls.
20
+ - **`dataLayer` is a shared GTM data bus, not a GA4-only pipe.** A single `dataLayer.push` is typically consumed by **multiple tags in the GTM container** — the GA4 tag plus non-GA4 tags (Google Ads conversion, remarketing/audience, Meta Pixel, other vendor tags). Unlike `gtag('event', ...)` (GA4-exclusive), a `dataLayer.push` is therefore **ambiguous in ownership**. In `switch` mode, do not delete a `dataLayer.push` assuming it only feeds GA4: confirm first that no other GTM tag depends on it. When that cannot be confirmed, keep the `dataLayer.push` and treat the site as `add` mode (add `ta.track(...)` alongside) rather than deleting it.
21
+
22
+ ### Server (Measurement Protocol)
23
+
24
+ - Not a SDK — raw HTTP POST to `https://www.google-analytics.com/mp/collect?measurement_id=G-XXX&api_secret=SECRET` with body `{ client_id, user_id, events: [{ name, params }] }`.
25
+
26
+ ### GA4 ↔ Firebase Analytics
27
+
28
+ GA4 is Firebase Analytics' web layer — a single measurement ID is both a GA4 property and a Firebase project. In a project where `gtag(...)` (GA4) and `logEvent(...)` (Firebase) coexist, they are **one data stream, not two providers**: merge them into a single migration run (see SKILL.md Phase 0) producing one scan / one `draft.json` / one `mapping.json`. Do not migrate them as two separate providers.
29
+
30
+ ## 2. Event mapping rules
31
+
32
+ > **Forward compatibility**: preserve event/property names verbatim (skip snake_case — AE matches names case-sensitively) when historical GA4 data has been (or will be) imported into AE offline and must join with new SDK data; transform only hard-constraint violations, matching the names the offline import used. See `mapping-framework.md` §1.
33
+
34
+ - `gtag('event', name, params)` / `dataLayer.push({event: name, ...})` → `track(snake_case(name), params)`.
35
+ - **Event name constraints**: ≤ 40 chars; only alphanumeric + underscore; must start with a letter; ≤ 25 params; param name ≤ 40 chars; param value ≤ 100 chars.
36
+ - **Reserved prefixes** — event, parameter, and user-property names cannot begin with `_` (leading underscore), `firebase_`, `ga_`, or `google_`; parameter names additionally cannot begin with `gtag.`. Strip the prefix and flag for user confirmation.
37
+ - **Reserved param name**: `firebase_conversion` is the only fully-reserved parameter name (cannot be used at all). Auto-collected / system parameters — `engagement_time_msec`, `gclid`, `session_id`, `session_number` — also must not be redefined as custom parameters: drop or map per user decision.
38
+ - **Reserved event names** (cannot be used as custom events): `ad_activeview`, `ad_click`, `ad_exposure`, `ad_query`, `ad_reward`, `adunit_exposure`, `app_clear_data`, `app_exception`, `app_install`, `app_remove`, `app_store_refund`, `app_update`, `app_upgrade`, `dynamic_link_app_open`, `dynamic_link_app_update`, `dynamic_link_first_open`, `error`, `first_open`, `first_visit`, `in_app_purchase`, `notification_dismiss`, `notification_foreground`, `notification_open`, `notification_receive`, `os_update`, `screen_view`, `session_start`, `user_engagement`.
39
+ - **Recommended event names** (GA4-predefined — custom events must not reuse them): `click`, `file_download`, `form_start`, `form_submit`, `scroll`, `view_complete`, `video_progress`, `video_start`, `view_search_results`, `sign_up`, `login`, and more. Route both sets to Section 5 auto-track decisions, never to manual `track()`; see the events reference for the full list.
40
+ - `gtag('set', 'user_properties', ...)` / `gtag('config', ..., { user_id })` are config calls, not events — map to identity / user property per Sections 3–4, not `track`.
41
+
42
+ ## 3. Identity mapping
43
+
44
+ - `gtag('set', 'user_id', id)` / `gtag('config', 'G-XXX', { user_id: id })` → AE `login(accountId)` (account_id_source `user_account`).
45
+ - Measurement Protocol `user_id` field → same mapping.
46
+ - **Forward compatibility**: GA4's auto anonymous id is `client_id`. When imported historical data must join with new data, map it to AE `#distinct_id` via the AE visitor-id API (`setDistinctId` / `identify`) once at init, before any event; see `mapping-framework.md` §4.
47
+ - `gtag('consent', 'default', {...})` → **`needs decision`**: GA4 consent is per-purpose (`analytics_storage`, `ad_storage`, …), finer-grained than AE's single tracking switch. AE's consent model is to **initialize the SDK only after the user accepts the privacy policy** (gate the AE init behind the consent check — see the AE client-SDK FAQ, e.g. `android_sdk_faq.md` / `ios_sdk_faq.md`). Map an `analytics_storage: denied` default to that gated init where the semantics match; `ad_storage` and other purposes have no AE equivalent — confirm with the user.
48
+
49
+ ## 4. User property mapping
50
+
51
+ | Source operation | AE method | Notes |
52
+ |---|---|---|
53
+ | `gtag('set', 'user_properties', {k:{value:v}})` | `user_set` | overwrite; use `user_setOnce` when first-time-only |
54
+
55
+ > GA4 / gtag.js has **no** common-property (super property) API — `gtag('set', 'user_properties', ...)` is a **user** property, not an event property attached to every event; do not map it to AE `setSuperProperties`.
56
+
57
+ **Reserved user property names** (cannot be used): `first_open_time`, `first_visit_time`, `last_deep_link_referrer`, `user_id`, `first_open_after_install` — plus the reserved-prefix rule in §2.
58
+
59
+ **User property limits**: ≤ 25 user properties; name ≤ 24 chars; value ≤ 36 chars; user-id value ≤ 256 chars.
60
+
61
+ ## 5. Auto-track decision (enhanced measurement)
62
+
63
+ GA4 auto-collects these (no call sites):
64
+
65
+ | GA4 auto-track | Decision |
66
+ |---|---|
67
+ | `page_view` | map to AE `ta_page_show` switch |
68
+ | `session_start` | drop (AE `ta_app_start` / `ta_page_show` cover lifecycle) |
69
+ | `first_visit` | map to AE `ta_app_install` switch |
70
+ | `scroll`, `click`, `view_search_results`, `video_start`, `file_download`, `form_start`, `form_submit`, `user_engagement` | drop or map per user decision; most have no AE auto-track equivalent |
71
+
72
+ Enable via the AE SDK init switch, never as manual `track()`.
73
+
74
+ ## 6. Dependency identifiers
75
+
76
+ | Platform | Remove in `switch` mode | Notes |
77
+ |---|---|---|
78
+ | Web | gtag.js script snippet (`https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX`) + all `gtag(...)` calls | remove the `dataLayer` global **only after confirming no other GTM tag consumes it** (see §1 dataLayer variant); if in doubt, keep it |
79
+ | Server | Measurement Protocol endpoint | remove the `mp/collect` HTTP calls |
80
+
81
+ AE SDK dependency is resolved via the AE wiki (`ae-generate-tracking-code` → `references/sdk-index.md`), not here.
82
+
83
+ ## 7. Official docs
84
+
85
+ - gtag.js (GA4): https://developers.google.com/analytics/devguides/collection/ga4
86
+ - gtag.js API reference: https://developers.google.com/tag-platform/gtagjs/reference
87
+ - Events reference: https://developers.google.com/analytics/devguides/collection/ga4/events
88
+ - Event parameters: https://developers.google.com/analytics/devguides/collection/ga4/event-parameters
89
+ - User properties: https://developers.google.com/analytics/devguides/collection/ga4/user-properties
90
+ - Collection limits (40/24/36 chars, 25 params / 25 user properties): https://support.google.com/analytics/answer/9267744
91
+ - Measurement Protocol (GA4): https://developers.google.com/analytics/devguides/collection/protocol/ga4
92
+ - Measurement Protocol reference (reserved names): https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference