wiki-ingest-book は何をしますか?
初回取り込み前に、キット内の
docs/GOTCHAS.mdを読んでください(運用上の注意点。書籍のページオフセット校正を含む)。
LLM-wiki取り込みパターンを学術書に拡張します。書籍は文脈が重く、一度に取り込むことはできないため、このスキルは2フェーズアプローチを採用しています。最初に書籍概要、次に必要に応じて章を取り込みます。
役割と境界
実行すること: 書籍ノートの作成、章ノートの作成、発見事項のコンセプトノートとメソッドノートへの伝搬、インデックスとログの更新。
実行しないこと: 一度に全書籍を読む(文脈制限のリスク)、メタデータや章タイトルを創作する、論文取り込みワークフローを複製する(章は論文と同じコンセプト伝搬ルールに従う)。
保存場所
パスは wiki.config.json から取得されます(wiki-ingest を参照)。書籍と章は <wiki_root>/books/ に保存されます。テンプレート: templates/book.md および templates/chapter.md。PDFライブラリを格納するフォルダは、設定内の pdf_library_dir です。
関連スキル
wiki-ingest: 初期ステータスの決定ルールと、インデックスルーティングに使用されるfield_titlecase_mapを共有します。wiki-lint: 各章の取り込み後に実行します。チェック8(chapters_ingested同期)とチェック9(章のbook:フロントマター)で、最も一般的な書籍取り込みのずれを検出します。
必須契約(各取り込み後に成立している必要があります)
- すべての章ノート
books/{book}_ChNN.mdは、フロントマターにbook: "[[{book_basename}]]"を保持しなければならず、そのターゲットは存在する書籍ノートに解決可能でなければなりません。書き込み後に確認し、欠落している場合はwiki-lintチェック9がフラグを立てます。 - すべての章の取り込みでは、親書籍ノートの
chapters_ingested:リストに章番号を追加しなければなりません。追加後、{book}_Ch*.mdをリスト化し、2つのセットが一致することを確認してください。そうしないと、wiki-lintチェック8がずれをフラグします。 - 初期ステータスは
wiki-ingestのステータステーブルに従います: 定義のみの場合はstub、進行中の場合はdraft、2つ以上のソース付き発見事項がある章ノートはfinalに達します(章自体がソースです)。派生したコンセプトノートとメソッドノートは厳格な昇格ルールに従います:finalにはN個の異なるソース作品が必要です(min_distinct_sources_for_final、デフォルト2)。つまり、この1冊の書籍から構築されたコンセプトは、2番目の独立したソースがそれを裏付けるまでdraftのままです。 - インデックスルーティングは
field_titlecase_mapを使用して、新しいコンセプトとメソッドを正しいタイトルケースフィールドのサブセクションに配置し、日付付きのキャッチオールブロックには決して配置しません。
前文(モードAまたはモードBの前、常に)
WIKI_SCHEMA.mdを読む。- テンプレートを読む: モードAは
templates/book.mdを使用し、モードBはtemplates/chapter.md(および参考用のtemplates/book.md)を使用する。
ツール: すべてのVault書き込みにはホストのファイルツール(Read/Write/Edit)を使用します。
ローカルPDF解決(全文取得の推奨)
デフォルトフォルダ: 設定内の pdf_library_dir(参照管理ツールのPDFストレージ)。
抽出ツール: pdftotext(poppler)、またはテーブル精度を重視する場合は docling。常に pdftotext を -enc UTF-8 で実行します。
PDFの特定は、著者名で列挙してgrepする方法で行い、グロブツールや find -iname "*<author>*" は使用しないでください。どちらも、一部のファイルシステムに存在するファイルに対して偽陰性が文書化されています: find "<pdf_library_dir>" -iname "*.pdf" | grep -i <first_author_lastname>。最初のパスが空の場合は、ルートをライブラリ全体に広げます(書籍はテーマ別サブフォルダにも存在します)。正確に1件の一致: それを使用。0件または2件以上: ユーザーに正確なパスを尋ねます。それも失敗した場合: 参照管理ツールの全テキストにフォールバックします。
完全な解決アルゴリズム、ローカルファースト全文カスケードとMCP決定テーブル、スキャンPDF検出、および非ASCIIファイル名の危険性については、
references/BOOK-INGEST-WORKFLOW.md(セクション1および1bis)を参照してください。新しい書籍の最初の抽出前に読んでください。以下の本文には、すべての章で使用されるコマンドのみを記載しています。
抽出コマンド
- 目次/概要(モードA):
pdftotext -enc UTF-8 -f 1 -l 20 "<パス>" -(最初の20ページ、stdout)。 - 章の範囲(モードB):
pdftotext -enc UTF-8 -f <pdf_start> -l <pdf_end> "<パス>" -。-f/-lはPDFページ番号を受け取り、書籍のページ番号ではありません。目次のオフセットを使用して変換します(次のセクション)。 - 抽出結果をReadするファイルに書き込む: 長い章のスライスは、stdoutよりもファイルとして扱う方が簡単な場合があります。プロジェクト内に書き込みます(例:
_temp/{book}_Ch{NN}.txt)。OS固有の/tmpには書き込まないでください。Readツールが開けない可能性があります(Windows上のGit Bashは/tmpをWindowsツールが見られない場所にマップします)。
ページオフセットの校正(書籍のページはPDFページではありません)
書籍の目次には書籍のページ番号がリストされています。pdftotext -f/-l はPDFページを指定します。これらはオフセット(前付、図版)によって異なり、書籍全体を通して非線形に増加します(図、表、章区切り)。目次の番号をそのまま pdftotext に渡すと、間違ったページが抽出されます。これは章の取り込みにおいて最も一般的な時間の無駄です。各書籍につき1回、任意の章を抽出する前に校正します:
- 既知の書籍開始ページを持つ章を1つ選びます。
pdf_start = book_page + offset_guessと推定します(前付は多くの場合20~60ページです)。 - 最初の1ページだけを抽出し、章のタイトルが表示されることを確認します。正しいページに到達するまで、最大5ページ調整します。
- 校正されたオフセットを書籍ノートに記録します(例: 目次の近くに
> [!note] PDFオフセット: book_pg + N = pdf_pg (ゾーン: Part X))。後続の章で再利用します。 - 長い書籍の場合、ゾーンまたはPartごとに再校正します。単一の固定オフセットはずれます(ある教科書では、Ch 3で+36、Ch 21で+56)。テキストレイヤーPDFの場合、テキストを改ページで分割すると、正確な開始ページを持つ高速なページマップが得られます。
モードA: 書籍概要
トリガー: /wiki-ingest-book [タイトル]
- 参照管理ツールで特定: タイトルで検索し、メタデータ(タイトル、著者、編集者、年、出版社、ISBN、版、DOI、citekey)を取得します。
- 年サフィックスcitekeyの注意点(多巻またはPartシリーズ):
...2019a/...2019bのようなBetter BibTeX citekeyは、同じ著者、同じ年のシリーズのPart 1とPart 2を確実にマッピングするわけではありません(サフィックスは曖昧性解消の順序であり、意味ではありません)。ノートに名前を付けたり、どの巻を扱っているかを信頼したりする前に、必ず実際のタイトル(およびサブタイトルまたは「Part N」)をメタデータから確認してください。
- 年サフィックスcitekeyの注意点(多巻またはPartシリーズ):
- 目次用の全文を解決(カスケード; 「ローカルPDF解決」を参照):
- プライマリ:
pdftotext -enc UTF-8 -f 1 -l 20 "<ローカルパス>" -(約3~8kトークン)。 - フォールバック1: 参照管理ツールの全テキスト。ローカルPDFが利用できず、かつ出力が2,000ワード未満の場合のみ。
- フォールバック2: ユーザーに目次を貼り付けてもらう。「ソース: ユーザー提供」とマークします。
- フォールバック3: よく知られた教科書の場合はモデル知識。各項目に
[!note]をマークします。
- プライマリ:
- ファイル名を決定:
FirstAuthor_Year_Keyword.md(最初の著者の姓、ASCIIのみ。キーワードは書籍の主要トピックに関する1~3語)。books/{filename}.mdが存在する場合は、その場で更新します。 - 書籍ノートを作成または更新
books/{filename}.mdをtemplates/book.mdから作成/更新します。last_verifiedを本日の日付に設定します。 - 目次を埋める ステップ2から。不確かな場合は、章に
?をマークし、その制限をメモします。 - 3~5の高レベルテーマを抽出(書籍レベルでのみ、章固有の主張はなし)。軽い伝搬: テーマが研究ラインのコアであり、かつ2つ以上のWiki論文がすでに触れている場合にのみ
concepts/ノートを更新します。それ以外の場合は、書籍ノートにリストするだけです。ノートに到達するテーマは、エビデンステーブルルールに従います: モードBのステップ6bおよび8b。 - ガバナンスチェック:
wiki-ingestステップ5の研究ライン一致およびコンセプト対メソッドのルーティングを適用します。概要レベルでは、どの章がメソッドノートを生成しそうか、どの章がコンセプトノートを生成しそうかのみをメモします。完全な伝搬はモードBで行われます。 index.md: インデックスがBasesビューを埋め込んでいる場合、書籍エントリは追加しません。新しい親書籍の取り込みが完了した場合にのみ## Quick Statsの「Books (取り込み済み)」カウントを更新します。manualモードの場合は、エントリを追加します。凍結されたレガシーインデックスには決して触れません。log.mdに追加:## [YYYY-MM-DD] ingest-book | {タイトル}: 概要。- 報告: 書籍ノートのパス、特定されたテーマ、および詳細な取り込みが可能な章(
/wiki-ingest-book [タイトル] > Chapter N)。
モードB: 章の取り込み
トリガー: /wiki-ingest-book [タイトル] > Chapter N(または > Chapter: [章タイトル])
-
既存の書籍ノートを読む
books/FirstAuthor_Year_Keyword.md。- 存在しない場合: 停止。最初にモードAを実行し、再試行します。
- 章が目次にリストされていない場合: ステータス
pendingで行を追加し、最終報告書に記録し、続行します。 - 章がすでに
ingestedとマークされている場合: 上書きする前にユーザーに確認します(デフォルト: その場で更新し、既存の[[wikilinks]]を保持します)。
-
章の内容を解決(カスケード; 「ローカルPDF解決」を参照):
- 書籍ノートの目次から章のページ範囲を取得し、記録されたオフセットを使用して書籍ページをPDFページに変換します。目次のページ番号自体が不明な場合にのみユーザーに尋ねます。
- プライマリ:
pdftotext -enc UTF-8 -f <pdf_start> -l <pdf_end> "<ローカルパス>" -(典型的な章は1k~8kトークン)。 - フォールバック1: 章が独自のライブラリエントリを持つ
bookSectionアイテムである場合、そのアイテムの全文を使用します。 - フォールバック2: 参照管理ツールからの書籍全体の全文。ローカルPDFが利用できず、かつ書籍が5,000ワード未満の場合のみ。
- フォールバック3: ユーザーに章テキストを貼り付けてもらう。
- フォールバック4: モデル知識。すべての主張に
[!warning]を付けます。コンセプトノートやメソッドノートには決して到達せず、シールも取得しません。
-
章ファイル名:
FirstAuthor_Year_Keyword_ChNN.md(例:Knuttgen_1987_Strength_Ch03.md)。 -
章ノートを作成
books/{chapter_filename}.mdをtemplates/chapter.mdから作成します。last_verifiedを本日の日付に設定します。- 必須契約: フロントマターに
book: "[[{parent_book_basename}]]"を出力し、それが解決されることを確認します。解決されない場合、親は取り込まれていません: 最初にモードAを実行します。 - 初期ステータス:
wiki-ingestステータステーブルを適用します。目次エントリのみが入力された足場章はstub、少なくとも2つのソース付き発見事項がある章はfinalです。 - エビデンスレベル: デフォルトで
evidence_level: textbook。章自体が独立した系統的レビューまたはメタアナリシスである場合にのみ、SR-MAまたはSRにオーバーライドします。測定品質はインラインの発見事項に残し、フロントマターには決して入れません。
- 必須契約: フロントマターに
-
3~8のコンセプトと1~4のメソッドを抽出:
wiki-ingestと同じ抽出ルール(references/BOOK-INGEST-WORKFLOW.mdを参照)。 -
ガバナンスチェック:
wiki-ingestステップ5と同じ研究ライン一致およびコンセプト対メソッドルーティング。この章について明示的に決定します: コンセプトノート(実証的知見)、メソッドノート(フレームワーク、プロトコル)、またはその両方。一般的な教育的内容は通常、メソッドノートのみを生成します。methods/に属するコンテンツに対してコンセプト作成を強制しないでください。 6b. エビデンステーブルとチェック(伝搬前): この章にwiki-ingestステップ5bおよび5cを適用し、その章用のスクラッチテーブルを使用します。書籍に関する3つの追加事項:- ページ列はPDFページと印刷ページの両方を示し、章タイトルはあなたが着地したページで確認されます(間違ったオフセットは別の章を引用します)。
- 教科書は厳密な読み方を適用します: 発見事項が名前付けるすべてのメカニズムとマーカーを確認します。章の原因または基準のリストは、項目がページ上にない限り、各項目の証拠ではありません。
- 誰が話しているかを明記します: 章が別の著者に委ねる主張は「X([[chapter]]による報告)」と書き、章の臨床意見は試験結果として書かないでください。 合格した行のみがステップ7と8に進みます。レンダリングされたページから兆候を読み取ります。
-
コンセプトノートに伝搬: 論文の取り込みと同じです。発見事項を
[[chapter_note]]バックリンクとともに既存のconcepts/{Concept}.mdに追加するか、templates/concept.mdから新しいものを作成します。作成ルールはwiki-ingest/references/CONCEPT-PROPAGATION.mdと同じです。 -
該当する場合はメソッドノートに伝搬。 8b. 章ノートにシールを押す:
wiki-ingestステップ8bをワークとしての章に適用します(source_verificationに検証を記録: ライブラリキー、ISBN、チェックした章とページ、日付)。 -
前方参照スタブ(自動): 章の本文が書き終わった後、まだ存在しない兄弟章への前方参照を具体化します:
python skills/wiki-ingest-book/scripts/create_forward_ref_stubs.py \ <wiki_root>/books/{book}_Ch{NN}.md <wiki_root>/books/{book}.md [--dry-run]このスクリプトは、取り込み済みの章の
[[{book}_ChNN]]リンク(エイリアス対応)をスキャンし、書籍ハブの## Table of Contentsテーブルを読み取って欠落している各章のタイトルとページを回復し、ハブのフロントマターからDOIとcitekeyを導出し({doi_base}_{N}、{citekey_base}_ch{N})、status: stubでUTF-8スタブを書き込みます。目次行のない前方参照はスキップされ、報告されます(手動取り込みが必要)。アクションは_temp/wiki_ingest_book_stubs_created.mdにログ記録されます。wiki-lintチェック8はstatus: stubを尊重するため、これらのスタブはchapters_ingestedを非同期化しません。chapters_ingestedは、実際に取り込まれた章の正規のリストのままです。⚠️ 章の散文に取り込み状態のマーカーを決して書かないでください。
*(pending ingest)*、兄弟章の横に「未取り込み」、## Related Papers、参照項目、またはその他の場所に書かないでください。取り込み状態は可変であり、正確に1つの居場所があります: 書籍ハブの## Table of Contents行。ステップ11でpendingからingestedに切り替わります。散文にコピーされたマーカーは、可変の事実を不変の場所に複製します: 兄弟が取り込まれ、目次が更新され、散文は永久に反対のことを主張し続けます。1回の監査で、58のノートに68の古いマークが生成され、すべての依存関係がすでに取り込まれていました。各ファイルはそれ自体と一貫性があり、矛盾はファイル間でのみ存在するため、このクラスを確認するリントチェックはありません。兄弟をリンクするだけにしてください。ワークがWikiの外部にある場合は、プレーンテキストで名前を付けてください。 -
欠落コンセプトレポート(自動): s
[truncated for translation]