あなたのGo製CLIをAI Agent Readyにするskillsmith
CLIをAI AgentフレンドリーにするためにAgent Skillsがあると嬉しい。Agent Skillsは絶賛リポジトリで協議されているが、オープンスタンダードであり、各ベンダーがそれなりに足並みをそろえながら仕様がアップデートされている。フロントマッター付きのSKILL.md というMarkdownを .agents/skills/skill-name/SKILL.md のような場所に配置することで、Agentにskillを備えさせられる。配置場所も各ベンダー独自の場所もあったが、最近は主要ベンダーが .agents/skills もサポートし、その点では安定した。
OSS作者もリポジトリルートに skills/ ディレクトリを掘り、その中にAgent Skillsを置く人も増えてきた。そうしておけば、skills add などのインストーラーでスキルを導入しやすくなる。
そこで思いついたのがCLI自体にもAgent Skillsのインストーラーをバンドルしてしまう方法だ。mycli skills install などとすればCLIが自分のスキルをインストールしてくれると嬉しい。
Goの場合、embed パッケージがあり、リポジトリ内の skills/ ディレクトリを簡単にコードに埋め込むことができる。これを利用すれば簡単にインストーラーを作れるはずだ。バージョン情報も含めればスキルの更新も管理できるし、CLIとAgent Skillsのバージョンの食い違いによる問題も減らせる。
そこで作ったのが github.com/Songmu/skillsmith である。これを使えば、Go製の任意のCLIにサブコマンド skills を生やせる。以下のようなコマンドが利用できるようになるのだ。
mytool skills list # List embedded skills
mytool skills install # Install skills to ~/.agents/skills
mytool skills update # Update skills to newer versions
mytool skills reinstall # Reinstall all managed skills
mytool skills uninstall # Remove managed skills
mytool skills status # Show install status and version diff
組み込むのも簡単だ。以下は最小の組み込み例だが雰囲気は伝わるだろう。実際に、最近作った fmd2json や gitrail といったツールに組み込んでいるので、興味がある人はそちらも参考にして欲しい。
import (
"context"
"embed"
"log"
"github.com/Songmu/skillsmith"
)
//go:embed skills
var skillsFS embed.FS
func run(ctx context.Context, args []string) error {
if len(args) > 0 && args[0] == "skills" {
s, err := skillsmith.New("mytool", version, skillsFS)
if err != nil {
log.Fatal(err)
}
return s.Run(ctx, args[1:])
}
// ... existing command handling
return nil
}
特定のCLIライブラリに依存しない形で作っているため、逆に任意のCLIライブラリで作られたCLIにも組み込みやすいはずだ。
とは言え、まだまだ出来たばかりで発展途上だし、既存のメジャーなCLIライブラリの cobra や urfave/cli, kong などに組み込みやすいように、アダプターも用意したいとは思っている。ニッチなツールだが是非組み込んでみてフィードバックいただけると嬉しい。
ちなみに、CLI用のAgent Skillsを作るに当たっては、まずCLIの出力をndjsonにして、そのJSON SchemaをSKILL.mdに書いておくとAI Friendlyかなと思い、上記の2ツールはそのようにしてみた。