---
name: generate-tracking-code
description: 交互式将 AE 埋点方案落为用户项目代码、LogBus2 配置或 debug 脚本。触发词：代码埋点、埋点代码、tracking code、埋点落地、logbus 配置、AE 上报代码、generate tracking code、insert tracking、トラッキングコード、트래킹 코드。支持多端多平台独立选择输出方式（插入/片段），服务端默认 LoggerConsumer + LogBus2 架构。
---

# generate-tracking-code

> **会话语言**：本 skill 文档为中文，但**所有与用户的对话输出必须使用用户输入的语言**。
> 英文用户输入 → 英文回复；日文用户输入 → 日文回复。不确定时默认英文。
> 包括 Section 标题、Phase 名称、模板提示文案、代码注释等全部输出，不得照搬文档中的中文原文。

## 何时触发

用户说"生成埋点代码 / 帮我做 web 端埋点 / 生成 logbus 配置 / 服务端上报代码" 时触发。支持多端多平台独立选择输出方式。

## Phase 0 — Anchor（每个问题单独一条消息）

### 前置：从 draft.json 读取已有配置

首先检查 `.ae-tracking/draft.json` 是否存在，读取已有配置：

| 配置项 | draft.json 字段 | 处理方式 |
|---|---|---|
| AE projectId | `meta.project_id` | 有值 → 确认；无值 → 询问 |
| AE web 地址 | `meta.host` | 有值 → 确认；无值 → 询问 |
| **SERVER_URL** | `meta.server_url` | **必须询问**，数据上报地址，与 web 地址不同 |
| **APP_ID** | `meta.app_id` | **必须询问**，来自 AE 后台「接入配置」 |
| SDK 集成模式 | `meta.sdk_integration_mode` | 有值 → 直接使用 |
| 客户端 SDK 类型 | `meta.client_platforms`（优先）或 `meta.client_sdk_type` | 有值 → 直接使用 |
| 服务端语言 | `meta.server_language` | 有值 → 直接使用 |
| 用户体系 | `meta.user_identity` | 有值 → 直接使用 |

**注意**：`project_id` ≠ `APP_ID`，`host` ≠ `SERVER_URL`。即使 project_id 和 host 已有值，SERVER_URL 和 APP_ID 仍需单独询问。

**多平台支持**：
- 若 `client_platforms` 存在（数组），则为多平台场景，需为每个平台生成代码
- 若只有 `client_sdk_type`，则为单平台（向后兼容）
- 示例：`client_platforms: ["android", "openharmony"]` → 生成 Android + OpenHarmony 代码

**开发语言支持**：
- Android SDK：支持 Java / Kotlin（可生成两种代码）
- iOS SDK：支持 Objective-C / Swift（可生成两种代码）
- 其他 SDK：固定语言，无需选择

**语言配置来源**：
- 优先读取 `meta.client_platform_languages`（如 `{"android": ["java", "kotlin"]}`）
- 若无配置，对于 Android/iOS 平台需追问用户选择

**确认流程**：
- 有值：问 **"确认使用 draft.json 中的配置：<值>？yes / 输入新值"**
- 用户 `yes` → 使用 draft 值
- 用户输入新值 → 更新 draft.json 并使用新值

### 需要询问的配置（必须逐项确认）

**⚠️ 关键：SERVER_URL 和 APP_ID 是独立的配置项，即使 draft.json 中已有 project_id 和 host 也必须询问。`project_id` ≠ `APP_ID`，`host` ≠ `SERVER_URL`。**

1. **SERVER_URL** — 数据上报地址（**与 web 地址不同**；请前往 AE 系统「项目管理」→「接入配置」→ 填写「公网地址」）
   - ⚠️ 「公网地址」需要填写过才会显示，如果没填过不会显示此字段
   - 解决方案：咨询运维获取地址，或**跳过此步骤**（代码中可暂时用 `SERVER_URL` 或 `PUSH_URL` 替代）
2. **APP_ID** — 请前往 AE 系统「项目管理」→「接入配置」→ 复制「APP_ID」

**host 处理**（可选）：
- 如果需要从 AE fetch plan（无本地 draft.json）→ 询问 host
- 如果已有本地 draft.json → host 不必须，仅在验证阶段提示用户打开 AE Debug 页面

