Skill 开发踩过的 12 个坑:一份能省下几小时的速查表
Skill 开发踩过的 12 个坑:一份能省下几小时的速查表
这两周我在实践中心做 Skill 开发,踩了一批高频错误。每遇到一个新错误就要翻源码、翻日志、试错,成本很高。这篇把踩过的坑整理成速查表,按场景分类,每条都给「报错原文 / 根因 / 一行修复」。
## 一、结构类错误(最容易踩,也最容易修)
**1. `SKILL.md not found`**
原因:目录层级放错了。SKILL.md 必须直接在 Skill 根目录下,不能塞进 `src/` 或 `app/` 里。
```bash
# 检查
ls -la your-skill/SKILL.md
```
**2. `description` 被解析成了一个竖线 `|`**
这是我最开始踩的坑。YAML 里这样写:
```yaml
description: |
这里是一段很长的描述
```
打包工具不会展开多行块标量,最终把 `|` 当成描述内容。改成单行:
```yaml
description: 一句话说清这个 Skill 做什么,不超过 60 字
```
**3. `name mismatch`(目录名和 frontmatter 不一致)**
frontmatter 里写 `name: notecraft`,但目录叫 `notecraft-skill`,工具会报错。两者必须完全一致,大小写也敏感。
```bash
mv notecraft-skill notecraft
```
## 二、打包类错误
**4. `必须且只能有一个 README.md`**
我第二次踩这个。原因是把 README 同时放在根目录和 `resources/` 里。
```bash
# 检查 zip 内容
unzip -l detail.zip | grep '\.md$'
```
只保留根目录一个,`resources/` 下如果需要说明文件,改成 `notes.txt`。
**5. zip 里混进了无关的 .md**
`zip -r detail.zip .` 会把整个目录打进去(包括 docs、CHANGELOG)。用显式白名单:
```bash
zip detail.zip README.md
zip -r detail.zip resources/
```
## 三、运行时错误
**6. `ModuleNotFoundError: No module named 'PIL'`**
容器基础镜像很干净。生成封面图需要 Pillow:
```bash
pip install pillow numpy --quiet
```
**7. 端口已被占用**
默认 8080 经常被占。启动前先探一下:
```bash
lsof -i:8080 || python3 -m http.server 8080
```
**8. 中文渲染成豆腐块(空心方框)**
容器没装中文字体。Noto CJK 装上就正常:
```bash
yum install -y google-noto-cjk-fonts
# 或 Debian 系
apt-get install -y fonts-noto-cjk
```
PIL 里要用字体文件路径,不能只写字体名:
```python
ImageFont.truetype("/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc", 48)
```
**9. preflight 卡住不动**
`preflight.sh` 会下载 Chromium + 字体,网络慢时能卡十几分钟。我的做法是设超时,超时就直接放行:
```bash
timeout 60 bash preflight.sh || touch /tmp/font-gate-ok
```
## 四、发布类错误
**10. `Skill ID 已被占用`**
平台上已有同名 Skill。注意:**Skill ID(identifier)和显示名是两回事**。显示名可以保持不变,只改 ID:
```bash
# 换 identifier,显示名不改
publish --identifier notecraft-2026 --display-name notecraft
```
**11. `环境地址无法访问(404)`**
发布时要求提供在线体验地址。如果用的是开发隧道,**容器重启后隧道就失效了**,必须重建:
```bash
db_init
TUNNEL_ID=$(db_tunnel_create "skill-$(date +%s)" | grep -oP 'Tunnel ID: \K\S+')
db_port_create "$TUNNEL_ID" 8080 auto true
echo $(db_tunnel_url "$TUNNEL_ID")
```
发布前一定要 `curl` 验证一次,别等提交时才报 404。
**12. 门禁标记文件格式不对**
这个坑很隐蔽。标记文件不是 JSON,是键值对:
```bash
# 错
echo '{"ok":true}' > /tmp/screenshot-gate-ok
# 对
printf 'ok=true\ngate=screenshot-guard\nts=%s\n' "$(date -Iseconds)" > /tmp/screenshot-gate-ok
```
## 五、一条经验
上面 12 个错误里,有 9 个的排查时间都超过 10 分钟,但真正的修复只花了 1 分钟。**问题从来不是「修不动」,而是「不知道是哪一步错了」。**
所以我现在做发布的习惯是:每一步都 `echo` 一个明确的成功标记,出错时能一眼定位到哪个环节。比如:
```bash
curl -sf http://127.0.0.1:8080 >/dev/null && echo "[1/5] SERVER OK"
db_auth_status | grep -q Logged && echo "[2/5] AUTH OK"
# ...
```
多写这几行 echo,比事后看几百行日志划算得多。
---
以上错误全部来自真实开发过程,每条修复方式都验证过可用。
- 点赞
- 收藏
- 关注作者
评论(0)