CLAUDE LABEN
CODE — Claude Code は v2.1.267 まで進みました。昨日の時点では v2.1.263 でしたので、一日のあいだに四つの版が積まれたことになりますEFFORT — maxEffortLevel が新設されました。Bedrock・Vertex・Foundry を含むすべてのプロバイダで、effort の上限を設定側から固定できますCACHE — この版のいちばん大きな塊は新機能ではなく、プロンプトキャッシュの再利用が外れる不具合の修正でした。十数件がまとめて直っていますRESUME — セッションを再開したときや /model を切り替えたときにツール定義が書き直され、気づかないうちに費用だけが増える。そういう種類の不具合ですGATEWAY — v2.1.266 は回帰の修正です。CLAUDE_CODE_USE_GATEWAY を置いた構成が全リクエスト失敗していました。設定ではなく版を上げてくださいPLUGIN — --plugin-dir にプラグインを束ねたフォルダを指定できるようになりました。パスのバックスラッシュで封じ込めチェックを回避できた問題も直っていますCODE — Claude Code は v2.1.267 まで進みました。昨日の時点では v2.1.263 でしたので、一日のあいだに四つの版が積まれたことになりますEFFORT — maxEffortLevel が新設されました。Bedrock・Vertex・Foundry を含むすべてのプロバイダで、effort の上限を設定側から固定できますCACHE — この版のいちばん大きな塊は新機能ではなく、プロンプトキャッシュの再利用が外れる不具合の修正でした。十数件がまとめて直っていますRESUME — セッションを再開したときや /model を切り替えたときにツール定義が書き直され、気づかないうちに費用だけが増える。そういう種類の不具合ですGATEWAY — v2.1.266 は回帰の修正です。CLAUDE_CODE_USE_GATEWAY を置いた構成が全リクエスト失敗していました。設定ではなく版を上げてくださいPLUGIN — --plugin-dir にプラグインを束ねたフォルダを指定できるようになりました。パスのバックスラッシュで封じ込めチェックを回避できた問題も直っています
記事一覧/Claude Code
Claude Code/2026-09-10中級

plugin.json を1枚置くと、スキルの棚がまとめて外せる単位になります

スキルを用途ごとに色分けしたら、毎日使う一群は全体の5パーセントしかありませんでした。.claude-plugin/plugin.json を1枚置いてフォルダをプラグインに変え、その日に使わない棚をグループごと外せるようにするまでの手順と、途中で二度つまずいた読み込みの規則を書き残します。

Claude Code251Agent Skills4プラグイン7文脈設計3個人開発127

プレミアム記事

雨の降る午後に、手元のスキル置き場を開いて、フォルダを用途ごとに色分けしてみました。SEO の調査に使うもの、フロントエンドの実装に使うもの、サイトの運用に使うもの。分けているうちに、いちばん短い列がいちばんよく使う列なのだと気づきました。

数を数えた話はスキルを数えたら42本ありましたのほうに書き残しましたので、ここでは繰り返しません。今回お伝えしたいのは、数えたあとに何をするかです。

最初のうち、私は「束ねれば軽くなる」と思っておりました。結果は芳しくありませんでした。束ねても毎ターンの重さは1文字も減らなかったのです。それでも組み直してよかったと感じております。減ったのは重さではなく、手数のほうでした。

用途ごとに数え分けると、比率が見えてきます

数え方は前回と同じで、frontmatter の description の文字数を足すだけです。違うのは、足す前に用途で分けるところになります。

# group_skills.py — スキル置き場を用途ごとに数え分ける
import os
import re
import sys
 
BASE = sys.argv[1] if len(sys.argv) > 1 else os.path.expanduser("~/.claude/skills")
 
GROUPS = {
    "seo":       ["ai-seo", "seo-audit", "programmatic-seo", "content-research-writer"],
    "web-front": ["vercel-optimize", "vercel-react-best-practices", "webapp-testing"],
    "design":    ["frontend-design", "implement-design", "web-design-guidelines"],
    "site-ops":  ["claudelab-site", "gemilab-site"],
}
 
def description_length(folder: str) -> int:
    path = os.path.join(BASE, folder, "SKILL.md")
    if not os.path.isfile(path):
        return 0
    text = open(path, encoding="utf-8", errors="replace").read()
    front = re.search(r"^---\n(.*?)\n---", text, re.S | re.M)
    if not front:
        return 0  # frontmatter がない=説明を持たないフォルダ
    field = re.search(r"^description:\s*(.*?)(?=^\w+:|\Z)", front.group(1), re.S | re.M)
    if not field:
        return 0
    return len(" ".join(field.group(1).split()))
 
lengths = {d: description_length(d) for d in sorted(os.listdir(BASE))
           if os.path.isdir(os.path.join(BASE, d))}
total = sum(lengths.values()) or 1
assigned = set()
 
print(f"{'group':<12}{'n':>4}{'chars':>8}{'share':>8}")
for name, members in GROUPS.items():
    present = [m for m in members if m in lengths]
    assigned.update(present)
    chars = sum(lengths[m] for m in present)
    print(f"{name:<12}{len(present):>4}{chars:>8}{chars / total * 100:>7.1f}%")
 
rest = [k for k in lengths if k not in assigned]
rest_chars = sum(lengths[k] for k in rest)
print(f"{'(rest)':<12}{len(rest):>4}{rest_chars:>8}{rest_chars / total * 100:>7.1f}%")
print(f"total {len(lengths)} folders / {total} chars")

os.path.isfile で弾いている行と、frontmatter がないときに 0 を返している行は、どちらも実際に必要でした。私の棚には、中身が案内文だけになったフォルダが残っていて、そこで例外を吐いて止まったからです。