### 如果只有 xlsx 文件（无 draft.json）

首先检查是否同时存在 `.ae-tracking/draft.json` 和 `.ae-tracking/draft.xlsx`：

**若两者都不存在** — 说明当前环境尚未生成过埋点方案。此时提醒用户两种选择：

1. **是否需要先生成埋点方案？**
   - 是 → 提示用户使用 `generate-tracking-plan` skill 生成埋点方案
   - 附：埋点方案文档路径（飞书：https://www.feishu.cn/docx/Jt0VdhNB6oSJ4TxISs1cq2Ebnmg）

2. **如果已有埋点方案**
   - 提供 xlsx 文件路径，使用 `ae-tracking code import-xlsx` 命令导入
   - 或将 xlsx 文件放到 `.ae-tracking/draft.xlsx` 后再执行

**若存在 xlsx 文件**（用户通过 `ae-tracking code import-xlsx` 命令提供，或放在 `.ae-tracking/draft.xlsx`），则进入以下流程：

**Step 1：解析 xlsx 文件**

执行以下命令解析 xlsx：
```bash
ae-tracking code import-xlsx --xlsx <xlsx路径> --out .ae-tracking/draft.json
```

此命令会：
1. 读取 xlsx 中的事件、事件属性、公共属性、用户属性
2. 根据事件 `platform` 字段推断 `sdk_integration_mode`
3. 输出 draft.json（meta 部分仅有 events 和 plan_name）

**Step 2：从 xlsx 可推断的信息**

| 字段 | 是否可推断 | 说明 |
|---|---|---|
| 事件列表 | ✅ | 从 `#事件数据` sheet |
| 事件属性池 | ✅ | 从 `#事件数据` sheet |
| 公共事件属性 | ✅ | 从 `#公共事件属性` sheet |
| 用户属性 | ✅ | 从 `#用户数据` sheet |
| sdk_integration_mode | ⚠️ 有限支持 | xlsx 的"采集端"列可推断（client/server/both），但若无该列则需询问 |
| client_platforms | ❌ | 需询问用户选择 |
| client_platform_languages | ❌ | 需询问用户选择（仅 Android/iOS） |
| server_language | ❌ | 需询问用户选择（仅 sdk_integration_mode 含 server） |
| user_identity | ❌ | 需询问用户选择 |
| host / project_id | ❌ | 需询问或跳过 |

**"采集端"列解析规则**：
- 空值 / 无此列 → 无法推断 platform，默认生成客户端代码（向后兼容）
- `客户端` / `client` → 仅客户端采集，解析为 `platform: "client"`
- `服务端` / `server` → 仅服务端采集，解析为 `platform: "server"`
- `客户端,服务端` / `client,server` / `服务端,客户端` / `server,client` → 两端都采集，解析为 `platform: "both"`

**内部表示**：xlsx 中的 "采集端" 值经过 `ae-tracking code import-xlsx` 解析后，统一转为 `platform` 字段的内部值：
- `client` → 客户端采集
- `server` → 服务端采集
- `both` → 两端都采集（xlsx 中是 "客户端,服务端" 或 "client,server"）

**代码生成时的平台过滤**：
- 客户端代码：只生成 `platform === "client"` 或 `platform === "both"` 的事件
- 服务端代码：只生成 `platform === "server"` 或 `platform === "both"` 的事件
- 若 xlsx 无 platform 列，客户端和服务端代码都会生成（向后兼容）

**Step 3：询问缺失配置**

按顺序依次询问，每项单独一条消息：

1. **SDK 集成模式**：问 **"埋点通过客户端还是服务端上报？客户端 / 服务端 / 两者都有"**

2. **客户端平台**（仅 sdk_integration_mode 含 client）：
   问 **"这是什么平台的 App？"**
   - Android / Android SDK
   - iOS / iOS SDK
   - OpenHarmony / OpenHarmony SDK
   - Web / H5（JavaScript SDK）
   - 微信小程序（小程序 SDK）
   - 微信小游戏（小游戏 SDK）
   - Unity 游戏（Unity SDK）
   - Cocos 游戏（CocosCreator / Cocos2d-x / LayaAir）
   - React Native / Flutter / uni-app
   - 其他

   → 用户选择后，**仅当选择 Android 或 iOS 时**，追问：
   - Android → 问 **"开发语言是什么？Java / Kotlin / 两者都支持"**
   - iOS → 问 **"开发语言是什么？Objective-C / Swift / 两者都支持"**

