## 前言
今天花了一小时,创建一个可以把自然语言秒变子弹笔记格式的 OpenClaw Skill——`bujo`。
效果长这样:
```
bujo:下班前给领导回电话
→ • 下班前给领导回电话
bujo:今天上午要给孪生体项目开早会
→ ○ 主持孪生体项目早会(10:00)
```
一行指令,直接出结果,不废话。
## 一、背景与需求
### 1.1 为什么需要这个 Skill?
做子弹笔记(Bullet Journal)是很好的习惯,但每次都要手动想符号、调整格式,挺烦的。尤其是工作一忙,根本懒得开 Notion 或者手写。其实还有本人写东西比较啰嗦,在本上写,一写写一大段,特别没有子弹笔记的感觉。因此还是很需要这个功能的。
**核心需求**:说一句话,自动吐出标准格式的子弹笔记。
### 1.2 技术挑战
- **纯提示词驱动**:不想写脚本,希望 Skill 完全靠 AI 理解规则来工作
- **触发词设计**:如何让 OpenClaw 准确识别「这句话是子弹笔记转换」而不是「普通聊天」
- **极致精简**:输出要短、一行一条,不能 AI 味太重
## 二、解决方案设计
### 2.1 整体思路
做纯提示词 Skill,不依赖任何外部脚本或 API。OpenClaw 识别到触发词后加载 Skill 规则,直接输出改写结果。
### 2.2 触发词设计
第一版用了「记一笔」作为触发词,但 OpenClaw 的描述匹配不够精准,改成了更明确的关键词:
```
bujo、/bujo、BuJo、bullet journal、子弹笔记格式化、整理成子弹笔记
```
## 三、核心代码实现
### 3.1 SKILL.md(核心提示词)
```markdown
---
name: bullet-journal
description: |
子弹笔记(Bullet Journal)格式转换。将自然语言句子改写成标准子弹笔记格式。
触发场景:用户说 bujo、/bujo、BuJo、bullet journal、子弹笔记格式化、整理成子弹笔记 时激活。
---
# Bullet Journal
## 符号规则
| 符号 | 含义 | 示例 |
|------|------|------|
| `•` | 待办任务 | • 开发后端接口 |
| `○` | 行程事件 | ○ 主持孪生体项目早会(10:00) |
| `—` | 纯笔记 | — 发现并发锁 bug |
| `*` | 优先级 | * 【重要】周五前提交测试报告 |
| `✕` | 已完成 | ✕ 修复登录接口 bug |
## 改写规则
1. **极致精简**:省略主语、虚词、冗余修饰,一行一条
2. **保留核心语义**,贴合工作场景
3. **时间处理**:自然语言时间 → HH:MM 格式
4. **仅输出改写结果**,不额外解释
```
## 四、遇到的问题与解决方案
### 4.1 问题:PowerShell 路径含版本号导致字符串解析失败
**现象**:
OpenClaw skill creator 的 `package_skill.py` 路径包含 `v0.2.23.532`,PowerShell 和 Python `-c` 参数都对含反斜杠+版本号的路径字符串解析报错:非法字符、字符串截断等。
**原因**:
PowerShell 对 `D:\LEO\bin\QClaw\v0.2.23.532\...` 路径中的 `.` 数字版本号和反斜杠组合存在解析歧义。
**解决方案**:
把打包脚本内容读出来,用 Python 写到干净路径(`C:\Users\...\AppData\Local\Temp\_tw_pkg.py`),再执行,绕过所有 PowerShell 转义问题。
### 4.2 问题:Windows GBK 编码导致 emoji 输出报错
**现象**:
`package_skill.py` 中含有 `📦` 等 emoji,`print()` 在 Windows GBK 环境下报 `UnicodeEncodeError`。
**原因**:
Windows 默认控制台编码是 GBK,不支持 emoji 字符。
**解决方案**:
在 Python 脚本开头强制重定向 stdout 编码:
```python
import sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')
```
## 五、Skill 创建完整流程
### 5.1 目录结构
```
bullet-journal/
├── SKILL.md # Skill 定义文件(核心)
├── README.md # 用户使用文档
└── LICENSE # MIT 许可证
```
### 5.2 SKILL.md 编写要点
`description` 字段是 OpenClaw 判断是否调用 Skill 的唯一依据,**必须包含所有触发场景**,格式越具体越好。
### 5.3 打包安装
直接压缩为 `.skill` 文件即可:
```python
import zipfile
with zipfile.ZipFile('bullet-journal.skill', 'w') as zf:
for root, dirs, files in os.walk('bullet-journal'):
for file in files:
fp = os.path.join(root, file)
zf.write(fp, os.path.relpath(fp, 'bullet-journal'))
```
## 六、开源仓库
🎉 **GitHub 仓库地址**:https://github.com/zhangle231/bullet-journal-skill
### 6.1 安装方法
**方法一:通过 OpenClaw**
```bash
skills install https://github.com/zhangle231/bullet-journal-skill
```
**方法二:手动安装**
下载 `.skill` 文件,拖入 OpenClaw 窗口即可。
### 6.2 使用示例
```
bujo:下班前给曹总回电话
→ • 下班前给曹总回电话
bujo:【重要】周五前要提交测试报告
→ * 【重要】周五前提交测试报告
bujo:刚才修好了登录接口的一个 bug
→ ✕ 修复登录接口 bug
```
## 七、总结与展望
### 7.1 技术要点回顾
1. **纯提示词 Skill 是可行的**:不需要写脚本,SKILL.md 就是全部
2. **触发词要具体**:`description` 字段决定 AI 是否识别,这是核心
3. **Windows 环境做好 UTF-8 适配**:GBK 编码问题很常见,提前处理
4. **打包用 zipfile 最稳**:不依赖外部工具
### 7.2 可以改进的地方
- [ ] 支持多行批量输入
- [ ] 输出加日期前缀(如 `2024-06-01 •`)
- [ ] 支持导出到本地 markdown 文件