Skip to contents

语言: English | 简体中文

什么是技能?

技能是存储为 <name>/SKILL.md 的可复用提示模板。用户可以输入 /name arguments 直接加载技能。模型也可以根据系统提示中的名称和描述做语义匹配, 然后调用 use_skill 工具;完整正文只在需要时加载。

本地斜杠命令优先于同名技能。特别是 /compact [instructions] 由 REPL 或 Shiny 服务器在本地处理并调用压缩控制器;它不会作为技能提示发送。包中也附带一个 compact/SKILL.md,供模型通过工具进行语义调用。

codeagent 附带的技能

当前安装包包含以下 17 个技能目录:

技能 说明
/plan 在不编辑文件的情况下生成分析和逐步实施计划
/verify 验证上一步操作的正确性与完整性
/simplify 审查并简化最近的代码或输出
/compact 请求结构化对话摘要;直接 /compact 语法使用上述本地命令
/remember 把持久信息保存到跨会话记忆
/loop 解释周期任务请求,例如 /loop 5m /verify
/document 运行包文档工作流,包括 devtools::document()
/roxygen 生成 roxygen2 文档骨架
/testthat 创建 testthat 单元测试
/style 一致地格式化和检查 R 代码
/lint 使用 lintr 与 styler 检查和整理 R 代码
/news 为发布更新 NEWS.md
/pkgdown 构建或更新 pkgdown 网站、参考索引和 vignette 文章
/explore 用自然语言探索和分析 data frame
/report 把探索会话导出为 Quarto 文档
/no-secrets 防止打印或提交密钥和具体基础设施标识
/posit-dev-packages 更新项目锁定的核心开发包并报告版本

实际列表可能更长,因为 btw、已安装包(包括 Shiny)以及用户/项目目录都会贡献技能。 可用 list_skills_meta() 检查实时列表,或在聊天中输入 / 打开斜杠命令提示。

在聊天中使用技能

# 在 Shiny 应用或 REPL 中:
/plan add a new summarise_by_group() function
/roxygen summarise_by_group
/testthat summarise_by_group

未知的 /name 会被解析为技能请求,但如果加载失败,REPL 与 Shiny 路径会保留 原始斜杠文本,并把它作为普通提示发送。直接以编程方式调用 load_skill_prompt() 时则会产生“Skill not found”错误,并列出当前可用名称。

创建自定义技能

请使用目录,而不是平铺的 Markdown 文件。支持以下用户级和项目级位置:

# 用户全局(btw 原生):
~/.btw/skills/my-skill/SKILL.md
~/.config/btw/skills/my-skill/SKILL.md

# 项目本地:
.btw/skills/my-skill/SKILL.md          # btw 原生
.agents/skills/my-skill/SKILL.md       # btw agents 目录
.claude/skills/my-skill/SKILL.md       # Claude Code 兼容
.codex/skills/my-skill/SKILL.md        # Codex 兼容

btw 还会提供其内置技能和发现到的包技能。codeagent 在此基础上补充已安装的 codeagent 技能、已安装的 Shiny 包技能,以及上述四个项目本地兼容路径。自定义 技能建议全局使用 ~/.btw/skills,项目内使用 .btw/skills

SKILL.md 格式

---
name: my-skill
description: Short description shown in skill picker
metadata:
  argument-hint: "<what to type after /my-skill>"
allowed-tools:
  - Read
  - Bash
---

Skill body — instructions for the agent.

Use $ARGUMENTS to insert the user-supplied arguments.

namedescription 是关键发现字段。当前 btw 兼容技能把 argument-hint 放在 metadata 下;即使后端省略非核心 frontmatter,codeagent 也会重新解析文件以保留 该提示。allowed-tools 会保留为技能元数据,但不会绕过中央权限门。

在正文中,$ARGUMENTS 展开为完整参数字符串;可用的 $ARG1$ARG2 及后续 占位符根据按空白分隔的 token 展开。

架构与流程

codeagent 使用 btw 进行主要发现/加载,加入兼容路径,并采用渐进披露:元数据进入 系统提示,正文按需加载。

                    用户输入 /name args
                            |
                            v
                   .preprocess_input()
        +-------------------+--------------------+
 识别出的本地命令                         否则 -> 技能请求
 (例如 /compact)                            |
        |                                      v
 由 REPL/Shiny 处理                 load_skill_prompt(name, args, cwd)
 (不作为技能提示发送)                       ^
                                                | use_skill 工具调用
 系统提示 <- build_skill_hint()                 |
 <available_skills> = 名称、描述、参数提示       |
        |                                        |
        v                                        |
      模型 -- 语义匹配 --> use_skill ------------+  .make_skill_tool()
                                                |
                                                v
             可用时 btw:::find_skill() + frontmatter 正文
             否则读取发现路径并去掉 frontmatter
                                                |
                                                v
                         替换 $ARGUMENTS 与 $ARG1 ...
                                                |
                                                v
                         注入完整正文供代理遵循

 发现与两级元数据缓存:list_skills_meta(cwd)

   内存 .skill_cache,以规范化 cwd 为键
        | 未命中或签名不匹配
        v
   磁盘 <codeagent-config>/cache/skills/<cwd-key>.rds
        | 未命中、损坏或签名不匹配
        v
   btw:::btw_skills_list()
     + btw 内置、包、用户和原生项目目录
     + 已安装的 codeagent 与 Shiny 包技能
     + cwd 下的 .btw、.agents、.claude、.codex 技能目录
        |
        v
   命名 SkillMeta 列表 -> 尽力原子写入磁盘 + 内存缓存

签名是对发现目录求和:每个目录中递归的 SKILL.md 文件数加文件修改时间。它能 检测常规的新增、删除和编辑。缓存 I/O 采用尽力而为方式:缓存缺失、损坏或不可写 时会回退到发现流程,而不会破坏技能列表。

公开签名与默认值

list_skills_meta(cwd = getwd())

load_skill_prompt(name, args = "", cwd = getwd())

build_skill_hint(cwd = getwd(), max_tokens = 1000L)

install_ds_skills(
  skill = NULL,
  scope = c("user", "project"),
  overwrite = FALSE
)

build_skill_hint() 会把生成的元数据块截断到约 max_tokens * 4 个字符。 install_ds_skills()skill = NULL 时安装精选的 Posit R/数据科学集合,使用 "all" 时安装全部上游技能,也可安装指定名称;默认作用域为用户全局。

技能发现

# 列出所有可用技能
list_skills_meta()

# 以编程方式加载技能提示
load_skill_prompt("plan", args = "add feature X", cwd = getwd())