3. **服务端语言**（仅 sdk_integration_mode 含 server）：
   问 **"服务端语言是什么？"**
   - Java
   - Python
   - Go
   - Node.js
   - PHP
   - C# / .NET
   - 其他

4. **用户体系**：
   - 账号 ID 来源：user_account / role_id / none
   - 访客 ID 策略：auto / device_id / custom

5. **SERVER_URL / APP_ID**（如已配置则跳过）

**Step 4：合并配置并进入 Phase 1**

将询问结果写入 `.ae-tracking/draft.json` 的 meta 部分，然后进入 Phase 1 执行。

---

### 如果无本地 plan 文件

如果没有 `.ae-tracking/draft.json` 或 `.ae-tracking/remote-plan.json`，需要：

1. **AE projectId** — 从 AE 后台获取
2. **AE web 地址** — 用于 fetch plan
3. 执行 `ae-tracking plan fetch` 获取埋点方案
   
   **追问规则**（根据集成模式确定需要生成代码的端/平台）：
   
   | 集成模式 | 需要生成的端/平台 |
   |---|---|
   | `client_only` | 1 个客户端平台（从 plan 读取 `client_sdk_type` 或询问） |
   | `server_only` | 1 个服务端语言（从 plan 读取 `server_language` 或询问） |
   | `both` | 客户端平台 + 服务端语言（两者都需要） |

---

### 端/平台定义

**客户端平台**（对应客户端 SDK）：

| plan 字段 | 平台 | SDK | 文档路径 |
|---|---|---|---|
| `android` | Android | Android SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/客户端-sdk/android.md` |
| `ios` | iOS | iOS SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/客户端-sdk/ios.md` |
| `openharmony` | OpenHarmony | OpenHarmony SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/客户端-sdk/openharmony.md` |
| `javascript` | Web / H5 | JavaScript SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/客户端-sdk/javascript.md` |
| `miniprogram` | 小程序 | 小程序 SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/客户端-sdk/小程序小游戏.md` |
| `unity` | Unity | Unity SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/客户端-sdk/游戏引擎/unity.md` |
| `game_engine` | 游戏引擎 | Cocos / Laya / Unreal | 见 `references/sdk-index.md` |

**服务端语言**（对应服务端 SDK）：

| plan 字段 | 语言 | SDK | 文档路径 |
|---|---|---|---|
| `java` | Java | Java SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/服务端-sdk/java.md` |
| `python` | Python | Python SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/服务端-sdk/python.md` |
| `go` | Go | Go SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/服务端-sdk/golang.md` |
| `nodejs` | Node.js | Node SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/服务端-sdk/nodejs.md` |
| `php` | PHP | PHP SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/服务端-sdk/php.md` |
| `csharp` | C# | C# SDK | `~/.ae-tracking/wiki/te-docs/raw/接入指南/服务端-sdk/c.md` |

---

### 输出方式定义

每个端/平台可选择两种输出方式：

| 方式 | 说明 | 参数 | 产物 |
|---|---|---|---|
| **insert**（插入） | 直接 Edit 写入用户项目 | 需指定项目路径 | 代码写入指定目录 |
| **snippet**（片段） | markdown 打印 + 生成代码文件 | 无需路径 | `.ae-tracking/output/<platform>-sdk.<ext>` |

**服务端默认附加**：
- LoggerConsumer 代码（插入或片段，根据选择）
- LogBus2 配置文件（`.ae-tracking/output/daemon.json`）
- 官方文档链接：https://docs-v2.thinkingdata.cn/?version=latest&code=logbus2_installation

**独立选项**：
- `debug` — 校验脚本（生成测试上报代码）

---

## Phase 1 — Load plan

```bash
ae-tracking auth login --host <host>
ae-tracking auth status
ae-tracking plan fetch --project <projectId> --host <host> > .ae-tracking/remote-plan.json
```

失败降级：
- AE 无法访问 → 问用户是否用 `.ae-tracking/draft.json`（本地已有 plan）
- 两者都没有 → 终止，让用户先跑 `generate-tracking-plan`

**读取 SDK 集成配置**：
从 plan 文件中读取：
- `meta.sdk_integration_mode` — SDK 集成模式
- `meta.client_sdk_type` — 客户端 SDK 类型（如 `client_only` 或 `both`）
- `meta.server_language` — 服务端开发语言（如 `server_only` 或 `both`）
- `meta.user_identity` — 用户体系配置（用于生成 `login()` / `identify()` 调用）

**确定需要生成代码的端/平台列表**：
```
端/平台列表 = {
  client: [client_sdk_type]  // 如 ['android'] 或 ['javascript']
  server: [server_language]  // 如 ['java'] 或 ['python']
}
```

---

## Phase 2 — Route mode（选择输出方式）

### 2.1 展示端/平台列表

根据 Phase 1 读取的配置，展示需要生成代码的端/平台：

```
需要生成代码的端/平台：

