font
/font — フォントを「TERASU Lab フォント図鑑」+「mikke!」に追加
ユーザー入力: $ARGUMENTS
目的: 気になったフォントを、サイトURLとスクショから特定して、TERASU Lab のフォント図鑑と mikke! のフォントタブの両方に1件追加する。/section(実物から抽出)のフォント版。
2026-07-24 v2.0 でリポ分離に追従(それ以前の版は旧リポ
~/dev/lab-terasuに書き込んでおり、
本番のどちらにも反映されなかった)。フォントのデータとツールは core(terasu-web-core)が正本で、
Lab と mikke! の両方がこの1本を見る。必ず core を更新し、両方のリポに反映するところまでやる。入口は2つある(2026-07-24 追加)。
A. 単体で使う(従来どおり): URL+スクショをもらってフォントを特定して入れる。
B. /mikke から流れてくる: 参考HPを足すとdetect_fonts.mjsがそのサイトの書体を拾うので、
★が付いたものをここで登録する。このとき--companyに参考HPの社名を必ず入れる
(大串「良いHPはフォントも良い。/mikke で自動で入ればフォント集がめっちゃ増える」)。
実行フロー
0. まずスクショ募集メッセージを返して待つ(コマンド単体で打つ運用)
- コマンドが打たれたら、最初に必ず次のメッセージだけ返して一旦応答を終える(他の作業を先にやらない):
入れ込みたいフォントのサイトURLと、そのフォントが使われている部分のスクショを送ってください(複数フォントまとめてOK)
- URL+スクショが送られてきたらステップ1へ。※例外:
$ARGUMENTSに最初から情報があればそのまま進む。
1. 現在地把握(3リポとも最新にする)
cd ~/dev/terasu-lab && git pull --ff-only && git submodule update --init --recursive
cd ~/dev/mikke && git pull --ff-only && git submodule update --init --recursive
git -C ~/dev/terasu-lab/core status --short # クリーンであること
旧リポ ~/dev/lab-terasu は使わない(自動デプロイ停止済みの参照用。ここに書いても本番に出ない)。
2. フォントを特定する(スクショ+実サイトから)
- 送られたスクショで「どのフォントか」を見る。あわせて実サイトのCSSからフォント名を確定する:
bash # 実サイトのCSSに使われているfont-family / Google Fonts読み込みを確認 curl -sL "<URL>" | grep -oiE "fonts.googleapis.com[^\"')]+|font-family:[^;}]+" | sort -u | head - 決める項目:
--id(一意slug・小文字例: albertsans)/--name(正式フォント名 例: Albert Sans)--cat(下記語彙から1つ)/--jp(名前の右の短い説明)/--tags(カンマ区切り)--desc(用途・雰囲気の説明1〜2文)--css(@import url(...)+font-family: '...';。Google Fontsなら公式の埋め込みCSSをそのまま)- cat語彙:
en-sansen-serifen-displayen-monojp-sansjp-serifjp-displayjp-handwritepairing - en- は英字プレビュー、jp- は日本語プレビューの既定文言が入る(
--big/--midで上書き可)。 - 有料フォント(Adobe Fonts有料kit・モリサワ・フォントワークス等)は載せない。mikke!は一般公開なので
「誰でも使える」=無料・商用可・自己ホストできるものに限る。有料しか無いときは近い代替を提案する。
無料の判定は「Google Fonts か」ではない(2026-07-27 大串FB「フォントは本当にゼロ件?」で根治)。
Google Fonts の外にも誰でも使える書体は大量にある(Fontshare・Font Squirrel・LINE Seed・OFL系)。
ここを「Google Fonts だけ」に狭めていたせいで、TSUKASA の主役 Aileron(使用304箇所・SIL OFL商用可)を
「自前配信」として捨てていた。判定はcore/data/の2つのカタログで行う:
-font-catalog-google.json… Google Fonts 全1,942件(<link>が無くても名前一致で拾う)
-font-catalog-free.json… Google外の無料フォント辞書。新しく無料と分かったら1件足す(次から自動で★になる)判定ロジックやカタログを更新したら、必ず全件を棚卸しし直す:
cd ~/dev/mikke/core && node tools/rescan_fonts.mjs --jobs=4→python3 tools/bulk_add_fonts.py(--dryで下見)。
初回はこれで312サイトから53書体を回収し、図鑑が 87件→165件 になった。
3. カード生成(core に足す=ここが両方への入口)
cd ~/dev/terasu-lab/core
python3 tools/add_font.py --id <slug> --name "<正式名>" --cat <cat> \
--jp "<短い説明>" --tags "<tag1,tag2>" --desc "<用途・雰囲気>" \
--company "<どこで使われていたか。単体登録なら Googleフォント>" \
--css "@import url('...');\nfont-family: '<正式名>', sans-serif;"
python3 build_core.py # web-fonts-data.json に集約
python3 tools/extract_fonts.py # mikke!用 data/mikke-fonts.json を更新(**マージ方式**)
- 重複ガードで⛔(同id/同名)が出たら既登録=報告して停止(--force は大串指示がある時だけ)。
add_font.pyを叩く前にdata/mikke-fonts.jsonも名前で照合する(2026-08-24 の事故)。
mikke! のフォントは ①Lab の web-fonts から流れてきたもの と ②mikke! に直接登録されたもの
(contributor: ogushi・絞り込み軸lang/shape/moodつき)の2系統あり、
add_font.pyの重複ガードはdata/web-fonts/しか見ないので②は素通りする。
bash cd ~/dev/terasu-lab/core && python3 - <<'"'"'EOF'"'"' import json names = ["<入れたいフォント名>", ...] mk = {f["name"]: f for f in json.load(open("data/mikke-fonts.json"))} for n in names: f = mk.get(n) print(n, "→ mikke!に既存:", {k: f.get(k) for k in ("id","sub","desc")} if f else "なし") EOF
既存があれば id をそのまま流用し、--jp/--descも既存の文言に合わせる。
id を変える(例delagothicone→dela-gothic-one)と mikke! に同じ書体が2枚出る。
文言を変えると大串が書いた説明を上書きしてしまう。
-extract_fonts.pyは 件数が減ったら exit 1 で止まる。止まったら原因を確かめるまでコミットしない。
ver を採番する( 本番に出す修正はフォント追加でも必ず +1・2026-08-24 に漏らした)
cd ~/dev/terasu-lab/core && git fetch origin -q
python3 tools/bump_ver.py "フォント図鑑: <名前> を追加" # MIKKE_VER と changelog を同時に更新
手打ちの +1 は禁止(origin/main を見て採番する=複数人が同じverを名乗る事故を防ぐ)。
core をコミットして push(これを忘れると両方に出ない)
cd ~/dev/terasu-lab/core
git add data/web-fonts/<slug>.json web-fonts-data.json data/mikke-fonts.json build_mikke.py
git commit -m "フォント図鑑: <名前> を追加(/font)" && git push origin main
~/dev/mikke/core 側で作業した時は detached HEAD なので git push origin main が
! [rejected] (non-fast-forward) で弾かれる。その時は git push origin HEAD:main と書く。
4. 両方へ反映(2リポとも core のポインタを進める・直接prod OK)
# ① TERASU Lab(push で GitHub Actions が自動デプロイ・約1分)
cd ~/dev/terasu-lab && git submodule update --remote core && git add core \
&& git commit -m "core更新: フォント<名前>を追加" && git push origin main
# ② mikke!(ロック付きスクリプトでデプロイ。中で build_core.py → build_site.py の順に走る)
cd ~/dev/mikke && git submodule update --remote core && git add core \
&& git commit -m "core更新: フォント<名前>を追加" && git push origin main
bash tools/deploy_mikke.sh
npx: command not found で3回リトライして落ちるPCがある(node未導入機)。その時は前置きする:
export PATH="/Applications/ChatGPT.app/Contents/Resources/cua_node/bin:$PATH"
どちらか片方で止めない。core を push しただけでは、どちらのサイトにも出ない
(各リポが指している core のコミットを進めて初めて反映される)。
5. 本番検証(両方の実機で・wrangler出力を信じない)
curl -sL "https://lab.terasu.scale-group.co.jp/fonts/?cb=$RANDOM" | grep -c "<正式名>"
curl -sL "https://mikke.scale-group.co.jp/fonts/?cb=$RANDOM" | grep -c "<正式名>"
- 両方とも1以上になるまで完了報告しない。0のままならCI/デプロイの完了を待って再確認。
- あわせて総数が減っていないことも見る(フォントが消える事故の再発検知):
bash # フォントカードの総数(2026-08-24 実測の基準=178・Lab と mikke! で必ず一致する) curl -sL "https://lab.terasu.scale-group.co.jp/fonts/?cb=$RANDOM" | grep -c 'data-mk-type="font"' curl -sL "https://mikke.scale-group.co.jp/fonts/?cb=$RANDOM" | grep -c 'data-mk-type="font"'
6. 完了報告(3行・事実だけ)
- 追加したフォント名+カテゴリ
- 本番URL2つ: https://lab.terasu.scale-group.co.jp/fonts/ / https://mikke.scale-group.co.jp/fonts/
- 実機検証OKの旨
退化禁止・順守
- HTML本体は手編集しない(1件=1ファイルのJSON追加=競合ゼロ方式)。カード生成は必ず
add_font.py経由。 - 順番厳守:
add_font.py→build_core.py→extract_fonts.py(逆にすると集約前のデータを読む)。 data/mikke-fonts.jsonを作り直さない(2026-07-24 の事故の真因)。mikke! には web-fonts を通さず
直接足した日本語フォント25件と、絞り込み用の軸(lang/shape/mood)があり、丸ごと再生成すると消える。
いまのextract_fonts.pyはマージ方式(既存は消さない・取れた項目だけ更新)なので、
この挙動を変えないこと。件数が減ったら止まる安全弁も入っている。- 有料フォント(Adobe Fonts等のkit依存)は一般公開のmikke!に載せない=無料・自己ホスト可能なものに限る。
関連
- 兄弟コマンド:
/section(セクションを抽出)・/mikke(参考サイトを追加) - リポ:
~/dev/terasu-lab(Lab)/~/dev/mikke(mikke!)/ 共通は submodulecore/(terasu-web-core)
※ 旧~/dev/lab-terasuは参照用。ここで作業しても本番に出ない - 主要ファイル(すべて core 側):
tools/add_font.py(カード生成)・tools/extract_fonts.py(mikke!用抽出・マージ方式)
・データdata/web-fonts/<id>.json→web-fonts-data.json/data/mikke-fonts.json
変更履歴(★=大きな変化)
| ver | 日付 | 変更内容 |
|---|---|---|
| v2.2 | 2026-08-24 | ★フォントのデータ源が2系統ある件を明文化+3つめの退化を根治。①add_font.py の重複ガードは data/web-fonts/ しか見ず、mikke! に直接登録された書体を素通りする(実測: 送られた6書体は全部 mikke! に既存で、Lab に無いのは3件だけだった)→ 着手前に data/mikke-fonts.json を名前で照合し id と文言を既存に合わせる手順を追加 ②extract_fonts.py の blend() が Lab の和文プレビューを mikke! の英字サンプル欄に流し込んで日本語に化けさせていた("Build the future"→"美しい設計")→ 既存の sample_en/sample_jp は上書きしない保護を追加 ③検品コマンドを実カード数(data-mk-type="font")に修正・基準178件。あわせて node 未導入機の npx 対処を追記 |
| v2.1 | 2026-07-24 | 会社名(--company)を追加(大串指示「今後は"ある会社のHPで見たフォント"を入れていく設計。絞り込みで会社名も見られるように」)。既存81件は「Googleフォント」で登録済み。/mikke から流れてくる入口Bを明記(参考HPの社名を入れる)。あわせて Lab のフォント図鑑に絞り込み4軸・検索・削除ボタンを実装(それまで絞り込みは中身が空で使えなかった) |
| v2.0 | 2026-07-24 | ★リポ分離に追従+2つの退化を根治。①ツールを core へ移設(旧リポに書いていてどちらの本番にも出ない状態だった)②extract_fonts.py の丸ごと再生成をやめマージ方式に(mikke!の日本語フォント25件が消えていた・実測81→57件)③レコードごと差し替えると mikke! の絞り込み軸(lang/shape/mood)が消えるのでフィールド単位の重ね方に。両リポの core ポインタを進める手順と、両方の実機検証を必須化 |
| v1.0 | 2026-06-30 | 新設(旧 ~/dev/lab-terasu 単一リポ時代) |
- memory: project_terasu_lab / project_mikke |