Files
blackbird/aibox/SKILLS_FORMAT.md
T
qing 457bb900fb fix(aibox): round-5 audit batch K - max_turns clamp, task input validation, XSS hardening, atomic writes, broadcast timeout
第五轮审计(J1~J16)全量修复 + 子代理 max_turns 钳制:
- 子代理 max_turns 钳制(0/None 回退默认 10,负数钳制 1)+ 14 项回归测试
- J1 任务系统投毒:add_memo 入库校验(时间/间隔/类型)、调度器预检与触发事务
  防御、展示路径兜底、register 移入 try、add_user_task 补 repeat_end_time 透传
- J2/J13 前端 XSS:三页面 marked 输出经 DOMPurify 净化、entry1 系统消息/任务
  分隔条改 textContent、CDN 脚本补 SRI
- J3 FTS 删除换序(先 fts 后内容表,索引不再残留)
- J5 原子写推广:新增 common/atomic.py(mkstemp+fsync+os.replace),config/prompt/
  history 全部接入;损坏配置备份后回退
- J6 单例初始化加锁(PromptManager/ConfigManager 并发首例不双重加载)
- J7 broadcast 并发发送 + wait_for 超时回收僵死连接
- J4/J8/J9~J12/J14~J16:验证异常脱敏、交互输入容错、MemoDatabase WAL+busy_timeout、
  memo 批量删除、/new 竞态、skills 引号转义、voice_client 清理、死代码移除、
  skill_manager 同名键/help 截断
2026-08-19 07:01:13 +08:00

