[{"data":1,"prerenderedAt":529},["ShallowReactive",2],{"post-index":3,"post-claude-code-mods-intro":453},{"posts":4,"categories":402,"tags":411},[5,17,35,43,60,74,87,105,122,144,156,167,179,193,208,223,239,250,264,275,285,296,308,319,331,343,356,367,377,387],{"slug":6,"title":7,"description":8,"publishedAt":9,"updatedAt":9,"category":10,"tags":13,"thumbnail":16},"ai-cognitive-debt-approval"," 認知負債は「承認」で生まれる ── コーディングエージェント時代の意図負債と、個人・チームの向き合い方","コーディングエージェントに実装を任せると、コードは速く書けるのに人の理解が追いつかない。認知負債・意図負債・理解負債の違いを「下り」と「上り」で整理し、負債が生まれる承認の瞬間と、個人とチームでできる対策、まだ答えのない問いを、自分の体験から考える。","2026-11-03T17:12:07.686Z",{"name":11,"slug":12},"AI","ai",[14],{"name":15,"slug":15},"organization",null,{"slug":18,"title":19,"description":20,"publishedAt":21,"updatedAt":21,"category":22,"tags":23,"thumbnail":16},"design-harness-personal-product","デザインハーネスを個人開発で組んだ — AI が作る画面のずれを止めるまで","デザイナーのいない個人開発で、AI が作る画面のずれを止めるまでの記録。Codex の Product Design で画像の案を出して画面を作り直し、デザインファイルとコードの食い違いを正本の分担で片付け、lint・見た目の比較・AI の評価役からなるデザインハーネスで外れたら止める仕組みを組んだ。","2026-11-03T15:39:02.665Z",{"name":11,"slug":12},[24,27,30,32],{"name":25,"slug":26},"claude code","claude-code",{"name":28,"slug":29},"design system","design-system",{"name":31,"slug":31},"codex",{"name":33,"slug":34},"design harnes","design-harnes",{"slug":36,"title":37,"description":38,"publishedAt":39,"updatedAt":39,"category":40,"tags":41,"thumbnail":16},"claude-code-mods-intro","Claude Codeの「Claude Mods」とは？ 入れてみた3つのmodと、安全に入れる手順","Claude Codeの新機能Claude Mods（v2.1.287〜）を紹介する。hooks・skills・MCPとの違い、入れてみたmod 3つ（prompt-rail・md-prompt・qa-guide）の使い方、claude plugin validateで中身を確かめて入れる手順をまとめた。","2026-11-03T15:30:44.678Z",{"name":11,"slug":12},[42],{"name":25,"slug":26},{"slug":44,"title":45,"description":46,"publishedAt":47,"updatedAt":47,"category":48,"tags":51,"thumbnail":16},"worktree-shared-reverse-proxy","AI 時代の並列開発の環境構築 — git worktree ごとにアプリを同時に動かす","git worktree の並列開発で、各 worktree のフロントとバックを同時に動かす Docker Compose 構成を紹介する。ポートはずらさず共有のリバースプロキシでホスト名に振り分け、DB は 1 つを共有ネットワークに置いて全 worktree から参照する。","2026-11-03T15:24:32.067Z",{"name":49,"slug":50},"Dev Env","dev-env",[52,54,57],{"name":53,"slug":53},"git",{"name":55,"slug":56},"Docker","docker",{"name":58,"slug":59},"開発環境","development-environment",{"slug":61,"title":62,"description":63,"publishedAt":64,"updatedAt":64,"category":65,"tags":66,"thumbnail":16},"ghostty-herdr-dev-env","Ghostty + herdr で組む開発環境（2026年9月版） — AI エージェントを並べてターミナルで開発する","WezTerm + tmux + 自作ツールから Ghostty + herdr に移した私の開発環境を紹介する。Claude Code・Codex・takt を並べて動かす 1 タスクの流れ、ターミナル内ブラウザで画面の要素を AI に渡す方法、Neovim・lazygit・hunk・Nix まで層ごとにまとめた。","2026-11-03T15:14:47.700Z",{"name":49,"slug":50},[67,68,70,72],{"name":58,"slug":59},{"name":69,"slug":69},"herdr",{"name":71,"slug":71},"ghostty",{"name":73,"slug":73},"terminal",{"slug":75,"title":76,"description":77,"publishedAt":78,"updatedAt":78,"category":79,"tags":80,"thumbnail":16},"dotfiles-operation-and-nix","設定ファイルを端末に置いたままにしない — dotfiles 運用のすすめと、その先の Nix","設定ファイルを Git リポジトリで管理する dotfiles 運用の始め方と、その先で効いてくる Nix の話。何を入れて何を入れないか、配線の 3 手法の比較、運用して見えてくる穴、3 端末を 1 つの設定で回すところまでを実例で書く。","2026-11-03T15:04:48.084Z",{"name":49,"slug":50},[81,82,85],{"name":58,"slug":59},{"name":83,"slug":84},"Nix","nix",{"name":86,"slug":86},"dotfiles",{"slug":88,"title":89,"description":90,"publishedAt":91,"updatedAt":91,"category":92,"tags":93,"thumbnail":102},"opencode-go-plan-evaluation","OpenCode Go プランを評価する — 月$10 で LLM オーケストレーションの中間層は作れるか","OpenCode が提供する月額固定の Go プラン（初月$5、翌月以降$10\u002F月）を、料金体系・想定ユースケース・3層 LLM 構成における中間モデル層としての適合性まで含めて評価する。","2026-05-07T12:12:31.936Z",{"name":11,"slug":12},[94,97,100],{"name":95,"slug":96},"Harness Engineering","harness-engineering",{"name":98,"slug":99},"LLM","llm",{"name":101,"slug":101},"opencode",{"url":103,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F6Nh8tVuSCuHunaVeqyegdU\u002F0fee3536b9ee406b986430ebc1b8ebfd\u002FOpenCode_Go_%C3%A3__%C3%A3__%C3%A3__%C3%A3__%C3%A3__%C3%A8__%C3%A4__%C3%A3__%C3%A3__.png","",{"slug":106,"title":107,"description":108,"publishedAt":109,"updatedAt":109,"category":110,"tags":111,"thumbnail":120},"prompt-context-harness-engineering","ハーネスエンジニアリングとは何か：プロンプト→コンテキスト→ハーネスへ至るAIエージェント設計の変遷","「ハーネスエンジニアリング」とは何か。プロンプトエンジニアリング、コンテキストエンジニアリングから続く3段階の変遷を、論文引用（Lost in the Middle \u002F SWE-bench）とClaude Codeの実装例（フック・ルール・Skill）で階層構造として整理する。","2026-04-07T13:04:49.564Z",{"name":11,"slug":12},[112,115,116,119],{"name":113,"slug":114},"Prompt Engineering","prompt-engineering",{"name":95,"slug":96},{"name":117,"slug":118},"Context Engineering","context-engineering",{"name":98,"slug":99},{"url":121,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F74HnVGS2R8wphJ1nGHgLfb\u002Fb87d3d6e35ccc518e04d9959c7637a88\u002Fã__ã__ã__ã__ã__ã__ã__ã__ã__ã__ã_ªã__ã__ã__ã__ã__ä__ã__ï__ã__ã__ã__ã__ã__ã__ã__â__ã__ã__ã__ã__ã__ã__â__ã__ã__ã__ã__ã__è__ã__A.png",{"slug":123,"title":124,"description":125,"publishedAt":126,"updatedAt":126,"category":127,"tags":130,"thumbnail":142},"authjs-v5-jwt-dual-timeout-bff-django","Auth.js v5 でJWT二重タイムアウトを実装する：BFF + Django連携の設計パターン","Auth.js v5のjwt callbackで8時間の絶対有効期限と30分のアイドルタイムアウトを両立する実装方法を解説。Next.js MiddlewareによるBFF API保護とDjango REST Frameworkとの Token Exchange パターンも紹介する。","2026-04-06T12:45:28.328Z",{"name":128,"slug":129},"Programming","programming",[131,134,136,139],{"name":132,"slug":133},"auth.js","auth-js",{"name":135,"slug":135},"jwt",{"name":137,"slug":138},"Django REST Framework","django-rest-framework",{"name":140,"slug":141},"Next.js","next-js",{"url":143,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002FpqkFfHKpf2UqoNrB6KrKS\u002F672a78076f28d88b31509c230f9c3f64\u002FAuth.js_v5_ã__ã__JWTäº_é__ã__ã__ã__ã__ã__ã__ã__å__è__ã__ã__ï__BFF___Djangoé__æ_ºã__è__è__ã__ã__ã__ã__ã__.png",{"slug":145,"title":146,"description":147,"publishedAt":148,"updatedAt":148,"category":149,"tags":150,"thumbnail":154},"claude-code-spec-to-growing-claudemd","仕様書を「渡す」からCLAUDE.mdを「育てる」へ — Claude Codeの使い方が変わった話","Claude Codeに仕様書を丸ごと渡す運用から、CLAUDE.mdを継続的に育てる運用へ。「間違えたら追加」ルールの実践例と、20行→146行+31スキルに育てた記録。","2026-04-02T14:58:11.375Z",{"name":11,"slug":12},[151,152,153],{"name":25,"slug":26},{"name":113,"slug":114},{"name":117,"slug":118},{"url":155,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002FqybhQ2TQSYQhIvDhWxqvs\u002F9f8b888e11a76223c8a1b1da42df5ce1\u002Fä__æ__æ__ã__ã__æ__ã__ã__ã__ã__CLAUDE.mdã__ã__è__ã__ã__ã__ã___â___Claude_Codeã__ä__ã__æ__ã__ã__å__ã__ã__ã__è__.png",{"slug":157,"title":158,"description":159,"publishedAt":160,"updatedAt":160,"category":161,"tags":162,"thumbnail":165},"claude-code-harness-engineering","Claude Codeを覚醒させる「ハーネスエンジニアリング」 CLAUDE.md・Hooks・Rules設定の徹底解説","プロンプトを書く時代から、AIが最高に働く環境を設計する時代へ。Claude CodeのCLAUDE.md、Hooks、Rules、Settings、Agent Routingを体系的に解説し、自作のオーケストレーションシステム「ai-orchestra」による統合管理の実践例を紹介する。","2026-03-22T08:59:48.575Z",{"name":11,"slug":12},[163,164],{"name":25,"slug":26},{"name":95,"slug":96},{"url":166,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F3liirUgzBlFBuAMoytyN5E\u002F66ba6b07385791bcaae4ddf404f06ce1\u002FClaude_Codeã__è__é__ã__ã__ã__ã__ã__ã__ã__ã__ã__ã__ã__ã__ã__ã__ã_ªã__ã__ã__ã___CLAUDE.mdã__Hooksã__Rulesè__å__ã__å__åº_è__èª_.png",{"slug":168,"title":169,"description":170,"publishedAt":171,"updatedAt":172,"category":173,"tags":174,"thumbnail":177},"claude-code-dev-toolchain","Claude Code開発を支える私のツールチェイン — ターミナルからAIデザインまで","Claude Code CLIを中心とした開発環境を紹介する。WezTerm + Tmuxのターミナル構成、GTRやBatonによる並列開発、ステータスライン・通知フックのカスタマイズ、MCP\u002Fプラグイン活用、Aqua VoiceやPencilとの連携まで、実際に使っているツールチェインの全体像をまとめた。","2026-03-21T19:30:43.616Z","2026-11-03T15:18:14.982Z",{"name":49,"slug":50},[175,176],{"name":25,"slug":26},{"name":58,"slug":59},{"url":178,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F4wFUBAqC9yuIgeo3xWVHJM\u002F8843248b854fee93872b5ac519d16bc2\u002FClaude_Codeé__ç_ºã__æ__ã__ã__ç__ã__ã__ã__ã__ã__ã__ã__ã___â___ã__ã__ã__ã__ã__ã__ã__AIã__ã__ã_µã__ã__ã__ã__ã__ã__.png",{"slug":180,"title":181,"description":182,"publishedAt":183,"updatedAt":184,"category":185,"tags":186,"thumbnail":191},"lazygit-commit-message-auto-generate","【コピペで導入】lazygit × Claude Code でコミットメッセージ自動生成","lazygit の customCommands と Claude Code の --print モードを組み合わせ、Ctrl+G 一発で Conventional Commits 形式のコミットメッセージを自動生成する方法を解説。コピペ可能な完成形設定と、4段階の試行錯誤で得たハマりポイントを共有します。","2026-03-15T04:36:20.532Z","2026-11-03T15:18:53.496Z",{"name":49,"slug":50},[187,188,189],{"name":53,"slug":53},{"name":25,"slug":26},{"name":190,"slug":190},"lazygit",{"url":192,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F62ov1mzeLUjRm6cbzQ7R92\u002F3bc21a7fe7ec517ad3258b6264d4097e\u002Fã__ã__ã__ã__ã__ã__ã__ã__å__å__ã__lazygit_Ã__Claude_Code_ã__ã__ã__ã__ã__ã__ã__ã__ã__ã__ã__ã__è_ªå__ç__æ__.png",{"slug":194,"title":195,"description":196,"publishedAt":197,"updatedAt":198,"category":199,"tags":200,"thumbnail":206},"git-worktree-runner-guide","git-worktree-runner で worktree 管理が劇的にラクになった話","git-worktree-runner（GTR）は git worktree の操作を 1 コマンドに集約する CLI ラッパーです。Taskfile.yaml での運用から GTR に移行した体験を元に、インストール・設定・AI 並列開発での活用法を解説します。","2026-03-09T15:32:31.316Z","2026-11-03T15:18:33.924Z",{"name":49,"slug":50},[201,202,204],{"name":53,"slug":53},{"name":203,"slug":203},"git-worktree",{"name":205,"slug":205},"git-worktree-runner",{"url":207,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F7BRBfHFocF2ABOeOQmtIic\u002Fa63ce99493098bc42123e4315f43d768\u002Fgit-worktree-runner_ã__ã___worktree_ç__ç__ã__ã__å__ç__ã__ã__ã__ã__ã_ªã__ã__è__.png",{"slug":209,"title":210,"description":211,"publishedAt":212,"updatedAt":212,"category":213,"tags":214,"thumbnail":221},"rag-basic-knowledge","RAG入門 — 検索拡張生成の基礎知識を実験結果とともに学ぶ","RAG（検索拡張生成）の仕組みをVectorDB・Embedding・チャンク分割の3要素に分解して解説。Embeddingモデル変更で正答率0\u002F5→4\u002F5に改善した検証データも公開。","2026-03-01T11:29:25.841Z",{"name":11,"slug":12},[215,218,219],{"name":216,"slug":217},"RAG","rag",{"name":98,"slug":99},{"name":220,"slug":220},"ollama",{"url":222,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F1enfpUixTuvis0oX9x5Cfa\u002F934aed76ac994412ceb37dfdf5dc6f6c\u002FRAGå__é___â___æ__ç__æ__å_µç__æ__ã__å_ºç__ç__è__ã__å__é__çµ_æ__ã__ã__ã__ã__å__ã_µã__.png",{"slug":224,"title":225,"description":226,"publishedAt":227,"updatedAt":228,"category":229,"tags":230,"thumbnail":237},"engineer-ai-daily-workflow","1人のエンジニアがAIを日常にどう組み込んでいるか — 契約サービスから活用フローまで全公開","Claude Code、ChatGPT、Gemini、Aqua Voice、Adobe Fireflyの5サービスを使い分けるエンジニアが、開発・情報収集・ブレスト・音声入力・振り返りまで、AIを日常に組み込んだリアルな活用フローを全公開します。","2026-02-18T14:13:58.531Z","2026-02-18T14:14:12.514Z",{"name":11,"slug":12},[231,232,234],{"name":98,"slug":99},{"name":233,"slug":233},"openclaw",{"name":235,"slug":236},"マルチエージェント","multi-agent",{"url":238,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F5gBC06O8WX2GX8wmoOXQfy\u002F27a11e0f280f642a781e462dead9d3ae\u002F1äººã__ã__ã__ã__ã__ã__ã__ã__ã__AIã__æ__å__ã__ã__ã__ã__çµ_ã__è__ã__ã__ã__ã__ã__ã___â___å__ç__ã_µã__ã__ã__ã__ã__ã__æ__ç__ã__ã_.png",{"slug":240,"title":241,"description":242,"publishedAt":243,"updatedAt":243,"category":244,"tags":245,"thumbnail":248},"ai-orchestra-design-and-practice","Claude Codeマルチエージェント実践｜AI Orchestraで超えた2つの壁","Claude Code単体運用で生じるコンテキスト溢れ・役割混乱の課題を、25種の専門エージェントとClaude×Codex×Geminiのマルチモデル連携で解決するオーケストレーションシステム「AI Orchestra」。その設計思想、Hookによる自動ルーティング、並列レビューなどの実装を具体的に紹介します。","2026-02-08T08:01:16.212Z",{"name":11,"slug":12},[246,247],{"name":235,"slug":236},{"name":98,"slug":99},{"url":249,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F6j2KWOOo7wJfUobTCg3o2w\u002F126c8d413cd9a56e64fba107544ec4e1\u002FClaude_Codeã__ã__ã__ã__ã__ã__ã__ã__ã__ã__å__è_µï__AI_Orchestraã__ã__è__ã__ã__2ã__ã__å__.png",{"slug":251,"title":252,"description":253,"publishedAt":254,"updatedAt":255,"category":256,"tags":257,"thumbnail":262},"ai-benchmark-guide","AIベンチマーク読み方ガイド｜SWE-bench・GPQA・ARC-AGIの意味と活用法","SWE-bench、GPQA Diamond、ARC-AGI、Terminal-Benchなど主要AIベンチマークの読み方を解説。2026年2月最新のモデルスコア比較と、コーディングエージェントへのタスク振り分けに活かす実践的な指針を紹介します。","2026-02-07T16:10:19.131Z","2026-02-07T16:11:56.095Z",{"name":11,"slug":12},[258,259],{"name":98,"slug":99},{"name":260,"slug":261},"Benchmark","benchmark",{"url":263,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F3QlfPsXmLogdj9o4mdgFYQ\u002F73a69ca272ac4e4fdcf977f322c0218a\u002FAIã__ã__ã__ã__ã__ã__ã__èª_ã__æ__ã__ã__ã__ã__ã__ï__SWE-benchã__GPQAã__ARC-AGIã__æ__å__ã__æ__ç__æ__.png",{"slug":265,"title":266,"description":267,"publishedAt":268,"updatedAt":268,"category":269,"tags":270,"thumbnail":273},"multi-agent-building-guide","マルチエージェント構築入門｜構成の全体像と3つの実装アプローチ","マルチエージェントの構築方法を解説。オーケストレーター・サブエージェント・ツール連携の3要素から、自作・フレームワーク・既存ツール活用の選択肢まで。Claude Codeでの実装例付き。","2026-02-05T12:52:58.095Z",{"name":11,"slug":12},[271,272],{"name":98,"slug":99},{"name":235,"slug":236},{"url":274,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F68XZFvLA17pegNy0lHCrYN\u002Ff90202a483bf087f4fa4cbb80dae934e\u002Fã__ã__ã__ã__ã__ã__ã__ã__ã__ã__æ__ç__å__é__ï__æ__æ__ã__å__ä__å__ã__3ã__ã__å__è__ã__ã__ã__ã__ã__ã__.png",{"slug":276,"title":277,"description":278,"publishedAt":279,"updatedAt":279,"category":280,"tags":281,"thumbnail":283},"openclaw-security-and-features","OpenClaw徹底解説 ── セルフホスト型AIアシスタントの可能性とセキュリティリスク","「AIが自分の代わりにメッセージを返信してくれたら…」そんな願いを叶えるツールが、いま爆発的な人気を集めています。その名も「OpenClaw」。わずか2ヶ月でGitHub Stars 10万を突破し、週間200万人が訪れるほどの注目を浴びています。  しかし、その急成長の裏には商標問題、詐欺騒動、そして深刻なセキュリティ脆弱性の発覚と、波乱万丈なドラマがありました。","2026-02-03T15:20:26.415Z",{"name":11,"slug":12},[282],{"name":233,"slug":233},{"url":284,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F7aKouVOZSGnzVUGgLQfa22\u002F5688eb515dc5f0b2c301b9b8c267ec20\u002F00036.png",{"slug":286,"title":287,"description":104,"publishedAt":288,"updatedAt":289,"category":290,"tags":291,"thumbnail":294},"custom-instructions","ChatGPTやClaudeがもっと賢くなる！カスタム指示の書き方と実例集","2026-01-30T17:42:57.415Z","2026-02-03T15:03:06.461Z",{"name":11,"slug":12},[292,293],{"name":98,"slug":99},{"name":113,"slug":114},{"url":295,"description":287},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F4EojonTOebJGeiaXf98ol0\u002F9e391fc8bd6e548f8c96136c805b49d7\u002FChatGPTã__Claudeã__ã__ã__ã__ã__è__ã__ã_ªã__ï__ã__ã__ã__ã__æ__ç_ºã__æ__ã__æ__ã__å__ä__é__.png",{"slug":297,"title":298,"description":299,"publishedAt":300,"updatedAt":301,"category":302,"tags":303,"thumbnail":306},"ollama-local-llm-setup","ローカルLLMはまず小さめモデルから：Ollamaで始める導入〜疎通確認","acでOllamaを使い、ローカルLLMを最短で起動→1回応答まで確認する手順を解説。モデル選定の考え方、遅い\u002Fメモリ\u002Fディスクの切り分け、API疎通(curl)もまとめます。","2026-01-18T06:40:49.270Z","2026-01-21T13:05:14.924Z",{"name":11,"slug":12},[304,305],{"name":220,"slug":220},{"name":98,"slug":99},{"url":307,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F1NQmtspOD1S6LEb4SrCYIQ\u002F49c213de131a9a4ea139c32e805f3b01\u002Fã__ã__ã__ã__LLMã__ã__ã__ã__å__ã__ã__ã__ã__ã__ã__ã__ã__ï__Ollamaã__ã__å__ã__ã__å__å__ã__ç__é__ç_ºèª_.png",{"slug":309,"title":310,"description":104,"publishedAt":311,"updatedAt":312,"category":313,"tags":314,"thumbnail":317},"llm-leaderboard-score-guide","LLMリーダーボードの読み方：スコア指針とベンチマーク確認手順","2026-01-10T08:57:26.636Z","2026-01-18T06:55:58.990Z",{"name":11,"slug":12},[315,316],{"name":260,"slug":261},{"name":98,"slug":99},{"url":318,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F8u7GQ3mAlcvIHOc5bFJc6\u002Fa953bf74c33117efa393eaf8541f515a\u002FLLMã_ªã__ã__ã__ã__ã__ã__ã__ã__ã__ã__èª_ã__æ__.png",{"slug":320,"title":321,"description":104,"publishedAt":322,"updatedAt":322,"category":323,"tags":324,"thumbnail":329},"vite_docker_esbuild-error","Vite + Docker + ESBuild Errorの解決","2021-11-12T03:53:22.965Z",{"name":128,"slug":129},[325,326],{"name":55,"slug":56},{"name":327,"slug":328},"Vite","vite",{"url":330,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F5gqsl4ZChCI3uaSXQA86du\u002F3c94f9928ffaaab2d8911d32e742de1e\u002Fprogramming.jpg",{"slug":332,"title":333,"description":104,"publishedAt":334,"updatedAt":335,"category":336,"tags":337,"thumbnail":341},"nuxt-router-scroll-control","Nuxt.jsのページ遷移時のスクロール制御したい","2021-10-28T14:31:11.276Z","2021-10-28T14:35:33.155Z",{"name":128,"slug":129},[338],{"name":339,"slug":340},"Nuxt.js","nuxt-js",{"url":342,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F6dqpNPZsBJJ7x9XJj1Ld1z\u002Fcd1bb9323a8ffb0657ad79525403e1ff\u002Fnuxt.jpg",{"slug":344,"title":345,"description":104,"publishedAt":346,"updatedAt":347,"category":348,"tags":349,"thumbnail":354},"react-drf-img_uploader-backend","React × DRFで画像アップロード機能作成 (バックエンド実装編)","2021-10-26T02:56:58.215Z","2021-10-27T11:37:43.829Z",{"name":128,"slug":129},[350,353],{"name":351,"slug":352},"React","react",{"name":137,"slug":138},{"url":355,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F4jbVtK0nXsMKZplpBAwhri\u002Fb0ccef5153d92a7947eb0c682008255c\u002Fdjango-rest-framework.jpg",{"slug":357,"title":358,"description":104,"publishedAt":359,"updatedAt":360,"category":361,"tags":362,"thumbnail":365},"react-drf-img_uploader-frontend","React × DRFで画像アップロード機能作成 (フロント実装編)","2021-10-26T02:39:01.629Z","2021-10-27T11:37:24.670Z",{"name":128,"slug":129},[363,364],{"name":351,"slug":352},{"name":137,"slug":138},{"url":366,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F3uFOs5NyHOvRqYgE1lQ3p6\u002Fd79c8fabb7d4151c5773ffe1cdd2bce3\u002Freact.jpg",{"slug":368,"title":369,"description":104,"publishedAt":370,"updatedAt":371,"category":372,"tags":373,"thumbnail":376},"react-drf-img_uploader-environment","React × DRFで画像アップロード機能作成 (環境構築編)","2021-10-26T02:00:01.702Z","2021-10-27T11:47:28.398Z",{"name":128,"slug":129},[374,375],{"name":351,"slug":352},{"name":137,"slug":138},{"url":330,"description":104},{"slug":378,"title":379,"description":104,"publishedAt":380,"updatedAt":381,"category":382,"tags":383,"thumbnail":385},"docker-install-procedure","各OS毎のDockerインストール手順","2021-10-26T01:43:54.692Z","2022-02-07T14:32:07.791Z",{"name":128,"slug":129},[384],{"name":55,"slug":56},{"url":386,"description":104},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F3aVlE8NIfX12QvTafaC8xE\u002Fd00bf480e212538e1816fc10d2e7b77d\u002Fdocker.jpg",{"slug":388,"title":389,"description":104,"publishedAt":390,"updatedAt":391,"category":392,"tags":395,"thumbnail":399},"notion-clear-trash","Notionのゴミ箱を一括削除する","2021-09-12T13:04:59.853Z","2021-10-21T14:29:03.528Z",{"name":393,"slug":394},"Lifestyle","lifestyle",[396],{"name":397,"slug":398},"Notion","notion",{"url":400,"description":401},"https:\u002F\u002Fimages.ctfassets.net\u002Fd3b1looh8iwg\u002F5binM4YxsZdSXX9SKkGyNP\u002Fcf39353211db8b3e0c4ac18e03b55527\u002Fnotion.jpg","Notion記事用のサムネイル",[403,405,407,409],{"name":49,"slug":50,"count":404},6,{"name":11,"slug":12,"count":406},16,{"name":128,"slug":129,"count":408},7,{"name":393,"slug":394,"count":410},1,[412,414,415,417,418,420,421,422,423,424,425,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450],{"name":98,"slug":99,"count":413},10,{"name":25,"slug":26,"count":404},{"name":137,"slug":138,"count":416},4,{"name":58,"slug":59,"count":416},{"name":55,"slug":56,"count":419},3,{"name":53,"slug":53,"count":419},{"name":95,"slug":96,"count":419},{"name":113,"slug":114,"count":419},{"name":351,"slug":352,"count":419},{"name":235,"slug":236,"count":419},{"name":260,"slug":261,"count":426},2,{"name":117,"slug":118,"count":426},{"name":220,"slug":220,"count":426},{"name":233,"slug":233,"count":426},{"name":132,"slug":133,"count":410},{"name":31,"slug":31,"count":410},{"name":33,"slug":34,"count":410},{"name":28,"slug":29,"count":410},{"name":86,"slug":86,"count":410},{"name":71,"slug":71,"count":410},{"name":203,"slug":203,"count":410},{"name":205,"slug":205,"count":410},{"name":69,"slug":69,"count":410},{"name":135,"slug":135,"count":410},{"name":190,"slug":190,"count":410},{"name":140,"slug":141,"count":410},{"name":83,"slug":84,"count":410},{"name":397,"slug":398,"count":410},{"name":339,"slug":340,"count":410},{"name":101,"slug":101,"count":410},{"name":15,"slug":15,"count":410},{"name":216,"slug":217,"count":410},{"name":73,"slug":73,"count":410},{"name":327,"slug":328,"count":410},{"name":451,"slug":451,"count":452},"takt",0,{"slug":36,"title":37,"description":38,"publishedAt":39,"updatedAt":39,"category":454,"tags":455,"thumbnail":16,"html":457,"headings":458,"readingMinutes":496,"older":497,"newer":503,"related":510},{"name":11,"slug":12},[456],{"name":25,"slug":26},"\u003Cp>Claude Modsは、Claude Codeの公式の拡張の仕組みだ。Claude Codeの中で動くTypeScript（またはJavaScript）の関数で、画面にペインを足したり、プロンプトやツール呼び出しを書き換えたりできる。2026年10月1日（米国時間）のv2.1.287で正式にリリースされた（\u003Ca href=\"https:\u002F\u002Fclaude.com\u002Fblog\u002Fclaude-code-mods\" target=\"_blank\" rel=\"noopener noreferrer\">公式ブログ\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code\u002Freleases\u002Ftag\u002Fv2.1.287\" target=\"_blank\" rel=\"noopener noreferrer\">リリースノート\u003C\u002Fa>）。\u003C\u002Fp>\n\u003Cp>私は発表の数日後に、公開されているmodを3つ入れた。この記事では、modsでできること、入れた3つのmodの使い方、入れる前に中身を確かめる手順を順に書く。\u003C\u002Fp>\n\u003Cp>先に結論を書く。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>modsはpluginに入れて配られる。入れて使うだけならTypeScriptは書かなくてよく、\u003Ccode>\u002Fplugin\u003C\u002Fcode>のコマンド2行で入る。v2.1.287以降は既定で有効\u003C\u002Fli>\n\u003Cli>settings hook（settings.jsonに書く従来のhooks）・skill・MCPと違い、modsはClaude Codeの中で動く。そのため画面に描いたり、組み込みの機能を差し替えたりできる\u003C\u002Fli>\n\u003Cli>modはサンドボックスの外で、自分のユーザー権限で動く。入れる前に\u003Ccode>claude plugin validate\u003C\u002Fcode>で、どのイベントを拾い、どのAPIを呼ぶかを見る\u003C\u002Fli>\n\u003Cli>私が入れたのはprompt-rail（プロンプトの目次）、md-prompt（入力欄のMarkdownに色を付ける）、qa-guide（Claudeの質問に解説を添える）の3つ。最初の1つなら、呼ぶAPIが3つだけのmd-promptが試しやすい\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>検証環境はmacOSとClaude Code 2.1.289（ターミナル、\u003Ccode>&quot;tui&quot;: &quot;fullscreen&quot;\u003C\u002Fcode>）で、2026年10月5日に確認した。\u003C\u002Fp>\n\u003Ch2 id=\"claude-modsとは:-claude-codeの中で動き、画面と挙動を変えられる関数\" tabindex=\"-1\">\u003Cspan class=\"h-no\" aria-hidden=\"true\">01\u003C\u002Fspan>Claude Modsとは: Claude Codeの中で動き、画面と挙動を変えられる関数\u003C\u002Fh2>\n\u003Cp>Claude Codeは、ツールを呼ぶ、権限を確認する、画面の一部を描く、といった動作のたびにイベントを出す。modはこのイベントに差し込む関数で、イベントの前・後・代わりに処理を走らせられる。公式ブログは、1つの関数でできることとして次の例を挙げている。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>モデルに届く前にプロンプトを書き換える\u003C\u002Fli>\n\u003Cli>ツール呼び出しを止める、書き換える、やり直す\u003C\u002Fli>\n\u003Cli>権限リクエストを承認・拒否する\u003C\u002Fli>\n\u003Cli>ツールの出力から秘密情報を消してからClaudeに読ませる\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>画面にも手を入れられる。会話の横にペインを開く、入力欄の上に帯を出す、ツールの結果やClaudeの質問ダイアログの表示を差し替える、ボタンや入力欄を置く、といったことができる（\u003Ca href=\"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fplugins\u002Fmods\u002Foverview\" target=\"_blank\" rel=\"noopener noreferrer\">公式ドキュメント\u003C\u002Fa>）。\u003C\u002Fp>\n\u003Ch3 id=\"settings-hook・skill・mcpとの違い\" tabindex=\"-1\">settings hook・skill・MCPとの違い\u003C\u002Fh3>\n\u003Cp>公式ドキュメントは、modsをsettings hook・skill・MCPサーバーと並べて比べている。mods以外の3つを1行ずつ説明しておく。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>settings hook: settings.jsonに書く従来のhooks。ツール呼び出しの前後などに、シェルコマンドやHTTPリクエスト、プロンプトを走らせる\u003C\u002Fli>\n\u003Cli>skill: \u003Ccode>SKILL.md\u003C\u002Fcode>に書いた手順書。Claudeが読んで、その通りに作業する\u003C\u002Fli>\n\u003Cli>MCPサーバー: 外部のプロセスやサービスで、Claudeに新しいツールを渡す\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>公式ドキュメントの比較表を要約した。\u003C\u002Fp>\n\u003Cdiv class=\"tbl\" tabindex=\"0\" role=\"region\" aria-label=\"Table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C\u002Fth>\n\u003Cth>mod\u003C\u002Fth>\n\u003Cth>settings hook\u003C\u002Fth>\n\u003Cth>skill\u003C\u002Fth>\n\u003Cth>MCPサーバー\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>何を書くか\u003C\u002Ftd>\n\u003Ctd>JavaScript \u002F TypeScript\u003C\u002Ftd>\n\u003Ctd>スクリプトとsettings.jsonの設定\u003C\u002Ftd>\n\u003Ctd>Markdown\u003C\u002Ftd>\n\u003Ctd>任意の言語のサーバー\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>変えられるもの\u003C\u002Ftd>\n\u003Ctd>ツール呼び出し、プロンプト、コマンド、ターン、画面の表示\u003C\u002Ftd>\n\u003Ctd>ツール呼び出しやプロンプトを通すかどうか、ツールの引数と結果、Claudeに足す文脈\u003C\u002Ftd>\n\u003Ctd>Claudeが知っていること・すること\u003C\u002Ftd>\n\u003Ctd>Claudeが使えるツール\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>画面に描けるか\u003C\u002Ftd>\n\u003Ctd>描ける\u003C\u002Ftd>\n\u003Ctd>描けない\u003C\u002Ftd>\n\u003Ctd>描けない\u003C\u002Ftd>\n\u003Ctd>描けない\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>選ぶとき\u003C\u002Ftd>\n\u003Ctd>ペインや帯、独自コマンドがほしい、イベントを書き換えたい\u003C\u002Ftd>\n\u003Ctd>手元のスクリプトでイベントを止める・許可する・記録する\u003C\u002Ftd>\n\u003Ctd>同じ指示を何度も貼っている\u003C\u002Ftd>\n\u003Ctd>Claudeを外部のシステムにつなぐ\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>settings hookもツールの引数を書き換えられるので、書き換えられるかどうかは分かれ目にならない。違いは、modがClaude Codeのプロセスの中で動くことにある。そのため、画面を描くことも、組み込みの機能を差し替えることもできる。実際に\u003Ccode>\u002Fdiff\u003C\u002Fcode>はmodとして作り直されていて、\u003Ccode>\u002Fplugin\u003C\u002Fcode>から無効にしたり、自作のものに置き換えたりできる。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fstatic.zenn.studio\u002Fuser-upload\u002Fbdfe873b0cc4-20261005.png\" alt=\"modはClaude Codeの中でツール呼び出し・プロンプト送信・画面の描画のイベントに差し込まれ、ペインや帯を描く。settings hook・skill・MCPサーバーはClaude Codeの外から関わる\" loading=\"lazy\">\u003C\u002Fp>\n\u003Ch2 id=\"私が入れたmod-3つ\" tabindex=\"-1\">\u003Cspan class=\"h-no\" aria-hidden=\"true\">02\u003C\u002Fspan>私が入れたmod 3つ\u003C\u002Fh2>\n\u003Cp>私が入れた3つのmodは、どれも作者のGitHubリポジトリがマーケットプレイスを兼ねていて、2行のコマンドで入る。入れ方は次の章に、入れる前の確認も含めて書いた。\u003C\u002Fp>\n\u003Ch3 id=\"prompt-rail:-長いセッションで「さっきの指示」に戻れる\" tabindex=\"-1\">prompt-rail: 長いセッションで「さっきの指示」に戻れる\u003C\u002Fh3>\n\u003Cp>1つのセッションで何十回もやり取りしていると、最初に出した条件をどう書いたかを確かめるために、スクロールで遡ることになる。\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Foikon48\u002Fprompt-rail\" target=\"_blank\" rel=\"noopener noreferrer\">prompt-rail\u003C\u002Fa>は、セッション内で自分が送ったプロンプトを、入力欄の上に並ぶ短い線（レール）として表示する。線にマウスを乗せるとそのプロンプトとターンの要約が出て、クリックすると会話のその位置まで飛ぶ。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fstatic.zenn.studio\u002Fuser-upload\u002F62d122b3633d-20261005.png\" alt=\"prompt-railの横レール。入力欄の上に自分のプロンプトが線で並び、マウスを乗せた1本の中身が表示されている\" loading=\"lazy\">\u003C\u002Fp>\n\u003Cp>主な使い方は次の通り。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\u002Fprompt-rail horizontal\u003C\u002Fcode>（入力欄の上、既定）と\u003Ccode>\u002Fprompt-rail vertical\u003C\u002Fcode>（会話の横のペイン）で表示を切り替える。\u003Ccode>\u002Fprompt-rail off\u003C\u002Fcode>で隠す\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fprompt-rail next\u003C\u002Fcode> \u002F \u003Ccode>prev\u003C\u002Fcode> \u002F \u003Ccode>first\u003C\u002Fcode> \u002F \u003Ccode>last\u003C\u002Fcode>で前後のプロンプトへ飛ぶ。\u003Ccode>\u002Fprompt-rail 12\u003C\u002Fcode>は12番目へ、\u003Ccode>\u002Fprompt-rail find &lt;語&gt;\u003C\u002Fcode>はその語を含む最新のプロンプトへ飛ぶ\u003C\u002Fli>\n\u003Cli>\u003Ccode>~\u002F.claude\u002Fkeybindings.json\u003C\u002Fcode>にキーを割り当てると、Claudeの作業中でも飛べる\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cfigure class=\"code\" data-lang=\"json\">\u003Cdiv class=\"code-bar\">\u003Cspan class=\"lang\">JSON\u003C\u002Fspan>\u003Cspan>11 LINES\u003C\u002Fspan>\u003Cbutton class=\"copy\" type=\"button\" data-cursor=\"COPY\">COPY\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki site-code\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode class=\"language-json\">\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"bindings\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">      \"context\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"Chat\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">      \"bindings\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        \"ctrl+k\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"command:prompt-rail-prev\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        \"meta+j\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"command:prompt-rail-next\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">      }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  ]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Ffigure>\n\u003Cp>READMEは、マウスで操作するなら\u003Ccode>&quot;tui&quot;: &quot;fullscreen&quot;\u003C\u002Fcode>を推奨している。Claude DesktopのCodeタブでは、レールとプレビューは出るが、クリックしてもその位置へは飛べない。Desktopがmodに会話のスクロールを許していないためだ（READMEに記載）。\u003C\u002Fp>\n\u003Ch3 id=\"md-prompt:-入力欄に書いたコードブロックや表に色が付く\" tabindex=\"-1\">md-prompt: 入力欄に書いたコードブロックや表に色が付く\u003C\u002Fh3>\n\u003Cp>プロンプトにコードや表を書いて指示するとき、入力欄は素のテキストなので、どこからどこまでがコードかが見分けにくい。\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnogu66\u002Fmd-prompt\" target=\"_blank\" rel=\"noopener noreferrer\">md-prompt\u003C\u002Fa>は、入力欄のMarkdownに打った端から色を付ける。\u003Ccode>```\u003C\u002Fcode>で始めたコードブロックは、閉じる前から背景つきのカードになり、言語に応じてシンタックスハイライトされる。見出し、太字、リスト、チェックボックス、引用、表、リンクにも色が付く。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fstatic.zenn.studio\u002Fuser-upload\u002F56bb3e6a2a55-20261005.png\" alt=\"md-promptで入力欄に書いたTypeScriptのコードブロックがハイライトされている様子\" loading=\"lazy\">\u003C\u002Fp>\n\u003Cp>md-promptは色を付けるだけで、文字は変えない。送信されるのは打った文字そのままで、\u003Ccode>```\u003C\u002Fcode> や \u003Ccode>**\u003C\u002Fcode>などの記号も消えずに薄く表示される。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\u002Fmd-prompt on\u003C\u002Fcode> \u002F \u003Ccode>off\u003C\u002Fcode> \u002F \u003Ccode>toggle\u003C\u002Fcode>で切り替える。\u003Ccode>\u002Fconfig\u003C\u002Fcode>で「Markdown」を検索しても切り替えられる\u003C\u002Fli>\n\u003Cli>複数行の下書きは、\u003Ccode>\\\u003C\u002Fcode>のあとにEnterで改行する（ターミナルが対応していればShift+Enterでもよい）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>4行以上を貼り付けた部分には色が付かない。Claude Codeが貼り付けを\u003Ccode>[Pasted text #N +M lines]\u003C\u002Fcode>に畳み、md-promptが受け取る編集イベントが発生しないためだ（READMEに記載）。1〜3行の貼り付けには色が付く。\u003C\u002Fp>\n\u003Ch3 id=\"qa-guide:-claudeの質問に、文脈と選択肢ごとの影響を添えてくれる\" tabindex=\"-1\">qa-guide: Claudeの質問に、文脈と選択肢ごとの影響を添えてくれる\u003C\u002Fh3>\n\u003Cp>ClaudeがAskUserQuestionで選択肢を出してきたとき、セッションが長いと、何の話だったかを思い出すために会話を遡ることがある。\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faieo-product\u002Fclaude_qamods\" target=\"_blank\" rel=\"noopener noreferrer\">qa-guide\u003C\u002Fa>は、質問ダイアログの横にペインを開き、次の内容を表示する。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>AIによる解説: いまClaudeが従っている指示の要約、なぜ今この質問をしているか、選択肢ごとに何が起きるか、おすすめ1行\u003C\u002Fli>\n\u003Cli>自分が直近に入力した指示\u003C\u002Fli>\n\u003Cli>質問の直前にClaudeが書いた説明の末尾\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fstatic.zenn.studio\u002Fuser-upload\u002Fd8fe6816a1c8-20261005.png\" alt=\"qa-guideのペイン。左にClaudeの質問ダイアログ、右にAI解説と直近の指示が出ている\" loading=\"lazy\">\u003C\u002Fp>\n\u003Cp>ターミナルの幅が144列以上あると、ペインは質問のたびに自動で開く。狭いときは\u003Ccode>\u002Fqa-guide\u003C\u002Fcode>で開ける。ペインにフォーカスを移す（\u003Ccode>Ctrl+X\u003C\u002Fcode> → \u003Ccode>Tab\u003C\u002Fcode>、またはクリック）と、\u003Ccode>p\u003C\u002Fcode> \u002F \u003Ccode>n\u003C\u002Fcode>で過去の質問、\u003Ccode>l\u003C\u002Fcode>で最新の質問、\u003Ccode>h\u003C\u002Fcode>で履歴一覧を表示できる。\u003Ccode>a\u003C\u002Fcode>を押すと、AI解説のON \u002F OFFが切り替わる。表示言語は\u003Ccode>\u002Fconfig\u003C\u002Fcode>の\u003Ccode>language\u003C\u002Fcode>で\u003Ccode>auto\u003C\u002Fcode> \u002F \u003Ccode>en\u003C\u002Fcode> \u002F \u003Ccode>ja\u003C\u002Fcode>から選ぶ。\u003C\u002Fp>\n\u003Cp>AI解説は、質問1件ごとにモデル呼び出しを1回増やす。セッションのプロンプトキャッシュを使えるときは安く済むが、無料ではない。気になるなら、ペインで\u003Ccode>a\u003C\u002Fcode>を押すと次の質問からAI解説が止まる（すでに始まった呼び出しは止まらない）。qa-guide自身は独自の通信をせず、質問や回答をディスクに書かない。ただしAI解説の追加リクエストでは、会話や質問文がClaude Code経由でモデルに渡る（READMEに記載）。\u003C\u002Fp>\n\u003Ch2 id=\"安全に入れる手順:-入れる前にclaude-plugin-validateで中身を見る\" tabindex=\"-1\">\u003Cspan class=\"h-no\" aria-hidden=\"true\">03\u003C\u002Fspan>安全に入れる手順: 入れる前に\u003Ccode>claude plugin validate\u003C\u002Fcode>で中身を見る\u003C\u002Fh2>\n\u003Cp>modはClaude Codeの中で、自分のユーザー権限で動く。公式ドキュメントは、modが読み込まれたあとにできることとして、次を挙げている。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>自分のアカウントで読める範囲のファイルの読み書き、プログラムの起動、ネットワーク通信\u003C\u002Fli>\n\u003Cli>環境変数や設定ファイルの読み取り（そこに置いたAPIキーも含む）\u003C\u002Fli>\n\u003Cli>送ったプロンプトとClaudeのツール呼び出しをすべて見る、書き換える\u003C\u002Fli>\n\u003Cli>ツール呼び出しを、確認ダイアログが出る前に承認する\u003C\u002Fli>\n\u003Cli>自分のプランやAPIキーでモデルを呼ぶ\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Claude Codeのサンドボックスを有効にしていても、隔離されるのはClaudeが実行するBashコマンドで、modが起動したプロセスはサンドボックスの外で動く。そこで、入れる前に\u003Ccode>claude plugin validate\u003C\u002Fcode>で、そのmodがどのイベントを拾い、どのAPIを呼ぶかを確かめる。validateはコードを実行せずに読むだけなので、入れる前に使える。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fstatic.zenn.studio\u002Fuser-upload\u002Fdb177f676748-20261005.png\" alt=\"サンドボックスが囲むのはClaudeのBashコマンドだけで、modはその外からファイルの読み書き、プログラムの起動、ネットワーク通信、環境変数・APIキー、モデル呼び出しに手が届く\" loading=\"lazy\">\u003C\u002Fp>\n\u003Ch3 id=\"手順\" tabindex=\"-1\">手順\u003C\u002Fh3>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fstatic.zenn.studio\u002Fuser-upload\u002F5deb11d2de0c-20261005.png\" alt=\"marketplace addでリポジトリを取得し、claude plugin validateでhooks:とcalls:を読み、納得できたら\u002Fplugin installで入れ、\u002Fpluginで1 mod activeを確認する。更新したらmarketplace updateのあとにもう一度validateする\" loading=\"lazy\">\u003C\u002Fp>\n\u003Cp>prompt-railを例に書く。\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>マーケットプレイスを追加する。この時点ではまだmodは入っておらず、リポジトリが\u003Ccode>~\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Foikon48\u002F\u003C\u002Fcode>に取得される\u003C\u002Fp>\n\u003Cfigure class=\"code\" data-lang=\"text\">\u003Cdiv class=\"code-bar\">\u003Cspan class=\"lang\">TEXT\u003C\u002Fspan>\u003Cspan>1 LINE\u003C\u002Fspan>\u003Cbutton class=\"copy\" type=\"button\" data-cursor=\"COPY\">COPY\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki site-code\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode class=\"language-text\">\u003Cspan class=\"line\">\u003Cspan>\u002Fplugin marketplace add oikon48\u002Fprompt-rail\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Ffigure>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>シェルでmodのディレクトリをvalidateする。mod本体の場所は、リポジトリの\u003Ccode>.claude-plugin\u002Fmarketplace.json\u003C\u002Fcode>の\u003Ccode>source\u003C\u002Fcode>に書かれている（今回の3つはどれも\u003Ccode>plugins\u002F&lt;mod 名&gt;\u003C\u002Fcode>）\u003C\u002Fp>\n\u003Cfigure class=\"code\" data-lang=\"bash\">\u003Cdiv class=\"code-bar\">\u003Cspan class=\"lang\">BASH\u003C\u002Fspan>\u003Cspan>1 LINE\u003C\u002Fspan>\u003Cbutton class=\"copy\" type=\"button\" data-cursor=\"COPY\">COPY\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki site-code\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode class=\"language-bash\">\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">claude\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> plugin\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> validate\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> ~\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Foikon48\u002Fplugins\u002Fprompt-rail\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Ffigure>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>出力の\u003Ccode>hooks:\u003C\u002Fcode>と\u003Ccode>calls:\u003C\u002Fcode>の行を読み、納得できたら入れる\u003C\u002Fp>\n\u003Cfigure class=\"code\" data-lang=\"text\">\u003Cdiv class=\"code-bar\">\u003Cspan class=\"lang\">TEXT\u003C\u002Fspan>\u003Cspan>1 LINE\u003C\u002Fspan>\u003Cbutton class=\"copy\" type=\"button\" data-cursor=\"COPY\">COPY\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki site-code\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode class=\"language-text\">\u003Cspan class=\"line\">\u003Cspan>\u002Fplugin install prompt-rail@oikon48\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Ffigure>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>インストール後の案内に従って有効にする。\u003Ccode>Run \u002Freload-plugins to activate.\u003C\u002Fcode>と出たら\u003Ccode>\u002Freload-plugins\u003C\u002Fcode>を実行するか、新しいセッションを始める（prompt-railのREADMEは新しいセッションを案内している）。シェルから入れた場合は、開いているセッションで\u003Ccode>\u002Freload-plugins\u003C\u002Fcode>を実行する。\u003Ccode>\u002Fplugin\u003C\u002Fcode>を開くと、タブの下に\u003Ccode>1 mod active · prompt-rail\u003C\u002Fcode>のような行が出る\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>ほかの2つは次のコマンドで入る。\u003C\u002Fp>\n\u003Cfigure class=\"code\" data-lang=\"text\">\u003Cdiv class=\"code-bar\">\u003Cspan class=\"lang\">TEXT\u003C\u002Fspan>\u003Cspan>5 LINES\u003C\u002Fspan>\u003Cbutton class=\"copy\" type=\"button\" data-cursor=\"COPY\">COPY\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki site-code\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode class=\"language-text\">\u003Cspan class=\"line\">\u003Cspan>\u002Fplugin marketplace add nogu66\u002Fmd-prompt\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>\u002Fplugin install md-prompt@nogu66\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>\u002Fplugin marketplace add aieo-product\u002Fclaude_qamods\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>\u002Fplugin install qa-guide@claude-qamods\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Ffigure>\n\u003Ch3 id=\"出力の読み方\" tabindex=\"-1\">出力の読み方\u003C\u002Fh3>\n\u003Cp>\u003Ccode>hooks:\u003C\u002Fcode>の行はそのmodが受け取るイベント、\u003Ccode>calls:\u003C\u002Fcode>の行はコードが呼ぶmods APIの一覧だ。modがファイルやプロセス、ネットワークに触るには必ずmods APIを通るので、\u003Ccode>calls:\u003C\u002Fcode>を見ればできることの範囲がわかる。公式ドキュメント（\u003Ca href=\"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fplugins\u002Fmods\u002Fadmin\" target=\"_blank\" rel=\"noopener noreferrer\">組織向けの管理ページ\u003C\u002Fa>）が見ておくべきものとして挙げている名前のうち、主なものを表にした。\u003C\u002Fp>\n\u003Cdiv class=\"tbl\" tabindex=\"0\" role=\"region\" aria-label=\"Table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>出力に出る名前\u003C\u002Fth>\n\u003Cth>意味\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>$.fs.read\u003C\u002Fcode> \u002F \u003Ccode>$.fs.write\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>自分が読み書きできるファイルなら、どこでも読み書きできる\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>$.process.run\u003C\u002Fcode> \u002F \u003Ccode>$.process.spawn\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>自分の権限でプログラムを起動する\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>$.http.fetch\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>ネットワークに通信する\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>$.env.get\u003C\u002Fcode> \u002F \u003Ccode>$.settings.read\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>環境変数や設定を読む（APIキーが入っていることがある）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>$.model.complete\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>自分のプランやAPIキーでモデルを呼ぶ\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>$.prompt.submit\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>自分が打ったものとしてプロンプトを送る\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>hooksの\u003Ccode>tool.call\u003C\u002Fcode> \u002F \u003Ccode>prompt.submit\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>すべてのツール呼び出し・プロンプトを見て、書き換えられる\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>hooksの\u003Ccode>tool.check\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>確認ダイアログが出る前に、ツール呼び出しを承認・拒否できる\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch3 id=\"3つのmodの実際の出力\" tabindex=\"-1\">3つのmodの実際の出力\u003C\u002Fh3>\n\u003Cp>私の環境で3つをvalidateした結果と、それを見てどう判断したかを書く。\u003C\u002Fp>\n\u003Cp>md-promptは、\u003Ccode>calls:\u003C\u002Fcode>が3つしかない。コマンドの登録、自分の設定の書き込み、ログの出力だけで、ファイル・プロセス・ネットワークには触らない。\u003C\u002Fp>\n\u003Cfigure class=\"code\" data-lang=\"text\">\u003Cdiv class=\"code-bar\">\u003Cspan class=\"lang\">TEXT\u003C\u002Fspan>\u003Cspan>2 LINES\u003C\u002Fspan>\u003Cbutton class=\"copy\" type=\"button\" data-cursor=\"COPY\">COPY\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki site-code\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode class=\"language-text\">\u003Cspan class=\"line\">\u003Cspan>❯ .\u002Fregister.tsx hooks: session.start, command.run{command=md-prompt}, prompt.edit, prompt.fill\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>❯ .\u002Fregister.tsx calls: $.command.register, $.config.set, $.ui.log\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Ffigure>\n\u003Cp>prompt-railには\u003Ccode>$.process.spawn\u003C\u002Fcode>と\u003Ccode>$.fs.read\u003C\u002Fcode>が出る（以下は\u003Ccode>calls:\u003C\u002Fcode>行の抜粋）。\u003C\u002Fp>\n\u003Cfigure class=\"code\" data-lang=\"text\">\u003Cdiv class=\"code-bar\">\u003Cspan class=\"lang\">TEXT\u003C\u002Fspan>\u003Cspan>3 LINES\u003C\u002Fspan>\u003Cbutton class=\"copy\" type=\"button\" data-cursor=\"COPY\">COPY\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki site-code\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode class=\"language-text\">\u003Cspan class=\"line\">\u003Cspan>❯ .\u002Findex.tsx calls: $.clock.after, $.command.register, $.config.set (via writeMode),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>  $.fs.read (via readTranscript), $.fs.stat (via readTranscript),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>  $.process.spawn (via streamRows), ..., $.ui.scroll (via jumpTo), $.ui.toast\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Ffigure>\n\u003Cp>プロセスを起動するので、ソースの\u003Ccode>streamRows\u003C\u002Fcode>を読んだ。起動しているのは\u003Ccode>tail -c +&lt;位置&gt; &lt;会話ログのパス&gt;\u003C\u002Fcode>で、セッションの会話ログ（transcript）の続きを読んでプロンプトの一覧を作っているだけだった。\u003C\u002Fp>\n\u003Cp>qa-guideには\u003Ccode>$.model.fork\u003C\u002Fcode>と\u003Ccode>$.model.complete\u003C\u002Fcode>が出る。前の章で書いた、質問ごとのモデル呼び出しがこれにあたる。\u003Ccode>$.env.get\u003C\u002Fcode>で読むのは\u003Ccode>LANG\u003C\u002Fcode>と\u003Ccode>LC_ALL\u003C\u002Fcode>だけで、表示言語の自動判定に使っている（以下も抜粋）。\u003C\u002Fp>\n\u003Cfigure class=\"code\" data-lang=\"text\">\u003Cdiv class=\"code-bar\">\u003Cspan class=\"lang\">TEXT\u003C\u002Fspan>\u003Cspan>3 LINES\u003C\u002Fspan>\u003Cbutton class=\"copy\" type=\"button\" data-cursor=\"COPY\">COPY\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki site-code\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode class=\"language-text\">\u003Cspan class=\"line\">\u003Cspan>❯ .\u002Fregister.tsx calls: $.clock.now, $.command.register, $.config.list (via resolveLang),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>  $.env.get (via resolveLang), $.model.complete, $.model.fork, $.session.messages, ...\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>❯ .\u002Fregister.tsx env reads: LANG, LC_ALL\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Ffigure>\n\u003Ch3 id=\"validateでわからないこと\" tabindex=\"-1\">validateでわからないこと\u003C\u002Fh3>\n\u003Cp>validateの出力は、コードが呼ぶAPIの一覧で、安全の保証ではない。prompt-railの\u003Ccode>$.process.spawn\u003C\u002Fcode>のように、何を起動するかはソースを読まないとわからない。更新すると中身が変わるので、更新のたびに見直す。\u003Ccode>\u002Fplugin marketplace update &lt;マーケットプレイス名&gt;\u003C\u002Fcode>で取得元を新しくしたら、もう一度validateして前の出力と比べる。問題がなければ、\u003Ccode>\u002Fplugin update &lt;mod 名&gt;@&lt;マーケットプレイス名&gt;\u003C\u002Fcode>で入れている版を更新する。公式以外のマーケットプレイスは自動更新が既定でオフなので、この順番で更新できる。自動更新をオンにすると、validateを挟まずに新しい版が入る。\u003C\u002Fp>\n\u003Cp>自分の権限設定（settings.jsonの\u003Ccode>permissions\u003C\u002Fcode>）で守れる範囲にも限りがある。denyルールがかかるのはClaudeのツール呼び出しで、mod自身の\u003Ccode>$.fs.read\u003C\u002Fcode>や\u003Ccode>$.process.spawn\u003C\u002Fcode>には効かない。\u003Ccode>Read(.env)\u003C\u002Fcode>をdenyしていても、modは\u003Ccode>$.fs.read\u003C\u002Fcode>でそのファイルを読める。また、ツール呼び出しを承認するmodは、askルールで確認が出るはずの呼び出しや、自分のPreToolUse hookが止めた呼び出しも承認できる。auto modeでは、modが承認した呼び出しは分類器のチェックを通らずに実行される。managed settingsのない端末で、Team \u002F Enterpriseプランでサインインしていない場合（個人のプランなど）は、denyルールで拒否される呼び出しもmodが承認できる（\u003Ca href=\"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fpermissions#extend-permissions-with-hooks\" target=\"_blank\" rel=\"noopener noreferrer\">権限のドキュメント\u003C\u002Fa>に記載）。\u003C\u002Fp>\n\u003Ch3 id=\"チームで使う場合\" tabindex=\"-1\">チームで使う場合\u003C\u002Fh3>\n\u003Cp>組織でClaude Codeを配っている場合は、管理者がmanaged settingsでmodを制限できる（\u003Ca href=\"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fplugins\u002Fmods\u002Fadmin\" target=\"_blank\" rel=\"noopener noreferrer\">公式ドキュメント\u003C\u002Fa>）。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Team \u002F Enterpriseプランでサインインしている端末や、managed settingsがある端末では、既定で組み込みのガード\u003Ccode>sec-default\u003C\u002Fcode>が最初に読み込まれる。このガードがあると、ユーザーが入れたmodはdenyルールで拒否された呼び出しを承認できない。ただし管理者が\u003Ccode>allowModsToOverrideDenyRules\u003C\u002Fcode>を有効にすると、この制限は外れる\u003C\u002Fli>\n\u003Cli>managed settingsでこのガードのオプション\u003Ccode>allowManagedModsOnly\u003C\u002Fcode>を有効にすると、組織のものとして配られたmodと組み込みのmod以外は読み込まれなくなる（どのmodが組織のものと数えられるかは公式ドキュメントに条件がある）\u003C\u002Fli>\n\u003Cli>\u003Ccode>strictKnownMarketplaces\u003C\u002Fcode>で、入れられるマーケットプレイスを絞れる\u003C\u002Fli>\n\u003Cli>\u003Ccode>disableSideloadFlags\u003C\u002Fcode>で、\u003Ccode>--plugin-dir\u003C\u002Fcode>や\u003Ccode>--plugin-url\u003C\u002Fcode>での読み込みを禁止できる\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>会社のマシンに入れるなら、先に社内のルールと、これらの設定が入っているかを確認したほうがいい。\u003C\u002Fp>\n\u003Ch2 id=\"外し方と、表示されないとき\" tabindex=\"-1\">\u003Cspan class=\"h-no\" aria-hidden=\"true\">04\u003C\u002Fspan>外し方と、表示されないとき\u003C\u002Fh2>\n\u003Cp>modを止める方法は、範囲によって3つある。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>1つだけ止める: \u003Ccode>\u002Fplugin\u003C\u002Fcode>のInstalledタブで、そのpluginを無効化またはアンインストールする\u003C\u002Fli>\n\u003Cli>1セッションだけ、入れたmodを全部止める: \u003Ccode>claude --safe-mode\u003C\u002Fcode>で起動する（mod以外のカスタマイズも止まる）\u003C\u002Fli>\n\u003Cli>常に、入れたmodを全部止める: \u003Ccode>~\u002F.claude\u002Fsettings.json\u003C\u002Fcode>に\u003Ccode>&quot;disableAllHooks&quot;: true\u003C\u002Fcode>を書く。settings hookと独自のステータスラインも止まる。組織が管理しているものは動き続ける\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>どちらの方法でも、\u003Ccode>\u002Fdiff\u003C\u002Fcode>などの組み込みのmodは止まらない。組み込みのmodは、無効にできるものだけ\u003Ccode>\u002Fplugin\u003C\u002Fcode>のInstalledタブで個別に止められる。\u003C\u002Fp>\n\u003Cp>入れたのに何も表示されないときは、次を確認する。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>バージョン: modsはv2.1.287以降で動く。\u003Ccode>claude --version\u003C\u002Fcode>で確かめる\u003C\u002Fli>\n\u003Cli>ワークスペースの信頼: Claude Codeは、信頼していないディレクトリではmodのコードを読み込まない。作ったばかりのディレクトリで起動したときに起きやすい（md-promptのREADMEに記載）\u003C\u002Fli>\n\u003Cli>ターミナルの幅: ユーザーが開いていないペインは、ターミナルが144列以上のときだけ自動で開く。一度開いたあとは110列から開く\u003C\u002Fli>\n\u003Cli>使っている場所: 描画されるのはターミナルとClaude DesktopのCodeタブ（WSLのセッションを除く）だけ。VS Code拡張のチャット欄と\u003Ccode>claude -p\u003C\u002Fcode>では、modのフックは動くが画面には何も出ない。クラウドセッションでは、pluginがセッションに引き継がれた場合だけフックが動き、描画はされない\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>なお、早期アクセス期に書かれたREADMEには、\u003Ccode>~\u002F.claude\u002Fsettings.json\u003C\u002Fcode>に\u003Ccode>CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1\u003C\u002Fcode>を書く手順が残っている。v2.1.287以降はこの環境変数を無視するので、書かなくてよい。書いてあれば消してよい。\u003C\u002Fp>\n\u003Ch2 id=\"自分で作るなら\" tabindex=\"-1\">\u003Cspan class=\"h-no\" aria-hidden=\"true\">05\u003C\u002Fspan>自分で作るなら\u003C\u002Fh2>\n\u003Cp>Claude Codeのセッションで、ほしいmodの内容を説明すると、Claudeが組み込みのplugin-authoringスキルを使ってコードを書く。最初のファイルを保存したときにホットリロードを有効にするか聞かれ、有効にするとそのセッションで動く。自分でコードを書く場合は、公式の\u003Ca href=\"https:\u002F\u002Fclaude.dev\u002Fblog\u002Fgetting-started-with-claude-code-mods\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">入門ガイド\u003C\u002Fa>と、Anthropicの\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code-playground\u002Ftree\u002Fmain\u002Fclaude-code\u002Fmods\" target=\"_blank\" rel=\"noopener noreferrer\">サンプル集\u003C\u002Fa>がわかりやすい。\u003C\u002Fp>\n\u003Cp>公開されているmodを自分用に直すのも手だ。私は\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyash-gadodia\u002Fclaude-mods\" target=\"_blank\" rel=\"noopener noreferrer\">yash-gadodia\u002Fclaude-mods\u003C\u002Fa>の\u003Ccode>receipt\u003C\u002Fcode>（MITライセンス）をもとに、turn-receiptというmodを作って使っている。ターンごとに編集とコマンド実行の件数をフッターに出し、編集したのに何も実行していないターンには\u003Ccode>⚠ no run\u003C\u002Fcode>を付ける。何も実行せずに「修正しました」と完了を宣言したときは、次のスピナーに\u003Ccode>unverified claim pending\u003C\u002Fcode>を出す。元のmodから、何を「実行」と数えるかの判定を変え、日本語の完了宣言も拾えるようにした。\u003C\u002Fp>\n\u003Ch2 id=\"まとめ\" tabindex=\"-1\">\u003Cspan class=\"h-no\" aria-hidden=\"true\">06\u003C\u002Fspan>まとめ\u003C\u002Fh2>\n\u003Cp>modsは、Claude Codeの画面と挙動を自分の使い方に合わせるための仕組みだ。入れて使うだけなら、\u003Ccode>\u002Fplugin\u003C\u002Fcode>のコマンド2行で済む。ただ、中身は自分の権限で動くコードなので、入れる前にvalidateの出力を見る。プロセスの起動やネットワーク、モデル呼び出しが出ていたら、ソースの該当箇所を読む。\u003C\u002Fp>\n\u003Cp>まだ入れていないなら、呼ぶAPIが少ないmd-promptから試すのがいい。\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode>\u002Fplugin marketplace add nogu66\u002Fmd-prompt\u003C\u002Fcode>を実行する\u003C\u002Fli>\n\u003Cli>シェルで\u003Ccode>claude plugin validate ~\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Fnogu66\u002Fplugins\u002Fmd-prompt\u003C\u002Fcode>を実行し、出力を見る\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fplugin install md-prompt@nogu66\u003C\u002Fcode>で入れ、新しいセッションの入力欄にコードブロックを書いてみる\u003C\u002Fli>\n\u003Cli>合わなければ\u003Ccode>\u002Fplugin\u003C\u002Fcode>のInstalledタブで無効にする\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>settings hookやCLAUDE.mdの設定は\u003Ca href=\"\u002Fblog\u002Fclaude-code-harness-engineering\">ハーネスエンジニアリングの記事\u003C\u002Fa>に、普段使っている道具は\u003Ca href=\"\u002Fblog\u002Fclaude-code-dev-toolchain\">ツールチェインの記事\u003C\u002Fa>にまとめている。\u003C\u002Fp>\n",[459,462,465,468,471,474,477,480,482,484,486,488,490,492,494],{"level":426,"id":460,"text":461},"claude-modsとは:-claude-codeの中で動き、画面と挙動を変えられる関数","Claude Modsとは: Claude Codeの中で動き、画面と挙動を変えられる関数",{"level":419,"id":463,"text":464},"settings-hook・skill・mcpとの違い","settings hook・skill・MCPとの違い",{"level":426,"id":466,"text":467},"私が入れたmod-3つ","私が入れたmod 3つ",{"level":419,"id":469,"text":470},"prompt-rail:-長いセッションで「さっきの指示」に戻れる","prompt-rail: 長いセッションで「さっきの指示」に戻れる",{"level":419,"id":472,"text":473},"md-prompt:-入力欄に書いたコードブロックや表に色が付く","md-prompt: 入力欄に書いたコードブロックや表に色が付く",{"level":419,"id":475,"text":476},"qa-guide:-claudeの質問に、文脈と選択肢ごとの影響を添えてくれる","qa-guide: Claudeの質問に、文脈と選択肢ごとの影響を添えてくれる",{"level":426,"id":478,"text":479},"安全に入れる手順:-入れる前にclaude-plugin-validateで中身を見る","安全に入れる手順: 入れる前にclaude plugin validateで中身を見る",{"level":419,"id":481,"text":481},"手順",{"level":419,"id":483,"text":483},"出力の読み方",{"level":419,"id":485,"text":485},"3つのmodの実際の出力",{"level":419,"id":487,"text":487},"validateでわからないこと",{"level":419,"id":489,"text":489},"チームで使う場合",{"level":426,"id":491,"text":491},"外し方と、表示されないとき",{"level":426,"id":493,"text":493},"自分で作るなら",{"level":426,"id":495,"text":495},"まとめ",22,{"slug":44,"title":45,"description":46,"publishedAt":47,"updatedAt":47,"category":498,"tags":499,"thumbnail":16},{"name":49,"slug":50},[500,501,502],{"name":53,"slug":53},{"name":55,"slug":56},{"name":58,"slug":59},{"slug":18,"title":19,"description":20,"publishedAt":21,"updatedAt":21,"category":504,"tags":505,"thumbnail":16},{"name":11,"slug":12},[506,507,508,509],{"name":25,"slug":26},{"name":28,"slug":29},{"name":31,"slug":31},{"name":33,"slug":34},[511,515,522],{"slug":6,"title":7,"description":8,"publishedAt":9,"updatedAt":9,"category":512,"tags":513,"thumbnail":16},{"name":11,"slug":12},[514],{"name":15,"slug":15},{"slug":18,"title":19,"description":20,"publishedAt":21,"updatedAt":21,"category":516,"tags":517,"thumbnail":16},{"name":11,"slug":12},[518,519,520,521],{"name":25,"slug":26},{"name":28,"slug":29},{"name":31,"slug":31},{"name":33,"slug":34},{"slug":88,"title":89,"description":90,"publishedAt":91,"updatedAt":91,"category":523,"tags":524,"thumbnail":528},{"name":11,"slug":12},[525,526,527],{"name":95,"slug":96},{"name":98,"slug":99},{"name":101,"slug":101},{"url":103,"description":104},1793725976648]