MAKER FIRMWARE · AI HARDWARE FLOW

把功能做小,把流程跑全。依靠 AI,让实体按键多出一个“打开应用”的动作(Host Action),并把测试、构建、烧录与真机结果逐层分开。

跑通第一条开发链路

Build Route开发路径

BEFORE STEP 01 · SEE THE WHOLE JOB

先看最终要做成什么,
再开始改固件

最终结果很具体:在 EasyInput App 里给一个按键选择“打开应用”并同步;以后按下这个按键,电脑就打开已经选好的目标应用。接下来的所有操作,都只是在保证这条链路可靠成立。

先不要从代码和术语开始。从 App 里设置按键,到电脑最终打开应用,其实是一条连续的软件协同链路。第一次把对应关系保存好以后,后面的每次按键都会从这条链路中间继续向下走。

ONE CONNECTED FLOW / 一条连续流程

先设置一次,之后每次按键都会沿同一条链路工作

顺着蓝色连线从上往下看:App 和固件会用同一个 UUID 认出同一个动作,但它们各自保存的信息不同。

01 / 在 App 里设置

按键 + “打开应用” + 目标应用

选择要使用的按键和想打开的应用,例如计算器或备忘录。

02 / App 自动生成

UUID

读作 U-U-I-D;全称 Universally Unique Identifier,中文可理解为“通用唯一标识符”。

它像这次动作的专属识别码,不是目标应用自己的编号,也不需要手动输入。

格式示例:123e4567-e89b-12d3-a456-426614174000
03A / App 在电脑本地记住

UUID → 目标应用

应用名称和安装位置留在电脑端。App 以后收到这个 UUID,就知道要打开哪个应用。

03B / App 把按键配置同步给固件

按键按下 → 发送 UUID

固件只需要记住这个按键对应哪个 UUID,不需要知道应用名称和安装位置。

从这里开始: 下面 5 步会在每次按键时发生

04 / 触发

按下按键

按键只负责产生一次按下动作。

05 / 固件

固件读取 UUID

固件从已经保存的按键配置里找到 UUID。

06 / 发送

把 UUID 发给电脑

有线或无线发送相同内容;双连接时不能重复发送。

07 / App 查找

UUID → 目标应用

App 用电脑本地保存的对应关系找到目标应用。

08 / 结果

电脑打开目标应用

真正执行“打开应用”的是电脑端 App。

下一次按键,再从“按下按键”继续

按键时到底发送什么?发送内容的关键部分只有 UUID。它不会再次带上按键名称或按键属性,也不会带上目标应用的名称和安装位置。

SCOPE / 本次开发范围

这次在 Maker 固件侧完成协议接入

PLAIN WORDS / 先看作用

看懂流程里的三个称呼

开发板里的程序

固件负责读取按键

开发板开机后,固件一直在运行。本次 Host Action v1 接入就在当前固件项目中完成。

UUID(动作的唯一标识)

读作 U-U-I-D

全称是 Universally Unique Identifier,中文可理解为“通用唯一标识符”。在这里,它让 App 和固件认出同一个动作,不是目标应用自己的编号。

固定消息格式(协议)

两边按同一种写法交换编号

编号放在哪里、一次发送多长、按下和松开时分别做什么,都已经约好,不能让 AI 临时换一种写法。

为什么第 1 步之前就要说清这套协同规则?

软件协同,就是两个程序各自负责一部分,再按共同约好的规则交换信息。Host Action v1 已经确定;固件发送的编号、长度或时机只要有一项不同,即使代码检查通过、固件也成功写进开发板,两端仍然无法正确配合。

COPY FOR AI / 直接复制

长提示词不用逐字读

后面的深色区域是给 AI 的完整执行要求,不需要逐字理解。提示词只固定三类不能猜的内容:Host Action v1、开发板安全、写入授权;路径、文件名、测试数量、构建目录、工具安装位置和 App 小版本由 AI 先读取当前环境再决定。版本号显示不同不等于失败,只有工程声明不兼容、必需入口缺失或真实验证失败才停下。每段提示词下方的“为什么要这样要求 AI”不会一起复制。

PHASE 01 · CHECK THE START

先确认原项目正常,
再开始修改

先让 AI 只读固件项目,确认哪些地方不能动,再检查修改前的代码能否正常通过电脑检查并生成固件。

先确认 AI 打开的就是当前固件项目,也确认原项目本来能正常工作。这样后面出现问题时,才知道是不是这次修改造成的。

