CLAUDE.md · diff
git:20260901.4e26eb1 to git:20260923.b852b0b
90 added, 202 removed. Audit A to A.
# Claude Code Plugins Marketplace
- Claude Code用プラグインを公開するためのマーケットプレイスリポジトリです。
+ Claude Code 用プラグインを配布するマーケットプレイスのリポジトリ。
## リポジトリ構成
- プラグインには 2 つの配置パターンがある:
+ プラグインの置き方は 2 通りある。
- 1. **direct-skill 方式**: 単体スキルプラグインはスキルディレクトリを直接 source にする(`source: "./skills/<skill-dir>"` + `skills: ["./"]`)。`plugins/` 配下のラッパーは不要
- 2. **wrapper 方式**: エージェント依存プラグイン、フック定義プラグイン、複数スキルの bundle は `plugins/<plugin-name>/` 配下にまとめる
+ 1. **direct-skill 方式**: 単体スキルのプラグイン。スキルディレクトリをそのまま source にする(`source: "./skills/<skill-dir>"` + `skills: ["./"]`)
+ 2. **wrapper 方式**: エージェントを持つもの、フックを定義するもの、複数スキルの bundle。`plugins/<plugin-name>/` にまとめる
```text
.
├── .claude-plugin/
- │ └── marketplace.json # プラグインマニフェスト
- ├── skills/ # SKILL.mdの実体かつ単体スキルプラグインのsource
+ │ └── marketplace.json # プラグイン一覧とバージョンの記載元
+ ├── skills/ # スキルの実体。direct-skill 方式の source を兼ねる
│ └── <skill-name>/
│ ├── .claude-plugin/ # direct-skill 方式で source になるスキルのみ
│ │ └── plugin.json
│ ├── SKILL.md
- │ └── README.md # (任意、ユーザー向け設定リファレンスなど)
- ├── plugins/ # wrapper 方式のプラグインのみ
+ │ ├── references/ # (任意) SKILL.md から読む手順・定義
+ │ └── README.md # (任意) 利用者向けの設定リファレンス
+ ├── plugins/ # wrapper 方式のプラグイン
│ └── <plugin-name>/
- │ ├── skills/ # bundle の場合、複数 skill 分のエントリ
- │ │ └── <skill-name> # skills/<skill-name> の実ディレクトリコピー
│ ├── .claude-plugin/
│ │ └── plugin.json
- │ ├── agents/ # (エージェント依存プラグインのみ)
+ │ ├── skills/
+ │ │ └── <skill-name>/ # skills/<skill-name> の実ディレクトリコピー
+ │ ├── agents/ # (エージェント依存のみ)
│ │ └── <agent-name>.md
│ └── README.md # (任意)
- ├── tests/ # リポジトリ自身のテスト。*.test.mjs を Skill(run-node-tests) が実行する
- │ └── <feature>/
+ ├── tests/ # リポジトリ自身のテスト(*.test.mjs)。Skill(run-node-tests) が実行する
├── .claude/
- │ ├── commands/ # 開発用コマンド
- │ ├── skills/ # 開発・テスト用シンボリックリンク
- │ └── agents/ # エージェントへのシンボリックリンク
- ├── CHANGELOG.md # 変更履歴
- └── README.md # リポジトリ説明
- ```
-
- **注意:** marketplace.json で `source: "./"` を使ってはいけない。`skills/` 配下の全スキルが自動発見されて重複登録される([anthropics/claude-code#13344](https://github.com/anthropics/claude-code/issues/13344))。必ず `./skills/<skill-dir>` または `./plugins/<plugin-name>` のように specific なパスを指定する。
-
- ## プラグインマニフェスト
-
- **全プラグインが `<source>/.claude-plugin/plugin.json` を持つ。** direct-skill 方式・wrapper 方式のどちらも例外なし。マニフェストの無いプラグインは、インストール後のキャッシュディレクトリ名(バージョン文字列)からプラグイン名が推定され、同名前空間の重複・別プラグイン同士の合流が起きる([anthropics/claude-code#76234](https://github.com/anthropics/claude-code/issues/76234))。
-
- - `name` は marketplace.json の `name` と一致させる。スキルディレクトリ名とは異なってよい(例: plugin `peer` → `skills/ask-peer/`)
- - `version` は書かない。marketplace.json を単一のバージョン源とし、plugin.json はそれを継承する。両方に書くとバージョン更新のたびに 2 ファイル編集が必要になる
- - 例外は既存の `plugins/caffeinate` と `plugins/translate` の 2 つ。どちらも `version` を持つため、bump 時は marketplace.json とペアで更新する
-
- ## スキル追加フロー(direct-skill 方式 / エージェント非依存)
-
- スキルが `allowed-tools` を持ち、エージェント / フック定義に依存しない場合。`plugins/` 配下のラッパーは作らない。
-
- ### 1. skills/ ディレクトリにスキル作成
-
- ```text
- skills/<skill-name>/
- ├── .claude-plugin/
- │ └── plugin.json
- ├── SKILL.md
- └── README.md # (任意、設定が複雑ならユーザー向けリファレンスを追加)
+ │ ├── commands/ # 開発用コマンド(/verify-plugins 等)
+ │ ├── skills/ # skills/* へのシンボリックリンクと、配布しない開発用スキル
+ │ ├── agents/ # plugins/*/agents/*.md へのシンボリックリンク
+ │ ├── rules/ # 毎セッション読み込まれるルール
+ │ ├── rules-extras/ # ルールの Good/Bad 例(自動では読み込まれない)
+ │ ├── rules-staging/ # extract-rules が 1 回だけ観測したルール候補
+ │ └── dev-workflow.md # dev-workflow の設定
+ ├── CHANGELOG.md
+ └── README.md
```
- ### 2. SKILL.md
-
- ```markdown
- ---
- name: <skill-name>
- description: スキルの説明
- allowed-tools: Read, Glob, Grep
- ---
-
- # スキル名
+ marketplace.json の `source` に `"./"` を書かない。`skills/` 配下の全スキルが自動検出され、重複登録される([anthropics/claude-code#13344](https://github.com/anthropics/claude-code/issues/13344))。source には `./skills/<skill-dir>` か `./plugins/<plugin-name>` を指定する。
- スキルの詳細な説明と使い方
- ```
+ wrapper 配下の `skills/<skill-name>/` は symlink でなく実ディレクトリのコピーにする。plugin cache が symlink を解決しない不具合([anthropics/claude-code#53948](https://github.com/anthropics/claude-code/issues/53948))への暫定対応で、`skills/<skill-name>/` を編集したらコピーも同期する。
- ### 3. plugin.json
+ ## プラグインマニフェスト
- `.claude-plugin/plugin.json` を置く。プラグイン名は marketplace.json の `name` と一致させる(スキルディレクトリ名とは異なってよい)。`version` は書かない(marketplace.json を単一のバージョン源とする)。理由は「プラグインマニフェスト」節を参照。
+ 全プラグインの source 直下に `.claude-plugin/plugin.json` を置く。`name` は marketplace.json の `name` と揃え、`version` は書かない。理由と例外(`caffeinate` / `translate`)は `.claude/rules/project.rules.md` § プラグイン構造 にある。
```json
{
"name": "<plugin-name>",
- "description": "スキルの説明",
+ "description": "プラグインの説明",
"author": { "name": "hiropon", "url": "https://github.com/hiroro-work" },
"homepage": "https://github.com/hiroro-work/claude-plugins",
"repository": "https://github.com/hiroro-work/claude-plugins",
"license": "MIT",
"keywords": ["keyword1", "keyword2"]
}
```
- ### 4. marketplace.json に追加
-
- `.claude-plugin/marketplace.json` の `plugins` 配列に追加(プラグイン名とスキル名が異なっても OK、例: plugin `peer` → skill `ask-peer`):
-
- ```json
- {
- "name": "<plugin-name>",
- "source": "./skills/<skill-name>",
- "skills": ["./"],
- "description": "スキルの説明",
- "version": "1.0.0",
- "author": { "name": "hiropon" },
- "category": "workflow"
- }
- ```
-
- ### 5. 開発・テスト用シンボリックリンク作成
-
- ```bash
- ln -s ../../skills/<skill-name> .claude/skills/<skill-name>
- ```
-
- ### 6. CHANGELOG.md 更新
-
- ## プラグイン追加フロー(wrapper 方式)
-
- wrapper には **2 つのサブパターン** がある。必要なファイル構成が異なるので混同しないこと:
-
- | サブパターン | 用途 | `.claude-plugin/plugin.json` | `agents/` | `skills/` |
- |---|---|---|---|---|
- | **A. エージェント / フック wrapper** | エージェント依存 (`translate`)、フック定義 (`caffeinate`) | 必須 | エージェント依存なら必須 | 単一スキルのエントリ |
- | **B. bundle wrapper** | 複数スキルの束 (`dev-workflow-bundle`) | 必須 | 不要 | 複数スキルのエントリ + marketplace.json の `skills` 配列 |
-
- ### サブパターン A: エージェント / フック wrapper
-
- #### A-1. skills/ ディレクトリにスキル作成+プラグインディレクトリ作成
-
- ```text
- skills/<skill-name>/
- └── SKILL.md
-
- plugins/<plugin-name>/
- ├── .claude-plugin/
- │ └── plugin.json
- ├── skills/
- │ └── <skill-name> # → ../../../skills/<skill-name> (シンボリックリンク)
- ├── agents/ # エージェント依存プラグインのみ
- │ └── <agent-name>.md
- └── README.md
- ```
+ ## スキルを追加する(direct-skill 方式)
- ```bash
- mkdir -p skills/<skill-name>
- mkdir -p plugins/<plugin-name>/skills
- ln -s ../../../skills/<skill-name> plugins/<plugin-name>/skills/<skill-name>
- ```
+ エージェントにもフック定義にも依存しないスキルはこの方式にする。`plugins/` 配下にラッパーは作らない。
- #### A-2. plugin.json
+ 1. `skills/<skill-name>/` に `SKILL.md` と `.claude-plugin/plugin.json` を作る
- ```json
- {
- "name": "<plugin-name>",
- "description": "プラグインの説明",
- "author": {
- "name": "hiroro-work",
- "url": "https://github.com/hiroro-work"
- },
- "homepage": "https://github.com/hiroro-work/claude-plugins",
- "repository": "https://github.com/hiroro-work/claude-plugins",
- "license": "MIT",
- "keywords": ["keyword1", "keyword2"]
- }
- ```
+ ```markdown
+ ---
+ name: <skill-name>
+ description: スキルの説明
+ allowed-tools: Read, Glob, Grep
+ ---
- フック定義が必要な場合は `plugin.json` の `hooks` フィールドで指定(例は `plugins/caffeinate/.claude-plugin/plugin.json` を参照)。
+ # スキル名
- #### A-3. marketplace.json に追加
+ スキルの詳細な説明と使い方
+ ```
- ```json
- {
- "name": "<plugin-name>",
- "source": "./plugins/<plugin-name>",
- "description": "プラグインの説明",
- "version": "1.0.0",
- "author": { "name": "hiropon" },
- "category": "workflow"
- }
- ```
+ 2. marketplace.json の `plugins` 配列に追加する。プラグイン名とスキル名は違ってよい(例: plugin `peer` → skill `ask-peer`)
- ### サブパターン B: bundle wrapper
+ ```json
+ {
+ "name": "<plugin-name>",
+ "source": "./skills/<skill-name>",
+ "skills": ["./"],
+ "description": "スキルの説明",
+ "version": "1.0.0",
+ "author": { "name": "hiropon" },
+ "category": "workflow"
+ }
+ ```
- #### B-1. プラグインディレクトリ作成
+ 3. 開発用のシンボリックリンクを張る: `ln -s ../../skills/<skill-name> .claude/skills/<skill-name>`
+ 4. CHANGELOG.md を更新する
- ```text
- plugins/<bundle-name>/
- ├── .claude-plugin/
- │ └── plugin.json
- └── skills/
- ├── <skill-a> # → ../../../skills/<skill-a>
- ├── <skill-b> # → ../../../skills/<skill-b>
- └── ...
- ```
+ ## プラグインを追加する(wrapper 方式)
- ```bash
- mkdir -p plugins/<bundle-name>/skills
- ln -s ../../../skills/<skill-a> plugins/<bundle-name>/skills/<skill-a>
- ln -s ../../../skills/<skill-b> plugins/<bundle-name>/skills/<skill-b>
- ```
+ | 種類 | 用途 | `agents/` | `skills/` |
+ | --- | --- | --- | --- |
+ | **エージェント / フック wrapper** | エージェント依存(`translate`)、フック定義(`caffeinate`) | エージェント依存なら必須 | 単一スキルのコピー |
+ | **bundle wrapper** | 複数スキルの束(`dev-workflow-bundle`) | 不要 | 複数スキルのコピー + marketplace.json の `skills` 配列 |
- #### B-2. marketplace.json に追加(`skills` 配列を明示)
+ ### エージェント / フック wrapper
- ```json
- {
- "name": "<bundle-name>",
- "source": "./plugins/<bundle-name>",
- "skills": ["./skills/<skill-a>", "./skills/<skill-b>"],
- "description": "bundle の説明",
- "version": "1.0.0",
- "author": { "name": "hiropon" },
- "category": "workflow"
- }
- ```
+ 1. `skills/<skill-name>/SKILL.md` を作り、`plugins/<plugin-name>/skills/` へコピーする
- `skills` 配列と `plugins/<bundle-name>/skills/` 配下のエントリセットは **必ず一致** させること(`/verify-plugins` と `run-tests` が整合性を検証する)。
+ ```bash
+ mkdir -p plugins/<plugin-name>/skills/<skill-name>
+ cp -R skills/<skill-name>/. plugins/<plugin-name>/skills/<skill-name>/
+ ```
- **wrapper 配下の `skills/` エントリは symlink ではなく実ディレクトリコピー**(`ln -s` の例は upstream bug 修正後の想定形)。plugin cache が symlink を解決しない bug([anthropics/claude-code#53948](https://github.com/anthropics/claude-code/issues/53948))を回避するため commit `56026cb` で全 wrapper を一括変換済み。詳細と検証ツール側の扱いは `.claude/rules/project.rules.md` § プラグイン構造 の wrapper エントリ bullet を参照。
+ 2. `plugins/<plugin-name>/.claude-plugin/plugin.json` を置く。フックは `hooks` フィールドに書く(例: `plugins/caffeinate/.claude-plugin/plugin.json`)
+ 3. エージェントがあれば `plugins/<plugin-name>/agents/<agent-name>.md` に置く
+ 4. 開発用のシンボリックリンクを張る。スキルは必ず、エージェントはある場合だけ
- `dev-workflow-bundle` にメンバーを追加する場合はもう 1 つ義務がある: 新メンバーの `SKILL.md` に横断ディレクティブ `## Dispatch authorization` を他メンバーと byte-identical に同梱すること(漏れると `/verify-plugins` と `run-tests` Check 7 が落ちる)。文言・配置の source of truth は `.claude/rules/project.rules.md` § プラグイン構造 の「**bundle 全メンバーに複製する横断ディレクティブは byte-identical を保ち、メンバー追加時に必ず同梱する**」bullet。
+ ```bash
+ ln -s ../../skills/<skill-name> .claude/skills/<skill-name>
+ ln -s ../../plugins/<plugin-name>/agents/<agent-name>.md .claude/agents/<agent-name>.md
+ ```
- ### wrapper 共通: 開発・テスト用シンボリックリンク作成
+ 5. marketplace.json に `"source": "./plugins/<plugin-name>"` のエントリを追加する(`skills` は書かない)
+ 6. CHANGELOG.md を更新する
- ```bash
- # スキル
- ln -s ../../skills/<skill-name> .claude/skills/<skill-name>
+ ### 既存の bundle にメンバーを足す
- # エージェント(サブパターン A のみ)
- ln -s ../../plugins/<plugin-name>/agents/<agent-name>.md .claude/agents/<agent-name>.md
- ```
+ 1. `skills/<name>/` に `SKILL.md` と `.claude-plugin/plugin.json` を作り、開発用のシンボリックリンクを張る(上の「スキルを追加する」の手順 1 と 3)
+ 2. `plugins/dev-workflow-bundle/skills/<name>/` へコピーする(手順は上と同じ `cp -R`)
+ 3. marketplace.json を 4 か所編集する: 新しいプラグインのエントリ(direct-skill 方式の形)の追加、bundle の `skills` 配列への `./skills/<name>` の追加、bundle の `description` への名前の追加、bundle の `version` の引き上げ
+ 4. `plugins/dev-workflow-bundle/.claude-plugin/plugin.json` の `description` も marketplace.json と同じ文面にする
+ 5. 新メンバーの `SKILL.md` の前置き部分の末尾に `## Dispatch authorization` 節を置く。本文は他メンバーと 1 文字も違えない(`/verify-plugins` と `run-tests` の Check 7 が検査する)
+ 6. CHANGELOG.md を更新する
- ### wrapper 共通: CHANGELOG.md 更新
+ `skills` 配列と `plugins/<bundle-name>/skills/` 配下のエントリは必ず一致させる。新しい bundle を作る場合も、`skills` 配列を明示すること以外はエージェント / フック wrapper と同じ手順になる。
## 検証コマンド
```bash
/verify-plugins # 構造・バージョン・動作テスト
- /verify-plugins --full # 完全検証(CLI更新確認を含む)
- /test-skills # スキル・エージェント動作テスト
+ /verify-plugins --full # 上記 + CLI 更新の確認
+ /test-skills # スキル・エージェントの動作テスト
```
- ## コーディング規約
-
- ### 命名規則
-
- - スキル名: kebab-case(例: `security-scanner`, `ask-claude`)
- - プラグイン名: kebab-case(例: `peer`, `translate`)
- - エージェント名: kebab-case(例: `peer`, `tr`)
-
- ### allowed-tools
-
- - 必要最小限の権限のみ付与
- - `Bash(*)` は避け、具体的なコマンドを指定(例: `Bash(git *)`, `Bash(jq *)`)
- - セキュリティスキャンで警告される可能性のあるパターンは正当な理由がある場合のみ使用
-
- ### バージョン管理
-
- - セマンティックバージョニング(SemVer)を使用
- - `marketplace.json` と `plugin.json` のバージョンは常に一致させる
+ `Skill(run-tests)`(構造)、`Skill(run-node-tests)`(`tests/`)、`Skill(verify-bundle-sync)`(bundle コピーの同期)は dev-workflow の Check / Test でも実行される。
- ### ドキュメント
+ ## コーディング規約
- - README.md: ユーザー向けのドキュメント(使い方、機能、設定など)
- - SKILL.md: Claude向けの指示(処理フロー、出力形式など)
+ - スキル名・プラグイン名・エージェント名は kebab-case(例: `security-scanner`、`peer`、`tr-hq`)
+ - バージョンは SemVer。marketplace.json にだけ書く(`caffeinate` / `translate` は plugin.json と揃えて上げる)
+ - README.md は利用者向け(使い方・設定)、SKILL.md は Claude 向け(処理の流れ・出力形式)
+ - `allowed-tools` やバージョン運用などの規範は `.claude/rules/` にある
## セキュリティ
- プラグイン追加時は `/security-scanner --project` でセキュリティスキャンを実行し、問題がないことを確認してください。
+ プラグインを追加したら `/security-scanner --project` を実行し、問題がないことを確かめる。