tirtc-device-builder 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,369 +1,447 @@
1
1
  # TiRTC Device Builder
2
2
 
3
- TiRTC Device Builder 是一个面向设备开发者的 Codex Plugin 仓库。它把不同芯片平台的开发流程拆成独立 Skill,根据开发板型号、原理图、BSP、引脚表和外设示例生成、移植、编译和验证 TiRTC 设备工程。
3
+ TiRTC Device Builder 用于把 ESP32-S3 开发板接入 TiRTC。输入可以只有开发板型号,也可以包含原理图、BSP、引脚表和外设示例。安装后的 Codex Skill 会先检查环境、整理有依据的硬件事实,再生成独立的 ESP-IDF 工程并完成板级移植和编译。烧录和实机验证只有在开发者明确给出目标串口并授权后才会执行。
4
4
 
5
- 仓库当前包含:
5
+ 当前仓库提供一个 Skill:
6
6
 
7
- | Skill | 平台 | 能力 |
7
+ | Skill | 平台 | 主要用途 |
8
8
  |---|---|---|
9
- | `tirtc-esp32-builder` | ESP32-S3 / ESP-IDF 5.5.x | 环境诊断、Hardware IR、H5 实时查看/对讲、AI 对讲工程生成、编译、烧录和分层验收 |
9
+ | `tirtc-esp32-builder` | ESP32-S3、ESP-IDF 5.5.x | 环境检查、Hardware IR、工程生成、板级媒体移植、编译、烧录和分层验收 |
10
10
 
11
- 后续平台以新的同级 Skill 加入,例如 `skills/tirtc-taixin-builder/`。每个平台独立维护 SDK、构建工具、板级适配和验收约束。
11
+ 开发者不需要克隆 `tirtc-server-example`,也不用登录 npm。工程模板、协议文档和 TiRTC SDK 已打包在独立的 ESP32 Device Kit 中,安装命令会自动下载并校验。
12
12
 