保存当前进度

project-flow-cy

把目标、边界、决定、问题和结果留在项目里,换一个 AI 对话也能从这里继续。

固件开发对象

easy-input-maker

本次在这个固件项目中完成 Host Action v1 接入。代码检查、修改和生成固件都从这里进行。

板子哪些地方不能动

easyinput-board-cy

核对板型、按键、电源和写入安全边界,防止 AI 把通用经验误用到当前开发板。

生成并写入固件

esp-idf-cy

检查开发环境、生成固件、识别目标开发板,并在得到确认后完成写入。

01先让 AI 只读固件项目

开始前先看清

固件项目

固件是开发板开机后运行的程序。这里的代码、说明和电脑检查都放在同一个项目文件夹里,它是本次固件侧开发对象。

不能随便改的硬件

按键接在哪里、怎样供电、程序写在哪里、电脑怎样识别这块板,都已经由当前开发板决定。第一步先让 AI 把这些边界说清楚。

01 / 现在做什么

把下面的提示词复制给 AI。这一步只让它查看固件项目,确认按键代码在哪里,以及当前开发板哪些地方不能随意改。

02 / 为什么做

AI 先认清了项目和开发板,后面才不会把其他 ESP32 板子的做法误用到这块板上。

03 / 直接复制给 AI · 不用逐字读
请先读取当前 Maker 固件项目生效的 AGENTS.md、README 和已有 flow/ 记录,使用 project-flow-cy 记录本次目标,并用 easyinput-board-cy 核对 EasyInput V2.0 的板型与安全边界。全程只读,不改代码,不离开当前仓库。请用普通中文返回:①项目是否已经包含 Host Action;②按键链路入口;③工程自己声明的工具版本与目标;④必须保护的硬件、分区和设备身份。文件名或目录与示例不同,以当前仓库事实为准。
04 / 应该看到什么
  • AI 明确本次开发在固件侧完成,并说清它要怎样接入 App 已有的 Host Action v1。
  • AI 用普通中文说清按键代码大致在哪里。
  • AI 列出开发板上不能随意改的地方,并说明原因。
05 / 没看到就停在这里

如果 AI 已经开始改代码、跑到其他项目,或没有说清哪些硬件不能动,先不往下做,重新执行本步。

02先确认原项目本来能正常工作

开始前先看清

修改前的正常起点(基线)

先证明原项目本来能够正常通过检查。后面再出错时,才知道问题是不是这次修改造成的。

电脑检查与生成固件

电脑侧逻辑检查(宿主测试)先检查代码规则;生成固件(构建)再把代码变成可以写入开发板的文件。两项通过都不代表已经写进开发板。

01 / 现在做什么

让 AI 对原项目运行一次电脑侧逻辑检查,再生成一次固件。此时仍然不改代码,也不写入开发板。

02 / 为什么做

先证明源码和环境原本正常,后续才能判断新失败是否由这次修改引起。

03 / 直接复制给 AI · 不用逐字读
先不要改代码或烧录。按当前 Maker 工程自己的说明发现并运行全部宿主测试;再使用 esp-idf-cy 读取工程声明的 ESP-IDF 版本和目标,激活或准备匹配环境并执行默认构建。课程基线曾用 5.5.5 验证,但以当前仓库的版本化声明为准,不因本机当前版本不同而跳过检查。返回实际测试清单及发现/执行/通过数量、工程要求与实际使用的版本、构建产物或最早失败证据,并说明工作区是否变化。
04 / 应该看到什么

AI 返回本轮实际发现的测试总数,并确认清单中的项目全部通过;固件生成成功;检查过程没有修改代码。测试总数以当前 Git 基线的真实清单为准,不为了匹配页面凑固定数字。

05 / 没看到就停在这里

只要有检查未通过、固件无法生成,或验证过程改了代码,就先停下来查原因,不进入新功能修改。

03找到一次按键怎样到达电脑

开始前先看清

一次按键的动作路径

按键被按下后,固件先找到这个键对应的动作,再生成一条内部消息,最后选择有线或无线连接发给电脑。这里先让 AI 找出这条已经存在的路径。

01 / 现在做什么

让 AI 选一个现在已经能用的按键动作,从按下开始,一直找到它通过有线或无线发到电脑的路。

02 / 为什么做

新动作必须接入已有流程;跳过理解直接新增并行路径,最容易破坏原功能或造成双发。

03 / 直接复制给 AI · 不用逐字读
请只读追踪一个当前已有的按键动作:从配置解析和 Keymap,到固件事件,再到 USB 或 BLE 发送。目录、文件和函数名以当前代码为准;如果两条通道的选择方式与页面叫法不同,请说明语义等价关系。用普通中文给出链路、关键代码位置和单通道选择证据,不修改代码。
04 / 应该看到什么

AI 用一条清楚的箭头链说明:按下按键 → 找到这个键的动作 → 生成内部消息 → 选择有线或无线 → 发到电脑,并给出对应的代码位置。

05 / 没看到就停在这里

如果 AI 只说了一堆名词,却没有说清路径和代码位置,就先让它继续查找,不开始修改。

PHASE 02 · MAKE THE ACTION

把固定格式交给 AI,
先在电脑上做出动作

App 已经按页面开头的固定格式接收动作,所以这里先让 AI 记住同一份格式,再在电脑上完成动作逻辑,暂时不碰真实开发板。

04把 App 已经认识的消息格式交给 AI

开始前先看清

打开应用动作(Host Action)

这是开发板发给电脑的一次动作请求。EasyInput App 收到后,才会真正打开已经选好的应用。

UUID(动作的唯一标识)与固定消息格式(协议)

App 会为动作自动生成 UUID。固件只按已经约好的格式保存和发送 UUID,不需要知道应用路径,也不能让 AI 临时改写格式。

AI 会这样读取 · 不用背

host_action:<UUID>
host_action

动作类型:告诉固件“这不是复制或输入文字,而是一个应用动作”。

:

分隔符:把左边的动作类型和右边的 UUID 分开。

<UUID>

占位符:宿主测试可以使用固定示例,真机验收使用 EasyInput App 同步的实际 UUID;尖括号只是说明位置,不要照着输入。

整句意思:配置层保存一个应用动作,它的编号是右边这个 UUID。真正发送给 App 时会去掉 host_action: 前缀,只发送 UUID。

01 / 现在做什么

把页面开头的固定消息格式一起交给 AI,让它与当前固件项目核对,再记进项目。这一步只做核对和记录,不改代码。

02 / 为什么做

EasyInput App 已经按这个格式接收动作,而这里又不能改 App。因此固件必须遵守同一格式,AI 不能现场另造一套。

03 / 直接复制给 AI · 不用逐字读
请读取当前 Maker 工程和已有 flow/ 记录,核对下面这份 Host Action v1 固定合同:配置保存 host_action:<canonical-lowercase-uuid>;非规范 UUID 直接拒绝且不自动转小写;传输使用 Report ID 0x11、kind 0x05、chunk index 0、total chunks 1、data length 36;payload [4..39] 只放无前缀 UUID ASCII,余量保持现有归零行为;0x04 继续用于状态响应;按下发送一次、松开不发送;USB 与 BLE 使用同一内容和现有单通道选择,不双发;固件不保存应用路径或名称;完整实现后声明 "host_action_v1": true,并保证 BLE 状态不超过 512 字节。当前基线没有该功能不算冲突,目录、类名和函数名也可以不同。若固定字段与现有编号或容器没有直接冲突,使用 project-flow-cy 记录合同、预计涉及的语义层和不承担范围;本步只改 flow/,不改代码、不测试、不构建、不烧录。只有固定字段冲突或容器无法承载时才停止。返回合同核对结果、实际记录文件和代码未变化证据。
04 / 应该看到什么

AI 确认页面开头的固定格式与当前项目没有冲突,已经把它记进项目,并明确说本步没有修改代码。具体编号和字段由 AI 逐项核对,不需要人背诵。

05 / 没看到就停在这里

如果 AI 说固定格式与项目有冲突,先保留它给出的位置和原因,不进入修改。如果它已经改了代码,或只给方案却没有留下项目记录,也重新执行本步。

05先让打开应用动作通过电脑检查

开始前先看清

先在电脑上检查动作逻辑

这一阶段只检查 UUID 是否有效、按下时会产生什么消息,不连接有线、无线或真实开发板。这样出错时更容易找到原因。

01 / 现在做什么

把提示词复制给 AI,让它先核对上一步记下的固定格式,再在电脑上实现并检查打开应用动作。这时不连接真实开发板。

02 / 为什么做

先测纯逻辑,失败只会落在格式、解析、事件或消息这一小块;如果一开始同时接入传输和硬件,错误范围会变得很大。

