Book-to-Skill コンバーター
書かれた知識を、要約ではなく構造を抽出することで、実用的なエージェントスキルに変換します。
哲学
書籍には結晶化された専門知識(フレームワーク、原則、テクニック)が何年もかけて開発された形で含まれています。このスキルは、その知識をGitHub Copilot CLI、Amp、Claude Code、またはその他の互換性のあるエージェントが繰り返し活用できる形式に抽出します。
構造を抽出し、要約はしない。 スキルは書評ではありません。それは以下のツールキットです:
- 名前付きフレームワーク(明確な適用方法を持つメンタルモデル)
- 実践可能な原則(意思決定を導くルール)
- テクニック(ステップバイステップの方法)
- アンチパターン(避けるべきこととその理由)
- ボイスキャリブレーション(著者の思考と表現方法)
著者の正確さを保つ。 フレームワークには理由があって特定の名前が付いています。「5つのなぜ」は「なぜを複数回尋ねる」とは交換できません。正確な表現を捉えてください。
適切に深みをレイヤー化する。 シンプルな本 → シンプルなスキル。10以上のフレームワークを含む複雑な本 → 参照ファイルとオンデマンドチャプターを持つスキル。
動作モード
4つのパスがあります。ユーザーのリクエストに基づいてルーティングします:
1. フル変換(デフォルト)
トリガー: ユーザーが特別な指示なしに1つ以上のドキュメント/ディレクトリ/グロブパスを提供する アクション: 以下のすべてのステップ(ステップ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):
~/.agents/skills/ - Claude Code 個人スキル:
~/.claude/skills/ - プロジェクトローカル Copilot スキル:
.github/skills/ - プロジェクトローカル Claude スキル:
.claude/skills/ - プロジェクトローカル Amp / Copilot スキル:
.agents/skills/ - Amp グローバルスキル:
~/.config/agents/skills/ - Amp レガシーグローバルスキル:
~/.config/amp/skills/
生成されたブックスキルについては、ユーザーのホストエージェントが実際に検出できる保存先を選んでください(ステップ5を参照)。有効なルートが複数存在する場合は、ユーザーに一度だけ尋ね、そのセッション中は答えを記憶してください — 黙ってデフォルトにしないでください。
ステップ0 — 範囲外チェック
引数が提供されていない場合、停止して応答:
「book-to-skill は、サポートされているドキュメントパス、フォルダ、またはグロブパターンが必要です。使用方法:
book-to-skill <path-to-document-folder-or-glob>... [skill-name-slug]」
ワークフロー全体を通して:
- 入力パスとオプションのスキルスラッグを特定します。
- 最後の引数がファイル、フォルダ、または存在する/ファイルにマッチするグロブではなく、かつスキルスラッグのように見える場合(例: 小文字のハイフン、英数字)、それを
SKILL_NAMEとして扱います。 - 他のすべての引数を
INPUT_PATHSのリストとして扱います。 - いずれかの入力パスが既存のスキルディレクトリである場合(
SKILL.mdとchapters/サブフォルダを含む)、またはSKILL_NAMEがSKILLS_HOME内の既存のスキルスラッグと一致する場合、この実行を 更新/統合 操作(モード4)としてフラグ付けします。
ステップ1 — 入力の検証
INPUT_PATHS の中に、サポートされているファイル、ディレクトリ、またはグロブパターンが少なくとも1つあることを確認します。
ディレクトリとグロブについては、展開してマッチするサポート対象ファイル(.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 の場合、続行前にユーザーに通知:
「📐 テクニカルモード選択 — Docling を使用して構造認識抽出(表、コードブロック、数式はマークダウンとして保存)を行います。1ページあたり約1.5秒かかるため、長めのソースでは数分かかることがあります。開始します…」
BOOK_TYPE=text の場合、通知:
「📄 テキストモード選択 — 各ファイルタイプに最適な最速の抽出ツールを使用します。プレーンテキスト/マークダウン/HTMLは通常数秒で準備完了。PDFは利用可能な場合 pdftotext を使用します。」
ステップ2 — ソースドキュメントからテキストを抽出
抽出スクリプトを実行し、入力パスを渡します:
SCRIPT_PATH=""
for candidate in \
"$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" \
".github/skills/book-to-skill/scripts/extract.py" \
".claude/skills/book-to-skill/scripts/extract.py" \
".agents/skills/book-to-skill/scripts/extract.py" \
"$HOME/.config/agents/skills/book-to-skill/scripts/extract.py" \
"$HOME/.config/amp/skills/book-to-skill/scripts/extract.py"
do
if [ -f "$candidate" ]; then
SCRIPT_PATH="$candidate"
break
fi
done
if [ -z "$SCRIPT_PATH" ]; then
echo "book-to-skill の scripts/extract.py が見つかりませんでした" >&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/full_text.txt— 全ソースの結合抽出テキスト(明確に視覚的に区切られた境界あり)<tempdir>/book_skill_work/metadata.json— 全体の結合サイズ、単語数、ページ数、トークン数、および個別に処理されたsourcesの詳細リスト
<tempdir>/book_skill_work/metadata.json を読み込んで結果を確認します。
ステップ2.5 — 事前コスト見積もり
<tempdir>/book_skill_work/metadata.json を読み込み、生成を行う前にユーザーに見積もりを提示します:
📖 検出されたソース: <total_sources> ソース
<ソースメタデータリストから各ソースファイル名と形式をリスト>
📄 結合ページ/セクション: ~<N> | 単語数: ~<N> | 総トークン数: ~<N>K
💰 推定トークンコスト(フル変換/更新):
入力(読み取り+プロンプト): ~<N>K トークン
出力(生成/更新されるスキルファイル): ~<N>K トークン
合計: ~<N>K トークン
コスト: 上記のトークン数に、お使いのモデルの現在の100万トークンあたりの
入出力レートを掛けてください(価格とモデル名は頻繁に変わります —
ハードコードせず、今日のレートを引用し、見積もりとラベル付けしてください)。
⏱ 推定時間: ~<N> 分
📁 生成/更新されるファイル:
SKILL.md + チャプターファイル + 用語集 + パターン + チートシート
➡ フル変換/更新を続行しますか?(または「分析のみ」と入力して先にプレビュー)
見積もり方法:
- 入力トークン ≈ メタデータの
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スタイルアクセス
再帰的言語モデル(RLM)パラダイムに着想を得て: full_text.txt を1回の読み取りではなく、クエリ可能なコーパスとして扱います。ファイル全体をコンテキストに読み込むと、後で生成に必要な予算を消費します。
約50kトークンを超える書籍では、範囲指定なしの Read(full_text.txt) よりもプログラム的なプローブを優先します:
# Read 前のサイズチェック
wc -w "$FULL_TEXT_PATH"
# ファイル全体を読み込まずにチャプターのオフセットを見つける
grep -n -E "^\s*(Chapter|CHAPTER)\s+[0-9]+" "$FULL_TEXT_PATH" | head -40
# 必要なチャプターだけを取得(開始行..終了行を含む)
sed -n '<start>,<end>p' "$FULL_TEXT_PATH"
# SKILL.md で主張する前に、フレームワークが実際に言及されているか確認
grep -c -i "westrum\|dora" "$FULL_TEXT_PATH"
# オフセット/リミット指定のターゲット Read は全ファイルダンプを避ける
# Read(file_path=full_text.txt, offset=<line>, limit=<lines>)
このアプローチをステップ3(構造分析)、ステップ7(チャプターごとの要約)、ステップ8(用語集/パターン抽出)で使用します。50kトークン未満の書籍では、単一の Read で問題ありません。
これが重要な理由: 200ページの書籍は約75kトークンです。チャプターごとに1回ずつ再読み取りすると(28パス)約200万入力トークンがかかります。 grep + sed を使用して関連するスライスのみを取得すると、生成コストをソースではなく出力に比例させることができます。
ステップ3 — 書籍構造の分析
抽出された full_text.txt の最初の8,000文字を読み、以下を特定します:
- 書籍のタイトルと著者
- チャプター構成(「第N章」「PART I」、番号付き見出し、目次を探す)
- コアテーマと対象分野
- おおよそのチャプター数
次に、存在する場合は目次セクションを読み、すべてのチャプターをマッピングします。
モードが「分析のみ」の場合: 今すぐ抽出レポートを生成して停止します。構造:
## 抽出レポート — <タイトル>
### 著者のコアフレームワーク
- **<フレームワーク名>**: <説明と適用タイミング>
### 主要原則
- <原則>: <実践可能なルール>
### テクニックと方法
- <テクニック>: <ステップバイステップまたは方法>
### アンチパターン
- <避けるべきこと>: <理由>
### 提案スキル名
`{著者姓}-{コアコンセプト}` — 例: `cialdini-influence`
### 検出されたチャプター
| # | タイトル | 主要フレームワーク |
ステップ4 — 目的の確認(フル変換のみ)
生成前に、ユーザーに質問します:
「このスキルは何をするのに役立てますか?(1つ以上選択)
- 作業中に著者のフレームワークを適用する
- 著者のメンタルモデルで考える
- 特定のチャプターやコンセプトを参照する
- すべて」
回答を使用して、SKILL.md のコアセクションで何を強調するかの重み付けを行います。
回答から DEPTH を導出する(追加のプロンプトは不要):
- 回答が選択肢3のみ(参照)の場合 →
DEPTH=reference— 軽量、高速ルックアップのチャプター。 - 回答に選択肢1、2、または4が含まれる場合 →
DEPTH=study— より詳細な作業、例、推論を含む深いチャプター。
DEPTH と BOOK_TYPE が一緒になって、ステップ7のチャプターごとのトークン予算を設定します。別途「学習 vs 参照」の質問はしない — ここで推論されます(モード2/3ではステップ4がスキップされるため、デフォルトは DEPTH=study)。
ステップ5 — スキル名の決定
SKILL_NAME が提供された場合、それをスキルスラッグとして使用します。
それ以外の場合は、2つのオプションを提案し、ユーザーに選択させます:
- 著者-コンセプト形式:
{著者姓}-{コアコンセプト}(例:cialdini-influence、meadows-systems) - タイトル形式: 書籍タイトルから小文字ハイフン(例:
designing-data-intensive-apps)
書籍に強力な方法論的アイデンティティがある場合は、著者-コンセプト形式をデフォルトにします。
スキルの保存先ルート(SKILLS_HOME)を選択します。ユーザーのファイルシステムで既存のスキルホームをプローブし、ユーザーが実行しているホストに基づいて選択します:
| ホストエージェント | 個人
...
(元の翻訳が完了していない部分。必要なすべてのセクションを含む完全な翻訳が必要な場合は、全文を提供してください。)