ljg-library について
ljg-libraryは、本の独自の視点を絵で記憶したい人向けに、書籍をPNGの図書カードにするスキルです。視点を示す一文、フェインマン式の解説、対応するイラストを組み合わせ、文章ノートは出力しません。
主な機能
- 01本独自の視点の抽出
- 02視点の一文と解説の作成
- 03同じ内容を描くイラストの生成
- 04表紙・書誌情報・著者画像の取得
- 05PNGのレンダリングと確認
活用シーン
- 01読了した本をビジュアルカード化
- 02画像を通じて本の中心的な考えを復習
- 03練り上げた視点を確認してカード化
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lijigang/ ljg-skills --skill ljg-libraryインストール後、Claude Code で/ljg-libraryを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/extract_color.pygen_illustration.pylibrary_template.htmlreferences/example.mdextraction.mdvisual.md詳細
ljg-library:ビューファインダー貸出カード
一冊の本を、2050図書館の貸出カード一枚に仕立てます。表紙、著者、書誌情報はカードの身元です。本当にすべきことは、その本ならではの「ビューファインダー」を、一枚のイメージ画面に抽出することです。著者はある視点からある問題を見つめ、ほかの人には見えていなかった画面を目にしています。テキスト block はその画面を言葉で解き明かし、図解 block はそれを絵にします。半年後にカードをちらりと見れば、画面がよみがえり、この本を読んだ甲斐があったと思えるでしょう。
カード一枚に二つの作業があります:
- ビューファインダー block(テキスト):主文
{{FRAME}}でその画面を一言で示し、ファインマン解説{{EXP}}で賢い門外漢にも伝わるように説明します。{{EXP}}は必ずfeynman-eli5skill を使って生成し、手書きしないでください。 - 図解 block(画像生成):同じ画面を
assets/gen_illustration.pyに渡して描きます。继刚はすべての画像の主役です。スクリプトは彼の墨絵(assets/ljg-portrait.png)をキャラクター参照としてモデルに渡し、彼だとわかる姿を描きます。彼は画面の中で、その核心となる動作を自ら行うか、あるいは受け止めます。スタイルは吉田誠治風の絵本調です。異世界の日常空間、斜めに差し込む暖かな光、蜜のような琥珀色と木の茶色を基調とした暖色、確かな建築パース、植物や本、道具の細部が積み重なる描写、魔法工房や古書店、図書館のような癒やしの場所、場面に自然に溶け込む手書きの中国語、そしてその中に住まう小さな姿の人物としての继刚。スタイルはスクリプトに固定済みなので、frame には何を描くかだけを書きます。
テキストと絵が語るのは、必ず同じ画面でなければなりません。抽出に失敗すれば、このカードはただの豆瓣読書カードになってしまいます。
出力は PNG のみで、テキストメモは作成しません。
作業を始める前に、2つの reference を読む
references/extraction.md— 本からイメージ画面をどう抽出し、画像生成用 frame をどう書くか。抽出は6段階です:対象、視点、従来の画面、イメージ画面、ファインマン解説、検証。继刚がすでに考えを深めている場合(読了後すぐにカードを作るのが通常です)は、その考えをそのまま使います。検証と作画だけを行い、抽出し直す必要はありません。references/visual.md— カード本体の仕様、配色、フォント、出荷前チェック。
手順
输入:书名(或 书名 + 已想透的取景框思想)
↓
1. weread 取真封面 + 书目(见「素材获取」)
2. web 抓作者头像
3. 提封面主色 → 卡身强调色(python3 assets/extract_color.py <封面>)
4. 提炼意向画面(用户给了→校验;没给→extraction.md 六步)
5. {{FRAME}} 主句 + {{EXP}} 费曼讲解(走 feynman-eli5)
6. 写 frame(英文构图:继刚在做什么、隐喻物件、信息流向、3-5 个中文标注每个 ≤5 字),生图:
python3 assets/gen_illustration.py --frame "<...>" --out /tmp/ljg_lib_{slug}_sketch.png
7. 填 assets/library_template.html 占位变量({{SKETCH_IMG}} = file://生成图)
8. 渲染(capture.js,fullpage)
9. Read 成品 PNG 亲眼验,不满意调 frame 重生,然后交付
素材の取得
表紙 + 書誌情報
继刚は微信読書を利用しているので、まず weread skill の /store/search を使います(事前に Read ~/.claude/skills/weread/search.md):
curl -s -X POST "https://i.weread.qq.com/api/agent/gateway" \
-H "Authorization: Bearer $WEREAD_API_KEY" -H "Content-Type: application/json" \
-d '{"api_name":"/store/search","keyword":"<书名>","scope":10,"skill_version":"1.0.3"}'
レスポンスの results[].books[].bookInfo(各 result に本が1冊)には title / author / translator / cover / publisher があります。cover URL はデフォルトで s_ サムネイル(70×100)なので、カードに使うと必ずぼやけます。s_ を t7_ に置き換えて、285×411の高解像度画像を取得します:.../cover/942/635942/t7_635942.jpg。-H "Referer: https://weread.qq.com/" を付けてダウンロードしてください。
weread で見つからない場合は、本の種類に応じて次の手段に切り替えます:
- 中国語の本 / 得到コース系の書籍 → 豆瓣の表紙。
l/publicの大きな画像パスを使います(s/publicの小さな画像はぼやけます) - 外国語の学術書 → OpenLibrary:
https://openlibrary.org/search.json?q=<書名>からcover_iを取得し、covers CDNhttps://covers.openlibrary.org/b/id/<cover_i>-L.jpgを使います - どこにもない場合 → CSS の仮表紙を使い、作業を止めない
著者のアバター
ウィキペディアの原画像が最も確実です。Wikipedia API から original 画像 URL を直接取得します:
curl -s -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
"https://en.wikipedia.org/w/api.php?action=query&titles=<英文名>&prop=pageimages&piprop=original&format=json"
# 拿到 .original.source 后下载(同样带 UA):
curl -sL -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" -o /tmp/ljg_lib_{slug}_avatar.jpg "<original-url>"
thumb パス(/thumb/.../480px-xxx.jpg)は、そのサイズのキャッシュがない場合に HTML エラーページを返すので注意してください。原画像のパス(/thumb/ とサイズ部分を削除したもの)を使い、必ず User-Agent を付けてください。UA がないと Wikimedia に拒否されます。
代替手段:英語版ウィキペディアにない場合 → ウィキ REST summary(/api/rest_v1/page/summary/<名前>)→ 中国語圏の人物なら百度百科 → どこにもなければアバターを省略(テンプレートの著者行では avatar が自動的に非表示になります)。作業は止めません。
主役の参照画像
assets/ljg-portrait.png は继刚本人のアバターから背景を切り抜いた墨絵で、gen_illustration.py が自動的にキャラクター参照としてモデルに渡します。生成されるのは、モデルが吉田誠治風に描いた彼です。本人だとわかれば十分で、ピクセル単位で同じ顔にする必要はありません。アバターを更新する場合は、この png を差し替えるだけです。
カード本体のアクセントカラー
python3 assets/extract_color.py /tmp/ljg_lib_{slug}_cover.jpg
# 输出形如:#c43d30
表紙から最も目立つ色を抽出して、カード本体のアクセントカラーにします。本を替えると色も自動的に変わります。赤い表紙なら赤いカード、青い表紙なら青いカードです。次の2つの場合は手動で調整してください:表紙の大部分がベージュやグレーの背景の場合、スクリプトがくすんだ背景色を選んでしまいます。「鮮やかさ × 頻度」で並べ替え、実際のピクセルから映える色を選んでください。色を勝手に固定しないでください。表紙の色がとても明るい場合は、半段階ほど暗くすると、淡い色のカード本体でも読みやすくなります。アクセントカラーはカード本体だけに使います(ラベル、英語の行、キーワードの強調、署名の印字)。図解パネルの配色は生成画像に含まれるため、互いに影響しません。暖色(茶色、オレンジ、緑)を選ぶと、暖色調のイラストによりよく合います。
テンプレート変数(library_template.html)
| 変数 | 内容 |
|---|---|
{{ACCENT}} | カード本体のアクセントカラー hex(表紙から抽出) |
{{COVER}} | 表紙の file:// 絶対パス |
{{AVATAR_IMG}} | アバター全体の <img class="avatar" src="file://…">(アバターがない場合は空文字列) |
{{TITLE}} {{EN}} {{SUBTITLE}} | 書名の中国語 / 英語 / 副題 |
{{TAGS}} | テーマタグ3〜4個。それぞれ <span class="tag">…</span> |
{{AUTHOR_CN}} {{AUTHOR_META}} | 著者の中国語名 / 「英語名 · 出版社 年」 |
{{FRAME}} | イメージ画面の主文。キーワードは <span class="hl">…</span> でアクセントカラーにします |
{{EXP}} | ファインマン解説(feynman-eli5 の生成物)。キーワードも同様に色を付けます |
{{SKETCH_TITLE}} | 図解パネルのタイトル(英語 + 中国語。例:Ergodicity 遍历性) |
{{SKETCH_IMG}} | 生成したイラストの file:// 絶対パス |
レンダリング
node ~/.claude/skills/ljg-card/assets/capture.js \
/tmp/ljg_library_{name}.html ~/Downloads/{name}.png 1080 1440 fullpage
ljg-card の capture.js を再利用します(playwright は ljg-card/node_modules にインストール済み)。fullpage は省略できません。カードの高さは内容に応じて決まるため、省略すると下部に空白が残ります。file:// で参照するローカルの表紙やアバターは、そのままレンダリングできます。
納品
- Read で完成した PNG を実際に確認し、図解パネルは拡大して見ます。visual.md の出荷前チェックと照合してください:表紙が読み込まれている、解説が画面を十分に説明している、カード本体の色が調和している、继刚だとわかる、画面が一目で理解できる、中国語の注記がぼやけていない、テキストと絵が同じ画面を表している、右側に欠けがない、下部に余白がない。画像生成の結果に満足できなければ、frame を調整して再生成します。
- ファイルパスを報告し、イメージ画面の抽出について一言説明を添えます。
注意点
- 表紙のサイズ:weread の
s_は70×100のサムネイルなので、必ずぼやけます。t7_(285×411)に置き換え、ダウンロード時にRefererを付けてください。 - アバターの thumb の罠:Wikimedia の
/thumb/.../NNNpx-はキャッシュがないと HTML エラーページを返します。原画像のパスを使い、User-Agent を付けてください。 - 画像生成後は必ず画像を確認:同じ frame でも生成される画像は毎回異なります。gemini は中国語の注記をぼかしたり、继刚を似ていない姿に描いたり、動作を間違えたりすることがあります。生成のたびに必ず Read で実物を確認してください。問題があれば frame を調整して再生成します。再生成する前に、現在の画像を別のパスに保存してください。新しい画像が古い画像より良いとは限りません。使える画像を上書きして失わないでください。
- 中国語の注記は5文字以内:長い注記や珍しい漢字はぼやけやすくなります。各注記を5文字以内にし、仕組みの詳細は本文に任せてください。絵の中に明確に書かせようとしないでください。
- frame 内の注記はセミコロンか読点で区切る:
/で中国語の注記を区切ると、安全フックが危険なコマンドだと誤判定して BLOCK します。スラッシュは使わないでください。 - frame は具体的に描ける内容にする:继刚が実際に経験する動作、実在の比喩的な物、情報の流れを明確に書いてください。抽象的な命題は描けません。イメージ画面に立ち戻り、目に見える物や動作に落とし込んでください(extraction.md を参照)。
- 主役は様式化して描き、同じ顔の再現を目指さない:墨絵を参照して生成し、本人だとわかれば十分です。実際の墨絵を顔に貼り付ける合成はしません。
- 2種類の色を混ぜない:カード本体のアクセントカラーは表紙から抽出します。図解パネルの背景は生成画像に含まれます。
- /tmp のファイル名には slug を付ける:カードを並行して作成するとき、生成画像、表紙、アバターはすべて一意なパス(書籍 slug を含む)を使います。固定名を共有すると画像が混ざります。
- 画像生成のコスト:
gen_illustration.pyは marswave gemini-3-pro を直接呼び出し、listenhub のインタラクティブなゲート制御は経由しません。画像ごとにネット接続と API クォータを消費し、実物を目視確認する必要があります。テンプレートだけの場合より時間がかかるため、複数のタスクをまとめて処理する際は余裕を見てください。 - {{FRAME}} に書くのは、見方がどう変わるかであり、内容の要約ではありません:「もともとは X ではなく、実は Y」という形にし、「本書は何を述べているか」は書きません。確認方法:書名と著者名を削除しても、この一文だけで成り立つなら、抽出は成功です。