241 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Aibox 扩展技能格式规范
本文档定义扩展技能的文件结构、接口约定和编写规范,供开发者与 AI 智能体参考。
## 概览
技能存放于 `~/.aibox/skills/` 目录,系统启动时自动扫描加载,运行时可通过 `reload_skills` 热重载。技能分为两种类型:
| 类型 | 识别方式 | 用途 |
|------|---------|------|
| 可执行技能 | 非 `.md` 文件,具有可执行权限 | 命令行工具,通过 `run_command` 调用 |
| Markdown 技能 | 以 `.md` 结尾 | 知识文档,AI 直接阅读并遵循 |
文件名仅允许字母、数字、下划线 `_` 和连字符 `-`,以 `_` 或 `.` 开头的文件会被忽略。
---
## 可执行技能
可执行技能是标准的命令行程序,系统仅依赖一个接口约定:**必须支持 `--help` 参数**。系统通过执行 `<skill> --help` 获取技能摘要和使用说明,不需要实现 `--description`、`--parameters`、`--execute` 等额外接口。
### 接口约定
系统按以下规则提取技能信息:
1. 执行 `<skill_path> --help`,超时上限 10 秒
2. 取 stdout 的第一个非空行作为**摘要**(若 stdout 为空则回退到 stderr)
3. 完整的 `--help` 输出作为技能**内容**,供 `search_skills` 展示
因此,`--help` 输出的第一行必须是一句简洁的功能描述,后续内容是完整的参数说明和使用示例。
### Python 技能模板
```python
#!/usr/bin/env python3
"""
技能模块内部说明(可选,不影响系统识别)
"""
import argparse
import sys
def main():
parser = argparse.ArgumentParser(
description="一句话功能摘要 —— 这是 --help 的第一行输出",
epilog="""
参数说明:
-x, --xxx 参数含义说明
-y, --yyy 另一个参数说明
使用示例:
my_skill -x value # 基本用法
my_skill -x value -y 10 # 组合用法
""",
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument("-x", "--xxx", type=str, required=True, help="参数说明")
parser.add_argument("-y", "--yyy", type=int, default=10, help="参数说明 (默认 10)")
args = parser.parse_args()
# --- 业务逻辑 ---
print(f"执行结果: xxx={args.xxx}, yyy={args.yyy}")
if __name__ == "__main__":
main()
```
### 关键要素
**Shebang 行**:Python 脚本使用 `#!/usr/bin/env python3`,Shell 脚本使用 `#!/bin/bash`。
**argparse `description`**:这是系统识别的技能摘要,必须是一句话,精准概括技能功能。它直接决定 AI 能否在 `search_skills` 时正确匹配到这个技能。
**argparse `epilog`**:包含两部分内容——参数说明和使用示例。使用 `RawDescriptionHelpFormatter` 保持排版原样输出。
**错误处理**:向 stderr 输出错误信息,以非零退出码退出。正常结果输出到 stdout。
```python
# 正确做法
print("错误: 参数无效", file=sys.stderr)
sys.exit(1)
# 避免
print("错误: 参数无效") # 会混入 stdout,污染正常输出
```
**退出码约定**:
| 退出码 | 含义 |
|--------|------|
| 0 | 执行成功 |
| 1 | 参数错误或一般性失败 |
| 其他 | 自定义错误码 |
### Shell 技能模板
```bash
#!/bin/bash
# 用法通过 --help 输出
if [ "$1" = "--help" ]; then
echo "一句话功能摘要"
echo ""
echo "用法: my_skill [选项]"
echo ""
echo "选项:"
echo " -n NAME 指定名称"
echo " -h 显示帮助"
echo ""
echo "示例:"
echo " my_skill -n hello"
exit 0
fi
# --- 业务逻辑 ---
echo "执行结果"
```
---
## Markdown 技能
Markdown 技能是纯文档型技能,AI 阅读其内容后按指引行事,无需执行。
### 格式约定
```markdown
一句话功能摘要(首行,# 前缀会被自动去除)
## 技能说明
详细的功能描述、使用场景、操作步骤...
## 注意事项
需要特别关注的点...
```
系统提取第一个非空行作为摘要。若首行以 `#` 开头(如 `# 代码审查指南`),会自动去除 `#` 前缀,取 `代码审查指南` 作为摘要。其余全部内容为技能正文。
### 适用场景
Markdown 技能适合不需要代码执行的知识型内容:操作规范、审查清单、决策指引、回答模板等。
---
## 部署流程
### 开发阶段
源码保存在项目的 `skills/` 目录下,保留文件扩展名(`.py`、`.sh`、`.md`)便于开发维护。
### 安装到系统
部署到 `~/.aibox/skills/` 时需要去掉可执行技能的扩展名,并赋予执行权限:
```bash
# 手动安装
cp skills/my_skill.py ~/.aibox/skills/my_skill
chmod +x ~/.aibox/skills/my_skill
# 验证
~/.aibox/skills/my_skill --help
```
Markdown 技能保留 `.md` 扩展名直接复制。
### 通过 AI 安装
告诉 AI 使用 `install_skill` 工具,按指引操作:
```
使用 install_skill 工具安装 /path/to/my_skill.py
```
### 热重载
安装后调用 `reload_skills` 使新技能生效,无需重启服务:
```json
{
"type": "message",
"content": "使用 reload_skills 重载技能"
}
```
---
## 调用方式
AI 智能体通过 `search_skills` 搜索技能,通过 `run_command` 执行技能:
```json
// 1. 搜索
{"tool": "search_skills", "args": {"keyword": "邮件"}}
// 2. 执行
{"tool": "run_command", "args": {"command": "163mail --to user@example.com --subject 标题 --body 内容"}}
```
Markdown 技能不通过命令执行,AI 阅读 `search_skills` 返回的内容后直接遵循其中的指引。
---
## 编写建议
**摘要要精准**。`description` 是 AI 匹配技能的唯一线索。"温度转换工具 - 摄氏度转华氏度" 比 "一个转换工具" 好得多,因为 AI 能通过关键词准确命中。
**参数命名要直观**。优先使用有明确含义的长参数名(`--channel`、`--temperature`),短参数名(`-c`、`-t`)作为补充。
**输出要结构化**。结果输出到 stdout,错误输出到 stderr。多字段输出时每行一个字段,便于 AI 解析:
```
AIN0: +2.500000 V (2500.000 mV)
AIN1: +1.234000 V (1234.000 mV)
```
**依赖要自包含**。尽量使用标准库,若需要第三方库,在启动时检测并给出安装提示:
```python
try:
import requests
except ImportError:
print("错误: 需要 requests 库,请执行: pip install requests", file=sys.stderr)
sys.exit(1)
```
**`--help` 要完备**。包含参数说明和使用示例两部分。AI 通过阅读 `--help` 输出学会如何调用技能,信息越完整,AI 调用越准确。
---
## 安全边界(J12,审计 2026-08-19)
**技能即可信代码**。可执行技能由 AI(可被网页内容/用户消息诱导)以子进程方式运行,参数为不可信输入:
- **参数必须经 shell 引号转义**:凡技能内部把参数拼进 shell 命令/脚本串(subprocess shell、PowerShell、python-nmap 等内部拼串库),一律先 `shlex.quote`(POSIX)或对应语言转义(PowerShell 单引号翻倍)
- **禁止把凭据嵌入命令行参数**:命令行参数对同机进程可见(`ps`);密码/令牌应经环境变量或配置文件传递
- **ssh/sftp 类技能**:`AutoAddPolicy` 信任任意主机密钥存在 MITM 风险,仅限可信网络使用;生产环境改用 `known_hosts` 校验
- 内置技能示例(`skills/`)已按此规范处理;新增技能请遵守同一条例