03 / 直接复制给 AI · 不用逐字读
先读取 flow/ 中的 Host Action v1 合同;合同缺失或与固定字段冲突就停止。若当前代码已经有等价实现,先验证再补缺口,不为制造改动而重写。只在纯逻辑层补最小宿主测试和实现:合法的小写标准 UUID 被接受;大写、长度、连字符或字符错误时直接拒绝;配置层保留完整 host_action:<UUID>;按下生成一次 Host Action,松开不生成;编码仍为 0x11/0x05/0/1/36,线上不带前缀且不占用 0x04。实际目录、符号和测试名以仓库为准。运行定向测试和全部宿主测试,再用 project-flow-cy 记录修改、测试证据和未验证项。不要接 USB/BLE,不烧录。
04 / 应该看到什么
  • 格式正确的 UUID 能被接受,格式错误的 UUID 会被拒绝。
  • 按下会生成一次动作,松开不会再生成一次。
  • 新检查在修改前会失败,修改后全部通过;有线和无线发送代码还没有被改动。
  • 精确字段由 AI 核对并写入项目记录。
05 / 没看到就停在这里

如果固定格式没有读到、UUID 检查未通过,或 AI 已经提前改了有线、无线代码,先停在这一步,不用临时加新规则来凑出通过结果。

06让八个实体键都能使用这个动作

开始前先看清

八个实体键

固件里把八个主要按键写成 KEY1 到 KEY8。这里要确认每一个键都能使用打开应用动作,而不是只让示例按键生效。

按下发送,松开不重复

一次完整按键动作包含按下和松开。打开应用只在按下时发送一次,同时还要确认复制、粘贴等原有动作没有被破坏。

AI 会这样读取 · 不用背

"press": "host_action:123e4567-e89b-12d3-a456-426614174000"
"press"

配置名称:指定“按键被按下时”要执行什么。

:

把配置名称和配置内容分开;双引号与冒号都是这行配置需要保留的符号。

"host_action:…"

配置内容:动作类型后面接 UUID。这里的固定编号只用于验证固件会不会正确解析,不能直接代表某个本机应用。

整句意思:这个按键被按下时,发送一次编号为该 UUID 的应用动作。

01 / 现在做什么

让 AI 确认八个实体键都能选择打开应用动作,按下只执行一次,松开不重复;同时重新检查复制、粘贴等原有动作。

02 / 为什么做

只测一个键,不能代表八个键都能用。新动作加进去后,原有动作也必须保持正常。

03 / 直接复制给 AI · 不用逐字读
继续在当前 Maker 工程检查八个实体主按键是否共用现有配置解析。已有能力就用测试证明,缺失时只做最小补齐;不要重写现有架构。测试要覆盖 KEY1—KEY8:每个键都能保留并解析完整 host_action:<UUID>,按下只产生一次 Host Action,松开不重复;同时回归复制、粘贴、快捷键和固定文字。示例 UUID 只能出现在宿主测试,不能进入默认 Keymap 或生产配置。文件位置和测试名称以当前仓库为准。运行定向测试和全部宿主测试,并用 project-flow-cy 记录实际修改、八键证据、旧动作回归和未验证项。不要修改 USB/BLE、能力声明、硬件配置、分区或设备身份,不烧录。
04 / 应该看到什么
  • 八个实体键都有通过记录。
  • 每个键都是按下执行一次,松开不重复。
  • 复制、粘贴、快捷键和固定文字仍然正常。
  • 测试用的示例编号没有被写入默认按键配置。
05 / 没看到就停在这里

只验证一个键、配置进入 Keymap 后丢失 host_action: 前缀、松开又产生第二个动作、旧按键回归失败,或把测试 UUID 写进生产配置,都不算完成。如果通用解析本来已经覆盖八个键,用完整测试证据确认即可,不强迫 AI 改生产代码。

PHASE 03 · SEND TO COMPUTER

让同一个动作,
通过有线或无线到达电脑

有线和无线都能把动作送到电脑,但两种连接同时存在时,一次按键仍然只能执行一次。固件还要告诉 App:这个动作已经可用。

01 / 代码逻辑

测试通过

说明电脑上可验证的代码逻辑符合当前测试。

02 / 固件文件

构建通过

说明源码能生成可写入开发板的固件文件。

03 / 写入设备

烧录成功

说明固件文件已经写入目标开发板。

04 / 真实效果

功能成功

说明真实按键、通道与 App 共同完成了目标动作。

07让动作通过有线或无线发送

开始前先看清

有线连接与无线连接

USB 是有线连接,BLE 是低功耗蓝牙无线连接。两种连接都发送同一个 UUID;同时连接时,同一次按键也只能发送一次。

继续使用现有发送路径

固件项目已经有把消息送到电脑的路径。这一步让 AI 把新动作接进去,不重新设计连接方式,也不要求理解内部的队列、路由或 GATT。

AI 会核对这三个值 · 不用背

Report ID 0x11 · kind 0x05 · UUID 36 bytes
0x11

0x 表示十六进制写法;这里是报告类型的固定编号,只需准确核对,不要求换算。

0x05

应用动作的固定类别编号。0x04 已经用于状态响应,不能拿来表示 Host Action。

36 bytes

标准 UUID 的 36 个英文字符会占 36 字节;数据区不带 host_action: 前缀。

整句意思:发送一条编号为 0x11 的报告,里面装的是 0x05 类应用动作和 36 字节 UUID。63 字节是现有消息容器,Host Action 的有效数据仍然只有这 36 字节。

01 / 现在做什么

让 AI 把已经通过电脑检查的动作,接进项目现有的有线和无线发送路径。两条路发送的内容必须完全一样。

02 / 为什么做

复用既有消息通道可以减少新协议面;同时必须沿用工程原本的 USB/BLE 选择逻辑,避免双连接双发。

03 / 直接复制给 AI · 不用逐字读
继续读取已记录的 Host Action v1 合同和当前实现,把动作最小接入工程现有的 App Command 发送链路。复用同一份编码结果:Report ID 0x11、kind 0x05、chunk index 0、total chunks 1、data length 36,线上只放无前缀 UUID;0x04 仍只用于状态响应。USB 与 BLE 要使用同一内容,并沿用项目现有的单通道选择,不能双连接双发,也不要用 App 去重掩盖固件问题。队列、路由、函数和文件名以当前代码为准,不强行套用示例结构。补齐共享编码、事件分发和路由的可测证据,运行定向测试和全部宿主测试,再用 project-flow-cy 记录调用链、修改和未验证项。不要增加能力声明,不改 HID/GATT、设备身份、硬件或分区,不烧录。
04 / 应该看到什么
  • 有线和无线共用同一份动作内容,没有各写一套。
  • 有线可用时只用有线,否则才用无线;一次按键不会发送两次。
  • 原有状态消息和普通键盘功能仍然通过检查。
  • 这一步还只是代码证据,不代表真机已经打开应用。
05 / 没看到就停在这里

如果有线和无线各写了一套动作内容,或两种连接同时存在时可能执行两次,就先停下修正。如果 AI 把电脑检查说成真机成功,也不进入下一步。

08让 App 知道固件已经支持这个动作

开始前先看清

支持标记(能力声明)

固件会给 App 一份功能清单。这里增加一个“已经支持打开应用动作”的标记,让 App 知道这个功能可以使用。

无线状态消息的大小上限

新增标记以后,固件发给 App 的状态消息仍不能超过原有的 512 字节空间。具体怎样压缩和计算交给 AI,不能为塞进新字段随意删除原有内容。

AI 会这样读取 · 不用背

"host_action_v1": true
"host_action_v1"

功能名称;v1 表示这套消息约定的第 1 版。

:

把左边的功能名称和右边的支持状态分开;双引号与冒号需要保留。

true

布尔值,也就是只有“是/否”的开关值;这里表示“支持”。它不是带引号的普通文字。

整句意思:固件告诉 App:“我支持第 1 版 Host Action。”

01 / 现在做什么

让 AI 在固件的功能清单中加入“已支持打开应用动作”的标记,再检查加完后的无线状态消息是否还放得下。

02 / 为什么做

App 需要先知道固件已经支持这个动作,才能正确开放功能。新标记还不能挤掉原有的电源和扬声器状态。

03 / 直接复制给 AI · 不用逐字读
继续完成 Host Action v1 的能力声明。先枚举当前工程真正会发布的能力状态和 BLE 状态变体;若已经存在等价实现,先验证再补缺口。把布尔值 "host_action_v1": true 加入所有实际需要的能力声明路径,保持状态响应 kind 0x04 与 Host Action kind 0x05 分工不变。为每个真实发布变体测量最终 UTF-8 字节数,并证明不超过 512 字节。若新增字段导致超限,只按仓库现有字段语义做最小收缩:保留当前电源事实、扬声器必要指标和既有能力,优先省略可选诊断或历史信息;无法确认字段是否可选时停止并返回超限变体和字节数,不能猜测、提高上限或删掉必要信息。状态名称、构造路径和测试名以当前代码为准,不复刻某次试跑的临时修复。运行定向测试和全部宿主测试,用 project-flow-cy 记录实际变体、最大字节数、修改和未验证项。不构建、不烧录,不改协议、HID/GATT、设备身份、硬件或分区。
04 / 应该看到什么
  • AI 确认固件所有对外功能清单都带上了支持标记。
  • 每种真正会发出的无线状态都不超过 512 字节。
  • 电源和扬声器的必要信息仍然保留,原有功能继续通过检查。
