book-to-skill について
book-to-skillは、書籍などの文書を再利用可能なエージェントスキルに変換するツールです。要約ではなくフレームワークや原則、手法を抽出し、分析のみの実行や既存スキルの更新にも対応します。
主な機能
- 01文書から構造化知識を抽出
- 02フレームワーク、原則、手法の記録
- 03生成前の分析に対応
- 04既存スキルへの内容追加と更新
- 05複数エージェントのスキル配置先に対応
活用シーン
- 01技術書を実用的なスキルに変換
- 02生成前に抽出内容を確認
- 03新しい資料を既存スキルに統合
- 04異なるエージェント環境向けのスキル作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ virgiliojr94/ book-to-skill --skill book-to-skillインストール後、Claude Code で/book-to-skillを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.gitignoreAGENTS.mdCHANGELOG.mdBACKERS.mdCLAUDE.mdCONTRIBUTING.mdREADME.mdLICENSE.mdREADME.ru.mdSECURITY.mdSECURITY-NOTICE.mdREADME.zh-CN.md.github/FUNDING.ymldependabot.ymlPULL_REQUEST_TEMPLATE.md.github/ISSUE_TEMPLATE/bug_report.mdfeature_request.md.github/workflows/codeql.ymldeploy-docs.ymlci.ymlbook_to_skill/__main__.pyconfig.py__init__.pycli.pyexceptions.pydependencies.pybook_to_skill/parsers/__init__.pycalibre.pydocx.pyepub.py詳細
書籍からスキルへの変換
要約を作成するのではなく、構造を抽出して、書かれた知識を実践的なエージェントスキルに変換します。
基本理念
書籍には、長年かけて培われたフレームワーク、原則、テクニックという形で、凝縮された専門知識が含まれています。このスキルは、その知識を GitHub Copilot CLI、Amp、Claude Code、Hermes Agent、OpenCode、OpenClaw、またはほかの互換性のあるエージェントが繰り返し活用できる形式に抽出します。 要約ではなく、構造を抽出します。 スキルは読書感想文ではありません。次のようなツールキットです。
- 名前のあるフレームワーク(明確な適用方法を備えたメンタルモデル)
- 実践的な原則(意思決定の指針となるルール)
- テクニック(段階を追った手法)
- アンチパターン(避けるべきこととその理由)
- 著者の思考やコミュニケーション方法(声の調整)
著者の精確さを保ちます。 フレームワークには、特定の名前が付けられていることがよくあります。「5 Whys」は「何度も理由を尋ねる」と同じではありません。正確な表現を記録してください。
深さは適切に調整します。 シンプルな書籍にはシンプルなスキルを、10以上のフレームワークを含む複雑な書籍には、参照ファイルや必要に応じて参照する章を含むスキルを作成します。
実行モード
利用できる方法は4つあります。ユーザーの依頼に応じて振り分けてください。
1. 完全変換(デフォルト)
トリガー: ユーザーが特別な指示なしに、1つ以上のドキュメント/ディレクトリ/glob のパスを指定する アクション: 以下のすべてのステップ(ステップ 0~9)を実行する 出力: SKILL.md、chapters/、用語集、パターン、チートシートを含む完全なスキル
2. 分析のみ
トリガー: ユーザーが「分析して」「抽出だけして」「生成前に確認したい」と依頼する アクション: ステップ 0~3 を実行し、見つかった構造化された抽出レポート(フレームワーク、原則、テクニック)を作成する。そこで終了し、スキルファイルは生成しない 出力: ユーザーが確認するための分析レポート
3. 既存の分析結果から生成
トリガー: ユーザーが既存の分析メモを提供するか、以前に分析のみの処理を実行している アクション: ステップ 0~3 を省略し、提供された分析結果を入力として使用して、ステップ 4~9 を実行する 出力: 提供された分析結果から作成したスキルファイル
4. 更新/統合(既存のスキル)
トリガー: ユーザーが1つ以上の新しいソースパスを指定し、既存のスキルを更新したいと示す(既存のスキルフォルダーを指す、SKILLS_HOME にすでに存在するスキルスラッグを指定する、または更新を明示的に依頼する)
アクション: ステップ 0(対象外の確認)、ステップ 1(入力の検証)、ステップ 1.5(書籍の種類の特定)、ステップ 2(新しいファイルの抽出)を実行する。その後、ステップ 5(既存のスキルパスの特定/検出)に進み、更新/統合ワークフローを実行して、新しい内容を既存のスキルファイルに統合する
出力: 新規または改訂された章の要約と、統合されたインデックス/用語集を含む更新済みの既存スキル
スキルの保存場所
このコンバーターは複数のスキルシステムから実行できます。このコンバーターのヘルパースクリプトを探す場合や、生成した書籍スキルを書き込む場合は、次の順に保存場所を優先してください。
- GitHub Copilot CLI の個人用スキル:
~/.copilot/skills/ - エージェント横断の個人用スキル(Copilot、Amp、Codex。デフォルトの状態を使用する OpenClaw):
~/.agents/skills/ - Claude Code の個人用スキル:
~/.claude/skills/ - プロジェクトローカルの Copilot スキル:
.github/skills/ - プロジェクトローカルの Claude スキル:
.claude/skills/ - プロジェクトローカルの Amp/Copilot/OpenClaw スキル:
.agents/skills/ - Amp のグローバルスキル:
~/.config/agents/skills/ - Amp のレガシーなグローバルスキル:
~/.config/amp/skills/ - Hermes Agent の個人用スキル:
$HERMES_HOME/skills/(デフォルトは~/.hermes/skills/) - Hermes Agent のプロジェクトスキル:
.hermes/skills/または.agents/skills/ - OpenClaw の個人用スキル:
${OPENCLAW_STATE_DIR:-~/.openclaw}/skills/(アクティブな状態。~/.agents/skills/はデフォルトの状態とのみ共有されます) - OpenClaw のプロジェクトスキル:
.agents/skills/またはskills/ - OpenCode の個人用スキル:
~/.config/opencode/skills/または~/.agents/skills/ - OpenCode のプロジェクトスキル:
.opencode/skills/または.agents/skills/
生成される書籍スキルについては、ユーザーレベルのエージェント横断ルート ~/.agents/skills/ を優先してください。物理コピーを1つ置けば、エージェント横断ホストと、デフォルトの状態を使用する OpenClaw で利用できます。Copilot CLI と Amp はネイティブに検出します。Claude Code では ~/.claude/skills/<skill_name> からのシンボリックリンクが必要です(Step 10 で作成します。ルールについては Step 5 を参照してください)。ユーザーが明示的に指定した場合に限り、ホスト専用またはプロジェクトローカルのルートを選んでください。BOOK_TO_SKILL_SCOPE=project または personal を設定すれば、自動化で選択を明示できます。両方のスコープが利用可能というだけの理由で、必須のスコープ確認を求めないでください。
ステップ 0 — 対象範囲外の確認
引数が指定されていない場合は、処理を停止して次のように応答します。
「book-to-skill には、サポートされているドキュメントのパス、フォルダー、または glob パターンが必要です。使用方法:
book-to-skill <path-to-document-folder-or-glob>... [skill-name-slug]」
ワークフロー全体を通じて、次の手順に従います。
- まず出力先のルートを解決します。 既存スキルを検索する前に、ステップ 5 の表と選択ルールに従い、この実行でユーザーのホストに書き込む個人用またはプロジェクトローカルのルートを特定します。プロジェクトローカルの指定がある場合は、個人用ルートではなく、プロジェクトローカルのルートを使用します。以下で「解決済みルート」とは、この出力先を指します。
- 入力パスと、任意のスキル slug を特定します。
- 最後の引数が、存在するファイル、フォルダー、またはいずれかのファイルに一致する glob ではなく、スキル slug のように見える場合(例:小文字とハイフン、英数字)、
SKILL_NAMEとして扱います。 - それ以外のすべての引数を
INPUT_PATHSのリストとして扱います。 - いずれかの入力パスが既存のスキルディレクトリ(
SKILL.mdとchapters/サブフォルダーを含む)である場合、またはSKILL_NAMEが解決済みルート内の既存のスキル slug と一致する場合は、この実行を 更新/統合 操作(モード 4)として扱います。 - 再実行ガード。 完全変換の抽出を開始する前に、ステップ 5 の命名オプション(著者の概念に基づく形式、タイトルに基づく形式、指定された
SKILL_NAME)を使って、作成予定のスキル slug を割り出し、解決済みルートに既存の一致がないか確認します。一致する場合は、処理を停止し、ユーザーに次の選択肢を尋ねます。 「<skill-name>はすでに存在します。次から選択してください。(1)更新/統合(モード 4)、(2)既存のスキルが完成していることを確認して停止、または(3)完全に再生成する」ユーザーが選択するまで、再抽出してはいけません。中断された実行からのコンテキスト復旧時(ネットワークの切断、会話の再生または続行)は、以前の実行で報告された抽出作業ディレクトリ(出力内のWorkdir ->、またはBOOK_SKILL_WORKDIRで設定したパス)が、現在も存在し、現在の入力とオプションに一致する場合に限り、再利用します。ディレクトリが存在し、そのmetadata.jsonが読み取り可能で、記録されたsourcesが、現在変換するファイルとファイル名および内容のフィンガープリントの両方で一対一に一致する必要があります(抽出ツールは、各ソースのsha256をmetadata.jsonに記録します。現在の各ファイルからフィンガープリントを再計算し、完全一致を確認します。このチェックの実行可能な実装はbook_to_skill/utils.pyのreuse_is_safe()です)。また、記録されたextraction_modeが今回使用するモード(ステップ 2 の「抽出内容が依頼されたドキュメントであることを確認する」ルール)と一致している必要があります。作業ディレクトリがなくなっている場合(一時ファイルのクリーンアップ)、metadata.jsonが失われている場合、ソースが一致しなくなっている場合(ファイル名が異なる、または内容のフィンガープリントが変更されている)、記録されたメタデータにソースのsha256がない場合(フィンガープリントの導入前に記録されたため、最新であることを確認できない)、またはモードが異なる場合は、その旨を伝えて、新たに抽出を開始します。再開するか破棄するか判断に迷う場合は、ユーザーに確認してください。
ステップ 1 — 入力の検証
INPUT_PATHS に、サポートされているファイル、ディレクトリ、または glob パターンが少なくとも 1 つ含まれていることを確認します。
ディレクトリと glob については、サポート対象のファイル(.pdf、.epub、.docx、.txt、.md、.markdown、.rst、.adoc、.html、.htm、.rtf、.mobi、.azw、.azw3)を見つけるために展開します。
サポート対象のファイルが見つからない場合は、わかりやすいエラーメッセージを表示して停止します。
ステップ 1.5 — コンテンツの種類を特定する
抽出する前に、ユーザーに質問します。
「これらのソースにはどのような種類のコンテンツが含まれていますか?最適な抽出方法を選ぶために役立ちます。
- 技術系 — コードブロック、表、数式、図を含む(例:プログラミング書籍、学術論文、アーキテクチャガイド)
- テキスト中心 — 主に文章で、表やコードはほとんど、またはまったくない(例:マネジメント、生産性、物語形式のノンフィクション)
- わからない — 高速な方法を使用し、品質に制限がありそうな場合はお知らせします」
回答を BOOK_TYPE として保存します。
- オプション 1 →
BOOK_TYPE=technical - オプション 2 →
BOOK_TYPE=text - オプション 3 →
BOOK_TYPE=text
BOOK_TYPE=technical の場合、続行する前にユーザーに次のように伝えます。
「📐 技術系モードを選択しました — 構造を認識した抽出(表、コードブロック、数式を Markdown として保持)に Docling を使用します。1 ページあたり約 1.5 秒かかるため、長いソースでは数分かかることがあります。開始します…」
BOOK_TYPE=text の場合、次のように伝えます。
「📄 テキストモードを選択しました — ファイル形式ごとに最適な高速抽出ツールを使用します。プレーンテキスト/Markdown/HTML は通常数秒で完了し、PDF では利用可能な場合に pdftotext を使用します。」
ステップ 2 — ソースドキュメントからテキストを抽出する
入力パスを指定して抽出スクリプトを実行します。
SCRIPT_PATH=""
HERMES_HOME_RESOLVED="${HERMES_HOME:-$HOME/.hermes}"
OPENCLAW_STATE_DIR_RESOLVED="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}"
PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || true)"
HERMES_PROJECT_TRUSTED=false
if [ -n "$PROJECT_ROOT" ] && [ "${HERMES_AGENT:-}" = true ] && \
command -v hermes >/dev/null 2>&1 && \
command -v python3 >/dev/null 2>&1 && \
hermes config get skills.trusted_project_dirs --json 2>/dev/null | PROJECT_ROOT="$PROJECT_ROOT" python3 -c 'import json, os, pathlib, sys; root=pathlib.Path(os.environ["PROJECT_ROOT"]).resolve(); sys.exit(not any(pathlib.Path(p).expanduser().resolve() == root for p in json.load(sys.stdin)))' 2>/dev/null
then
HERMES_PROJECT_TRUSTED=true
fi
CANDIDATES=(
"$HOME/.copilot/skills/book-to-skill/scripts/extract.py"
"$HOME/.agents/skills/book-to-skill/scripts/extract.py"
"$HOME/.claude/skills/book-to-skill/scripts/extract.py"
"${OPENCLAW_STATE_DIR_RESOLVED}/skills/book-to-skill/scripts/extract.py"
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/book-to-skill/scripts/extract.py
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/*/book-to-skill/scripts/extract.py
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/*/*/book-to-skill/scripts/extract.py
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/*/*/*/book-to-skill/scripts/extract.py
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/*/*/*/*/book-to-skill/scripts/extract.py
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/*/*/*/*/*/book-to-skill/scripts/extract.py
"$HOME/.config/opencode/skills/book-to-skill/scripts/extract.py"
"$HERMES_HOME_RESOLVED/skills/book-to-skill/scripts/extract.py"
"$HERMES_HOME_RESOLVED"/skills/*/book-to-skill/scripts/extract.py
)
if [ "${HERMES_AGENT:-}" != true ]; then
# Project-local roots are resolved against the git worktree, not the current
# directory: an agent can be invoked from anywhere inside the project (e.g.
# `src/nested`) and these roots still have to be found — that is how OpenCode
# and the other hosts discover project skills. The CWD-relative forms are kept
# so the probe also works outside a git repository.
if [ -n "$PROJECT_ROOT" ]; then
CANDIDATES+=(
"$PROJECT_ROOT/.github/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/.claude/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/.agents/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/.opencode/skills/book-to-skill/scripts/extract.py"
)
fi
CANDIDATES+=(
".github/skills/book-to-skill/scripts/extract.py"
".claude/skills/book-to-skill/scripts/extract.py"
".agents/skills/book-to-skill/scripts/extract.py"
"skills/book-to-skill/scripts/extract.py"
"skills"/*/book-to-skill/scripts/extract.py
"skills"/*/*/book-to-skill/scripts/extract.py
"skills"/*/*/*/book-to-skill/scripts/extract.py
"skills"/*/*/*/*/book-to-skill/scripts/extract.py
"skills"/*/*/*/*/*/book-to-skill/scripts/extract.py
"skills"/*/*/*/*/*/*/book-to-skill/scripts/extract.py
".opencode/skills/book-to-skill/scripts/extract.py"
)
if [ -n "$PROJECT_ROOT" ]; then
CANDIDATES+=(
"$PROJECT_ROOT/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/skills"/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/skills"/*/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/skills"/*/*/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/skills"/*/*/*/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/skills"/*/*/*/*/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/skills"/*/*/*/*/*/*/book-to-skill/scripts/extract.py
)
fi
fi
CANDIDATES+=(
"$HOME/.config/agents/skills/book-to-skill/scripts/extract.py"
"$HOME/.config/amp/skills/book-to-skill/scripts/extract.py"
)
if [ "$HERMES_PROJECT_TRUSTED" = true ]; then
CANDIDATES=(
"$PROJECT_ROOT/.hermes/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/.hermes/skills"/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/.agents/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/.agents/skills"/*/book-to-skill/scripts/extract.py
"${CANDIDATES[@]}"
)
fi
for candidate in "${CANDIDATES[@]}"
do
if [ -f "$candidate" ]; then
SCRIPT_PATH="$candidate"
break
fi
done
if [ -z "$SCRIPT_PATH" ]; then
echo "Could not find scripts/extract.py for book-to-skill" >&2
exit 1
fi
PYTHON_BIN="${PYTHON_BIN:-python3}"
if ! command -v "$PYTHON_BIN" >/dev/null 2>&1; then
PYTHON_BIN="python"
fi
"$PYTHON_BIN" "$SCRIPT_PATH" $INPUT_PATHS --mode <BOOK_TYPE> --install-missing ask
抽出の前に、スクリプトは検出した形式に必要なオプションの Python パッケージを確認します。より適した抽出ツールがない場合は、利用可能な代替手段をユーザーに提示します。非対話型セッションでは、インストールモードが明示的に yes に設定されていない限り、代替手段を使用します。
ヒント — 環境を事前確認する: "$PYTHON_BIN" "$SCRIPT_PATH" --check を実行すると、ファイルを処理せずに、形式ごとの抽出ツールのインストール状況と、不足しているものをインストールするための正確なコマンドが表示されます。ユーザーからセットアップや品質に関する問題が報告された場合に便利です。
これにより、実行ごとの作業ディレクトリが作成されます。デフォルトでは <tempdir>/book_skill_work-<pid>/、または BOOK_SKILL_WORKDIR に設定した正確なパスです。このディレクトリには次のものが含まれます。
full_text.txt— すべてのソースから抽出したテキストを結合し、境界を視覚的に明確に示したもの。metadata.json— 全体の結合サイズ、単語数、ページ数、トークン数、除外された EPUB 画像数、解決済みのworkdir、および個別に処理したsourcesの詳細な一覧。
実行が完了すると、3 つのパスすべてが出力されます(Workdir ->、Text ->、Meta ->)。固定の場所を想定せず、出力(または metadata.json 自身の workdir フィールド)からパスを取得してください。実行ごとにディレクトリ名が異なるため、同じマシンで並行して抽出しても互いの結果を上書きしません。
その実行の metadata.json を読み、結果を確認します。
何かを生成する前に、抽出したものが指定されたドキュメントであることを必ず確認してください。metadata.json の filename/source_file、または full_text.txt の 1 行目にある SOURCE: ヘッダーを確認します。バックグラウンド実行の完了を待っている場合は、その実行固有の作業ディレクトリを対象に待機してください。共有パスをポーリングすると、別の実行の出力が表示される場合があります。
ステップ 2.5 — 事前のコスト見積もり
この実行の metadata.json(抽出結果にある Meta -> パス)を読み、生成を始める前にユーザーに見積もりを提示します。
📖 Sources detected: <total_sources> source(s)
<list each source filename and format from the sources metadata list>
<if images_dropped > 5: warn that N source images were not read>
📄 Combined Pages/Sections: ~<N> | Words: ~<N> | Total tokens: ~<N>K
💰 Estimated token cost (Full Conversion / Update):
Input (reading + prompts): ~<N>K tokens
Output (skill files generated/updated): ~<N>K tokens
Total: ~<N>K tokens
Cost: multiply the token counts above by your model's current
input/output per-1M-token rates (prices and model names change often —
do not hardcode them; quote today's rate and label it as an estimate).
⏱ Estimated time: ~<N> minutes
📁 Files to be generated/updated:
SKILL.md + chapter files + glossary + patterns + cheatsheet
➡ Proceed with Full Conversion / Update? (or type "analyze only" to preview first)
見積もり方法:
- 入力トークン数 ≈ メタデータの
estimated_tokens× 1.3(章ごとの処理で生じるプロンプトのオーバーヘッド) - 出力トークン数 ≈ 章数 × 章ごとの予算 + 4,000(SKILL.md)+ 4,500(用語集 + パターン + チートシート)
BOOK_TYPEによる章ごとの予算の中間値(DEPTH はステップ 4 で決定され、予算を増やすことがあります):text≈ 1,000、technical≈ 1,800。ユーザーがすでに参照用か深掘り学習かを示している場合は、ステップ 7 のマトリックスで該当する行を使用します。
- コスト:トークン数を提示し、ユーザーが現在利用している入力/出力の 100 万トークンあたりの料金を掛けてください。料金を固定値として記載しないでください。モデル名や価格は変わるため、料金を示す場合は見積もりであることと日付を明記します。
続行する前にユーザーの確認を待ちます。「分析のみ」と言われた場合は、モード 2 に切り替えます。
ステップ 2.6 — 大規模な書籍(50k トークン超)への REPL スタイルのアクセス
Recursive Language Model(RLM)パラダイムに着想を得ています。full_text.txt を一度に読み込むのではなく、クエリ可能なコーパスとして扱います。ファイル全体をコンテキストに読み込むと、後の生成に必要な予算を消費してしまいます。
約 50k トークンを超える書籍では、上限を設けずに Read(full_text.txt) を実行するのではなく、プログラムによる検索を優先してください。
# Size check before any Read
wc -w "$FULL_TEXT_PATH"
# Find chapter offsets without loading the whole file
grep -n -E "^\s*(Chapter|CHAPTER)\s+[0-9]+" "$FULL_TEXT_PATH" | head -40
# Pull only the chapter you need (lines start..end inclusive)
sed -n '<start>,<end>p' "$FULL_TEXT_PATH"
# Verify a framework is actually mentioned before claiming it in SKILL.md
grep -c -i "westrum\|dora" "$FULL_TEXT_PATH"
# Targeted Read with offset/limit avoids dumping the full file
# Read(file_path=full_text.txt, offset=<line>, limit=<lines>)
この方法は、ステップ 3(構造の分析)、ステップ 7(章ごとの要約)、ステップ 8(用語集/パターンの抽出)で使用してください。50k トークン未満の書籍であれば、単一の Read で問題ありません。
重要な理由:200 ページの書籍は約 75k トークンです。章ごとに再読すると(28 回)、入力トークンが約 2M 必要になります。grep と sed で関連する範囲だけを取り出せば、生成コストを原文の量ではなく出力の量に比例させられます。
ステップ 3 — 書籍の構成を分析する
抽出した full_text.txt の冒頭 8,000 文字を読み、以下を特定します。
- 書籍のタイトルと著者
- 章の構成(「Chapter N」、「PART I」、番号付き見出し、目次などを探します)
- 主要なテーマと対象分野
- おおよその章数
目次がある場合は、そのセクションを読み、すべての章を把握します。
モードが「Analyze Only」の場合: 抽出レポートを作成して終了します。構成:
## Extraction Report — <Title>
### Author's Core Frameworks
- **<Framework Name>**: <what it is and when to apply>
### Key Principles
- <Principle>: <actionable rule>
### Techniques & Methods
- <Technique>: <step-by-step or how-to>
### Anti-patterns
- <What to avoid>: <why>
### Suggested Skill Name
`{author-lastname}-{core-concept}` — e.g. `cialdini-influence`
### Chapters Detected
| # | Title | Main Frameworks |
ステップ 4 — 目的を尋ねる(Full Conversion のみ)
生成を始める前に、ユーザーに尋ねます。
「このスキルを何に役立てたいですか?(1 つ以上選択してください)
- 作業中に著者のフレームワークを適用する
- 著者のメンタルモデルを使って考える
- 特定の章や概念を参照する
- 上記すべて」
回答に基づいて、SKILL.md のコアセクションで何を強調するかの比重を決めます。
回答から DEPTH を決定します(追加の質問はしません)。
- 回答が選択肢 3(参照)のみの場合 →
DEPTH=reference— 簡潔で、素早く参照できる章にします。 - 回答に選択肢 1、2、または 4 が含まれる場合 →
DEPTH=study— 詳細な解説、例、推論を含む、より掘り下げた章にします。
DEPTH と BOOK_TYPE の組み合わせで、ステップ 7 の章ごとのトークン予算を決定します。「study と reference のどちらにするか」を別途尋ねないでください。ここでの回答から判断します。(ステップ 4 を省略するモード 2/3 では、DEPTH=study をデフォルトとします。)
ステップ 5 — スキル名を決定する
SKILL_NAME が指定されている場合は、それをスキルのスラッグとして使用します。
指定されていない場合は、候補を 2 つ提案し、ユーザーに選んでもらいます。
- 著者の概念に基づく名前:
{author-lastname}-{core-concept}(例:cialdini-influence、meadows-systems) - タイトルに基づく名前:書籍のタイトルを小文字にし、単語をハイフンでつなぐ(例:
designing-data-intensive-apps)
書籍に明確な方法論上の特色がある場合は、著者の概念に基づく形式をデフォルトにします。
保存先のスキルルート(SKILLS_HOME)を選択します。まず、ユーザーからの明示的なリクエストまたは BOOK_TO_SKILL_SCOPE に基づいてスコープを決定し、その後にホストを確認します。プロジェクトローカル/プロジェクトへの出力を求められた場合は、プロジェクトローカルの行を選択します。個人用/グローバルへの出力を求められた場合は、個人用の行を選択します。どちらも指定されていない場合は、これまでの個人用デフォルト(Hermes 以外のホストでは ~/.agents/skills)を維持します。プロジェクトローカルのルートがあるという理由だけで、必須のスコープ確認を求めないでください。選択したルートへの書き込みには、ホストによる承認が必要な場合があります。
| ホストエージェント | 個人用スキルルート | プロジェクトローカルルート |
|---|---|---|
| GitHub Copilot CLI | ~/.agents/skills(ネイティブに検出) | .github/skills → .claude/skills → .agents/skills |
| Amp | ~/.agents/skills(ネイティブに検出) | .agents/skills |
| OpenAI Codex | ~/.agents/skills(ネイティブに検出。シンボリックリンクをたどります) | .agents/skills |
| Hermes Agent | $HERMES_HOME/skills/<category>(デフォルトは ~/.hermes/skills/<category>) | .hermes/skills/<category> → .agents/skills |
| Claude Code | ~/.agents/skills + ~/.claude/skills/<skill_name> からのシンボリックリンク | .claude/skills |
| OpenClaw | ${OPENCLAW_STATE_DIR:-~/.openclaw}/skills(アクティブな状態。デフォルトの状態の場合のみ ~/.agents/skills) | .agents/skills → skills/ |
Hermes Agent は、独自の個人用ルートを持つ唯一のホストです。個人用スキルをカテゴリ別に分類し、エージェント間共有ルートはスキャンしません。アクティブなプロファイルの HERMES_HOME を使用し、生成するスキルの内容に合ったカテゴリを選択してください。プロファイルのパスを手動で組み立てないでください。ユーザーがプロジェクトローカルの Hermes ルートを選択した場合は、生成後に hermes skills trust <project-root> を実行し、hermes skills list で検出を確認してください。プロジェクトが信頼されるまで、プロジェクトスキルは利用できません。 |
OpenClaw では、アクティブな状態ディレクトリの skills/ ルートを使用します:${OPENCLAW_STATE_DIR:-~/.openclaw}/skills/。共有の ~/.agents/skills 互換ルートが検出されるのは、OPENCLAW_STATE_DIR が未設定、またはデフォルトの ~/.openclaw の場合に限られます。デフォルト以外の状態ディレクトリでは、OpenClaw が共有ルートへのインストールを認識すると説明しないでください。生成後に openclaw skills list で検出を確認してください。
| OpenCode | ~/.agents/skills(ネイティブに検出されます。~/.config/opencode/skills と ~/.claude/skills も読み込まれます) | .opencode/skills → .agents/skills → .claude/skills |
Hermes Agent は、独自の個人用ルートを持つ唯一のホストです。個人用スキルをカテゴリ別に分類し、エージェント間共有ルートはスキャンしません。アクティブなプロファイルの HERMES_HOME を使用し、生成するスキルの内容に合ったカテゴリを選択してください。プロファイルのパスを手動で組み立てないでください。ユーザーがプロジェクトローカルの Hermes ルートを選択した場合は、生成後に hermes skills trust <project-root> を実行し、hermes skills list で検出を確認してください。プロジェクトが信頼されるまで、プロジェクトスキルは利用できません。
OpenCode はエージェント間共有の ~/.agents/skills ルートをネイティブにスキャンするため、上記の生成時のデフォルト設定でそのまま利用できます。シンボリックリンクも信頼手順も不要です。また、OpenCode 独自の管理対象ルート ~/.config/opencode/skills と、Claude 互換ルート ~/.claude/skills も読み込みます。ユーザーが希望した場合にのみ、OpenCode 管理対象ルートを使用してください。プロジェクトスキルは、作業ディレクトリから git ワークツリーまで親ディレクトリをたどって検出されます。スキルが表示されない場合は、生成後に新しいセッションを開始してください。(~/.cache/opencode/skills は skills.urls からダウンロードしたリモートスキルのキャッシュであり、作成用のルートではありません。生成したスキルをここに書き込まないでください。)
選択ルール:
- 個人用インストール:
SKILLS_HOMEを~/.agents/skillsに設定します(存在しない場合はディレクトリを作成します)。例外が1つあります。他人の環境に独自の規約を持ち込まないため、~/.agents/skillsが存在せず、かつホストのプライベートルートにすでにスキルがある場合は、代わりにプライベートルートを使用し、その理由をレポートで説明してください。 - Claude Code は
~/.agents/skillsをスキャンしません — 生成完了後、手順10でln -sfn "$HOME/.agents/skills/<skill_name>" "$HOME/.claude/skills/<skill_name>"を使ってスキルをリンクします。 - Hermes Agent の個人用インストールでは、エージェント間共有ルートではなく、上記の Hermes の行を使用し、シンボリックリンクは作成しません。
- ユーザーがプライベートなホストルート(
~/.copilot/skills、~/.claude/skills、~/.config/agents/skills、~/.config/amp/skills)を明示的に希望した場合は、その指定に従い、シンボリックリンクを省略してください。 - ユーザーがプロジェクトローカルへの出力を明示的に希望した場合は、使用するホストに対応するプロジェクトローカルの行を使用してください。
- 選択にホストの特定が必要な場合(プロジェクトローカルへの出力、Hermes の個人用ルート、OpenClaw の状態ルート、または Claude Code のシンボリックリンク)で、ホストを特定できない場合は、次のように尋ねてください:「どのエージェントを実行していますか — OpenCode、OpenClaw、Hermes Agent、GitHub Copilot CLI、Amp、Codex、または Claude Code ですか?」
- OpenClaw の個人用出力には
${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/skillsを使用してください。共有の~/.agents/skillsルートが OpenClaw の有効な出力先となるのは、OPENCLAW_STATE_DIRが未設定、またはデフォルトの$HOME/.openclawと等しい場合に限られます。それ以外の場合は、アクティブな状態ルート、またはプロジェクト/追加ディレクトリを使用してください。 - ユーザーが OpenClaw 管理対象の個人用ルートを明示的に希望した場合は、アクティブな状態ルートを使用し、
openclaw skills listで検出を確認してください。SKILLS_HOMEを選択したルートに設定し、$SKILLS_HOME/<skill_name>/がすでに存在するか確認します。Claude Code では、~/.claude/skills/<skill_name>が実際のディレクトリ(シンボリックリンクではない)として存在するかも確認します。以前のインストールがそこにある可能性があるため、存在する場合は続行前に移行するか尋ねます(ディレクトリを~/.agents/skills/に移動し、元のパスをシンボリックリンクに置き換えます)。 スキルがすでに存在する場合は、ユーザーに次のいずれかを選ぶよう促します。 - 更新/統合(モード 4)— 新しいファイルやコンテンツを既存のスキルコンポーネントに統合します。
- 上書き — スキルを削除し、最初から再生成します。
- 名前を変更 —
-2を追加するか、別のカスタムスラッグを使用します。
ユーザーが更新/統合を選択した場合は、ステップ 2.5 の後、ステップ 3、4、6、7、8、9 をスキップして、直ちに更新/統合ワークフローのセクションに進みます。
ステップ 6 — スキルのディレクトリ構造を作成する
mkdir -p "$SKILLS_HOME/<skill_name>/chapters"
ステップ 7 — 章の要約を生成する
トークン予算ルール — 重要(可変):
章ごとの予算は、BOOK_TYPE と DEPTH に応じて変わります。技術系の章にはコードや表のための余裕が必要で、学習向けの深さには、推論を段階的に示す余裕が必要です。次の表から予算を選んでください。
DEPTH=reference | DEPTH=study | |
|---|---|---|
BOOK_TYPE=text | 800~1,200 トークン | 1,000~1,800 トークン |
BOOK_TYPE=technical | 1,200~1,800 トークン | 2,000~3,000 トークン |
- これらはファイルごとの目標値であり、厳密な上限ではありません。内容の濃い章は超えても、内容の少ない章は下回ってもかまいません。質を長さより優先してください(品質ルール #3)。数値に合わせるために内容を水増ししてはいけません。
- ファイルは必要に応じて読み込まれるため、長い章でも、その章が実際に読まれるときにだけトークンを消費します。
- どちらの予算にするか迷う場合(内容が混在する書籍など)は、低い方を選び、分量ではなく精度で深さを出してください。
DEPTH=study は、数値ではなく内容で満たします。 標準のセクションテンプレート(Core Idea → Connects To)では、密度の高い文章の章も通常は 700~900 トークン程度になります。水増しせずに学習向けの予算に達するには、学習向けの深さを持つ章に具体的な内容を追加する必要があります。
- 章の具体的な例や成果物を 1 つ再現します(例:サンプルのプレスリリース、対話例、記入済みテンプレート、著者が順を追って説明する意思決定など)。
## Worked Exampleセクションの下に記載してください。これは最も大きな効果があり、学習者が再び参照する主な内容です。 - 各フレームワークの「方法」を、ひと言で済ませず、明確な手順や基準に展開します。
- 主要なフレームワークのうち 1~2 個に、「効果がある理由/失敗する状況」の短い注記を加えます。
章に具体的な例が実際になく、内容の拡充も難しい場合は、水増しせずに学習向けの最低量を下回る分量にしてください。その章の内容が少ないことを Core Idea に記載します。一方、reference の深さの章では、意図的に具体例を省き、判断にすぐ役立つ要点だけを残します。
ステップ 3 で特定した各章/主要セクションについて、次の作業を行います。
抽出した full_text.txt の対応セクションを読みます(文字オフセットを使うか、章見出しを grep します)。
以下の構成で $SKILLS_HOME/<skill_name>/chapters/ch<NN>-<slug>.md を作成します。
BOOK_TYPE に応じて重点を調整します。
technical→ 「コード例」、「参照表」、「コマンドと API」の各セクションを優先し、構文を正確に保持しますtext→ 「導入されるフレームワーク」、「メンタルモデル」、「重要なポイント」を優先し、空の技術セクションは省略します
# Chapter N: <Full Title>
## Core Idea
<1–2 sentences: the single most important thing this chapter teaches>
## Frameworks Introduced
- **<Framework Name>**: <exact formulation — preserve the author's naming>
- When to use: <specific situation>
- How: <steps or criteria>
## Key Concepts
- **<Term>**: <precise definition in 1 sentence>
(5–10 most important terms from this chapter)
## Mental Models
<2–4 frameworks or thinking tools. Write as "Use X when Y" or "Think of X as Y">
## Anti-patterns
- **<What to avoid>**: <why it fails>
## Code Examples *(technical books only — omit if BOOK_TYPE=text)*
```<language>
<key code example from this chapter>
- 実証する内容:<1 行>
参照表 (技術書のみ — BOOK_TYPE=text の場合は省略)
具体例 (DEPTH=study のみ — DEPTH=reference の場合は省略)
重要なポイント
- <実践に活かせる知見>
- <実践に活かせる知見>
- <実践に活かせる知見> (実務者が覚えておくべきポイントを 3~7 個)
関連項目
- 第 N 章:<この章との関連理由>
- <概念>:<関連する外部の概念または標準>
---
## Step 8 — Generate supporting files
### glossary.md
Create `$SKILLS_HOME/<skill_name>/glossary.md`:
- Every significant term from the book, alphabetically sorted
- Format: `**Term** — definition (Ch N)`
- Max 1,500 tokens
### patterns.md
Create `$SKILLS_HOME/<skill_name>/patterns.md`:
- All concrete techniques, design patterns, algorithms from the book
- Format: `## Pattern Name\n**When to use**: ...\n**How**: ...\n**Trade-offs**: ...`
- Max 2,000 tokens
### cheatsheet.md
Create `$SKILLS_HOME/<skill_name>/cheatsheet.md`:
**This is the most differentiated layer of the skill — treat it as a reasoning aid, not a keyword list.** Anyone can grep the glossary for a term. The cheatsheet captures the author's *judgment*: the decisions they'd make and why. It's the file that turns "I know the words" into "I'd act the way the author would".
Prioritize, in order:
1. **Decision rules** — "When X, do Y, because Z." The if/then logic the author applies, stated so the reader can apply it without re-reading the book.
2. **Decision trees / flowcharts** (as nested bullets or a small table) — for choices with more than two branches.
3. **Trade-off matrices** — competing options scored on the dimensions the author cares about, so the reader can pick under their own constraints.
4. **Thresholds & defaults** — the specific numbers, ratios, or rules of thumb the author commits to (e.g. "keep functions under ~20 lines", "alert when error budget < 10%").
5. **Tells & smells** — fast heuristics for recognizing a situation ("if you see X, you're probably in trouble Y").
Avoid: bare term→definition rows (that's the glossary), and prose paragraphs (that's the chapters). Every line should help the reader *decide* something.
- Format mostly as compact tables and decision rules; the content you'd want on a single printed page kept beside you while working.
- Max 1,200 tokens.
---
## Step 9 — Generate the master SKILL.md
**CRITICAL TOKEN BUDGET: Keep SKILL.md body under 4,000 tokens.**
Compaction truncates from the END — put the most important content FIRST.
Create `$SKILLS_HOME/<skill_name>/SKILL.md`:
```markdown
---
name: <skill_name>
description: "Knowledge base from \"<Full Title>\" by <Author(s)>. Use when applying <author>'s frameworks for <key topics, 3–6 terms>, studying the book, or referencing its concepts."
---
# <Full Title>
**Author**: <Author(s)> | **Pages**: ~<N> | **Chapters**: <N> | **Generated**: <YYYY-MM-DD>
## How to Use This Skill
- **Without arguments** — load core frameworks for reference
- **With a topic** — ask about `replication`, `pricing`, or another indexed topic; I find and read the relevant chapter
- **With chapter** — ask for `ch05`; I load that specific chapter
- **Browse** — ask "what chapters do you have?" to see the full index
When you ask about a topic not covered in Core Frameworks below, I will read
the relevant chapter file before answering.
---
## Core Frameworks & Mental Models
<generate 2,000 tokens of the most critical frameworks and insights here>
---
## Chapter Index
| # | Title | Key Frameworks |
|---|-------|----------------|
| [ch01](chapters/ch01-<slug>.md) | <Title> | <framework1>, <framework2> |
| [ch02](chapters/ch02-<slug>.md) | <Title> | <framework1>, <framework2> |
...
## Topic Index
- **<Term>** → ch<N>[, ch<N>]
- **<Term>** → ch<N>
## Supporting Files
- [glossary.md](glossary.md) — all key terms with definitions
- [patterns.md](patterns.md) — all techniques and design patterns
- [cheatsheet.md](cheatsheet.md) — quick reference tables and decision guides
---
## Scope & Limits
This skill covers the book content only. For hands-on implementation in your codebase,
combine with project-specific tools. For topics beyond this book, check related skills
or ask the agent directly.
<if images_dropped > 5: state that N source images were not read>
ステップ 9.5 — 生成されたスキルをスキャンする
成功を報告する前、別のセッションでスキルを読み込む前、または公開する前に、次のセキュリティスキャンを実行してください。
SKILL_CONVERTER_ROOT="$(cd "$(dirname "$SCRIPT_PATH")/.." && pwd)"
"$PYTHON_BIN" "$SKILL_CONVERTER_ROOT/tools/scan_generated_skill.py" "$SKILLS_HOME/<skill_name>"
スキャナーがゼロ以外の終了コードを返した場合は、停止して、ファイルや行に関する指摘を人間に確認してもらってください。生成されたファイルを黙って書き換えたり、指摘が解決されるか明示的に受け入れられるまで、スキルを読み込んだり公開したりしないでください。
ステップ 10 — クリーンアップと報告
ホストが Claude Code で、SKILLS_HOME が ~/.agents/skills(個人用インストールのデフォルト)の場合は、シンボリックリンクを作成して Claude Code からスキルを参照できるようにしてください。Claude Code がスキャンするのは ~/.claude/skills だけです。
mkdir -p "$HOME/.claude/skills"
LINK="$HOME/.claude/skills/<skill_name>"
TARGET="$HOME/.agents/skills/<skill_name>"
if [ -d "$LINK" ] && [ ! -L "$LINK" ]; then
CLAUDE_STATUS="skipped-realdir" # Step 5 migration declined; leave the old dir
else
ln -sfn "$TARGET" "$LINK" 2>/dev/null || true
# Read the link back — do NOT trust that `ln` did what was asked. On Windows/MSYS
# `ln -s` may COPY instead of link (or need Developer Mode / an elevated shell), and
# PowerShell/cmd have no `ln` at all. The report must reflect what is on disk, not the
# fact that the command ran.
if [ -L "$LINK" ] && [ "$(readlink "$LINK")" = "$TARGET" ]; then
CLAUDE_STATUS="linked"
elif [ -e "$LINK" ]; then
CLAUDE_STATUS="copy" # a real file/dir landed instead of a link
else
CLAUDE_STATUS="absent" # ln unavailable or refused
fi
fi
実ディレクトリに対するガードは必須です。既存の実ディレクトリに対して ln -sfn を実行すると、リンクがその中にネストされ(~/.claude/skills/<skill_name>/<skill_name>)、Claude Code は古いコピーを読み込み続けます。ユーザーがステップ 5 の移行を拒否した場合は、シンボリックリンクの作成を省略し、その旨を報告してください。移行されるまでは、Claude Code は古いディレクトリを使い続けます。
リンクに関することを報告する前に、リンクを読み戻して確認してください。 シンボリックリンクは主張であって事実ではありません。「Discoverable by」の行には、CLAUDE_STATUS(実際のディスク上の状態)を反映し、「コマンドを実行した」という事実だけを根拠にしないでください。リンクが存在しない場合や、コピーの場合でも、処理を失敗として終了しないでください。 スキルはハブに存在し、ほかのすべてのホストから引き続き見つかります。正直な報告は「~/.agents/skills/<skill_name> に書き込みました。リンクが作成されるまで、Claude Code からは参照できません」であり、中断ではありません。(Windows についての未検証の情報:ディレクトリジャンクションは、管理者権限の cmd で mklink /J を実行するか、PowerShell で New-Item -ItemType Junction を実行すれば作成でき、開発者モードもシンボリックリンクの特権も必要ありません。試す場合も、読み戻してから報告するルールは変わりません。)
ユーザーがホスト専用またはプロジェクトローカルのルートを選んだ場合(ステップ 5 のルール 3〜4)は、この作業を省略してください。
次に、抽出作業用ディレクトリをクリーンアップします。
PYTHON_BIN="${PYTHON_BIN:-python3}"
if ! command -v "$PYTHON_BIN" >/dev/null 2>&1; then
PYTHON_BIN="python"
fi
Remove **the work directory this run actually used** — the `Workdir ->` path from the
extraction output, which is also stored as `workdir` in `metadata.json`. Never delete a
directory you did not create: another extraction may be running beside yours.
```bash
# WORKDIR is the path this run reported; quote it in case of spaces.
rm -rf "$WORKDIR"
メタデータファイルが残っている場合は、同等の処理として次を実行できます。
"$PYTHON_BIN" - "$WORKDIR_METADATA_JSON" <<'PY'
import json
import shutil
import sys
from pathlib import Path
meta_path = Path(sys.argv[1])
workdir = json.loads(meta_path.read_text(encoding="utf-8")).get("workdir")
if workdir:
shutil.rmtree(workdir, ignore_errors=True)
PY
このファイルの古いコピーでは、固定の book_skill_work ディレクトリを削除していました。このパスはもう使われていないため、現在では同時実行中の別の処理の出力を削除するおそれはなく、クリーンアップは何も行わずに終了します。
その後、ユーザーに次のように報告します。
✅ Skill created: $SKILLS_HOME/<skill_name>/
📚 Book: <Full Title> — <Author>
📄 Pages: ~<N> | Chapters: <N>
Files generated:
SKILL.md — core frameworks + index (~X tokens)
chapters/ — <N> chapter summaries (~X tokens each, ~X total)
glossary.md — key terms (~X tokens)
patterns.md — techniques & patterns (~X tokens)
cheatsheet.md — quick reference (~X tokens)
─────────────────────────────────────────────────────
Total skill size: ~X tokens (loaded on-demand, not all at once)
💡 Tip: check your agent's session cost/usage command to see actual token usage.
Usage:
Ask for <skill_name> → load core frameworks
Ask <skill_name> about <topic> → find and explain a topic
Ask <skill_name> for ch<N> → dive into a specific chapter
Discoverable by: <only what is true for the chosen destination — see below>
Somewhere else? mv ~/.agents/skills/<skill_name> <dest_root>/<skill_name> \
&& ln -sfn <dest_root>/<skill_name> ~/.claude/skills/<skill_name>
Prompted for permission on every file? That is your host gating writes outside the
working directory. Say "save it in this project" and re-run to write inside it.
Reload (if your agent doesn't auto-detect new skills):
GitHub Copilot CLI: /skills reload
Claude Code: restart the session
Amp: restart the session
Hermes Agent: start a new session
OpenClaw: openclaw skills list (new session if watcher disabled)
OpenCode: start a new session
Share this skill (optional):
GitHub repo, installable on any host (Step 11): say "publish"
Copilot ecosystem: gh skill publish $SKILLS_HOME/<skill_name>
「Discoverable by」の行には、ln を実行した事実ではなく、CLAUDE_STATUS(読み戻しの結果)を反映してください。~/.agents/skills にインストールした場合は、次のとおりです。
linked→ 「Copilot CLI、Amp、Codex(ネイティブ対応);Claude Code(~/.claude/skills/<skill_name>のシンボリックリンク経由)」skipped-realdir→ 「Copilot CLI、Amp、Codex(ネイティブ対応);Claude Code は対象外 — 先に~/.claude/skills/<skill_name>の実ディレクトリを移行してください」copyまたはabsent→ 「Copilot CLI、Amp、Codex(ネイティブ対応);Claude Code は対象外 — ホストがシンボリックリンクを作成できませんでした(通常のコピーは次回の Update/Fold-in で同期がずれます)。開発者モードを有効にするか、手動でリンクを作成してください。または、~/.agents/skillsからスキルを実行してください」- Hermes Agent の個人用ルート → 「Hermes Agent(
$HERMES_HOME/skills/<category>から)」;シンボリックリンクについても、他のホストが Hermes のルートをスキャンしないため、他のエージェントについても記載しないでください - その他のホスト専用またはプロジェクトローカルのルート → そのルートをスキャンするホストのみを記載し、シンボリックリンクについては記載しないでください
「ほかの場所に移動しますか?」の行は、実際に実行したパスに対して正しい内容にし、実行によって作成したシンボリックリンクを壊さないようにします。
mvの移動先は常にスキルの最終ディレクトリである<dest_root>/<skill_name>とし、<dest_root>自体にはしません。mv ~/.agents/skills/mybook ~/.copilot/skills && ln -sfn ~/.copilot/skills ~/.claude/skills/mybookは正しいように見えますが、実際には正しくありません。スキルは~/.copilot/skills/mybookに配置される一方、リンクは一つ上の階層にあるルートを指すため、Claude Code はSKILL.mdのないディレクトリを解決先としてしまいます。この行で防ごうとしているのは、まさにこの問題です。ユーザーが実際に指定した移動先に置き換え、表示するコマンドに実際のパスを含めて、解釈の余地をなくします。 ~/.agents/skills+ シンボリックリンク →mv ~/.agents/skills/<skill_name> <dest_root>/<skill_name> && ln -sfn <dest_root>/<skill_name> ~/.claude/skills/<skill_name>- ホスト専用ルート(Hermes Agent を含む) →
mv <src_root>/<skill_name> <dest_root>/<skill_name> - プロジェクトローカルのルート →
mv <project_root>/<skill_name> <dest_root>/<skill_name>
「ファイルごとにアクセス許可を求められますか?」の行は、作業ディレクトリ外への書き込みが制限されているホスト(個人スコープのルートはすべて作業ディレクトリ外です)への回答です。移動先は上で案内し、1 行でできる対処法として、プロジェクトローカルのルートを指定して再実行する方法をその隣に記載します。個人スコープへのインストールの場合のみ残し、ユーザーがすでにプロジェクトローカルを選択している場合は削除します。
Step 11 — 生成したスキルを GitHub に公開する(任意)
Step 10 の報告後、Step 9.5 のスキャンに合格した場合に限り、一度だけ提案します。
「このスキルを GitHub に公開して、どの Agent Skills ホストからでも
npx skills addでインストールできるようにしますか?(yes / skip)」
ユーザーが断った場合は、ここで終了します。必要なもの:gh CLI と認証(gh auth status で確認してください)。gh がない、または認証されていない場合は、セットアップを提案します(brew install gh または https://cli.github.com を実行し、その後 gh auth login を実行)。または、gh を使わない方法として、ユーザーに GitHub のウェブ UI で希望する公開範囲の空のリポジトリを作成してもらい、その後、以下の git init/add/commit コマンドを実行し、続けて git remote add origin <repo-url> && git push -u origin main を実行します。以下の公開範囲に関するルールは、ウェブ UI で作成したリポジトリにも同じように適用されます。
公開範囲は独立した選択事項です。以前の回答から推測したり、読み取ったりしてはいけません。 ユーザーが公開に同意したら、これだけを別に尋ね、1 語での回答を求めます。
「プライベートリポジトリとパブリックリポジトリのどちらにしますか?
privateまたはpublicの 1 語で回答してください。」
回答は public を含むだけでは不十分で、回答そのものが public でなければなりません。これは提案ではなく、厳守すべきルールです。 公開範囲に関する質問への回答が、そのまま public の 1 語である場合を除き、すべてのケースで gh repo create に --private を指定します。部分一致は認められません。素材のライセンスについて述べた文は、公開範囲の回答ではないためです。 「パブリックドメインです」「その本はパブリックドメインです」「一般に公開されています」は、素材について述べたものであり、リポジトリについて述べたものではないため、いずれも --private とします。言い換え、文による回答、曖昧な回答、無回答、またはあなた自身による推測は、同意とはみなしません。もう一度尋ね、なお回答が public の 1 語でなければ --private を使用し、報告時にその旨を伝えます。プライベートリポジトリは後からパブリックに変更できますが、本に由来する内容を一度パブリックにプッシュすると、非公開には戻せません。
著作権の確認 — リポジトリを作成する前に必ず実施してください: 章ファイルは生の文章ではなく、要約を再構成したものですが、それでも原資料に由来します。README の「著作権とフェアユースに関するポリシー」に従い、第三者の著作権で保護された書籍から生成したスキルは、プライベートに保つ必要があります。 パブリックを提案できるのは、原資料がユーザー自身の文章、オープンライセンスのコンテンツ、またはユーザーがパブリックに再配布する権限を有していると明示的に確認した素材である場合に限ります。また、どのケースに該当するかを明示してください。社内資料にアクセスできることは、それを開示する許可があることを意味しません。社内文書から作成したスキルは、ユーザーが公開権を持つと明示しない限り、プライベートに保ちます。
ユーザーが同意した場合:
$SKILLS_HOME/<skill_name>/内にリポジトリのREADME.mdを追加します(既存のファイルを上書きしないでください)。スキルのタイトル、1 段落の説明(「Agent skill generated from by <Author> with book-to-skill」)、以下のステップ 3 のインストールコマンド、ファイル一覧、コンテンツは書籍本文ではなく、要約を再構成したものであることを示す注記を記載します。- スキルフォルダーを Git リポジトリとして初期化し、リモートを作成します(デフォルトのリポジトリ名は
<skill_name>です。ユーザーが変更できるようにしてください。<skill_name>-skillのようなサフィックスを付けたい場合もあります)。ネストされたリポジトリのガード: まず、スキルフォルダーがすでに Git リポジトリ内にあるか確認します(git -C "$SKILLS_HOME/<skill_name>" rev-parse --show-toplevel。.claude/skills/のようなプロジェクトローカルのルートでは、常に該当します)。その場合、その場所でgit initを実行してはいけません。外側のリポジトリではフォルダーが.gitmodulesのない埋め込みリポジトリ(gitlink、モード 160000)として記録され、外側のプロジェクトを新規クローンしてもスキルが黙って欠落することになります。代わりに、スキルフォルダーを一時ディレクトリにコピーし、コピー先で以下のコマンドを実行します。また、公開したリポジトリがリモートの作業コピーであり、プロジェクトローカルのフォルダーではないことをユーザーに伝えます。
cd "$SKILLS_HOME/<skill_name>"
git init -b main
git add -A
git commit -m "Add <skill_name> skill"
gh repo create <repo_name> --private --source . --push
# --private is the default; substitute --public ONLY under the visibility rule above
# (the visibility answer WAS the bare word "public" AND the copyright gate allows it)
- リポジトリの URL と、ホストをまたいで使えるインストールコマンドを報告します。
✅ Published: https://github.com/<owner>/<repo_name> (<private|public>)
Install on any Agent Skills host:
npx skills add https://github.com/<owner>/<repo_name> --skill <skill_name>
ネストされたリポジトリのガードが作動し、一時コピーからリポジトリを公開した場合は、ローカルフォルダーにはリモートが設定されないため、Update/Fold-in のプッシュ提案は表示されないことを示す行を 1 行追加します。
⚠️ Published from a copy: <skill folder> sits inside another git repository, so it has
no remote of its own. To publish a later update, re-run Step 11, or clone
https://github.com/<owner>/<repo_name> and fold new material into the clone.
ルートレベルの SKILL.md の構成は skills CLI が検出する形式と完全に一致しているため、リポジトリはそのままインストールできます。再構成は不要です。ネストされたリポジトリの場合を除き、ローカルフォルダーはこのマシンのライブインストールとして残り、リモートの作業コピーになります。そのため、以後の Update/Fold-in の実行では、同じリモートに変更をコミットしてプッシュできます。
Update / Fold-in ワークフロー
$SKILLS_HOME/<skill_name>/ にある既存のスキルに対して Update/Fold-in 操作を行う場合:
1. 既存のスキル構成を読む
既存のスキルのファイルを読み取り、解析します。
$SKILLS_HOME/<skill_name>/SKILL.mdを読み、既存の Chapter Index、Topic Index、メタデータ(著者、章の総数)、Core Frameworks を解析します。$SKILLS_HOME/<skill_name>/chapters/内のすべてのファイルを一覧表示し、最も大きい章番号(例:ch12)を確認します。$SKILLS_HOME/<skill_name>/glossary.md、$SKILLS_HOME/<skill_name>/patterns.md、$SKILLS_HOME/<skill_name>/cheatsheet.mdを読み、どの用語やフレームワークがすでにインデックス化されているか確認します。
2. コンテンツを照合し、改訂と追加を特定する
今回実行した処理の full_text.txt(抽出結果にある Text -> のパス)の新たに抽出されたテキストを分析し、新しいコンテンツが次のどれに該当するかを特定します。
- 既存の章の更新/改訂:新しいコンテンツのセクションが既存の章のトピックを直接更新または拡張する場合は、既存の章ファイルを読み、新しい詳細をマージしてファイルを書き換えます。
- 新規追加:コンテンツによって新しい章、論文、または独立したセクションが追加される場合は、
chapters/の下に新しい章の要約ファイルを作成します。既存の章番号の最大値の次から番号を付けます(例:既存の章がch12で終わる場合は、ch13-*.md、ch14-*.mdなどを作成します)。
3. 章の要約ファイルを生成または更新する
新規または改訂する章ごとに、次の操作を行います。
- 抽出された新しいテキストの該当セクションを読みます。
- 要約の作成には、Step 7 の書式ガイドラインに従います。
$SKILLS_HOME/<skill_name>/chapters/内のファイルを作成または更新します。
4. 補足ファイルのマージ
- glossary.md のマージ:
- 既存の
$SKILLS_HOME/<skill_name>/glossary.mdを読み込みます。 - 新しいコンテンツ(Step 8 の用語集ガイドライン)から、新しい用語と定義をすべて抽出します。
- 既存の用語と新しい用語を結合し、アルファベット順に並べ替えます。
- 用語がすでに存在する場合は、新しい章/出典の参照を追記します(例:
**Term** — definition (Ch 4, Ch 13))。 - 完全にマージされ、アルファベット順に並んだリストで
$SKILLS_HOME/<skill_name>/glossary.mdを書き直します。
- 既存の
- patterns.md のマージ:
- 既存の
$SKILLS_HOME/<skill_name>/patterns.mdを読み込みます。 - 新しいコンテンツから、新しいテクニック、アルゴリズム、パターンを抽出します。
- 新しいパターンを、一貫した書式で追記し、全体の長さを簡潔に保ちます(2,500 トークン未満)。
- 既存の
- cheatsheet.md のマージ:
- 既存の
$SKILLS_HOME/<skill_name>/cheatsheet.mdを読み込みます。 - 新しい比較ルール、判断表、パラメーターガイドを抽出します。
- それらを cheatsheet の構成に無理なく統合します。
- 既存の
5. マスター SKILL.md の再生成
マスタースキルファイル $SKILLS_HOME/<skill_name>/SKILL.md を更新します:
- メタデータ: 章数を増やし、推定ページ数を更新します。必要に応じて新しい出典名を追加します。
Generatedの日付を現在の日付に更新します。 - Core Frameworks: 新しいコンテンツから、影響の大きいメンタルモデルや原則を取り込みます(ファイル全体が 4,000 トークン未満に収まるようにします)。
- Chapter Index: 新しい章を索引表に追記し、作成された新しいファイルへのリンクを張ります。
- Topic Index: 新しいトピックをアルファベット順にマージします。既存のトピックが新しい章でも扱われている場合は、その行に新しい章へのリンクを追記します(例:
- **Topic** → ch05, ch13)。
6. スキャン、クリーンアップ、報告
ファイルの書き込みとマージが正常に完了したら、Step 9.5 を実行し、続けて Step 10 に進んでクリーンアップを行い、追加された章、マージされた用語集の用語、更新された索引をまとめたカスタム更新レポートを出力します。スキルフォルダーがリモートを持つ Git リポジトリである場合(Step 11 で公開されている場合)は、更新をコミットしてプッシュすることを提案します。
品質ルール
- 構造を抽出し、要約はしない — 名前付きのフレームワーク、正確な定式化、アンチパターンを捉え、章の要約にはしない
- 著者の正確さを保つ — 「The 5 Whys」は「何度も理由を問う」とは異なる。正確な名称を維持する
- 完全性より密度 — 1,000 トークンの要約は、10,000 トークンの抜粋に勝る
- 実践者の口調 — 「The book explains X」ではなく「Use X when Y」と書く
- SKILL.md は重要情報を先頭に — コンパクション(圧縮)は最初の 5,000 トークンを保持するため、最も重要な内容を最初に配置する
- 章ファイルはオンデマンド — 読み込まれるまではスキルの予算に含まれない
- 原書の文章をそのままコピーしない — 必ず統合、要約し、重要な情報を抽出する
- トピック索引は重要 — エージェントが適切な章ファイルに到達するための経路である