13
- ## 能力边界
13
+ - npm 包:[tirtc-device-builder](https://www.npmjs.com/package/tirtc-device-builder)
14
+ - GitHub 仓库:[tangeai/tirtc-device-builder](https://github.com/tangeai/tirtc-device-builder)
15
+ - ESP32 Device Kit:[kit-esp32s3-v1.0.0](https://github.com/tangeai/tirtc-device-builder/releases/tag/kit-esp32s3-v1.0.0)
14
16
 
15
- ESP32 Skill 使用公开的 [ThingConnect 示例仓库](https://github.com/tangeai/tirtc-server-example) 作为协议、模板、生成器和 TiRTC ESP32 SDK 的事实源。这个仓库不复制服务端源码、预编译 TiRTC SDK、设备凭证或媒体样本。
17
+ 文档导航:
16
18
 
17
- 模板工程提供配网、绑定、MQTT、TiRTC、H5 和 AI 会话骨架。具体开发板仍需接入摄像头、H.264 编码器、麦克风、扬声器、Codec、I2S 和按键。工程编译成功不等于 Web 已经出图或 AI 对讲已通过实机验收。
19
+ - [新用户快速开始](#新用户快速开始)
20
+ - [准备板卡资料](#准备板卡资料)
21
+ - [依赖和支持范围](#依赖和支持范围)
22
+ - [安装方式和默认目录](#安装方式和目录)
23
+ - [检查、生成和编译](#常用检查和开发命令)
24
+ - [烧录和实机验收](#烧录和验收)
25
+ - [常见问题](#常见问题)
18
26
 
19
- ## 新人从零开始:一次跑通 ESP32-S3 H5/AI
27
+ ## 新用户快速开始
20
28
 
21
- 推荐先跑通“安装 → 环境 → 板卡分析 → 生成 → 编译”,确认报告无误后再单独授权烧录和实机验收。整个过程使用同一份板卡事实,避免在代码生成阶段猜测引脚、器件或媒体能力。
29
+ ### 1. 确认 Node.js
22
30
 
23
- ```text
24
- 板卡型号/原理图/BSP
25
- ↓
26
- Hardware IR(硬件事实与来源)
27
- ↓
28
- 能力门禁(READY_TO_PORT 才进入实现)
29
- ↓
30
- 独立 ESP-IDF 工程 + 板级媒体适配
31
- ↓
32
- 编译 → 授权烧录 → 配网绑定 → H5/AI 验收
33
- ↓
34
- TIRTC_PORTING_REPORT.md
31
+ 安装命令依赖 Node.js 18 或更高版本:
32
+
33
+ ```bash
34
+ node --version
35
+ npm --version
35
36
  ```
36
37
 
37
- ### 第 0 步:确认当前支持范围
38
+ `node --version` 应输出 `v18.x` 或更高版本。如果终端提示找不到 `node` 或 `npm`,先从 [Node.js 官方下载页](https://nodejs.org/en/download) 安装受支持版本,再打开一个新终端。
38
39
 
39
- 当前可直接生成的基线是:
40
+ ### 2. 安装并检查开发环境
40
41
 
41
- | 项目 | 当前基线 |
42
- |---|---|
43
- | 芯片 | ESP32-S3 |
44
- | 模组 | ESP32-S3-WROOM-1-N16R8,或资源与配置经过确认的兼容板 |
45
- | ESP-IDF | 5.5.x |
46
- | TiRTC SDK | `espressif-esp32s3/2.3.0` |
47
- | 业务 | H5 实时音视频、H5 对讲、AI 双向语音 |
48
- | 工程生成 | 需要一次本地 ThingConnect 工作区 |
49
- | 烧录 | 必须明确给出串口并授权 |
42
+ ```bash
43
+ npx --yes tirtc-device-builder@latest setup esp32 --install
44
+ ```
50
45
 
51
- “板上有摄像头”不等于可以输出 H5 视频。H5 视频还需要可用的 H.264 Annex-B 编码输出、SPS/PPS、IDR 和关键帧请求控制;对讲还需要完整的麦克风采集、G.711 A-law 8 kHz 编码、下行解码、I2S/Codec/功放和扬声器路径。
46
+ 这条命令会:
52
47
 
53
- 当前生成器只支持 ESP32-S3,TiRTC SDK 也必须匹配 `espressif-esp32s3` 平台。Flash/PSRAM 不是 16 MB/8 MB 时,需要先调整 `sdkconfig.defaults`、分区表和板级资源预算并重新评估;Skill 不会把相似型号静默当作当前板卡。
48
+ - 把 `tirtc-esp32-builder` 安装到 Codex Skill 目录;
49
+ - 下载 ESP32 Device Kit 并校验 SHA-256;
50
+ - 复用当前可用的 ESP-IDF 5.5.x,找不到时安装 ESP-IDF 5.5.4;
51
+ - 安装 Espressif 管理的 ESP32-S3 工具链;
52
+ - 写入只包含本地路径的 `config.json` 和 `env.sh`;
53
+ - 激活托管环境并运行 Doctor。
54
54
 
55
- ### 第 1 步:固定工作路径
55
+ 安装器只写入当前用户有权限的目录,不执行 `sudo`,也不修改 `.bashrc`、`.zshrc` 等 shell 配置。如果缺少系统软件,它会停下来说明缺少什么;补齐后重新执行同一条命令即可继续。
56
56
 
57
- 下面的命令以 Linux、Ubuntu 或 WSL 的 Bash 为例。先把所有路径改成自己的绝对路径;路径可以不同,但后续必须始终使用同一组值。
57
+ 安装成功时,输出末尾应包含:
58
58
 
59
- ```bash
60
- export TIRTC_WORKSPACE=/home/your-user/workspace
61
- export TIRTC_THING_CONNECT_ROOT="$TIRTC_WORKSPACE/tirtc-server-example/thing-connect"
62
- export TIRTC_BOARD_DOCS="$TIRTC_WORKSPACE/board-materials"
63
- export TIRTC_PROJECT_DIR="$TIRTC_WORKSPACE/my-esp32-device"
59
+ ```text
60
+ OVERALL: PASS
61
+ SETUP: READY
62
+ Start a new Codex session and invoke $tirtc-esp32-builder.
64
63
  ```
65
64
 
66
- 逐项确认:
65
+ 如果看到 `OVERALL: NEEDS_SETUP`、`MISS` 或 `FAIL`,先看[常见问题](#常见问题)。
67
66
 
68
- ```bash
69
- printf 'workspace: %s\n' "$TIRTC_WORKSPACE"
70
- printf 'ThingConnect: %s\n' "$TIRTC_THING_CONNECT_ROOT"
71
- printf 'board docs: %s\n' "$TIRTC_BOARD_DOCS"
72
- printf 'output project: %s\n' "$TIRTC_PROJECT_DIR"
73
- ```
67
+ ### 3. 重新打开 Codex
74
68
 
75
- 注意:
69
+ Skill 在 Codex 会话启动时被发现。安装完成后,关闭当前 Codex 会话,再打开一个新会话。
76
70
 
77
- - `TIRTC_PROJECT_DIR` 是待生成的新目录,生成前不能已经存在;生成器不会覆盖旧工程。
78
- - 板卡资料和输出工程使用不同目录。
79
- - 不要把 Wi-Fi 密码、设备密钥、MQTT/WHIP token 或真实用户音视频放入板卡资料目录和 Git 仓库。
80
- - 新开终端后需要重新设置这些变量,除非开发者自行把它们加入 shell 配置。
71
+ ### 4. 把板卡和目标告诉 Codex
81
72
 
82
- ### 第 2 步:准备板卡资料包
73
+ 把你已经掌握的信息填进下面的提示词即可,不用先查齐所有硬件参数。路径请使用绝对路径,不确定的内容写“未知”。可直接复制的版本见[开发板接入提示词](skills/tirtc-esp32-builder/assets/developer-intake-prompt.md)。
83
74
 
84
- 创建资料目录,把原始资料按来源保存,不要先手工改写原理图或 BSP:
75
+ ```text
76
+ 请使用 $tirtc-esp32-builder 完成这块开发板的 TiRTC 移植。
85
77
 
86
- ```bash
87
- mkdir -p "$TIRTC_BOARD_DOCS"
78
+ 开发板:
79
+ - 厂商、完整型号、PCB/硬件版本:<填写>
80
+ - 资料与手中实物是否对应:<是/否/未知>
81
+
82
+ 资料:
83
+ - <原理图、BSP/厂商示例、数据手册或产品页;一行一个>
84
+
85
+ 目标:
86
+ - 功能:<例如 H5 实时音视频、H5 对讲、AI 双向语音>
87
+ - 视频:<MJPEG/H264/H265/根据合同和硬件证据选择>
88
+ - Wi-Fi:<指定方案/根据 BSP 选择>
89
+ - 设备绑定:<指定方案/根据平台合同选择>
90
+
91
+ 工程:<输出目录或现有工程的绝对路径>
92
+
93
+ 请先运行 Doctor,分析全部资料并生成 Hardware IR v2。资料不足时列出最小补充项;达到 READY_TO_PORT 后再生成、适配和编译,并输出 TIRTC_PORTING_REPORT.md。
94
+ 本轮不访问串口、不烧录、不擦除 NVS,也不要把任何凭证写入源码或报告。
88
95
  ```
89
96
 
90
- 最有利于一次完成的资料如下:
97
+ 手头只有型号也可以开始:
91
98
 
92
- | 优先级 | 资料 | 需要明确的内容 |
99
+ ```text
100
+ $tirtc-esp32-builder
101
+
102
+ 分析 <厂商> <完整型号> <PCB 版本>,目标是 H5 实时音视频、
103
+ H5 对讲和 AI 双向对讲。
104
+ 先给出板卡资料清单、Hardware IR、能力结论和最小缺失项;
105
+ 本轮不生成工程、不烧录。
106
+ ```
107
+
108
+ 只有型号时,Skill 会先调查公开资料并列出缺口,不会猜测 GPIO、器件或媒体能力。要进入代码移植,通常还需要准确的板卡版本、原理图,以及能在实物上运行的 BSP 或外设示例。
109
+
110
+ ## 工作范围
111
+
112
+ 整个流程从板卡资料核对开始,以分层验收报告结束:
113
+
114
+ ```text
115
+ 开发板型号、原理图、BSP、数据手册
116
+ │
117
+ ▼
118
+ Hardware IR:硬件事实、来源和未知项
119
+ │
120
+ ▼
121
+ 能力门禁:能否支持 H5 / AI
122
+ │
123
+ ▼
124
+ 独立 ESP-IDF 工程与板级媒体适配
125
+ │
126
+ ▼
127
+ 编译 → 授权烧录 → 分层实机验收
128
+ │
129
+ ▼
130
+ TIRTC_PORTING_REPORT.md
131
+ ```
132
+
133
+ Skill 负责:
134
+
135
+ - 检查 Node.js 之外的 ESP-IDF、编译器、TiRTC SDK、工程配置和串口;
136
+ - 从原理图、BSP、数据手册和实测示例中提取有来源的硬件事实;
137
+ - 生成并校验 `hardware-ir.json`,把冲突和未知项留在报告里;
138
+ - 判断视频、上行音频、下行播放和 AI 会话是否具备移植条件;
139
+ - 生成带 TiRTC SDK 的独立 ESP-IDF 工程;
140
+ - 把摄像头、所选 MJPEG/H.264/H.265 路径、麦克风、Codec、I2S、功放和按键接到板级 adapter;
141
+ - 运行测试和 `idf.py build`,记录固件路径、版本和 SHA-256;
142
+ - 在用户明确给出芯片、工程和串口后烧录;
143
+ - 分别验证启动、上线、本地媒体、H5、AI 和稳定性;
144
+ - 输出 `TIRTC_PORTING_REPORT.md`,每一层都标成 `PASS`、`FAIL` 或 `SKIP`。
145
+
146
+ ### Skill 不猜硬件
147
+
148
+ 模板工程提供配网、绑定、MQTT、TiRTC、H5 和 AI 会话骨架,但不会内置所有开发板的产品驱动。每块开发板仍要根据自身资料接入:
149
+
150
+ - 摄像头和所选 MJPEG/H.264/H.265 完整媒体路径;
151
+ - 麦克风采集路径;
152
+ - Codec、I2S、功放和扬声器播放路径;
153
+ - 板级电源、时钟、复位和使能控制;
154
+ - 需要用于 AI 会话的实体按键或其他触发方式。
155
+
156
+ 编译成功只代表构建层通过。只有拿到浏览器画面、实体扬声器声音和双向 AI 音频的实测证据,报告才能把对应能力标为 `PASS`。
157
+
158
+ ## 准备板卡资料
159
+
160
+ 板卡资料要和手上的实物版本对应。建议为每块板、每个 PCB 版本单独建目录,避免混入相似型号的文档。
161
+
162
+ 建议按下面的结构整理:
163
+
164
+ ```text
165
+ board-materials/
166
+ ├── BOARD.md
167
+ ├── schematic/
168
+ │ └── board-rev-a.pdf
169
+ ├── bom/
170
+ │ └── board-rev-a.xlsx
171
+ ├── bsp/
172
+ │ └── README.md
173
+ ├── datasheets/
174
+ │ ├── camera-sensor.pdf
175
+ │ ├── audio-codec.pdf
176
+ │ └── amplifier.pdf
177
+ └── examples/
178
+ ├── camera/
179
+ ├── audio-record/
180
+ └── audio-playback/
181
+ ```
182
+
183
+ `BOARD.md` 至少记录:
184
+
185
+ ```markdown
186
+ # 板卡身份
187
+
188
+ - 厂商:
189
+ - 完整销售型号:
190
+ - 模组型号:
191
+ - PCB 丝印:
192
+ - 硬件版本:
193
+ - Flash / PSRAM:
194
+
195
+ # 资料来源
196
+
197
+ - 产品页:
198
+ - 原理图名称和版本:
199
+ - BSP 仓库、commit 或 tag:
200
+ - 已在实物上验证的示例:
201
+
202
+ # 开发目标
203
+
204
+ - H5 实时视频:
205
+ - H5 实时音频:
206
+ - H5 下行对讲:
207
+ - AI 双向对讲:
208
+
209
+ # 媒体与接入合同
210
+
211
+ - H5 支持/选定的视频 profile:
212
+ - 音频格式与 stream ID:
213
+ - 板卡/BSP 支持的 Wi-Fi 凭证方法:
214
+ - 本工程选择的凭证方法和重配入口:
215
+ - ThingConnect 绑定、已绑定跳过和清除方式:
216
+ ```
217
+
218
+ 不同能力需要的证据不一样:
219
+
220
+ | 资料 | 用来确认什么 | 重要程度 |
93
221
  |---|---|---|
94
- | 必需 | 板卡身份 | 厂商、完整型号、模组型号、PCB 丝印和硬件版本 |
95
- | 必需 | 原理图或网表 | 摄像头、麦克风、Codec、功放、I2S、I2C、SPI、时钟、复位、电源使能和 GPIO |
96
- | 必需 | BSP 或厂商示例 | 可复现的 Git commit/tag、ESP-IDF 版本、能工作的外设初始化与管脚定义 |
97
- | 视频必需 | 摄像头/编码资料 | Sensor 型号、输入接口、H.264 编码位置、Annex-B 输出、SPS/PPS、IDR 控制 |
98
- | 对讲必需 | 音频资料 | 麦克风类型、Codec/ADC/DAC、采样率、位宽、声道、MCLK/BCLK/LRCK、功放使能 |
99
- | 推荐 | 器件数据手册 | Sensor、Codec、功放、时钟和电源芯片的准确型号与版本 |
100
- | 推荐 | 最小实测工程 | 已在该 PCB 版本运行的摄像头、录音、播放或编码示例及其构建命令 |
222
+ | 板卡身份 | 厂商、完整型号、模组、PCB 丝印和硬件版本 | 必需 |
223
+ | 原理图或网表 | GPIO、电源、复位、时钟、I2C、I2S、SPI、摄像头和音频链路 | 必需 |
224
+ | BSP 或厂商示例 | 实际初始化顺序、驱动版本、ESP-IDF 版本和可工作的管脚定义 | 必需 |
225
+ | 摄像头和编码资料 | Sensor、输入接口、所选 MJPEG/H.264/H.265 输出边界与刷新/关键帧控制 | H5 视频必需 |
226
+ | 音频资料 | 麦克风类型、Codec/ADC/DAC、采样率、位宽、声道、MCLK/BCLK/LRCK、功放使能 | 对讲必需 |
227
+ | 配网/绑定资料 | 可用 Wi-Fi 凭证方法、凭证存储/重配、可用绑定方法、已有绑定状态和清除入口 | 上线必需 |
228
+ | 数据手册 | 器件寄存器、时序、电气限制和版本差异 | 推荐 |
229
+ | 实测小工程 | 证明摄像头、录音、播放或编码确实在该 PCB 版本工作 | 强烈推荐 |
101
230
 
102
- 资料不完整也可以先调用 Skill。它会把未知事实写成 `null`,并列出进入下一步所需的最小补充项。不同 PCB 版本按不同板卡处理;不能只给“ESP32-S3”而省略载板型号和版本。
231
+ 提供 BSP 时,请同时注明可复现的 commit、tag 或压缩包版本,以及它使用的 ESP-IDF 版本。只有一个持续变化的仓库首页,后续很难追溯代码与实物不一致的原因。
103
232
 
104
- ### 第 3 步:安装 Node.js 和 Skill
233
+ 不要放进资料包的内容包括 Wi-Fi 密码、设备密钥、MQTT/WHIP token、证书、生产配置和真实用户音视频。
105
234
 
106
- 使用 npm 安装 Skill 只需要 Node.js 18 或更高版本。普通使用者不需要执行 `npm login`;登录只用于维护者发布 npm 包。
235
+ ## 依赖和支持范围
107
236
 
108
- 先检查版本和 npm 官方源:
237
+ ### 当前版本基线
109
238
 
110
- ```bash
111
- node --version
112
- npm --version
113
- npm config get registry
114
- ```
239
+ | 项目 | 当前要求 |
240
+ |---|---|
241
+ | 芯片 | ESP32-S3 |
242
+ | 参考模组 | ESP32-S3-WROOM-1-N16R8,或资源和配置经过确认的兼容板 |
243
+ | ESP-IDF | 5.5.x |
244
+ | 自动安装版本 | ESP-IDF v5.5.4 |
245
+ | TiRTC SDK | `espressif-esp32s3/2.3.0` |
246
+ | ESP32 Device Kit | 1.0.0 |
247
+ | Node.js | 18 或更高版本 |
248
+ | 支持自动安装的系统 | Linux、WSL、macOS |
249
+ | 原生 Windows | 使用 Espressif 官方安装器准备 ESP-IDF,再重新运行检查 |
115
250
 
116
- 预期:
251
+ 当前生成器只支持 ESP32-S3。Flash 或 PSRAM 不是 16 MB / 8 MB 时,需要重新评估 `sdkconfig.defaults`、分区表、DMA 和媒体缓存预算。名称相近的芯片不会被自动当作 ESP32-S3 处理。
117
252
 
118
- - Node.js 输出 `v18.x` 或更高版本;
119
- - npm registry 输出 `https://registry.npmjs.org/`。
253
+ ### 本机软件
120
254
 
121
- 如果 `node` 或 `npm` 不存在,先从 [Node.js 官方下载页](https://nodejs.org/en/download) 安装受支持版本,重新打开终端,再重复版本检查。
255
+ `setup esp32 --install` 会检查以下基础命令:
122
256
 
123
- 如果 registry 不是官方源,可为当前用户切换:
257
+ | 命令 | 用途 |
258
+ |---|---|
259
+ | `python3` | ESP-IDF、工程生成器和检查脚本 |
260
+ | `git` | 获取固定版本的 ESP-IDF |
261
+ | `bash` | 激活和安装 ESP-IDF |
262
+ | `tar` | 解包并验证 Device Kit |
124
263
 
125
- ```bash
126
- npm config set registry https://registry.npmjs.org/
127
- ```
264
+ Doctor 还会检查 `cmake`、`ninja`、`idf.py` 和 `xtensa-esp32s3-elf-gcc`。安装器不会调用系统包管理器;缺少基础命令时,需要开发者按当前操作系统安装。
128
265
 
129
- 确认 npm 包可访问并安装当前稳定版本:
266
+ Ubuntu、Debian 或 WSL 可以参考:
130
267
 
131
268
  ```bash
132
- npm view tirtc-device-builder version
133
- npx tirtc-device-builder@0.2.0 list
134
- npx tirtc-device-builder@0.2.0 install esp32
269
+ sudo apt-get update
270
+ sudo apt-get install -y git python3 python3-venv bash tar
135
271
  ```
136
272
 
137
- 成功时最后会看到类似输出:
273
+ ### 网络和业务环境
138
274
 
139
- ```text
140
- Installed tirtc-esp32-builder 0.2.0 to /home/.../.codex/skills/tirtc-esp32-builder
141
- Start a new Codex session, then invoke $tirtc-esp32-builder.
142
- ```
275
+ 首次安装通常需要访问:
143
276
 
144
- 默认安装位置是 `${CODEX_HOME:-~/.codex}/skills/tirtc-esp32-builder`。安装完成后关闭当前 Codex 会话并启动一个新会话,让 Codex 重新发现 Skill。
277
+ - npm 官方 Registry,用于取得 `tirtc-device-builder`;
278
+ - GitHub Release,用于下载 ESP32 Device Kit;
279
+ - Espressif 的 GitHub 仓库和工具下载地址,用于安装 ESP-IDF 与工具链。
145
280
 
146
- 如果目标目录已经存在,安装器会保护已有内容并退出。先确认目录中的本地修改是否需要保留;只有确定要替换时才执行:
281
+ H5 和 AI 的端到端验收还需要可访问的 ThingConnect 服务、可用账号、设备绑定条件、浏览器和外网。缺少其中一项,不影响工程生成和编译,但对应验收层要记录为 `SKIP`。
147
282
 
148
- ```bash
149
- npx tirtc-device-builder@0.2.0 install esp32 --force
150
- ```
283
+ ### 媒体约束
151
284
 
152
- 自定义 Skill 根目录时使用绝对路径:
285
+ H5 视频要先从前端和服务端支持的合同中选择一种 profile。MJPEG 提交完整 JPEG 帧;H.264/H.265 按合同提交 Annex-B access unit、参数集,并实现刷新或关键帧控制。板上有摄像头 Sensor,只能证明图像有来源,不能证明浏览器一定能持续出图。
153
286
 
154
- ```bash
155
- npx tirtc-device-builder@0.2.0 install esp32 \
156
- --skills-dir /absolute/path/to/skills
157
- ```
287
+ 当前音频基线使用 G.711 A-law、8 kHz、单声道。对讲还要有可靠的下行队列、A-law 解码、Codec/I2S/功放播放和会话停止清理。没有可用的全双工和 AEC 证据时,应按半双工设计 AI 对讲。
158
288
 
159
- 如果 npm 包尚未发布或当前网络无法访问 npm,可从 GitHub 安装固定版本。在 Codex 对话中输入:
289
+ ## 安装方式和目录
160
290
 
161
- ```text
162
- $skill-installer
291
+ ### 推荐:用 npx 一次检查并安装
163
292
 
164
- 安装:
165
- https://github.com/tangeai/tirtc-device-builder/tree/v0.2.0/skills/tirtc-esp32-builder
293
+ ```bash
294
+ npx --yes tirtc-device-builder@latest setup esp32 --install
166
295
  ```
167
296
 
168
- Linux/macOS 也可以执行:
297
+ `npx` 会临时取得最新 CLI 并运行,不要求全局安装。它适合这种低频的安装和诊断工具,也避免用户机器里长期保留旧版本命令。
298
+
299
+ ### 也可以全局安装
169
300
 
170
301
  ```bash
171
- python3 ~/.codex/skills/.system/skill-installer/scripts/install-skill-from-github.py \
172
- --repo tangeai/tirtc-device-builder \
173
- --ref v0.2.0 \
174
- --path skills/tirtc-esp32-builder
302
+ npm install --global tirtc-device-builder@latest
303
+ tirtc-device-builder setup esp32 --install
175
304
  ```
176
305
 
177
- 仓库根目录还包含 `.codex-plugin/plugin.json`,可作为 skills-only Plugin 使用。直接从 npm 或 GitHub 安装不依赖 Plugin Directory 审核。
306
+ 安装命令是 `npm install`,不要写成 `npm --install`。
178
307
 
179
- ### 第 4 步:准备 ThingConnect 工作区
308
+ 只执行 `npm install --global tirtc-device-builder` 会安装 CLI,不会准备完整开发环境。随后还要运行 `setup esp32 --install`,由它安装 Codex Skill、下载 Device Kit,并在需要时安装 ESP-IDF。npm 包没有 `preinstall`、`install` 或 `postinstall` 生命周期脚本,因此不会在安装 CLI 时改动这些目录。
180
309
 
181
- 当前 Skill 不复制 ThingConnect 服务端源码和 TiRTC 预编译库。生成新工程时,以下内容来自公开的 ThingConnect 仓库:
310
+ 安装公开包不需要执行 `npm login`;这个命令只和维护者发布新版本有关。
182
311
 
183
- - ESP32-S3 H5/AI 工程生成器;
184
- - 起步模板和平台公共组件;
185
- - TiRTC ESP32-S3 SDK 头文件、静态库和构建契约;
186
- - H5、AI、设备接入和会话协议文档。
312
+ ### 只安装 Skill
187
313
 
188
- 只需准备一次,后续多个工程可以共用同一工作区:
314
+ 如果 ESP-IDF 和 Device Kit 已经由团队统一准备,可以只复制 Codex Skill:
189
315
 
190
316
  ```bash
191
- mkdir -p "$TIRTC_WORKSPACE"
192
- git clone https://github.com/tangeai/tirtc-server-example.git \
193
- "$TIRTC_WORKSPACE/tirtc-server-example"
317
+ npx --yes tirtc-device-builder@latest install esp32
194
318
  ```
195
319
 
196
- 验证关键文件:
320
+ 这条命令不安装 ESP-IDF,也不下载 Device Kit。完整的新用户环境仍建议使用 `setup esp32 --install`。
321
+
322
+ ### 默认目录
323
+
324
+ | 内容 | 默认位置 |
325
+ |---|---|
326
+ | Codex Skill | `${CODEX_HOME:-~/.codex}/skills/tirtc-esp32-builder` |
327
+ | 托管根目录 | `~/.tirtc-device-builder` |
328
+ | Device Kit | `~/.tirtc-device-builder/kits/esp32s3/1.0.0` |
329
+ | ESP-IDF | `~/.tirtc-device-builder/esp-idf-v5.5.4` |
330
+ | Espressif 工具 | `~/.tirtc-device-builder/espressif` |
331
+ | 安装记录 | `~/.tirtc-device-builder/config.json` |
332
+ | 环境入口 | `~/.tirtc-device-builder/env.sh` |
333
+
334
+ 新开终端后,用下面的命令激活托管环境:
197
335
 
198
336
  ```bash
199
- ls -l "$TIRTC_THING_CONNECT_ROOT/device-sim/scripts/create_esp32_project.py"
200
- ls -l "$TIRTC_THING_CONNECT_ROOT/device-sim/sdk/espressif-esp32s3/2.3.0/include/tirtc/tiRTC.h"
201
- ls -l "$TIRTC_THING_CONNECT_ROOT/device-sim/sdk/espressif-esp32s3/2.3.0/lib/libTiRTC.a"
202
- ls -l "$TIRTC_THING_CONNECT_ROOT/device-sim/sdk/espressif-esp32s3/2.3.0/manifest/build-contract.env"
337
+ source ~/.tirtc-device-builder/env.sh
338
+ idf.py --version
339
+ printf '%s\n' "$TIRTC_THING_CONNECT_ROOT"
203
340
  ```
204
341
 
205
- 四条命令都应显示真实文件。记录当前源码版本,便于报告和复现:
342
+ `env.sh` 只设置 ESP-IDF、工具链和 Device Kit 路径,不包含设备凭证。
343
+
344
+ ### 自定义目录或复用已有环境
345
+
346
+ 把所有托管文件放到指定目录:
206
347
 
207
348
  ```bash
208
- git -C "$TIRTC_WORKSPACE/tirtc-server-example" rev-parse HEAD
349
+ npx --yes tirtc-device-builder@latest setup esp32 --install \
350
+ --root /absolute/path/tirtc-dev
209
351
  ```
210
352
 
211
- 生成器会把必要模块和 TiRTC SDK 复制到新工程的 `third_party/tirtc/`,所以已生成的工程可以移动并独立编译。安装 Skill、列出平台、分析本地板卡资料,以及诊断一个已经自带 SDK 的生成工程,不要求每次重新拉取 ThingConnect。
353
+ 自定义根目录后,环境入口也随之变为 `/absolute/path/tirtc-dev/env.sh`。
212
354
 
213
- ### 第 5 步:检查或安装 ESP-IDF 5.5.x
214
-
215
- 先检查当前终端,不要因为环境未激活而重复安装:
355
+ 复用已有 ESP-IDF 5.5.x:
216
356
 
217
357
  ```bash
218
- command -v idf.py
219
- idf.py --version
220
- command -v xtensa-esp32s3-elf-gcc
358
+ npx --yes tirtc-device-builder@latest setup esp32 --install \
359
+ --idf-dir /absolute/path/esp-idf
221
360
  ```
222
361
 
223
- 如果 `idf.py --version` 输出 `ESP-IDF v5.5.x`,并且能找到 `xtensa-esp32s3-elf-gcc`,直接进入第 6 步。
362
+ 复用已经解包的 Device Kit,或维护者本地的完整 ThingConnect 工作区:
224
363
 
225
- 如果 ESP-IDF 已安装但当前终端找不到 `idf.py`,执行该安装目录自带的 `export.sh`。例如:
364
+ ```bash
365
+ npx --yes tirtc-device-builder@latest setup esp32 --install \
366
+ --thing-connect-root /absolute/path/to/device-kit-or-thing-connect
367
+ ```
368
+
369
+ 从本地 Device Kit 压缩包安装,适合内网或离线转交:
226
370
 
227
371
  ```bash
228
- source /absolute/path/to/esp-idf/export.sh
229
- idf.py --version
230
- command -v xtensa-esp32s3-elf-gcc
372
+ npx --yes tirtc-device-builder@latest setup esp32 --install \
373
+ --kit-archive /absolute/path/tirtc-esp32s3-kit-1.0.0.tar.gz
231
374
  ```
232
375
 
233
- 每个新终端都需要重新执行 `source .../export.sh`。Skill 的环境检查不会自动修改 `.bashrc`、`.zshrc` 等持久 shell 配置。
376
+ 安装器仍会核对固定的 SHA-256、目录结构、清单和每个资源文件,不接受未经验证的同名压缩包。
377
+
378
+ ### 更新已安装的 Skill
234
379
 
235
- 在 Ubuntu/Debian/WSL 中首次安装时,以下命令安装当前基线 `v5.5.4`。下载、系统包安装和磁盘写入应由开发者在确认目录后执行:
380
+ 默认安装不会覆盖已有 Skill,以免丢失本地修改。确认这些修改不需要保留后,可用最新 npm 包替换:
236
381
 
237
382
  ```bash
238
- sudo apt-get update
239
- sudo apt-get install -y git wget flex bison gperf python3 python3-pip \
240
- python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util \
241
- libusb-1.0-0
383
+ npx --yes tirtc-device-builder@latest setup esp32 --install --force-skill
384
+ ```
242
385
 
243
- mkdir -p "$TIRTC_WORKSPACE/toolchains"
244
- git clone -b v5.5.4 --recursive \
245
- https://github.com/espressif/esp-idf.git \
246
- "$TIRTC_WORKSPACE/toolchains/esp-idf-v5.5.4"
386
+ 该命令只替换 Skill;同版本且已通过校验的 Device Kit 和 ESP-IDF 会继续复用。自定义脚本或规则请提前备份。
247
387
 
248
- "$TIRTC_WORKSPACE/toolchains/esp-idf-v5.5.4/install.sh" esp32s3
249
- source "$TIRTC_WORKSPACE/toolchains/esp-idf-v5.5.4/export.sh"
388
+ ## 常用检查和开发命令
250
389
 
251
- idf.py --version
252
- command -v xtensa-esp32s3-elf-gcc
390
+ ### 查看当前状态
391
+
392
+ ```bash
393
+ npx --yes tirtc-device-builder@latest setup esp32
253
394
  ```
254
395
 
255
- 最后两条命令必须分别显示 ESP-IDF 5.5.x 和 ESP32-S3 编译器路径。macOS、原生 Windows 或依赖版本有变化时,以 [Espressif ESP-IDF 5.5.4 Get Started](https://docs.espressif.com/projects/esp-idf/en/v5.5.4/esp32s3/get-started/index.html) 为准。
396
+ `setup esp32` 的检查逻辑不会安装开发组件、修改 shell 配置、生成工程或烧录。第一次运行 `npx` 时,npm 可能会把 CLI 下载到自己的缓存。
256
397
 
257
- ### 第 6 步:生成工程前运行 Doctor
398
+ 环境完整时,它会运行 Doctor 并输出 `SETUP: READY`。环境不完整时,它输出 `OVERALL: NEEDS_SETUP` 和下一条建议命令。
258
399
 
259
- 不安装 Skill 也可以通过 npm CLI 调用同一个检查脚本:
400
+ 查看 CLI 和当前平台:
260
401
 
261
402
  ```bash
262
- npx tirtc-device-builder@0.2.0 doctor esp32 \
263
- --expected-idf 5.5 \
264
- --target esp32s3 \
265
- --thing-connect-root "$TIRTC_THING_CONNECT_ROOT" \
266
- --require-workspace
403
+ npx --yes tirtc-device-builder@latest --help
404
+ npx --yes tirtc-device-builder@latest list
405
+ npx --yes tirtc-device-builder@latest setup esp32 --help
267
406
  ```
268
407
 
269
- 已经安装 Skill 时也可以直接执行:
408
+ ### 生成工程前运行 Doctor
270
409
 
271
410
  ```bash
272
- python3 ~/.codex/skills/tirtc-esp32-builder/scripts/doctor.py \
411
+ source ~/.tirtc-device-builder/env.sh
412
+
413
+ npx --yes tirtc-device-builder@latest doctor esp32 \
273
414
  --expected-idf 5.5 \
274
415
  --target esp32s3 \
275
416
  --thing-connect-root "$TIRTC_THING_CONNECT_ROOT" \
276
417
  --require-workspace
277
418
  ```
278
419
 
279
- 生成前的合格结果应满足:
420
+ 生成前应看到:
280
421
 
281
- | 检查项 | 期望 |
422
+ | 检查项 | 合格结果 |
282
423
  |---|---|
283
424
  | Python、Git | `PASS` |
284
425
  | `idf.py` | `PASS`,版本为 5.5.x |
285
426
  | target compiler | `PASS`,找到 ESP32-S3 编译器 |
286
- | ThingConnect workspace | `PASS` |
427
+ | ESP32 Device Kit | `PASS` |
287
428
  | TiRTC SDK | `PASS` |
288
- | serial discovery | 还未接板时允许 `WARN` |
429
+ | serial discovery | 未接板时允许 `WARN` |
289
430
  | OVERALL | `PASS` |
290
431
 
291
- `doctor.py` 是只读检查:不安装软件、不修改 shell 配置、不生成工程,也不烧录设备。
292
-
293
- 常见检查失败:
432
+ 已经安装 Skill 时,也能直接调用同一份脚本:
294
433
 
295
- - `idf.py not found`:当前终端没有激活 ESP-IDF,先执行 `source <idf-dir>/export.sh`。
296
- - `target compiler ... not found`:ESP-IDF 环境未激活,或安装时没有包含 `esp32s3`。
297
- - `ThingConnect workspace ... not found`:传入的路径必须是仓库根目录或其 `thing-connect/` 子目录,并且其中存在生成器。
298
- - `TiRTC SDK ... missing`:检查仓库是否拉取完整,以及 SDK 的头文件、静态库和 `manifest/build-contract.env` 是否存在。
299
- - `serial discovery: no serial device detected`:生成和编译阶段可以继续;烧录前必须解决。
300
-
301
- 不要在一个空目录上提前使用 `--project`。如果看到:
302
-
303
- ```text
304
- FAIL TiRTC build contract [required]: no sdkconfig or sdkconfig.defaults in ...
305
- ```
306
-
307
- 表示传入目录还不是已生成的 ESP-IDF 工程,或者 `--project` 路径给错了。先让 Skill/生成器创建工程;生成后目录中应有 `sdkconfig.defaults`,再运行项目级 Doctor。
308
-
309
- ### 第 7 步:在新 Codex 会话中调用 Skill
310
-
311
- 只给出板卡型号也可以启动分析,但提供完整资料更容易一次进入开发。建议复制下面的提示词,逐项替换尖括号内容和绝对路径:
312
-
313
- ```text
314
- 请使用 $tirtc-esp32-builder 完成这块板的 TiRTC 移植。
315
-
316
- 板卡:
317
- - 厂商:<厂商>
318
- - 完整型号:<型号>
319
- - 模组:<例如 ESP32-S3-WROOM-1-N16R8>
320
- - PCB 丝印/硬件版本:<版本>
321
-
322
- 输入资料:
323
- - 原理图或网表:/absolute/path/board-materials/<file>
324
- - BOM:/absolute/path/board-materials/<file>
325
- - BSP/厂商示例:/absolute/path/vendor-bsp
326
- - 摄像头/Codec/功放数据手册:/absolute/path/board-materials/<files>
327
- - ThingConnect:/absolute/path/tirtc-server-example/thing-connect
328
-
329
- 目标:
330
- - H5 实时视频和音频
331
- - H5 下行语音对讲
332
- - AI 双向语音对讲
333
-
334
- 输出:
335
- - 新工程目录:/absolute/path/my-esp32-device
336
- - Hardware IR:放在新工程同级或工程内的明确路径
337
- - 报告:/absolute/path/my-esp32-device/TIRTC_PORTING_REPORT.md
338
-
339
- 执行要求:
340
- 1. 先运行环境 Doctor,并核对 ESP-IDF 5.5.x、esp32s3 工具链和 TiRTC SDK。
341
- 2. 完整分析我提供的每份资料,记录来源、版本、冲突和未知项。
342
- 3. 生成、校验并严格评估 Hardware IR;不要从相似板型猜测管脚或器件。
343
- 4. 每项能力达到 READY_TO_PORT 后,生成独立工程并把板级采集、编码、播放、按键放在 starter_media/板级 adapter。
344
- 5. 运行相关测试和 idf.py build,保留实际命令、结果、固件路径和 SHA-256。
345
- 6. 本轮不烧录、不写设备凭证;需要下载、安装或修改系统环境时先说明具体动作。
346
- 7. 最后生成 TIRTC_PORTING_REPORT.md,所有验收层级使用 PASS、FAIL 或 SKIP,不能用编译成功代替 H5/AI 实机通过。
347
- ```
348
-
349
- 如果只有型号和网页资料,可先用:
350
-
351
- ```text
352
- $tirtc-esp32-builder
353
-
354
- 分析 <厂商> <完整型号> <PCB 版本>,目标是 H5 实时音视频、H5 对讲和 AI 双向对讲。
355
- 先输出板卡资料清单、Hardware IR、能力结论和最小缺失项;本轮不生成工程、不烧录。
434
+ ```bash
435
+ python3 ~/.codex/skills/tirtc-esp32-builder/scripts/doctor.py \
436
+ --expected-idf 5.5 \
437
+ --target esp32s3 \
438
+ --thing-connect-root "$TIRTC_THING_CONNECT_ROOT" \
439
+ --require-workspace
356
440
  ```
357
441
 
358
- Skill 会选择以下三条分支之一:
359
-
360
- - 已支持板卡:校验已有 Hardware IR 和 adapter 后重新生成、编译和验收;
361
- - 新板卡:逐份提取原理图/BSP/数据手册事实,建立 Hardware IR,再决定是否实现;
362
- - 已有 ESP-IDF 工程:先检查目标、配置、组件、驱动和最小外设示例,再隔离可复用板级代码。
363
-
364
- ### 第 8 步:检查 Hardware IR 和能力门禁
442
+ ### 检查 Hardware IR
365
443
 
366
- 默认 Hardware IR 工具位于:
444
+ 下面的工具通常由 Codex 调用,开发者也可以手工复核:
367
445
 
368
446
  ```bash
369
447
  python3 ~/.codex/skills/tirtc-esp32-builder/scripts/hardware_ir.py init \
@@ -376,196 +454,362 @@ python3 ~/.codex/skills/tirtc-esp32-builder/scripts/hardware_ir.py assess --stri
376
454
  /absolute/path/hardware-ir.json
377
455
  ```
378
456
 
379
- 通常由 Codex 执行这些命令,开发者只需检查结果:
457
+ 能力门禁有四种状态:
380
458
 
381
- | 状态 | 含义 | 下一步 |
459
+ | 状态 | 含义 | 怎么处理 |
382
460
  |---|---|---|
383
- | `NEEDS_CONFIRMATION` | 关键事实未知或只有单一来源 | 补原理图、BSP、数据手册或实测证据 |
384
- | `BLOCKED` | 已确认当前硬件/SDK 不满足 | 换硬件、补编码/播放路径或取得匹配 SDK |
385
- | `READY_TO_PORT` | 资料已足够,可以生成并实现板级适配 | 进入生成和编译 |
386
- | `HIL_VERIFIED` | 该功能已完成端到端实机验证 | 保存证据和版本 |
461
+ | `NEEDS_CONFIRMATION` | 关键事实未知、冲突或只有单一来源 | 补原理图、BSP、数据手册或实测证据 |
462
+ | `BLOCKED` | 现有硬件或 SDK 已确认不满足 | 更换硬件,补编码/播放路径,或取得匹配 SDK |
463
+ | `READY_TO_PORT` | 资料足以开始生成和板级实现 | 进入工程生成与编译 |
464
+ | `HIL_VERIFIED` | 已完成端到端实机验证 | 固定版本并保存证据 |
387
465
 
388
- `assess --strict` 返回非零不一定表示脚本坏了;当任一请求能力尚未达到 `READY_TO_PORT` 时,它会用退出码阻止过早生成。先处理输出中的具体原因。
466
+ `assess --strict` 在条件不足时返回非零,这是门禁在阻止过早生成,不代表脚本损坏。
467
+
468
+ Hardware IR v2 只有在运行证据绑定到同一固件 SHA-256 时才会给出 `HIL_VERIFIED`:
469
+
470
+ ```bash
471
+ python3 ~/.codex/skills/tirtc-esp32-builder/scripts/hardware_ir.py assess \
472
+ /absolute/path/hardware-ir.json \
473
+ --artifact-sha256 <64-character-sha256> --strict
474
+ ```
389
475
 
390
- ### 第 9 步:生成、实现和编译
476
+ ### 生成和编译
391
477
 
392
- 推荐让 Skill 自动执行。需要人工复现生成步骤时,确保 `TIRTC_PROJECT_DIR` 不存在,再运行:
478
+ 建议让 Skill 完成生成、适配和编译。需要人工复现时,先激活环境,并确认输出目录尚不存在:
393
479
 
394
480
  ```bash
481
+ source ~/.tirtc-device-builder/env.sh
482
+
395
483
  python3 "$TIRTC_THING_CONNECT_ROOT/device-sim/scripts/create_esp32_project.py" \
396
- "$TIRTC_PROJECT_DIR" \
484
+ /absolute/path/my-esp32-device \
397
485
  --name my_esp32_device
398
486
  ```
399
487
 
400
- `--name` 只能包含小写字母、数字和下划线。生成器拒绝覆盖已存在目录;需要重做时应先选择新的输出目录或人工备份旧工程。
488
+ `--name` 只能包含小写字母、数字和下划线。生成器不会覆盖已有目录。
401
489
 
402
- 进入工程,激活 ESP-IDF,再检查 SDK 构建契约。下面的 `source` 路径只适用于按第 5 步安装到示例目录的情况;已有安装应替换为其真实 `export.sh` 路径:
490
+ 工程生成后再做项目级检查:
403
491
 
404
492
  ```bash
405
- cd "$TIRTC_PROJECT_DIR"
406
- source "$TIRTC_WORKSPACE/toolchains/esp-idf-v5.5.4/export.sh"
407
-
408
493
  python3 ~/.codex/skills/tirtc-esp32-builder/scripts/doctor.py \
409
494
  --expected-idf 5.5 \
410
495
  --target esp32s3 \
411
- --project "$TIRTC_PROJECT_DIR"
496
+ --project /absolute/path/my-esp32-device
412
497
  ```
413
498
 
414
- 项目级 Doctor 的 `TiRTC build contract` 必须为 `PASS`。随后构建:
499
+ `TiRTC build contract` 为 `PASS` 后编译:
415
500
 
416
501
  ```bash
502
+ cd /absolute/path/my-esp32-device
417
503
  idf.py set-target esp32s3
418
504
  idf.py build
419
505
  ```
420
506
 
421
- 构建成功只证明 L1 Build 通过。真正的板卡移植还要完成 `components/starter_media/` 中的产品适配点:
507
+ 生成器会把 TiRTC SDK 复制到工程的 `third_party/tirtc/`。此后工程不再依赖 `tirtc-server-example`,但换机编译仍需准备兼容的 ESP-IDF 5.5.x 工具链。
422
508
 
423
- - 麦克风采集并提交 G.711 A-law、8 kHz、单声道帧;
424
- - 摄像头采集并提交 H.264 Annex-B access unit;
425
- - 收到关键帧请求时让编码器产生 IDR;
426
- - 把下行 A-law 音频放入有界队列,解码后写入 Codec/I2S/功放;
427
- - 把实体按键映射到 AI 开始/停止;
428
- - 停止会话时有界停止采集/播放任务并清空旧 generation 数据。
429
-
430
- 检查仍未完成的产品适配点:
509
+ 检查尚未完成的产品适配点:
431
510
 
432
511
  ```bash
433
512
  rg -n 'TODO\(product-' main components
434
513
  ```
435
514
 
436
- 编译产物位于 `build/`。报告至少记录 ESP-IDF、TiRTC SDK、BSP/adapter 版本,实际构建命令、返回码、固件文件和 SHA-256。
515
+ 常见适配内容包括麦克风采集、G.711 A-law 编码、所选视频 profile 输出与刷新请求、下行音频播放、实体按键和会话停止后的资源清理。
516
+
517
+ ## 烧录和验收
437
518
 
438
- ### 第 10 步:明确授权后烧录
519
+ ### 烧录前确认串口
439
520
 
440
- 先连接开发板并确定唯一串口。Linux 常见端口为 `/dev/ttyACM0` 或 `/dev/ttyUSB0`:
521
+ Linux 常见串口是 `/dev/ttyACM0` 或 `/dev/ttyUSB0`:
441
522
 
442
523
  ```bash
443
524
  ls -l /dev/ttyACM* /dev/ttyUSB*
444
525
  ```
445
526
 
446
- 用实际端口运行 Doctor:
527
+ 把实际端口交给 Doctor:
447
528
 
448
529
  ```bash
449
530
  python3 ~/.codex/skills/tirtc-esp32-builder/scripts/doctor.py \
450
531
  --expected-idf 5.5 \
451
532
  --target esp32s3 \
452
- --project "$TIRTC_PROJECT_DIR" \
533
+ --project /absolute/path/my-esp32-device \
453
534
  --serial-port /dev/ttyACM0
454
535
  ```
455
536
 
456
- `serial port` 必须为 `PASS`。如果设备存在但无权限,按系统规范配置串口用户组并重新登录;不要用长期放宽所有设备权限的方式绕过。
457
-
458
- 让 Skill 烧录时发起第二次、独立且明确的请求:
537
+ `serial port` 为 `PASS` 后,再单独向 Skill 授权:
459
538
 
460
539
  ```text
461
540
  $tirtc-esp32-builder
462
541
 
463
- 我确认目标芯片是 ESP32-S3,目标工程是 /absolute/path/my-esp32-device,
464
- 目标串口是 /dev/ttyACM0。授权本轮烧录该设备并打开串口监视;
542
+ 我确认目标芯片是 ESP32-S3,工程是 /absolute/path/my-esp32-device,
543
+ 串口是 /dev/ttyACM0。授权本轮烧录该设备并打开串口监视。
465
544
  不要擦除其他串口设备,不要在日志中输出 Wi-Fi 密码或设备密钥。
466
545
  烧录后执行 L2 Boot 检查并更新 TIRTC_PORTING_REPORT.md。
467
546
  ```
468
547
 
469
- 也可以人工执行:
548
+ 也可以人工烧录:
470
549
 
471
550
  ```bash
472
- cd "$TIRTC_PROJECT_DIR"
551
+ cd /absolute/path/my-esp32-device
473
552
  idf.py -p /dev/ttyACM0 flash monitor
474
553
  ```
475
554
 
476
- ESP-IDF Monitor 中使用 `Ctrl+]` 退出。多个串口同时存在时,必须根据 USB 拔插、设备标识或芯片探测结果确认目标,不能选择第一个端口直接写入。
555
+ 使用 `Ctrl+]` 退出 ESP-IDF Monitor。多个串口同时存在时,需要通过 USB 拔插、设备标识或芯片探测确认目标,不能默认烧录第一个端口。
477
556
 
478
- WSL 不一定自动获得 USB 串口。Doctor 看不到端口时,先按 [Microsoft 的 WSL USB 连接说明](https://learn.microsoft.com/windows/wsl/connect-usb) 把目标设备附加到当前 WSL 实例,再重新运行串口检查。
557
+ ### Wi-Fi 凭证和设备绑定
479
558
 
480
- ### 第 11 步:首次配网和绑定
559
+ SoftAP 是可选方案,不是接入前提。Hardware IR 要根据 BSP 的实际能力和产品要求,选择 SoftAP、BLE、SmartConfig、安全工厂/NVS 注入、不纳入版本控制的开发配置,或有文档的自定义方案。SSID 和密码不应写死在源码中。
481
560
 
482
- 固件首次启动且没有 Wi-Fi 配置时:
561
+ 无论选择哪种方法,都要有当前 PCB/BSP 的支持证据,凭证不能进入 Git、源码或报告,并且要保留清除或重配入口。没有 SoftAP、但支持工厂 NVS 注入的设备同样可以接入。只要工程提交了明文密码,Hardware IR v2 门禁就会判为 `BLOCKED`。
483
562
 
484
- 1. 在手机或电脑连接 `TiRTC-Setup-XXXX`。
485
- 2. 输入默认密码 `tirtc1234`。
486
- 3. 打开 `http://192.168.4.1`,填写设备要连接的 Wi-Fi。
487
- 4. 设备重启并联网后,在串口查看绑定验证码和体验平台地址。
488
- 5. 登录体验平台,在设备绑定入口输入验证码。
489
- 6. 回到串口输入 `status`,确认 platform、MQTT、TiRTC 均已就绪,runtime 处于 `waiting`。
563
+ Wi-Fi 配网和 ThingConnect 设备绑定是两套独立流程。绑定可以选择验证码、工厂预绑定、开发凭证,或平台合同允许的 custom 方案。验收时要分开检查:
490
564
 
491
- 也可以在串口输入:
565
+ 1. 没有 Wi-Fi 凭证时,设备进入选定的配网或注入流程。
566
+ 2. 已联网但尚未绑定时,设备进入选定的绑定流程;只有验证码方案需要显示验证码。
567
+ 3. NVS 已保存绑定时,日志应明确说明复用已有绑定并跳过首次绑定,不能据此判断“绑定流程缺失”。
568
+ 4. 分别验证只清设备绑定和只清 Wi-Fi 凭证的入口。
569
+ 5. `status` 确认 platform、MQTT、TiRTC 和 runtime 状态。
492
570
 
493
- ```text
494
- wifi-set <ssid> <password>
495
- wifi-clear
496
- status
497
- restart
498
- ```
571
+ 具体命令和 UI 由生成工程及所选方案决定,不能直接照搬另一块板。生产凭证、设备 secret 和 token 不得写入源码、脚本、Hardware IR、报告或 Git。
499
572
 
500
- `tirtc-set <device_id> <device_secret> [client_id]` 只用于受控底层联调。正常流程使用验证码绑定,真实凭证不能写入源码、脚本、报告或 Git。
573
+ ### 验证 H5 实时查看和对讲
501
574
 
502
- ### 第 12 步:按层验收 H5 和 AI
575
+ 1. 串口 `status` 显示 runtime 为 `waiting`。
576
+ 2. 在体验平台打开该设备的实时查看入口。
577
+ 3. 确认所选 MJPEG/H.264/H.265 视频持续显示,音频和视频发送计数持续增长。
578
+ 4. 发起 H5 对讲,确认 stream 14 下行计数增长,实体扬声器可以听到声音。
579
+ 5. 触发浏览器重连或刷新请求,确认 MJPEG 提交下一张完整 JPEG,或 H.264/H.265 产生合同要求的刷新/关键帧,画面能够恢复。
503
580
 
504
- 验收时不要跨级宣告成功。缺少账号、浏览器、服务、外网、板卡或仪器时,对应项记录为 `SKIP`,并写明补测条件。
581
+ 视频、声音和重连要分别保留证据。浏览器偶尔出现一帧,不能算作持续实时查看通过。
505
582
 
506
- | 层级 | 必须看到的证据 |
507
- |---|---|
508
- | L-1 Environment | Doctor 的必需项和项目构建契约通过 |
509
- | L0 Generate | 新工程和 Hardware IR 存在,未覆盖旧目录 |
510
- | L1 Build | `idf.py build` 成功并记录固件及 SHA-256 |
511
- | L2 Boot | 指定串口烧录成功,无 panic/反复重启 |
512
- | L3 Online | 配网、验证码绑定、MQTT、TiRTC 就绪 |
513
- | L4 Media | 摄像头、麦克风、扬声器本地路径和计数正常 |
514
- | L5 H5 | 浏览器持续收到声明的视频/音频,对讲到达设备扬声器 |
515
- | L6 AI | token、WHIP、`start_session`、双向音频、停止和 H5 恢复正常 |
516
- | L7 Stability | 按需求完成反复会话、弱网、资源和长稳测试 |
583
+ ### 验证 AI 对讲
517
584
 
518
- H5 验收:
585
+ 1. 先确认 H5 或其他会话没有占用媒体资源。
586
+ 2. 串口输入 `ai-start`,观察状态从 `ai-connecting` 进入 `ai-active`。
587
+ 3. 确认 `start_session` 成功后,设备才开始发送麦克风音频。
588
+ 4. 确认上行语音被 AI 接收,下行 AI 音频能从实体扬声器播放。
589
+ 5. 输入 `ai-stop`,确认发送 `end_session`,媒体任务停止,状态回到 `waiting`。
590
+ 6. 再次打开 H5,确认实时音视频可以重新连接。
519
591
 
520
- 1. 串口 `status` 显示 runtime 为 `waiting`。
521
- 2. 在体验平台打开该设备的实时查看入口。
522
- 3. 确认 H.264 视频持续显示,音频/视频发送计数持续增长。
523
- 4. 发起 H5 对讲,确认 stream 14 下行计数增长且实体扬声器可听。
524
- 5. 触发浏览器重连或关键帧请求,确认板端编码器产生新的 IDR,画面恢复。
592
+ 如果产品使用实体按键启动 AI,会话状态和验收条件相同,只是触发方式从串口命令换成板级按键。
525
593
 
526
- AI 验收:
594
+ ### 分层验收
527
595
 
528
- 1. 确认 H5/其他会话没有占用媒体资源。
529
- 2. 串口输入 `ai-start`,观察状态从 `ai-connecting` 进入 `ai-active`。
530
- 3. 确认只有 `start_session` 成功后才开始发送麦克风音频。
531
- 4. 确认上行麦克风被 AI 接收,下行 AI 音频在扬声器播放。
532
- 5. 输入 `ai-stop`,确认发送 `end_session`、媒体任务停止,状态回到 `waiting`。
533
- 6. 再次打开 H5,确认 H5 可以重新连接并恢复音视频。
596
+ 每一层都要有独立证据。缺少硬件、账号、浏览器、服务或网络时,写 `SKIP`,并注明后续补测条件。
534
597
 
535
- ### 第 13 步:检查最终交付物
598
+ | 层级 | 通过条件 |
599
+ |---|---|
600
+ | L-1 Environment | Doctor 必需项和项目构建契约通过 |
601
+ | L0 Generate | 新工程和 Hardware IR 存在,没有覆盖旧目录 |
602
+ | L1 Build | `idf.py build` 成功,固件和 SHA-256 已记录 |
603
+ | L2 Boot | 指定串口烧录成功,无 panic 或反复重启 |
604
+ | L3 Online | 所选 Wi-Fi 凭证和设备绑定流程、MQTT 与 TiRTC 就绪 |
605
+ | L4 Media | 摄像头、麦克风、扬声器的本地路径和计数正常 |
606
+ | L5 H5 | 浏览器持续收到声明的音视频,下行对讲到达实体扬声器 |
607
+ | L6 AI | token、WHIP、`start_session`、双向音频、停止和 H5 恢复正常 |
608
+ | L7 Stability | 按需求完成反复会话、弱网、资源和长稳测试 |
536
609
 
537
- 一次完整交付至少包含:
610
+ 一份完整交付通常包含:
538
611
 
539
- - 生成的 ESP-IDF 工程绝对路径;
540
- - `hardware-ir.json` 及每条关键事实的来源;
541
- - 能力评估结果和剩余阻塞项;
542
- - `build/` 中的固件产物及 SHA-256;
612
+ - 生成工程的绝对路径;
613
+ - `hardware-ir.json` 和关键事实来源;
614
+ - 能力评估与剩余阻塞项;
615
+ - 固件文件、构建命令、版本和 SHA-256;
543
616
  - 明确到芯片和串口的烧录记录;
544
617
  - 脱敏后的构建、启动和验收日志;
545
618
  - `TIRTC_PORTING_REPORT.md`;
546
- - L-1 到 L7 的 `PASS`、`FAIL` 或 `SKIP` 证据。
619
+ - L-1 到 L7 的 `PASS`、`FAIL` 或 `SKIP`。
620
+
621
+ 任务只做到生成和编译时,报告应明确停在 L1。
622
+
623
+ ## 常见问题
624
+
625
+ ### 找不到 `node`、`npm` 或 `npx`
626
+
627
+ 安装 Node.js 18 或更高版本,重新打开终端,再检查:
628
+
629
+ ```bash
630
+ node --version
631
+ npm --version
632
+ npx --version
633
+ ```
634
+
635
+ ### npm 使用了镜像源,提示 404 或找不到包
636
+
637
+ 查看当前 Registry:
638
+
639
+ ```bash
640
+ npm config get registry
641
+ ```
642
+
643
+ 如果不是 `https://registry.npmjs.org/`,切回官方源后重试:
644
+
645
+ ```bash
646
+ npm config set registry https://registry.npmjs.org/
647
+ npm view tirtc-device-builder version
648
+ ```
649
+
650
+ ### `npm login` 提示无法打开浏览器
651
+
652
+ 普通使用者不需要登录 npm。直接执行:
547
653
 
548
- 如果只完成生成和编译,报告应明确停在 L1;不能写成“Web 已出图”或“AI 对讲已完成”。
654
+ ```bash
655
+ npx --yes tirtc-device-builder@latest setup esp32 --install
656
+ ```
657
+
658
+ `npm login` 只供维护者发布包,与安装公开包无关。
659
+
660
+ ### 输出 `OVERALL: NEEDS_SETUP`
661
+
662
+ 这表示只读检查发现环境尚未准备完整。按输出提示执行安装:
663
+
664
+ ```bash
665
+ npx --yes tirtc-device-builder@latest setup esp32 --install
666
+ ```
549
667
 
550
- ### 一次成功检查清单
668
+ ### 提示缺少 `python3`、`git`、`bash` 或 `tar`
551
669
 
552
- 开始下一阶段前逐项确认:
670
+ 安装器不会运行 `sudo`。请用当前系统的包管理器补齐这些命令,再执行 `setup esp32 --install`。安装可以续跑,已经完成的部分会被复用。
553
671
 
554
- - [ ] 板卡厂商、完整型号、模组、PCB 版本一致。
555
- - [ ] 原理图/BOM/BSP/数据手册路径均为绝对路径且可读。
556
- - [ ] Node.js 版本不低于 18,Skill 已安装并重启 Codex。
557
- - [ ] ThingConnect 生成器、TiRTC 头文件、静态库和构建契约存在。
558
- - [ ] 当前终端已激活 ESP-IDF 5.5.x 和 ESP32-S3 工具链。
559
- - [ ] 生成前 Doctor 的 `OVERALL` 为 `PASS`。
560
- - [ ] 所有请求能力均为 `READY_TO_PORT` 或 `HIL_VERIFIED`。
561
- - [ ] 输出目录不存在,旧工程未被覆盖。
562
- - [ ] 项目级 Doctor 的 `TiRTC build contract` 为 `PASS`。
563
- - [ ] `idf.py build` 成功,但尚未把它当作实机功能通过。
564
- - [ ] 烧录前已确认唯一串口并明确授权。
565
- - [ ] 配网、绑定、H5、AI 分层验收均保留脱敏证据。
566
- - [ ] 最终报告中的每个 `SKIP` 都有原因和最小下一步。
672
+ ### `idf.py not found`
567
673
 
568
- ## 开发与验证
674
+ 当前终端没有激活 ESP-IDF。使用一键环境时执行:
675
+
676
+ ```bash
677
+ source ~/.tirtc-device-builder/env.sh
678
+ idf.py --version
679
+ ```
680
+
681
+ 使用已有 ESP-IDF 时执行它自己的 `export.sh`:
682
+
683
+ ```bash
684
+ source /absolute/path/esp-idf/export.sh
685
+ ```
686
+
687
+ ### ESP-IDF 版本不是 5.5.x
688
+
689
+ 不要用错误版本继续编译预编译 SDK。让安装器使用新的托管目录,或明确传入正确版本:
690
+
691
+ ```bash
692
+ npx --yes tirtc-device-builder@latest setup esp32 --install \
693
+ --idf-dir /absolute/path/esp-idf-v5.5.4
694
+ ```
695
+
696
+ 如果指定目录已存在但内容不完整或版本错误,安装器会拒绝覆盖。换一个空的新路径,或先人工备份原目录。
697
+
698
+ ### 安装完成后 Codex 找不到 Skill
699
+
700
+ 关闭当前 Codex 会话并重新打开。再检查默认文件是否存在:
701
+
702
+ ```bash
703
+ ls -l ~/.codex/skills/tirtc-esp32-builder/SKILL.md
704
+ ```
705
+
706
+ 设置过 `CODEX_HOME` 或 `--skills-dir` 时,要检查对应目录。不要同时把 Skill 安装到多个位置。
707
+
708
+ ### 已有 Skill,安装器拒绝覆盖
709
+
710
+ 安装器检测到本地已有 Skill,因此没有直接覆盖。确认可以替换后执行:
711
+
712
+ ```bash
713
+ npx --yes tirtc-device-builder@latest setup esp32 --install --force-skill
714
+ ```
715
+
716
+ 如果只使用 `install esp32` 子命令,对应选项是 `--force`。
717
+
718
+ ### Device Kit 下载失败
719
+
720
+ 确认能访问 npm 和 GitHub Release。受限网络中,可以在另一台机器下载公开 Release 附件,再传到开发机:
721
+
722
+ ```bash
723
+ npx --yes tirtc-device-builder@latest setup esp32 --install \
724
+ --kit-archive /absolute/path/tirtc-esp32s3-kit-1.0.0.tar.gz
725
+ ```
726
+
727
+ 安装器会校验 SHA-256 和内部文件清单。如果校验不一致,请重新获取官方 Release 附件,不要跳过校验。
728
+
729
+ ### 提示 `refusing to overwrite incomplete directory`
730
+
731
+ 目标路径已经存在,但不是完整的 Device Kit 或 ESP-IDF。安装器不会删除或覆盖该目录。请先检查并备份,再改用新的 `--root` 或 `--idf-dir` 路径。
732
+
733
+ ### Doctor 报 `no sdkconfig or sdkconfig.defaults`
734
+
735
+ 典型输出是:
736
+
737
+ ```text
738
+ FAIL TiRTC build contract [required]: no sdkconfig or sdkconfig.defaults in ...
739
+ ```
740
+
741
+ `--project` 指向的目录还不是已生成的 ESP-IDF 工程,或者路径写错了。生成前不要传 `--project`;生成后确认工程中存在 `sdkconfig.defaults`,再运行项目级 Doctor。
742
+
743
+ ### `WARN serial discovery: no serial device detected`
744
+
745
+ 没有连接开发板时,这是正常警告,不影响生成和编译。烧录前必须让串口检查变成 `PASS`。
746
+
747
+ 设备已连接但没有权限时,按操作系统规范把当前用户加入串口用户组并重新登录。Ubuntu 常见用户组是 `dialout`。不要长期把串口权限放宽给所有用户。
748
+
749
+ WSL 默认不一定能看到 USB 设备。按 [Microsoft WSL USB 连接说明](https://learn.microsoft.com/windows/wsl/connect-usb) 将设备附加到当前 WSL 实例,再运行 Doctor。
750
+
751
+ ### Hardware IR 一直是 `NEEDS_CONFIRMATION`
752
+
753
+ 先查看各个未知项要求什么来源。常见缺口包括准确的 PCB 版本、摄像头数据格式、所选视频 profile 的完整输出路径、Codec 时钟、功放使能脚、配网方法和可工作的厂商示例。不要从相似开发板复制管脚来填补这些信息。
754
+
755
+ ### 工程能编译,浏览器没有画面
756
+
757
+ 先确认摄像头输出是否真正进入选定的视频路径。MJPEG 要逐次提交完整 JPEG;H.264/H.265 要符合合同规定的 Annex-B、参数集和刷新帧行为。同时检查持续发送计数、丢帧和队列水位。Sensor 能输出 JPEG、RGB 或裸 YUV,不等于 H5 视频链路已经打通。
758
+
759
+ ### 工程能编译,但 H5 或 AI 没有声音
760
+
761
+ 分别检查上行和下行,不要把它们当成同一条链路:
762
+
763
+ - 上行:麦克风、采样率、声道、G.711 A-law 编码、发送时机;
764
+ - 下行:stream 14、队列边界、A-law 解码、I2S/Codec、功放使能、扬声器;
765
+ - AI:`start_session` 成功后才发送音频,停止时清理旧 generation 数据;
766
+ - 全双工:没有 AEC 和硬件证据时先验证半双工。
767
+
768
+ ### 原生 Windows 无法自动安装 ESP-IDF
769
+
770
+ 自动安装当前支持 Linux、WSL 和 macOS。原生 Windows 请使用 Espressif 官方安装器准备 ESP-IDF 5.5.x 和 ESP32-S3 工具链,再运行:
771
+
772
+ ```powershell
773
+ npx --yes tirtc-device-builder@latest setup esp32
774
+ ```
775
+
776
+ 也可以在 WSL 中完成整个流程,但烧录前要先把 USB 设备连接到 WSL。
777
+
778
+ ## 使用边界
779
+
780
+ ### 必须克隆 `tirtc-server-example` 吗?
781
+
782
+ 不需要。普通开发所需的生成器、模板、协议文档、TiRTC 头文件和 `libTiRTC.a` 都在版本化的 ESP32 Device Kit 中。一键安装会下载公开 Release,并把路径写进 `env.sh`。
783
+
784
+ `--thing-connect-root` 主要用于维护模板、协议或 Device Kit 的开发者复用完整源码工作区。
785
+
786
+ ### 为什么推荐 `npx`,不是安装一个 npm 包就结束?
787
+
788
+ `npx` 适合运行低频的安装和诊断命令,也可以明确选择 `@latest`。全局 `npm install` 同样可用,但只负责安装 CLI。
789
+
790
+ Skill、Device Kit 和 ESP-IDF 会写到 npm 包目录之外,也可能占用较多磁盘和下载时间,因此统一由显式命令 `setup esp32 --install` 安装。开发者可以提前看到安装计划和目标目录;以后卸载或升级 CLI,也不会误删开发环境。
791
+
792
+ ### 只给开发板型号能不能自动完成全部代码?
793
+
794
+ 可以先分析,但不能保证直接完成硬件移植。型号足以定位候选资料;GPIO、器件版本、所选视频 profile、音频时钟和配网能力仍需可信来源。资料不足时,Skill 会给出最小补充清单,不会拿相似板型的数据填空。
795
+
796
+ ### 能接入已有 ESP-IDF 工程吗?
797
+
798
+ 可以。把现有工程路径、目标芯片、ESP-IDF 版本、BSP 和已验证的外设示例交给 Skill。它会先检查组件、配置、SDK 构建合同和媒体接入边界,再决定复用哪些板级代码。
799
+
800
+ ### 生成的工程可以移走吗?
801
+
802
+ 可以。TiRTC SDK 会复制到工程的 `third_party/tirtc/`。移动后仍需在新机器上激活兼容的 ESP-IDF 5.5.x,并重新运行项目级 Doctor 和构建。
803
+
804
+ ### 能支持 ESP32 之外的芯片吗?
805
+
806
+ 仓库允许每个平台使用独立 Skill,但当前公开版本只实现 ESP32-S3。泰芯或其他平台需要新增 `skills/<platform-skill>/`,并分别维护 SDK、工具链、板级 adapter 和验收约束。
807
+
808
+ ## 给仓库维护者
809
+
810
+ 以下命令只供仓库维护者使用。
811
+
812
+ ### 本地验证
569
813
 
570
814
  ```bash
571
815
  npm ci --ignore-scripts
@@ -573,10 +817,9 @@ npm test
573
817
  npm pack --dry-run
574
818
  ```
575
819
 
576
- `npm pack --dry-run` 展示实际进入公开 tarball 的文件;发布前必须确认其中没有
577
- SDK 二进制、凭证、板卡私有资料、构建产物或用户媒体。
820
+ `npm pack --dry-run` 用于核对公开 tarball。包内不应出现 Device Kit 二进制、设备凭证、板卡私有资料、构建产物或用户媒体。
578
821
 
579
- 本地安装了 Codex 系统校验器时,还可以运行:
822
+ 本机安装了 Codex 系统校验器时,还可以运行:
580
823
 
581
824
  ```bash
582
825
  python3 ~/.codex/skills/.system/skill-creator/scripts/quick_validate.py \
@@ -585,20 +828,72 @@ python3 ~/.codex/skills/.system/skill-creator/scripts/quick_validate.py \
585
828
  python3 ~/.codex/skills/.system/plugin-creator/scripts/validate_plugin.py .
586
829
  ```
587
830
 
588
- ## 增加新平台
831
+ ### 打包 ESP32 Device Kit
832
+
833
+ ```bash
834
+ npm run pack:esp32-kit -- \
835
+ --source /absolute/path/tirtc-server-example/thing-connect \
836
+ --kit-version 1.0.0
837
+ ```
838
+
839
+ 输出位于 `dist/`:
840
+
841
+ ```text
842
+ tirtc-esp32s3-kit-1.0.0.tar.gz
843
+ tirtc-esp32s3-kit-1.0.0.tar.gz.sha256
844
+ ```
845
+
846
+ 校验后使用独立的 `kit-esp32s3-v<version>` 标签发布 GitHub Release:
847
+
848
+ ```bash
849
+ gh --version
850
+ gh release --help
851
+
852
+ cd dist
853
+ sha256sum -c tirtc-esp32s3-kit-1.0.0.tar.gz.sha256
854
+ cd ..
855
+
856
+ git tag -a kit-esp32s3-v1.0.0 -m "TiRTC ESP32-S3 Device Kit 1.0.0"
857
+ git push origin kit-esp32s3-v1.0.0
858
+
859
+ gh release create kit-esp32s3-v1.0.0 \
860
+ dist/tirtc-esp32s3-kit-1.0.0.tar.gz \
861
+ dist/tirtc-esp32s3-kit-1.0.0.tar.gz.sha256 \
862
+ --repo tangeai/tirtc-device-builder \
863
+ --verify-tag \
864
+ --latest=false \
865
+ --title "TiRTC ESP32-S3 Device Kit 1.0.0" \
866
+ --notes "ESP-IDF 5.5.x;TiRTC SDK 2.3.0;包含 H5/AI 工程生成资源。"
867
+ ```
868
+
869
+ `gh release --help` 如果提示 `No such command 'release'`,当前系统安装的不是 GitHub 官方 CLI。先按 [GitHub CLI 官方安装说明](https://github.com/cli/cli/blob/trunk/docs/install_linux.md) 安装或替换,再登录并发布 Release。
870
+
871
+ ### 发布 npm
872
+
873
+ `package.json` 版本与 Git 标签必须一致。推送 `v<package-version>` 标签后,`.github/workflows/publish.yml` 通过 npm Trusted Publishing 发布:
874
+
875
+ ```bash
876
+ npm test
877
+ git tag -a v0.4.0 -m "v0.4.0"
878
+ git push origin v0.4.0
879
+ ```
880
+
881
+ 不要重复发布已经存在的 npm 版本。版本变化同步更新 `package.json`、`.codex-plugin/plugin.json` 和发布说明。
882
+
883
+ ### 增加新平台
589
884
 
590
- 每个平台使用 `skills/<platform-skill>/` 独立目录。新 Skill 需要:
885
+ 每个平台放在独立的 `skills/<platform-skill>/` 目录,并写清楚:
591
886
 
592
- - 明确芯片、SDK、工具链和不适用范围;
593
- - 使用来源可追溯的硬件事实,不从相似型号静默推断;
594
- - 把平台驱动隔离在板级 adapter,不复制 H5/AI 会话状态机;
595
- - 区分编译、烧录启动、设备上线、媒体链路和端到端业务验收;
596
- - 对下载、工具链安装、串口烧录和凭证写入保留明确授权边界。
887
+ - 芯片、SDK、工具链和不适用范围;
888
+ - Hardware IR 需要的事实和来源;
889
+ - 板级媒体 adapter 与公共会话逻辑的边界;
890
+ - 编译、启动、上线、媒体、业务和稳定性验收;
891
+ - 下载、工具链安装、串口烧录和凭证写入的授权边界。
597
892
 
598
- 共享逻辑只在两个以上平台出现相同不变量后抽取,避免形成只转发参数的公共层。
893
+ 等两个以上平台出现相同且稳定的约束后,再提取共享逻辑,避免公共层只做参数转发。
599
894
 
600
895
  ## 安全与许可证
601
896
 
602
- 不要在 Issue、日志或报告中提交设备密钥、Wi-Fi 密码、MQTT/WHIP token、证书或用户音视频。安全问题按 [SECURITY.md](SECURITY.md) 私下报告。
897
+ 不要在 Issue、日志或报告中提交设备密钥、Wi-Fi 密码、MQTT/WHIP token、证书、生产配置或用户音视频。安全问题按 [SECURITY.md](SECURITY.md) 私下报告。
603
898
 
604
- 本仓库源码使用 MIT License,见 [LICENSE](LICENSE)。ThingConnect、TiRTC SDK、ESP-IDF、厂商 BSP、芯片资料和其他第三方内容使用各自的许可证;本仓库许可证不会替代它们。
899
+ 本仓库源码使用 [MIT License](LICENSE)。ThingConnect、TiRTC SDK、ESP-IDF、厂商 BSP、芯片资料和其他第三方内容使用各自的许可证,本仓库许可证不会替代它们。版本差异见 [CHANGELOG.md](CHANGELOG.md)。