客户端：
- android（Android SDK）

服务端：
- java（Java SDK，默认 LoggerConsumer + LogBus2）
```

### 2.2 快捷选项

提供快捷选项，简化交互：

**选项 1：一键生成（推荐）**
- 所有端/平台都选择 `snippet`（代码片段）
- 一次性生成所有代码文件到 `.ae-tracking/output/`
- **无需指定项目路径**，直接给出可复制的代码
- 适合快速获取代码参考、复制到项目中使用

**选项 2：插入到项目**
- 每个端/平台独立选择 `insert`（插入）或 `snippet`（片段）
- **需要指定项目路径**，代码会写入你的项目目录
- 适合已有项目、想让代码直接落到对应位置

### 2.3 逐个选择流程

如果用户选择「逐个选择」，按端/平台顺序询问：

**客户端平台询问**：
```
客户端 android 选择输出方式：
1. insert（插入）— 需指定项目路径
2. snippet（片段）— 无需路径，生成代码文件

请选择：insert / snippet
```

- 选 `insert` → 问 **"项目路径是什么？（绝对路径）"**
- 选 `snippet` → 无需额外参数

**服务端语言询问**：
```
服务端 java 选择输出方式：
1. insert（插入）— 需指定项目路径
2. snippet（片段）— 无需路径，生成代码文件

请选择：insert / snippet

（默认附加：LoggerConsumer + LogBus2 配置 + 官方文档链接）
```

- 选 `insert` → 问 **"项目路径是什么？（绝对路径）"**
- 选 `snippet` → 无需额外参数
- 服务端无论选择哪种，都额外生成 `.ae-tracking/output/daemon.json`
- **同步提供 LogBus2 官方文档链接**：https://docs-v2.thinkingdata.cn/?version=latest&code=logbus2_installation

### 2.4 独立选项

在端/平台选择完成后，询问：

**"是否需要生成 debug 校验脚本？yes / no"**

- `yes` → 生成 `.ae-tracking/output/te-debug.<ext>`
- `no` → 跳过

### 2.5 汇总选择结果

展示最终选择汇总：

```
输出方式汇总：

客户端 android：snippet（片段）
  产物：.ae-tracking/output/android-sdk.java

服务端 java：snippet（片段）
  产物：.ae-tracking/output/java-sdk.java
         .ae-tracking/output/daemon.json

LogBus2 官方文档：https://docs-v2.thinkingdata.cn/?version=latest&code=logbus2_installation

独立选项：debug
  产物：te-debug.java

确认？yes / no
```

---

## Phase 3 — Execute（按端/平台执行）

### 3.1 执行前检查

Phase 3 开始前检查：
```bash
test -z "$(git status --porcelain)" || echo "uncommitted changes present"
```

**处理规则**：
- `snippet` / `debug` → 无需检查（不写用户代码）
- `insert` 选择 → 检查 git 状态
  - git clean → 直接执行
  - git dirty → 暂停，等待用户选择：
    ```
    检测到未提交代码，insert 模式需要 git clean 环境。

    请选择：
    1. 先 commit / stash，完成后告诉我，我继续执行 insert
    2. 切换为 snippet 模式生成代码片段（之后想 insert 再来跑 skill）
    ```
    - 用户选择 1 → 用户完成 commit/stash 后，**重新进入 Phase 3.1 检查**，检查通过后执行 insert
    - 用户选择 2 → 本次所有 `insert` 改为 `snippet` 模式执行

### 3.2 按端/平台分发执行

**事件平台过滤规则**（重要）：
- xlsx "采集端" 列的值映射为 `platform` 字段：
  - `客户端` / `client` → `platform: "client"`
  - `服务端` / `server` → `platform: "server"`
  - `客户端,服务端` / `client,server` → `platform: "both"`
- 客户端代码：只生成 `platform === "client"` 或 `platform === "both"` 的事件
- 服务端代码：只生成 `platform === "server"` 或 `platform === "both"` 的事件
- 若 xlsx 无 platform 列（早期方案），则生成全部事件（向后兼容）
- `platform === undefined`（xlsx 无此列）→ 两端代码都生成

**客户端代码生成**：

| 输出方式 | 执行流程 |
|---|---|
| `insert` | 读 `references/client-sdk-insert.md` → Explore 项目 → 制定插入计划 → Edit 写入 |
| `snippet` | 读 `references/snippet-delivery.md` → markdown 打印 + 生成 `.ae-tracking/output/<platform>-sdk.<ext>` |

**只生成 `platform === "client"` 或 `platform === "both"` 的事件**

**⚠️ 强制规则：不得猜测 SDK 引用**
- 生成前必须读取 wiki 对应 SDK 文档（见 `references/sdk-index.md`）
- **必须从 wiki 主文档中复制 import 语句和包名**，不得猜测
- 示例：JavaScript SDK 的 npm 包名是 `thinkingdata-browser`，import 变量名是 `ta`
- 如果写出的代码与 wiki 文档不符（如 `TDAnalytics`/`te`/`@thinkingdata/web-sdk`），必须重新读 wiki 确认
- **每次生成代码前都必须重新读取文档**，不得复用"记忆"中的代码

---

**服务端代码生成**：

| 输出方式 | 执行流程 |
|---|---|
| `insert` | 读 `references/server-sdk-insert.md` → Explore 项目 → 制定插入计划 → Edit 写入 |
| `snippet` | 读 `references/snippet-delivery.md` → markdown 打印 + 生成 `.ae-tracking/output/<language>-sdk.<ext>` |

**只生成 `platform === "server"` 或 `platform === "both"` 的事件**

**服务端默认附加**：
- 生成 LoggerConsumer 模式代码（写本地日志文件）
- 生成 `.ae-tracking/output/daemon.json`（LogBus2 配置）
- **同步提供 LogBus2 官方文档链接**：https://docs-v2.thinkingdata.cn/?version=latest&code=logbus2_installation

**⚠️ 强制规则：不得猜测 SDK 引用**
- 生成前必须读取 wiki 对应 SDK 文档（见 `references/sdk-index.md`）
- **必须从 wiki 主文档中复制 import 语句和包名**，不得猜测
- **每次生成代码前都必须重新读取文档**，不得复用"记忆"中的代码

---

**独立选项执行**：

| 选项 | 执行流程 |
|---|---|
| `debug` | 读 `references/debug-script.md` → 生成 `.ae-tracking/output/te-debug.<ext>` |

---

## Phase 4 — Deliver（产物展示）

根据选择的输出方式展示产物：

### 全都生成片段

```
产物清单：

客户端：
- .ae-tracking/output/android-sdk.java（Android SDK 代码片段）

服务端：
- .ae-tracking/output/java-sdk.java（Java SDK LoggerConsumer 代码）
- .ae-tracking/output/daemon.json（LogBus2 配置）

LogBus2 官方文档：https://docs-v2.thinkingdata.cn/?version=latest&code=logbus2_installation

独立选项：
- .ae-tracking/output/te-debug.java（校验脚本）

README：.ae-tracking/output/README.md（使用说明）
```

### 混合选择（部分 insert + 部分 snippet）

```
产物清单：

客户端 android（insert）：
- <项目路径>/src/main/java/.../TrackingHelper.java（SDK init + 事件调用）

服务端 java（snippet）：
- .ae-tracking/output/java-sdk.java（LoggerConsumer 代码片段）
- .ae-tracking/output/daemon.json（LogBus2 配置）

LogBus2 官方文档：https://docs-v2.thinkingdata.cn/?version=latest&code=logbus2_installation