05 / 没看到就停在这里

过程中可能先看到“消息太大”的失败,原提示词已经告诉 AI 怎样收紧可选内容,让它继续修复并重跑即可。如果最终仍超过 512 字节,或原有的电源、扬声器信息被删掉,就停在这里,不自己另编新格式,也不只改检查来制造通过。

09确认代码通过检查并生成固件

开始前先看清

当前清单全部通过

测试总数以本轮 CTest 实际发现的清单为准。只有发现数、执行数和通过数一致,才能说明全部电脑检查通过;它仍不代表开发板已经写入新固件。

生成的固件文件

AI 会把代码变成可以写入开发板的文件,并检查文件大小和警告。文件成功生成以后,下一步仍要先核对改动范围。

01 / 现在做什么

让 AI 用当前代码重新运行全部电脑检查,再重新生成固件。不使用前面步骤留下的旧结果或旧文件。

02 / 为什么做

局部测试只证明局部逻辑;完整测试与构建要确认新增功能没有破坏工程其余部分,并能生成固件。

03 / 直接复制给 AI · 不用逐字读
继续在当前 Maker 工程完成软件侧总验收,不烧录或运行 App。重新发现当前 CTest 清单并执行全部宿主测试,不写死测试名称或数量;完成门是发现数、执行数和通过数一致且失败数为 0,并能从测试内容证明协议、八键、单通道路由和能力状态都已覆盖。数量或名称与旧记录不同,先解释真实差异。失败时定位最早失败,只在固定协议和硬件边界内做最小修复并重跑;需要改变固定合同、设备身份或硬件配置时停止。测试全部通过后,使用 esp-idf-cy 读取并激活仓库声明的 ESP-IDF 版本与目标,完成默认构建;课程基线曾用 5.5.5/ESP32-S3 验证,但当前执行以仓库的版本化声明为准。最后用 project-flow-cy 记录测试清单和数量、实际工具版本与目标、产物路径和大小、分区余量、警告、修复和未验证项,并分开说明测试、构建、烧录、真实功能四类证据。
04 / 应该看到什么

AI 列出的测试发现数、执行数和通过数完全一致,失败数为 0;固件生成成功,并给出新固件的位置和大小。此时只能说“代码通过并产生了固件”,还不能说真机功能已经成功。

05 / 没看到就停在这里

测试清单对不上、发现数/执行数/通过数不一致、存在失败,或固件生成失败,就先查明原因。不跳过检查凑数字,也不改工具版本来掩盖问题。

PHASE 04 · WRITE & TRY

确认改动后写入开发板,
再亲手按下按键

先检查 AI 到底改了什么,再确认眼前连接的就是目标开发板。写入后亲手检查有线、无线、重复执行和原有按键功能。

10确认 AI 只改了该改的地方

开始前先看清

改动清单(diff)

它会把 AI 实际增加、删除和修改的内容列出来。这一步要确认所有变化都与打开应用动作有关,没有碰硬件连接、设备身份或其他无关功能。

通过/有问题/还不能确认

工程记录可能写成 PASS、FAIL、UNKNOWN。只有每一项都有证据确认通过,才可以进入写入开发板;任何有问题或还不能确认的项目都先停下。

01 / 现在做什么

让 AI 列出从开始到现在所有新增、删除和修改的文件,并检查会影响构建、烧录或提交的 Git 忽略内容,逐项说明来源和用途。这一步只检查改动,不再修改代码。

02 / 为什么做

代码检查通过,不代表 AI 只改了该改的地方。写入开发板前,要让真实改动、会影响结果的生成内容和实际构建配置互相对上;与构建、烧录和提交无关的缓存不需要逐个清点。

