Skip to content

スキルマニフェスト

外部スキルは、manager の allow-list ディレクトリの 1 つに置かれた skill.json ファイルで記述されるサブプロセス実行可能ファイルです。ローダーは起動時にそれらのディレクトリを walk し、各 skill.json をパースし、グローバルスキルレジストリに SubprocessSkill を登録します。LLM はそのスキルを組み込みツールと並んで見ます。

真実の出所:internal/skill/loader.go

ディスク上のレイアウト

text
/etc/ongrid/skills/                  ← one entry in $ONGRID_SKILLS_EXTERNAL_DIRS
└── disk-cleaner/
    ├── skill.json
    └── run.sh                       ← the executable

skill.json は自身のサブディレクトリのトップにあります。ディレクトリツリーは再帰的に walk され、skill.json という名前のファイルはマニフェストとして扱われます。複数のスキルが同じ allow-list ルート下に住めます。

マニフェストスキーマ

json
{
  "name": "disk_cleaner",
  "description": "Free up disk by clearing stale build caches and journals.",
  "schema": {
    "type": "object",
    "properties": {
      "path":   { "type": "string", "description": "Root path to clean." },
      "dry_run": { "type": "boolean", "default": true }
    },
    "required": ["path"]
  },
  "entry": "run.sh",
  "env_allow": ["PATH", "HOME"],
  "timeout_seconds": 60,
  "class": "mutating",
  "category": "ops"
}
フィールド必須説明
namestringはいスキルキー。[a-z0-9_]+ にマッチする lower_snake であること。LLM 向け関数名になる。
descriptionstringはいヒューマン(UI)と LLM(関数 description)に表示。
schemaJSON Schemaいいえargs オブジェクトの生 JSON Schema。欠落 = 空オブジェクトスキーマ。
entrystringはい実行可能ファイルへのパス。相対パスは skill.json を持つディレクトリに対して解決。絶対パスは allow-list ルート下にある必要あり。
env_allowstring[]いいえ子に転送される env-var 名の明示リスト。空リスト = env なし(PATH さえも)"PATH" を追加して PATH をオプトイン。
timeout_secondsintいいえサブプロセスタイムアウト。ゼロは DefaultSubprocessTimeout(30s)にフォールバック。
classenumいいえsafe(デフォルト)、mutatingdangerousクラス分類 参照。
categorystringいいえ自由形式グループラベル。external がデフォルト。UI がサブプロセススキルをこれでグルーピング。

ワイヤープロトコル

サブプロセスは stdin = JSON args オブジェクトstdout = JSON 結果オブジェクトstderr = manager 用ログ行 で発動されます。

text
$ cat /tmp/args.json
{"path": "/var/cache", "dry_run": true}

$ run.sh < /tmp/args.json
{"freed_bytes": 1048576, "files_deleted": 17}

非ゼロ終了コードは失敗として扱われます。stderr はツール呼び出しイベントタイムラインに捕捉され、LLM が部分進捗を読めます。

結果オブジェクトは LLM に逐語で返されます。エージェントカーネルはこれをツール呼び出しのレスポンスとしてフォーマットします。LLM は JSON 形について推論することが期待されます。

クラス分類

同じ {safe, mutating, dangerous} 分類がネイティブスキルとサブプロセススキル両方に適用されます。

クラス何ができるか必須ペルソナパーミッション
safe読み取り専用 —— ホストやシステムへの副作用なし。read-only(任意のペルソナ)
mutating状態の作成 / 更新。可逆。mutating-with-confirm または dual-sign-required
dangerous不可逆(削除、再起動、exec-arbitrary)。dual-sign-required(SOP)

ペルソナの permission_mode フィールドが確認なしでどのクラスが動くかゲートします。エージェントペルソナフォーマット 参照。

Allow-list ルール

operator は ONGRID_SKILLS_EXTERNAL_DIRS(コロンまたはカンマ区切り絶対パス)で allow-list ディレクトリを設定します。ローダーは厳密に強制します:

  • 各ディレクトリは 絶対 パスであること。相対パスはログ行付きでスキップ。
  • 存在しないパスはスキップ(なので /etc/ongrid/skills がない新規インストールはちゃんと起動)。
  • 各マニフェストの entryfilepath.EvalSymlinks で正規化され、allow-list ルート下に住むかチェックされます。ルートの外を指すシンボリックリンクは拒否されます(entry %s escapes allowlist root %s)。

それ以上のサンドボックスはサブプロセスの責任です。スキルがタイトに封じ込められる必要があれば、entry として参照されるラッパー(bwrapfirejailnsenter)下で走らせてください。

ローダー挙動

text
LoadDirs(cfg)
  for each dir in cfg.Dirs:
    filepath.Walk(dir)
      for each skill.json found:
        parseManifest(path)
        buildSubprocessSkill(manifest, path, root)
        if skill already registered: skip (log line)
        else Register(skill)
  • マニフェストごとの検証失敗は ログされてスキップ されます。1 つの壊れたパックが起動をブロックしないように。
  • 重複名はエラーではなくスキップされます(古いマニフェストを削除する前に新しいマニフェストを投下するリデプロイで manager がクラッシュしないように)。
  • ローダーは正常に登録されたスキルの数を返します。manager 起動はスキルローダーで非ブロッキング:空の外部 dir は no-op。

起動時のログ

manager はマニフェストごとに 1 行ログします:

text
skill loader: registered subprocess skill "disk_cleaner" from /etc/ongrid/skills/disk-cleaner/skill.json
skill loader: skill "broken_one" already registered, skipping /etc/ongrid/skills/broken-one/skill.json
skill loader: parse /etc/ongrid/skills/typo/skill.json: invalid character ',' looking for beginning of object key
skill loader: build "bad_path": entry /tmp/escape.sh escapes allowlist root /etc/ongrid/skills

何が拾われたかを確認するには journalctl -u docker-compose@ongrid または docker compose logs ongrid を tail。

関連

ネイティブスキルメタデータ(SKILL.md フロントマター)

./skills/ 下で出荷される組み込みスキルは、openclaw / claude-code スキルエコシステムと相互運用するより豊かな YAML フロントマター SKILL.md フォーマットを使います。スキーマは internal/manager/biz/aiops/chatruntime/types.go で定義されています:

yaml
---
name: query_promql
description: Run a PromQL query and return the result matrix.
when_to_use: When the user asks for current or recent metric values.
activation:
  mode: always
metadata:
  os: [linux, darwin]
  requires:
    bins: []
    config: []
  ongrid:
    scope: manager
    activation:
      mode: always
tools:
  - name: query_promql
    impl: builtin:prom.QueryPromQL
    class: read
    description: Execute a PromQL query and return the matrix.
---

# query_promql

PromQL query tool ...

サードパーティが書くサブプロセススキルには、上のシンプルな skill.json フォーマットを推奨します。SKILL.md は manager バイナリにコンパイルされるスキル用です。