From 77f031a8fd852ecc992113feb9e39f4892a21b56 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Fri, 30 Oct 2026 01:01:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(keil-build):=20frontmatter=20=E6=95=B4?= =?UTF-8?q?=E5=80=BC=E5=8F=8C=E5=BC=95=E5=8F=B7=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=8A=80=E8=83=BD=E6=95=B4=E4=BB=BD=E5=8A=A0=E8=BD=BD=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:今日在飞会话给 description/whenToUse 追加了新内容(「pw: 前缀」等), 但两行值为未加引号的 YAML plain scalar——其中的 ASCII「冒号+空格」让 DSH parseFrontmatter() 所用的严格 yaml 解析器报 Nested mappings 错误 → keil-build 技能整份不加载(skill() 读不到、技能目录不收录)。 js-yaml 能吃下去,拿它自检会假绿。 修复:description/whenToUse 整值加双引号(pw: 字面量原样保留), 正文护栏段同步为「要么整值双引号,要么一个 ASCII 冒号都不写」并点名 解析器与假绿坑;另有两段纯重排(护栏段前移、衔接项目符号归位)。 验证(三重):DSH 自带 yaml 包严验全仓 17 个 SKILL.md 全 PASS; skill-size 门禁 17/17 无悬空指针;skill('keil-build') 全文可读, 技能目录已恢复收录。字节卫生:无 BOM、纯 LF、无 U+FFFD。 注:本笔仅含 SKILL.md。索引中另有一笔在飞会话暂存的 uvprojx, 属 UV4 XML 归一化抖动,按 AGENTS 口径不入库,留给该会话自行处置。 --- .dsh/skills/keil-build/SKILL.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/.dsh/skills/keil-build/SKILL.md b/.dsh/skills/keil-build/SKILL.md index 1298287d..af150dae 100644 --- a/.dsh/skills/keil-build/SKILL.md +++ b/.dsh/skills/keil-build/SKILL.md @@ -15,13 +15,6 @@ whenToUse: "需要编译 Keil MDK 工程、跑 @build 验证代码改动(只 # 覆盖:--project X.uvprojx --uv4 UV4.exe --target 名字 --log 路径 --timeout 600 ``` -## 调用形态:先认执行器是哪个 shell(2026-10-26 实测) - -- 同一个 @build,PowerShell 与 bash 是两种写法:bash 侧要去掉前导 & 并把路径改正斜杠(照抄 AGENTS 的 PowerShell 形态进 ops_bash 会语法错秒退 exit 2) -- ⚠ 那个 exit 2 不是脚本的环境错误 2:stderr 含 syntax error near unexpected token = 写法问题,换 bash 形态重跑,别去查 DTU_KEIL_UV4、别当环境错误排障 -- 后台跑(run_in_background: true)要自己收码,且别把脚本接进管道:实测 $? 取到的是 tail 的码(恒 0);要看报错行就单独 grep MDK-ARM/build_log.txt -- 解析顺序:命令行 > 项目档案 .serialtest/config.json > 环境 > 探测;UV4 显式设了但路径无效 = 立即报错,不静默回退 -- 退出码 0=PASS(0错0警) / 1=构建失败 / 2=环境错误 / 3=用法 / 4=build 锁被占用;2026-10-12 修正过 2 与 3 的归属,该篇末尾记了前后口径 ⚠ **改本文件 frontmatter 要么整值加双引号,要么一个 ASCII 冒号都别写**(2026-10-30 这份就因此整份加载失败)。 DSH 用 `yaml` 包的 `parse()` 读 frontmatter(`@deepseek-ai/dsh-skill-filesystem` 的 `parseFrontmatter()`), plain scalar 里出现 **ASCII「冒号 + 空格」**(例如把报错原文 `BUILD_ENV_ERROR: UV4.exe not found` 或 @@ -30,6 +23,13 @@ column 14` → **技能整份不加载**(`skill()` 读不到、也不进技能 拿它自检会假绿,必须用 DSH 自带的那个解析器验。另 — 值首字符不能是 `%`(directive indicator)或 `&` (anchor),双引号里的 `%SystemDrive%` 之类不受影响。落盘后**让 DSH 真加载一次**再收口。 +## 调用形态:先认执行器是哪个 shell(2026-10-26 实测) + +- 同一个 @build,PowerShell 与 bash 是两种写法:bash 侧要去掉前导 & 并把路径改正斜杠(照抄 AGENTS 的 PowerShell 形态进 ops_bash 会语法错秒退 exit 2) +- ⚠ 那个 exit 2 不是脚本的环境错误 2:stderr 含 syntax error near unexpected token = 写法问题,换 bash 形态重跑,别去查 DTU_KEIL_UV4、别当环境错误排障 +- 后台跑(run_in_background: true)要自己收码,且别把脚本接进管道:实测 $? 取到的是 tail 的码(恒 0);要看报错行就单独 grep MDK-ARM/build_log.txt +- 解析顺序:命令行 > 项目档案 .serialtest/config.json > 环境 > 探测;UV4 显式设了但路径无效 = 立即报错,不静默回退 +- 退出码 0=PASS(0错0警) / 1=构建失败 / 2=环境错误 / 3=用法 / 4=build 锁被占用;2026-10-12 修正过 2 与 3 的归属,该篇末尾记了前后口径 - **bash / `ops_bash` 侧「构建到底过没过」的一次自查**(2026-10-26 实测口径):先 `cd` 到仓库根(或该 worktree 根),跑 `.venv/Scripts/python.exe .dsh/skills/keil-build/scripts/keil_build.py; echo BUILD_RC=$?` —— 正斜杠、**无前导 `&`**,退出码归 python、不归 bash;再单独读日志计数 `grep -a -E "Error\(s\)|error:|Warning\(s\)" MDK-ARM/build_log.txt`。报结论要三样齐 —— **`BUILD_RC=0` + `UV4_RC: 0` + `BUILD_OK: 0 errors, 0 warnings`**(脚本自己判「无 `error:` 行 且 尾行含 `0 Error(s), 0 Warning(s)`」);bash 吐的 `syntax error near unexpected token` **既不是构建通过也不是构建失败**,那是写法问题,别拿它当构建结论报。 > 本节全文(逐字搬移、未改写,含命令与实测数字)→ [executor-shell-forms.md](reference/executor-shell-forms.md)。动手前先读那篇。 @@ -164,10 +164,9 @@ Agent 手工 `lock acquire build` 后忘了 `release`,锁要挂到 TTL 才被 - 编码类报错(`#870-D: invalid multibyte character sequence` 等)先怀疑源文件 BOM/编码被改写,而不是代码本身(见仓库 AGENTS.md 编码铁律)。 - -- **build 锁的对面是谁**(`BUILD_LOCK_BUSY`、退出码 4、`pw:` 插件树、`@task plugin list` / `plugin adopt`、`_wt/` 台账与合并回收)归 `task-worktree` skill(F 节 = DSH worktree 插件桥);换机/新克隆时 `DTU_*` 工具路径变量的设立与「会话不继承」坑 = `new-machine-setup` skill。 ## 与其它 skill 的衔接 +- **build 锁的对面是谁**(`BUILD_LOCK_BUSY`、退出码 4、`pw:` 插件树、`@task plugin list` / `plugin adopt`、`_wt/` 台账与合并回收)归 `task-worktree` skill(F 节 = DSH worktree 插件桥);换机/新克隆时 `DTU_*` 工具路径变量的设立与「会话不继承」坑 = `new-machine-setup` skill。 - 烧录/回读 = `stlink-flash` skill;串口闭环 = `serial-boot-test` skill (其档案 `flash_cmd`/`readback_cmd` 即 stlink-flash 的入口命令)。 - 收尾固定链(2026-10-26 实证):`@build` → `scripts/ram_baseline.py --update` →