独立选项：
- .ae-tracking/output/te-debug.java（校验脚本）
```

### Markdown 代码片段展示

对于所有 `snippet` 选择，在 markdown 响应中按端/平台分组展示：

```
## 客户端 Android

### SDK 初始化
```java
TDAnalytics.init(this, SERVER_URL, APPID);
```

### 公共属性
```java
Map<String, Object> superProperties = new HashMap<>();
superProperties.put("channel", "app_store");
TDAnalytics.setSuperProperties(superProperties);
```

### 事件组：auth
#### user_login
```java
TDAnalytics.track("user_login", new HashMap<String, Object>() {{
    put("login_method", "phone");
}});
```
...
```

---

## Phase 5 — Validate hint

根据选择的端/平台给出验证建议：

### 验证步骤

```
验证步骤：
1. 运行校验脚本：
   - 客户端：运行 .ae-tracking/output/te-debug-client.<ext>
   - 服务端：运行 .ae-tracking/output/te-debug-server.<ext>

2. 打开 AE Debug 页面：
   https://<host>/#/data/debug

3. 筛选 distinct_id=claude-test 查看上报数据

4. 如有 LogBus2：
   - 将 daemon.json 复制到 LogBus2 的 conf/ 目录
   - 启动：./logbus start
   - 官方文档：https://docs-v2.thinkingdata.cn/?version=latest&code=logbus2_installation
```

### 验证通过后

- 提示用户 commit 改动（如有 `insert`）
- 提示用户在代码中调用 `login()` / `identify()` 以关联用户 ID
- 提示用户将 daemon.json 复制到 LogBus2 的 conf/ 目录

### 验证失败

- 让用户贴错误文案回来 debug
- 检查 SERVER_URL / appId 是否正确
- 检查网络连通性
- 检查 LogBus2 配置文件格式

---

## 禁止

- **任何 `insert` 执行前未跑 `git status` 检查（重要：必须先检查，有未提交改动则拒绝执行）**
- 在 Phase 3 跳 reference 直接乱插
- 忽略 `// @tracking <event>` 注释的增量检测
- 复用 web host 当 SERVER_URL（必须分开）
- **使用 LogBus v1（已过时，只用 LogBus2）**
- 生成 LogBus2 配置时未提供官方文档链接
- 生成客户端代码时包含 `platform === "server"` 的专属事件
- 生成服务端代码时包含 `platform === "client"` 的专属事件（除非 `platform === "both"`）
- **跳过读 SDK 主文档直接凭猜测选集成方式** — 各 SDK 集成方式不同，必须先读 wiki 主文档的「集成 SDK」章节，根据项目特征（有/无构建工具）选择正确方式
- **Stage 0.5 未完成就进入 Stage 1** — SDK 集成必须在插入代码前确认，否则生成的 track() 调用无法执行

---

## 内部参考

所有输出方式的实际规则在 `references/*.md`。本 SKILL.md 只做 Phase 编排。

**SDK 文档索引**：
- `references/sdk-index.md` — 所有 SDK 的 wiki 文档路径索引（权威源）

**输出方式参考**：
- `references/client-sdk-insert.md` — 客户端代码插入流程
- `references/snippet-delivery.md` — 代码片段生成流程
- `references/server-sdk-insert.md` — 服务端代码插入流程（LoggerConsumer + LogBus2）
- `references/logbus-config.md` — LogBus2 配置生成（含官方文档链接）
- `references/debug-script.md` — 校验脚本生成

**LogBus2 官方文档**（生成配置时必须同步提供）：
- 使用指南：https://docs-v2.thinkingdata.cn/?version=latest&code=logbus2_installation
- 下载地址在官方文档「二、下载 LogBus2」章节中

**wiki 目录结构**（见 `~/.ae-tracking/wiki/te-docs/schema.md`）：
- `~/.ae-tracking/wiki/te-docs/raw/` — AE 官方文档镜像（只读，由 crawler 维护）
- `~/.ae-tracking/wiki/te-docs/synthesis/` — LLM 合成的概览文档

**生成代码时的文档读取顺序**：
1. 读 `references/sdk-index.md` 找到对应 SDK 的文档路径
2. 读 wiki 主文档（初始化、基础 API）
3. 读 wiki 进阶指南（LoggerConsumer、用户属性等）
4. 检查进阶指南下的子文档（如需要）
