yoi/tickets/agent-skills.md

8.1 KiB
Raw Blame History

Agent Skills を Workflow として ingest

背景

agentskills.io の "Agent Skills" は Anthropic 発のオープン標準で、Claude Code / Cursor / OpenCode / Gemini CLI / Goose / OpenHands など主要な coding agent 群が採用している。ユーザーが既に書いた skill を insomnia に持ち込めるようにすることで、他ツールと能力資産を共有できる。

insomnia 側の一級概念は Workflow (/<slug>tickets/workflow.md)。SKILL.md 形式は Workflow と意味的にほぼ同型procedural な指示本体 + メタデータ + 付随リソース)であり、別経路として並列管理するより Workflow にマップして ingest する方が呼び出し UX (/<slug>) と内部経路を一本化できる。

docs/plan/memory.md が「SKILL.md 形式は採用しない」と書いているのは Knowledge (#<slug>) の表現形式としての話で、本チケットの「Workflow への ingest 経路」とは矛盾しない。

Skill の骨格 (仕様要旨)

skill-name/
├── SKILL.md          # 必須: YAML frontmatter + Markdown 本体
├── scripts/          # 任意: 実行コード
├── references/       # 任意: 詳細ドキュメント
└── assets/           # 任意: テンプレート等の静的資産

SKILL.md frontmatter:

フィールド 必須 制約
name 1-64 chars, [a-z0-9-]+, ディレクトリ名と一致
description 1-1024 chars, 非空
license 自由文
compatibility 1-500 chars
metadata 任意の key-value map
allowed-tools experimental

前提チケット

  • tickets/workflow.md — Workflow loader / /<slug> resolve / model_invokation 注入の本実装。本チケットはその ingest 経路を増やすだけで、Workflow 側の意味論には手を入れない

方針

ロードソース

skill は manifest の [skills] directories で明示指定したパスのみ ingest する。$config_dir/skills/ の自動ロードや builtin skills は持たない — manifest に書かれていないディレクトリは決して読まれない。

[skills]
directories = ["~/skills", ".claude/skills", ".cursor/skills"]

各パスは manifest の base directory に対して resolve する(既存 scope.allow.target 等と同方針)。絶対パスでも相対パスでもよく:

  • user manifest layer ($config_dir/manifest.toml) に書けば全 workspace 共通で使う skill 集を持てる
  • project manifest layer に書けば workspace 固有の .claude/skills/ .cursor/skills/ をそのまま流用できる

ビルトイン $insomnia/skills/ は不要になるまで作らない(前ガイドラインのまま)。

SKILL → Workflow マッピング

SKILL.md frontmatter Workflow frontmatter 備考
name (ファイル名 = slug として扱う) name がディレクトリ名と一致することは仕様上の不変。slug としてはディレクトリ名を使用
description description そのまま
model_invokation true 固定。agentskills の progressive disclosureメタデータ常時注入と整合
user_invocable true 固定
requires 空配列。SKILL 側に概念がない
license / compatibility / metadata 保持はするが Workflow 実行には影響しない
allowed-tools permission-extension-point.md が Permission 層を整備するまで tracing::warn! して無視

Workflow 本文には SKILL.md 本体frontmatter 直下の Markdownをそのまま使う。

scripts / references / assets

skill ディレクトリ全体(SKILL.md 本体だけでなく scripts/ references/ assets/)を Pod の Scope に permission = read で自動 union する。scripts/ の実行は Bash ツール + Permission 層(permission-extension-point.md)が整うまで Read 経由の閲覧に留める。

衝突解決

同一 slug が複数ソースから来た場合の優先順位:

  1. <workspace>/.insomnia/memory/workflow/<slug>.md(内製 Workflow
  2. manifest [skills] directories の各エントリ(列挙順で解決。先に書かれたディレクトリが上位)

衝突時は上位を採用し、shadow した側について Event::Notification を発行する。「明示的に書かれた内製 Workflow が外部資産より強い」順に並べる。

検証

  • frontmatter は SKILL 仕様通り検証。name ↔ ディレクトリ名一致、description 長さ、name の文字種制約を hard error
  • 検証エラーは個別 skill 単位で skip + tracing::warn!。一個の壊れた SKILL が Pod 起動を止めない(内製 Workflow とは違う扱い: 外部資産は緩く受ける)
  • 未知フィールドは無視

範囲外

  • allowed-tools の実効化 → permission-extension-point.md 待ち
  • skill 専用の実行機構(scripts/ の自動実行)— Bash ツールと Permission 層で自然に扱う
  • skill の自動生成Hermes 風 Skill Library— memory 系チケットで別途、本チケットの ingest 経路を再利用する側
  • ビルトイン skill ($insomnia/skills/) — 必要になるまで追加しない
  • skill 間依存の解決 — 独立単位、相互参照は本体の Markdown リンクで

完了条件

  • manifest の [skills] directories = [...] で指定したパス配下の SKILL.md が Workflow として登録され、/<name> で呼び出せる
  • [skills] セクションが無い manifest では skill 由来の Workflow は 0 件 ($config_dir/skills/ 等の暗黙ロードはしない)
  • 内製 Workflow と同 slug の skill は内製優先で shadow され、Notification が発行される
  • skill ディレクトリSKILL.md 本体・scripts/references/assets/)が scope readable に含まれ、agent が Read ツールでアクセスできる
  • frontmatter 違反の skill は warn でスキップされ、他の skill / Pod 起動は影響を受けない
  • 単体テストで frontmatter 検証、Workflow へのマッピング、衝突解決(内製 > skill、manifest 未指定時の skill 0 件が verify される

実装順序

  1. SKILL.md パーサと frontmatter 検証を実装。Workflow frontmatter への変換器を含めてテスト完結
  2. manifest に [skills] directories: Vec<PathBuf> を追加し、ingest 経路を実装
  3. 衝突解決と Notification 発行を乗せる
  4. skill ディレクトリの Scope unionread 自動 allow

各ステップ終了時点でビルド通過・既存テスト合格を維持する。

参照

Review

  • 状態: Approve (Round 2)
  • レビュー詳細: ./agent-skills.review.md
  • 経緯:
    • 2026-05-04: 初回レビュー Approve (旧仕様: 2 ソース構成)
    • 2026-05-05: $config_dir/skills/ の自動 ingest を廃止、skill ロードソースを manifest [skills] directories のみに統合する設計変更。実装も WorkflowSource::WorkspaceSkill / UserSkill 2 バリアントから単一の Skill { dir } に簡略化済み
    • 2026-05-04: Round 2 レビュー Approve。新設計の完了条件をすべて満たし、Round 1 で挙げた user_skills_dir 関連の懸念は設計変更で構造的に解消。non-blocking として manifest crate の stale doc コメント (crates/manifest/src/lib.rs:47-62) と受け皿チケット (tickets/permission-extension-point.md:61) の旧バリアント名参照が残るのみ