03 / 直接复制给 AI · 不用逐字读
继续在当前 Maker 仓库做烧录前只读审计,不改代码、配置或测试,也不访问设备和 App。读取课程起点、flow/ 记录、当前 Git 状态和真实 diff,列出全部 staged/unstaged/untracked 变化;对 Git 忽略内容,只列出可能影响构建、烧录或提交的顶层路径,不要求清点无关缓存。逐项说明来源和用途,无法解释就标为 UNKNOWN。使用 easyinput-board-cy 核对:硬件引脚、BOOT 与电源规则未变;目标、分区和有效构建配置仍来自受版本控制的工程声明;USB/BLE 身份和 HID/GATT 未变;Host Action 仍符合 0x11/0x05/0/1/36、无前缀 UUID 和单通道不双发;固件未保存应用信息或生产 UUID,也未新增隐私日志;无关功能没有异常改动。生成物或托管依赖只需与当前锁文件和构建元数据对得上,不强制使用某个目录名。运行 git diff --check,并给每项结论标 PASS/FAIL/UNKNOWN。只有影响范围内的变化都可解释且禁止项全为 PASS,才记录 SAFE_TO_REQUEST_FLASH=YES;否则停止并指出证据。最后仅用 project-flow-cy 记录审计,不自动删除或回退任何文件。
04 / 应该看到什么

所有 Git 变化都被列出并归类;会影响构建、烧录或提交的 ignored 内容也有来源证据。托管依赖、实际构建配置和锁定文件互相吻合,硬件、存储布局、设备身份和无关功能都确认未改。AI 最后明确说“可以进入写入确认”,但此时还没有写入开发板。

05 / 没看到就停在这里

真实改动或会影响构建、烧录、提交的生成内容说不清,或硬件和设备身份有变化,都不写入开发板。先保留清单和问题位置,再决定怎样修正。

11确认目标板后,把固件写进去

开始前先看清

先确认目标板,再写入

写入会覆盖开发板里当前运行的固件。AI 必须先显示连接位置、芯片和设备编号,等人确认是目标板以后才能继续。

连接失败时才短按 BOOT

工具无法自动连接时,只能让开发板保持开机,短按并松开一次 BOOT。正常开机后看不到串口,不一定代表启动失败;下一步还会从 App、有线设备或无线连接继续确认。

01 / 现在做什么

让开发板保持开机,用可传数据的 USB 线连接电脑,再把提示词复制给 AI。AI 会先显示它识别到的开发板和准备写入的固件,然后停下等你确认。

02 / 为什么做

写入会覆盖开发板现在的固件,所以必须先确认“是这块板、是这个文件”,再由人明确授权。写完后看不到下载用的连接口,也不一定代表失败。

03 / 直接复制给 AI · 不用逐字读
继续在当前 Maker 工程完成“只读验身 → 人工确认 → 写入 → 正常重启”。先读取最新测试、构建和审计记录;若源码或构建配置在审计后变化,分别返回 REAUDIT_REQUIRED 或 REBUILD_REQUIRED 并停止。使用 esp-idf-cy 读取工程声明的 ESP-IDF 版本、目标和待写入产物,使用 easyinput-board-cy 核对 EasyInput V2.0 身份与 BOOT 规则。只读扫描候选端口并确认 ESP32-S3 和 MAC;多设备、芯片不符或身份不清时停止,不猜端口。确认后先显示写入授权卡:端口、芯片、完整 MAC、工程版本/目标、产物和烧录命令;完整 MAC 只在当前对话显示,项目记录仅保留后四位。等待我原样输入“确认烧录到 XXXX”,未收到精确确认前不得写入。确认后重验同一 MAC,再按项目正常流程用显式端口烧录,不执行 erase_flash,不改分区、偏移或设备身份。自动连接失败时,唯一允许的实体操作是“保持开发板开机,短按并松开一次 BOOT”,随后只重试一次;不要按住上电,也不要使用 RESET。写入成功后提示我用板上开关完全关机,再不按 BOOT 正常开机;只做一次不写设备的 USB HID/BLE/App 可见性观察,未看到时记为 UNKNOWN,不重新烧录。用 project-flow-cy 遮罩记录过程,分别返回 DEVICE_CONFIRMED、FLASH_WRITTEN、NORMAL_POWER_CYCLE_CONFIRMED、POST_FLASH_READY 和 FUNCTION_VERIFIED;本步前三项必须为 YES,FUNCTION_VERIFIED 保持 NO。
04 / 应该看到什么
  • AI 先显示目标开发板、将要写入的固件和唯一确认句,此时还没有写入。
  • 你原样输入 确认烧录到 XXXX 后,AI 才开始写入,并明确显示写入和校验成功。
  • 写完后用板上开关完全关机,再不按 BOOT 正常开机。这里只确认固件已写入,最终功能留到下一步。