手元で走らせた結果が下の表になります。分類は自分の仕事の区切りに合わせたもので、正解があるわけではありません。

グループ本数説明文の文字数全体に占める割合
SEO の調査・監査52,44220.7%
フロントエンド実装62,37020.1%
デザイン・画像92,41620.5%
サイト運用46235.3%
開発の進め方71,1459.7%
そのほか112,77423.6%
合計4211,770100%

ここで手が止まりました。ほとんど毎日開くサイト運用の一群は、説明文の総量では 5.3% しか占めていません。 残りの 94.7% は、その日にやらない仕事のための説明でした。棚が膨らんでいく感覚の正体はこれだったのかもしれません。

なお文字数はあくまで自分の環境を比べるための目盛りです。実際のトークン見積りは claude plugin details <name>count_tokens API を使って出してくれますので、絶対値が要るときはそちらをご覧ください。

.claude-plugin/plugin.json を1枚置くと、フォルダの意味が変わります

Claude Code のスキル置き場は、三つの違うものを同じ木の下に置ける仕組みになっております。

置いてあるもの何として読み込まれるか
<skills-dir>/foo/SKILL.md(マニフェストなし)ただのスキル foo
<skills-dir>/foo/.claude-plugin/plugin.jsonプラグイン foo@skills-dir。スキル・エージェント・フックなどを束ねられます
<plugin>/skills/bar/SKILL.mdプラグインの中に入ったスキル bar

読み込まれる場所は二つです。~/.claude/skills/ に置けば個人スコープで、どのプロジェクトでも読み込まれます。<cwd>/.claude/skills/ に置けばプロジェクトスコープになり、そのフォルダのワークスペース信頼を受け入れたあとに読み込まれます。

足場は claude plugin init が作ってくれます。

# ~/.claude/skills/site-ops/ に足場を作る(skills と hooks の入れ物つき)
claude plugin init site-ops --with skills hooks
 
# 既存の足場を作り直すとき
claude plugin init site-ops --force

作られる plugin.json は最小限で構いません。マニフェストそのものが省略可能で、必須の項目は name だけです。

{
  "name": "site-ops",
  "displayName": "Site Ops",
  "version": "0.1.0",
  "description": "4サイトの記事更新とデプロイまわりのスキル一式",
  "author": { "name": "Masaki Hirokawa" },
  "skills": "./skills/",
  "hooks": "./hooks/hooks.json"
}

平置きだったフォルダを移すと、こういう形になります。

~/.claude/skills/
├── site-ops/
│   ├── .claude-plugin/
│   │   └── plugin.json
│   ├── skills/
│   │   ├── claudelab-site/SKILL.md
│   │   ├── gemilab-site/SKILL.md
│   │   ├── antigravitylab-site/SKILL.md
│   │   └── rorklab-site/SKILL.md
│   └── hooks/
│       └── hooks.json
└── seo-kit/
    ├── .claude-plugin/
    │   └── plugin.json
    └── skills/
        ├── seo-audit/SKILL.md
        └── programmatic-seo/SKILL.md

一群を移すときの順番は、次の4段階で固定しております。

  1. 移したいフォルダ名を控えてから claude plugin init <name> --with skills で足場を作ります
  2. 元のフォルダを <name>/skills/ の下へそのまま移動します(SKILL.md の中身は触りません)
  3. claude plugin validate ~/.claude/skills/<name> を実行して、frontmatter の壊れたファイルがないかを確かめます
  4. Claude Code を開き直し、claude plugin details <name> で Always-on の値を控えます

3 の validate は、通れば終了コード 0、落ちれば 1、パスが読めないなど検査そのものが失敗したときは 2 を返します。私は 4 で控えた値を、移す前の合計と並べて手元のメモに残すようにしております。

commands/agents/skills/.claude-plugin/ の中に入れないでください。.claude-plugin/ に入るのは plugin.json だけで、ほかは1つ上の階層に置きます。私はここを一度取り違えて、コンポーネントが1つも読み込まれないプラグインを作ってしまいました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
平置きのスキル置き場を、作業ごとにまとめて外せる単位へ組み直せるようになります
毎ターン積み上がる説明文の重さを、自分の環境で用途別に数え分けて判断できるようになります
リポジトリ直下に置いたのに読まれない、フックを直したのに効かないという二つのつまずきを、踏む前に避けられるようになります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

Claude Code2026-09-06
スキルを数えたら42本ありました。うち4本は中身が『移動しました』だけでした
Claude Code v2.1.261 で入った /skill-doctor を入り口に、自分のスキル棚を実際に数えてみました。毎ターン乗るのは説明の1行だけという構造と、名前の重複を素朴な awk で探すと別のスキルまで拾ってしまう落とし穴を、手元で動かした小さなスクリプトとともに書き残します。
Claude Code2026-08-22
Claude Code の headersHelper に移したら、プロジェクト配下のカタログだけ認証が通らなくなりました
自前のプラグインカタログを headersHelper へ移す途中で、ユーザースコープでは動くヘルパーがプロジェクト配下だけ落ちました。原因は認証情報の非継承です。動くヘルパー2種と実測した実行コスト、無人実行での注意点をまとめました。
Claude Code2026-08-20
起動しただけで1万トークン消えるスキルを、大きさではなく到達率で切り分ける
自分用の運用スキルが、呼び出しただけで約1万トークンを消費していました。節ごとにトークンを測り、最大の節ほど切り出してはいけない理由と、到達率で分けたときの実測値を、監査スクリプトつきでまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます