おそらくはそれさえも平凡な日々

あなたの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

組み込むのも簡単だ。以下は最小の組み込み例だが雰囲気は伝わるだろう。実際に、最近作った fmd2jsongitrail といったツールに組み込んでいるので、興味がある人はそちらも参考にして欲しい。

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ライブラリの cobraurfave/cli, kong などに組み込みやすいように、アダプターも用意したいとは思っている。ニッチなツールだが是非組み込んでみてフィードバックいただけると嬉しい。

ちなみに、CLI用のAgent Skillsを作るに当たっては、まずCLIの出力をndjsonにして、そのJSON SchemaをSKILL.mdに書いておくとAI Friendlyかなと思い、上記の2ツールはそのようにしてみた。

created at
last modified at

2026-03-17T02:23:27+0900

comments powered by Disqus