05 / 没看到就停在这里

目标板不确定、固件不是最新检查过的文件,或你还没有输入完整确认句时,都不能写入。自动连接失败时,只在开机状态短按并松开一次 BOOT;还是失败就停止,不连续重试。

12按下按键,确认应用真的打开

开始前先看清

只保留一种连接来检查

先只接有线,再只接无线,各按一次。这样能分别确认两条连接都正常;两条同时连接时,还要确认同一次按键不会执行两次。

App 明确显示配置已经保存

“配置已发送”只表示内容离开了 App。只有 App 明确确认开发板已经保存同一份配置,才开始按键检查;具体消息编号和内容指纹交给 AI 核对。

01 / 现在做什么
  1. 先确认上一步已经写入成功,开发板也已正常重新开机;如果还看不到设备,先检查 App、有线或无线连接,不重新写入。
  2. 打开从 EasyInput 官网获得的正式 App,只保留这一个实例运行。课程完整复验使用过 0.1.26;如果实际小版本不同,先确认它仍能识别开发板,并且“按下动作”里能选择“打开应用”,不用只为匹配数字降级。
  3. 为一个按键选择“打开应用”,再选一个容易观察的应用,例如计算器或备忘录。点击同步,等 App 明确显示开发板已经保存;UUID 由 App 自动生成,不需要手动输入。
  4. 保持 App 运行,再按下页七项逐一检查。
02 / 为什么做

“开发板已连接”只证明连接可用,不代表 App 已经知道这个键要打开哪个应用。只有 App 保存好对应关系,并明确确认开发板已收到,才能开始按键检查。

03 / 直接复制给 AI · 不用逐字读
继续在当前 Maker 工程完成正常模式连接、App 配置同步和真实功能验证,不再烧录或修改固件。先确认 DEVICE_CONFIRMED、FLASH_WRITTEN、NORMAL_POWER_CYCLE_CONFIRMED 都为 YES;再通过 EasyInput App、USB HID 或 BLE 建立正常模式连接,不能用串口是否出现代替。只运行一个从 EasyInput 官网获得的正式 App 实例,记录实际版本;课程完整复验使用过 0.1.26,但不要仅因小版本号不同就判定失败。真正的入口门是当前 App 能识别开发板、按下动作里有“打开应用”、设置通道可用,并能明确显示配置已保存或同步已确认;缺少任一能力时停止并说明当前版本和缺口,不手写 UUID、不改 App、也不重新烧录。入口成立后,由 App 为一个实体键建立“UUID → 本机应用”映射并同步,UUID 由 App 生成。先以界面明确确认作为保存证据;若界面不清楚,再读取当前工程和当前 App 可见诊断,核对实际配置确认链路,不强行套用旧版本的内部字段名。只允许断开重连当前通道一次并重试同步一次,仍未确认就停止。同步确认后逐项记录七项:USB-only、BLE-only、双连接不双发、按下一次只触发一次、松开不重复、原有复制/粘贴/快捷键/固定文字正常、目标应用实际打开。每项由我观察,不能推测。最后用 project-flow-cy 记录条件和结果;只有同步确认且七项全通过,才返回 FUNCTION_VERIFIED=YES。
04 / 应该看到什么

开始七项检查前:开发板已正常连接,当前只运行一个官网正式 App 实例;无论小版本号是多少,动作列表都能选择“打开应用”,App 也明确显示开发板已经保存配置。下面七项要分别记录结果,不用一项成功代表全部通过。

01USB-only 能触发目标动作观察结果
02BLE-only 能触发目标动作观察结果
03USB/BLE 双连接不双发计数一次
04按下一次只产生一次动作计数一次
05松开不重复触发计数一次
06复制、粘贴、快捷键与固定文字仍正常检查旧功能
07EasyInput App 实际打开所选本机目标应用最终结果
05 / 没看到就停在这里

开发板看不到时,先停在连接检查,不重新写入。App 来源不明、没有“打开应用”,或同时开着两个实例时,先把 App 环境理清。App 一直没有确认开发板已保存时,只重连并重试一次;仍然失败就保留现场。不手写 UUID,也不从头盲目重写固件。

Vibe Coding 不是把判断交给 AI,
而是让 AI 缩短抵达第一条真机证据的距离。