Плагін — це каталог із компонентами (скіли, агенти, hooks, MCP-сервери та інше), який Claude Code встановлює й завантажує як один пакет. Найчастіше плагін беруть із маркетплейсу — каталогу, що описує, які плагіни існують і звідки їх завантажити. Під час розробки плагін можна вантажити просто з папки чи zip-архіву, без маркетплейсу.
Маніфест .claude-plugin/plugin.json дає плагіну назву, версію й опис. Він необов’язковий: без нього Claude Code знаходить компоненти за стандартною структурою, а назву бере з запису в маркетплейсі (або з імені каталогу при --plugin-dir). Усередині маніфесту обов’язкове лише поле name.
Що може містити плагін
| Компонент | Де лежить у плагіні | Що отримує користувач | Як називається в сесії |
|---|---|---|---|
| Скіли | skills/<name>/SKILL.md | Інструкції, які Claude підвантажує за описом; їх можна запустити і вручну | /plugin:name |
| Команди (старий формат) | commands/*.md | Одна Markdown-команда; нові розробки краще писати як скіли | /plugin:file, підпапка додає сегмент: /plugin:db:migrate |
| Агенти | agents/*.md | Субагенти, яким Claude делегує задачі | plugin:agent, явно: @agent-plugin:agent |
| Hooks | hooks/hooks.json | Команди, HTTP-запити, виклики MCP-інструментів, промпти чи субагенти на подіях життєвого циклу | без префікса — спрацьовують самі на своїх подіях |
| MCP-сервери | .mcp.json | Інструменти зовнішніх систем (GitLab, БД тощо) | сервер plugin:<plugin>:<server>, інструмент mcp__plugin_<plugin>_<server>__<tool> |
| LSP-сервери | .lsp.json | Діагностика після правок і навігація по символах | інструмент LSP |
| Output styles | output-styles/*.md | Стилі відповідей Claude | /output-style → plugin:name |
| Workflows | workflows/*.js | Скрипти, що оркеструють кількох субагентів | /plugin:<meta.name> |
| Теми | themes/*.json | Кольорові теми інтерфейсу | /theme, з позначкою плагіна |
| Монітори | monitors/monitors.json | Фонові команди; їхній вивід приходить Claude як сповіщення | у панелі задач |
| Виконувані файли | bin/ | Утиліти, які Claude запускає як звичайні команди | на PATH Bash tool |
| Налаштування за замовчуванням | settings.json | Діють лише ключі agent і subagentStatusLine | — |
| Канали | поле channels у маніфесті | Зовнішня система (чат-бот) надсилає повідомлення в сесію | прив’язані до MCP-сервера |
| Моди | modules у hooks/hooks.json | JS/TS-функції, що працюють усередині Claude Code й можуть малювати панелі | плагін із модулем називають модом |
| userConfig | поле у маніфесті | Діалог, у якому користувач вводить URL, токен тощо | /plugin configure |
| Eval-кейси | evals/ | Тести поведінки плагіна для claude plugin eval | — |
Жоден компонент не обов’язковий: плагін може складатися з одного скілу — або лише з dependencies (тоді це «набір» інших плагінів). Детальний опис кожного компонента — у розділах «Структура», «plugin.json» і «Компоненти».
Простір імен
Усе, що додає плагін, Claude Code ставить під назву плагіна (поле name маніфесту). Тому два плагіни можуть мати по скілу review і не конфліктувати. Для плагіна acme-django ви побачите:
/acme-django:migration-check # скіл skills/migration-check/SKILL.md /acme-django:about # команда commands/about.md @agent-acme-django:reviewer # агент agents/reviewer.md plugin:acme-django:gitlab # MCP-сервер у /mcp mcp__plugin_acme-django_gitlab__list_issues # назва MCP-інструмента (для permissions і matcher’ів hooks)
- Ім’я скілу —
/<plugin>:<тека>. Якщо в frontmatter заданоname, воно замінює лише останній сегмент; префікс плагіна лишається. - Агенти в підпапках додають сегменти:
agents/review/security.md→my-plugin:review:security. Ім’я агента не може містити:— двокрапка зарезервована під префікс. - Hooks префікса не мають. Якщо той самий hook лежить і в settings, і в плагіні, він спрацює двічі.
- Ім’я в маркетплейсі (запис у
marketplace.json) — це ключ для встановлення йenabledPlugins; ім’я в маніфесті — простір імен. Тримайте їх однаковими.
Зв’язок з іншими сторінками
Плагін нічого не вигадує — він пакує те, що Claude Code вміє й так. Усі ці компоненти працюють і без плагіна (у .claude/ проєкту чи ~/.claude/):
- Скіли — формат
SKILL.md, frontmatter, аргументи; у плагіні вони лише отримують префікс. - Агенти — субагенти, їхній frontmatter і моделі (у плагіні частину полів ігноровано — див. «Компоненти»).
- Hooks і MCP — події, matcher’и, формат серверів; у плагіні той самий формат.
- Налаштування плагінів — ключі
enabledPlugins,extraKnownMarketplaces,pluginConfigsта політики для організації.
Що додає увімкнений плагін до кожної сесії
Увімкнений плагін — частина кожної сесії, а не лише тих, де ви ним користуєтесь:
- Контекст і витрати. Назва й опис кожного скілу, агента й команди, які Claude може викликати сам, потрапляють у контекст на кожному ході. Повний текст підвантажується лише під час використання.
- Процеси. MCP-сервери плагіна працюють поруч із кожною сесією, а його hooks спрацьовують на своїх подіях.
- Права. Усе, що плагін запускає, він запускає від вашого імені. Hooks, монітори та сервери працюють поза sandbox — див. розділ «Обмеження та безпека».
- Плагін Claude Code ≠ розширення VS Code чи плагін JetBrains (це інтеграція самого Claude Code в IDE).
- «Маркетплейс плагінів» (
marketplace.json) ≠ сайт Claude Marketplace на claude.com: його не додають командою/plugin marketplace add. - Той самий формат плагіна ставиться також у claude.ai та Cowork, але там вантажиться інший набір компонентів. Ця інструкція — про Claude Code.
Офіційні джерела: огляд плагінів, компоненти.
Усе, що можна покласти в плагін, працює й без нього. Тож правило просте: поки налаштування обслуговує один проєкт або лише вас — лишайте його у .claude/ чи ~/.claude/. Робіть плагін, коли треба роздати налаштування команді, поставити їх у кілька репозиторіїв або випускати версіями.
Особисте, проєктне чи плагін
Особисте ~/.claude/ | Проєкт .claude/ | Плагін | |
|---|---|---|---|
| Хто отримує | Лише ви, в усіх проєктах на цій машині | Усі, хто працює з репозиторієм | Ті, хто встановив: scope user, project або local; через managed settings — уся організація |
| Як потрапляє до людини | Вручну на кожну машину | git clone / git pull | claude plugin install з маркетплейсу. Для project scope запис у .claude/settings.json лише вмикає плагін — кожен колега ще раз ставить його у себе |
| Назви | /skill без префікса | /skill без префікса | /plugin:skill — колізій немає |
| Версії й оновлення | Ніяких — ви самі | Разом із кодом на гілці | Поле version, git-теги, автооновлення маркетплейсу, закріплення версії |
| Перевірка змін | — | Звичайний merge request разом із кодом | Review репозиторію плагіна чи маркетплейсу |
| Зав’язане на плагіни | — | — | userConfig (діалог налаштувань), dependencies, bin/ на PATH, settings.json з agent |
| Вартість контексту | Назви й описи скілів/агентів | Те саме | Те саме для кожного увімкненого плагіна, у кожному проєкті |
skills/, agents/ і commands/ у плагін, а hooks із settings — у hooks/hooks.json (формат той самий). Покроково — у розділі «Розробка і тестування».Коли плагін — правильний вибір
claude plugin install acme-django@acme-pluginsclaude plugin updateuserConfig ховає токен у сховищі облікових данихdependencies ставить кілька плагінів одразу.claude/, воно пройде review разом із кодом~/.claude/skills/ або тестуйте плагін через --plugin-dir, нічого не встановлюючиCLAUDE.md. Плагін не завантажує власний CLAUDE.mdТипові сценарії для Django/Vue-команди на GitLab
| Сценарій | Що кладемо в плагін |
|---|---|
| Єдиний стандарт code review | Скіл review з чеклистом DRF/Vue, агент security-reviewer, hook PostToolUse на Write|Edit, що запускає ruff / prettier |
| Робота з GitLab | MCP-сервер у .mcp.json і скіл «створи MR за нашим шаблоном»; URL і токен запитує userConfig |
| Безпечні міграції | Скіл migration-check (перевірка залежностей між міграціями, зворотність) і hook PreToolUse для Bash |
| Onboarding | Плагін-бандл backend-standard / frontend-standard із dependencies: нова людина ставить один плагін і отримує весь набір |
| Інструменти репозиторію | bin/ із утилітами (наприклад, звіт про лінтинг Vue), які Claude викликає як звичайні команди |
| Фонові сигнали | Монітор, що стежить за логом помилок dev-сервера і повідомляє Claude |
| Обов’язкові для всіх | Адміністратор вмикає плагін через managed settings (enabledPlugins + extraKnownMarketplaces) — розділ «Для команди» |
/plugin (є для плагінів офіційного маркетплейсу), а для вже встановленого — claude plugin details <name>. Не ставте плагіни «про запас»: вимкніть або видаліть невикористані (вкладка Installed підсвічує їх як Not used recently).Плагін проходить шлях «маркетплейс → встановлення → кеш на диску → ввімкнення → завантаження компонентів у сесію → оновлення». Кожен крок змінює свій шар: налаштування, диск або запущену сесію — і розуміння цього шару пояснює більшість «чому плагін не працює».
Три шари: налаштування, диск, сесія
| Шар | Що це | Коли змінюється |
|---|---|---|
| Оголошено (settings) | enabledPlugins — які плагіни мають бути ввімкнені; extraKnownMarketplaces — які маркетплейси існують | Команди /plugin, claude plugin ..., ручне редагування settings |
| Завантажено на диск | ~/.claude/plugins/: known_marketplaces.json, installed_plugins.json, cache/ | Установка, оновлення, синхронізація; маркетплейс, оголошений у settings, але відсутній на диску, клонується у фоні |
| Завантажено в сесію | Набір плагінів, прочитаний на старті або при останньому /reload-plugins | Лише /reload-plugins або нова сесія |
claude plugin update закінчується словами «Restart to apply changes», а фонові оновлення просять /reload-plugins.Де лежать файли
Корінь — ~/.claude/plugins (змінюється через CLAUDE_CODE_PLUGIN_CACHE_DIR). Шляхи нижче — відносно нього:
| Шлях | Що зберігає |
|---|---|
cache/<marketplace>/<plugin>/<version>/ | Одна тека на кожну встановлену версію. Сюди вказує ${CLAUDE_PLUGIN_ROOT} — тож шлях змінюється з кожною версією |
data/<plugin-id>/ | Постійна тека плагіна, ${CLAUDE_PLUGIN_DATA}: переживає оновлення. Видаляється при видаленні з останнього scope (крім --keep-data) |
marketplaces/<name>/ | Клон або завантаження маркетплейсу з GitHub, іншого git-хоста чи URL. Для локального каталогу копії немає — використовується ваш шлях |
installed_plugins.json | Що встановлено: scope, installPath, version |
known_marketplaces.json | Які маркетплейси завантажено: source, installLocation, lastUpdated, autoUpdate. Один на користувача — маркетплейс, доданий в одному проєкті, видно в усіх |
synced/, .trash/ | Плагіни, синхронізовані з акаунта claude.ai, і видалені синхронізацією |
flagged-plugins.json | Плагіни, які Claude Code прибрав, бо маркетплейс їх зняв з публікації (секція Flagged у /plugin) |
../shared поза коренем плагіна, у кеші цього не знайде. Тому в плагіні використовуйте ${CLAUDE_PLUGIN_ROOT} і не вимагайте файлів поза його теками. Винятки, що вантажаться «на місці»: --plugin-dir, плагіни зі skills-тек, а також плагіни з відносним шляхом у маркетплейсі, доданому з локального каталогу.Звідки взявся плагін: суфікс ідентифікатора
У файлах налаштувань та в claude plugin list --json кожен плагін має id виду <name>@<origin>. Частина після @ каже, де Claude Code його знайшов:
| Закінчується на | Звідки плагін | Як вмикати/вимикати |
|---|---|---|
@<marketplace> | Встановлений з доданого вами маркетплейсу | "name@marketplace": true|false в enabledPlugins |
@inline | --plugin-dir, --plugin-url, CLAUDE_CODE_PLUGIN_DIRS або опція SDK. Лише на цю сесію | Увімкнено, поки defaultEnabled не false або в settings не "name@inline": false |
@skills-dir | Тека з .claude-plugin/plugin.json у ~/.claude/skills/ або .claude/skills/ проєкту (результат claude plugin init) | defaultEnabled або явне значення в settings |
@synced | Увімкнений у вашому акаунті claude.ai (або вашою організацією) і синхронізований у термінал | Вмикається/вимикається в /plugin; обов’язкові від організації вимкнути не можна |
Назви inline, skills-dir і synced зарезервовані — маркетплейс так називати не можна. Якщо збігаються назви плагінів із різних джерел, діє порядок: managed settings → --plugin-dir/--plugin-url → встановлений з маркетплейсу → skills-dir → synced.
Довіра й згода
- Код виконується від вашого імені. Правила permissions і sandbox стосуються викликів інструментів Claude, але не hooks, моніторів та MCP/LSP-процесів плагіна — вони працюють поза sandbox. Тож перегляньте плагін до встановлення (розділ «Обмеження та безпека»).
- Перед установкою ви бачите деталі.
/plugin install name@marketplaceу сесії нічого не ставить одразу — відкриває панель плагіна: що буде встановлено (команди, агенти, скіли, hooks, MCP/LSP-сервери), Context cost, вибір scope. - Попередження про довіру показується для будь-якого маркетплейсу; адміністратор може дописати своє через
pluginTrustMessage. - Плагіни з командою встановлення (джерело
command): Claude Code показує команду і питаєRun this command now? [y/N]. У скриптах —--yes. - Контент із репозиторію (проєктні
extraKnownMarketplaces, проєктні плагіни в.claude/skills/) вантажиться лише після діалогу довіри до папки. Довіри до батьківської папки чи режиму-pнедостатньо. MCP-сервери такого плагіна проходять те саме схвалення, що й проєктний.mcp.json; монітори не завантажуються. - Три рівні маркетплейсів: офіційні (
claude-plugins-officialта ін.), спільнотні (claude-community) і сторонні — усе інше, зокрема маркетплейс вашої компанії. Назви перших двох груп приймаються лише з репозиторіївgithub.com/anthropics/.
Докладніше: Plugin loading reference, Install and manage plugins, Plugin security and trust.
Плагінами керують двома способами: інтерактивною панеллю /plugin у сесії та командами claude plugin ... у shell (працюють без запуску сесії — зручно для скриптів і CI). Обидва змінюють одні й ті самі налаштування. Нижче — головне; компактну таблицю всіх команд дає розділ «Шпаргалка команд».
Панель /plugin
| Вкладка | Для чого |
|---|---|
| Discover | Список плагінів з ваших маркетплейсів; друкуйте для пошуку, Enter відкриває деталі |
| Installed | Ваші плагіни зі scope. Tab — перейти на вкладку, Space — увімкнути/вимкнути, f — у вибране, Enter — деталі. Вимкнені згруповано внизу; невикористані — під заголовком Not used recently |
| Marketplaces | Додані маркетплейси: перегляд плагінів, Update marketplace, Enable/Disable auto-update, видалення |
| Errors | Що не завантажилось і чому — перше місце, куди дивитись при проблемах |
| Stats | Звіт використання (у сесіях, де доступний /skill-doctor) |
Меню деталей плагіна: Disable/Enable plugin, Update now, Uninstall, а для плагінів з налаштуваннями ще Configure options (поля userConfig) і Configure (налаштування вбудованого MCP-сервера). Плагіни зі scope Managed поставила ваша організація — їх тут не вимкнути й не видалити. Закриваючи панель із відкладеними змінами, Claude Code сам виконує /reload-plugins.
Команди /plugin у сесії
Працюють лише в інтерактивній сесії; у claude -p відповідь буде /plugin isn't available in this environment. Аліаси: /plugins, /marketplace.
| Команда | Що робить |
|---|---|
/plugin | Відкриває панель на Discover |
/plugin install <plugin>[@marketplace] | Відкриває деталі плагіна — самого встановлення ще немає, його підтверджуєте вибором scope |
/plugin install <plugin> --marketplace <source> | Спершу додає маркетплейс (з підтвердженням), потім відкриває деталі. З v2.1.275 |
/plugin manage | Вкладка Installed |
/plugin enable|disable|uninstall <plugin> | Відкриває Installed на цьому плагіні й виконує дію |
/plugin configure <plugin> (config) | Діалог userConfig (або повідомлення, що плагін їх не оголошує) |
/plugin list [--enabled|--disabled] | Вбудований список із версією, scope й статусом |
/plugin validate <path> | Звіт claude plugin validate прямо в сесії |
/plugin tag [path] [--push] [--dry-run] | Створює git-тег релізу |
/plugin marketplace add|list|update|remove | Керування маркетплейсами (скорочення /plugin market) |
/reload-plugins [--force] | Застосувати зміни до поточної сесії |
Команди в shell
Усі підкоманди повертають код 0 при успіху й 1 при помилці (validate додає 2 для збою самого валідатора). claude plugins — синонім claude plugin. Плагін задається як name або name@marketplace (за однакових назв у двох маркетплейсах — лише з маркетплейсом; configure приймає тільки повну форму).
| Команда | Ключові прапорці | Примітки |
|---|---|---|
install <plugin> (i) | -s, --scope user|project|local (за замовчуванням user); --config key=value (повторюваний); -y, --yes; --accept-command <sha256>; --json; --marketplace <source> (v2.1.292+) | Не питає значень userConfig — передайте --config або скористайтесь configure. Без TTY і без -y установка плагіна з командою відмовляється |
uninstall <plugin> (remove, rm) | -s (user); --keep-data; --prune; -y; --json | З останнього scope видаляє також збережені опції, секрети й теку даних (крім --keep-data) |
enable <plugin> | -s (автовизначення: local → project → user); --json | Вмикає й залежності; помилка, якщо залежність не встановлена. Уже ввімкнений — код 1 |
disable [plugin] | -a, --all; -s; --json | Відмовляє, якщо від плагіна залежить інший ввімкнений; виводить команду для правильного порядку |
update <plugin> | -s (user/project/local/managed; автовизначення з v2.1.281); -y; --json | Нова версія завантажиться у наступній сесії або після /reload-plugins. Можна за голою назвою (v2.1.246+) |
list | --json; --available (лише з --json); --data-size [plugin] (v2.1.285+) | Групи: Installed, Session-only, Skills-directory, Synced from claude.ai |
details <name> | — | Склад плагіна й проєктована вартість токенів. Плагін має бути завантажений |
configure <plugin@marketplace> | --values-stdin; --json | v2.1.285+. Без прапорців показує опції й чи задані; з --values-stdin зберігає JSON зі stdin |
prune (autoremove) | -s (user); --dry-run; -y | Видаляє автоматично встановлені залежності, які більше нікому не потрібні. Ваші власні плагіни не чіпає |
# маркетплейс компанії на GitLab (повний URL з https:// — не "gitlab.acme.example/group/repo") claude plugin marketplace add https://gitlab.acme.example/platform/claude-plugins.git --scope project # поставити плагін для всієї команди (запис у .claude/settings.json) і задати параметри без діалогу claude plugin install acme-django@acme-plugins --scope project \ --config gitlab_url=https://gitlab.acme.example # тимчасово вимкнути лише для себе в цьому репозиторії claude plugin disable acme-django@acme-plugins --scope local # оновити, подивитися вартість і прибрати непотрібні залежності claude plugin update acme-django@acme-plugins claude plugin details acme-django claude plugin prune --dry-run
/plugin недоступний, але вже встановлені плагіни завантажуються. У -p плагіни, які ще треба встановити, ставляться у фоні й можуть не встигнути до першого запиту — додайте CLAUDE_CODE_SYNC_PLUGIN_INSTALL=1, щоб дочекатись. На чистій машині офіційний маркетплейс ще не зареєстрований: перед установкою з нього виконайте claude plugin marketplace add anthropics/claude-plugins-official.Scope: хто отримує плагін
| Scope | Куди пишеться | Кому доступний |
|---|---|---|
| user | enabledPlugins у ~/.claude/settings.json | Вам, в усіх проєктах (за замовчуванням для CLI) |
| project | .claude/settings.json (комітиться) | Усім, хто працює з репозиторієм — але не завантажує файли на їхні машини |
| local | .claude/settings.local.json | Вам, лише в цьому репозиторії |
| managed | Керовані налаштування організації | Усім, на кого поширюється політика; з панелі не змінити. Через update оновлюється, а ставиться лише адміністратором |
.claude/settings.json вмикає плагін, але для плагінів із зовнішнім джерелом колега побачить Plugin "<name>" is enabled in project settings but isn't installed here, доки один раз не виконає claude plugin install <name>@<marketplace> --scope project. Без цього кроку обходяться лише плагіни з відносним шляхом у маркетплейсі та налаштування, розгорнуті адміністратором.- Пріоритет: local > project > user; керовані налаштування організації переважують усе. Значення зливаються по ключу для кожного плагіна. Повний порядок джерел від нижчого до вищого: каталоги
--add-dir(діє лишеtrue) < user < project < local <--settings< managed. - Відмовитись від проєктного плагіна на своїй машині: поставте
falseдля нього в.claude/settings.local.json. Вимкнення в user settings не допоможе — проєктнеtrueмає вищий пріоритет (у списку будеDisabled in ~/.claude/settings.json but still loads). - Видалення проєктного плагіна з панелі питає: y — «Disable for me» (пише
falseу settings.local.json), u — «Uninstall for everyone» (прибирає зі спільного файла). - Термінал, локальні сесії десктопного застосунку й розширення VS Code на одній машині читають однакові файли налаштувань, тож user-плагін видно в усіх трьох. Хмарні сесії (claude.ai/code) локальні плагіни не завантажують.
Автооновлення, версії й закріплення
Плагін оновлюється сам, якщо в його маркетплейсу увімкнене автооновлення. Типові значення:
| Маркетплейс | Автооновлення за замовчуванням |
|---|---|
claude-plugins-official та інші офіційні назви (крім knowledge-work-plugins, first-party-plugins) | Увімкнено |
| Маркетплейси, додані з claude.ai | Увімкнено |
| Спільнотний, сторонні, маркетплейс вашої компанії, локальні | Вимкнено — вмикається на вкладці Marketplaces або через autoUpdate у extraKnownMarketplaces |
- Коли оновлює: у інтерактивній сесії після першого повідомлення, із випадковою затримкою до 10 хвилин. Запущена сесія лишається на завантажених версіях; ви побачите
Plugin updated: <name> · Run /reload-plugins to apply, а наступний запуск візьме нове. - Вимкнути все:
DISABLE_UPDATES=1,DISABLE_AUTOUPDATER=1абоCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1;FORCE_AUTOUPDATE_PLUGINS=1залишає оновлення плагінів попри вимкнений основний апдейтер. - Вручну: «Update now» у деталях плагіна або
claude plugin update name@marketplace. Команди «оновити все» немає;Update marketplaceна вкладці Marketplaces оновлює всі плагіни цього маркетплейсу. Голеclaude plugin marketplace updateбез імені лише оновлює списки, а встановлені плагіни лишає на місці. - Як визначається версія (за нею Claude Code бачить, що оновлення є, і називає теку кешу): 1)
versionуplugin.json; 2)versionу записі маркетплейсу; 3) інакше з джерела — 12 символів SHA коміту дляgithub/url/git-subdirта відносного шляху у git-маркетплейсі, SHA-256 дляarchive,unknownдляnpmі локальних не-git каталогів. - Закріплення (pinning): якщо в маніфесті є
"version": "1.0.0", користувачі лишаються на кеші, поки автор не змінить цей рядок — скільки б комітів не було. Звідси<name> is already at the latest versionпопри нові коміти. Або піднімайтеversionу кожному релізі, або не вказуйте її взагалі (тоді версія = SHA коміту). Не вказуйте в обох місцях: тоді мовчки перемагаєplugin.json. Додатково зафіксувати можна#v1.2.0приmarketplace add,ref/shaу записі маркетплейсу або діапазон~2.1.0у залежності.
/reload-plugins
/reload-plugins [--force] застосовує до поточної сесії все, що ви встановили, оновили, ввімкнули, вимкнули чи відредагували на диску. Виводить підсумок: Reloaded: N plugins · N skills · N agents · N hooks · N plugin MCP servers · N plugin LSP servers (плюс N errors during load. Run /plugin for details., якщо були помилки).
LSP, воно скидає prompt cache — наступне повідомлення перечитає всю розмову. Тоді Claude Code не застосовує зміни, а пише це та пропонує /reload-plugins --force (коштуватиме одного запиту без кешу). Те саме стосується автоматичного перезавантаження після закриття панелі. Монітори після оновлення підхоплюються лише після перезапуску сесії; хуки, MCP та LSP — після /reload-plugins.Офіційний маркетплейс і де шукати плагіни
| Офіційний | Спільнотний | Демо | |
|---|---|---|---|
Назва після @ | claude-plugins-official | claude-community | claude-code-plugins |
| Репозиторій | anthropics/claude-plugins-official | anthropics/claude-plugins-community | anthropics/claude-code |
| Що в ньому | Плагіни Anthropic та партнерів | Сторонні плагіни, подані авторами до Anthropic | Невеликий набір прикладів |
| Як отримати | Додається сам при першому інтерактивному запуску (якщо не блокує політика чи CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL=1) | /plugin marketplace add anthropics/claude-plugins-community | /plugin marketplace add anthropics/claude-code |
- Корисні офіційні плагіни:
plugin-dev(допомагає створювати плагіни:/plugin-dev:create-plugin),commit-commands,code-review,feature-dev,security-guidanceта LSP-плагіни (наприклад,pyright-lspдля Python іtypescript-lspдля TypeScript/JavaScript; потрібен ще й сам бінарний файл мовного сервера в PATH). - Як шукати: вкладка Discover (з пошуком);
/plugin install <name>за назвою; сайт Claude Marketplace на claude.com; файл.claude-plugin/marketplace.jsonу репозиторії маркетплейсу. - Багато популярних плагінів немає в жодному маркетплейсі Anthropic — вони в репозиторіях авторів. Anthropic їх не перевіряє, тож перед додаванням прочитайте розділ «Обмеження та безпека».
- Демо-маркетплейс (
anthropics/claude-code) дублює частину офіційних плагінів під тими самими назвами — ставте їх з офіційного, щоб не мати двох копій.
Скільки коштує плагін і чи ним користуються
claude plugin details <name>показує склад плагіна й рядок Always-on — скільки токенів він додає до кожної сесії, а також частку кожного скілу чи агента (hooks і MCP-схеми там не рахуються; MCP-інструменти дивіться в/context).- У панелі: Context cost (Every turn / When invoked) для плагінів офіційного маркетплейсу — рядок Every turn підсвічується від 2 000 токенів; Last used у деталях і група Not used recently на Installed.
Плагіни з акаунта claude.ai (id <name>@synced) синхронізуються у термінал при запуску, коли ви ввійшли через claude.ai. Видалити такий плагін можна лише вимкнувши його на claude.ai; плагіни, встановлені локально, на claude.ai не потрапляють. Докладніше: Install and manage plugins, Plugin commands reference.
Корінь плагіна — каталог, який ви передаєте в --plugin-dir (або який Claude Code копіює в кеш). Усе, крім маніфесту, лежить у корені, а не всередині .claude-plugin/. Додавайте лише ті теки, які потрібні, — жодна не обов’язкова.
acme-django/ # корінь плагіна (= ${CLAUDE_PLUGIN_ROOT} після встановлення) ├── .claude-plugin/ │ └── plugin.json # маніфест — єдиний файл у цій теці ├── skills/ │ └── migration-check/ │ ├── SKILL.md # скіл → /acme-django:migration-check │ └── reference.md # допоміжні файли скілу ├── commands/ │ └── about.md # команда (старий формат) → /acme-django:about ├── agents/ │ └── security-reviewer.md # субагент → acme-django:security-reviewer ├── hooks/ │ └── hooks.json # hooks (обгортка "hooks" обов’язкова) ├── .mcp.json # MCP-сервери → plugin:acme-django:<server> ├── .lsp.json # LSP-сервери (без обгортки) ├── monitors/ │ └── monitors.json # фонові монітори (масив) ├── output-styles/ │ └── terse.md # output style → acme-django:terse ├── themes/ │ └── dracula.json # тема для /theme ├── workflows/ │ └── release-audit.js # workflow → /acme-django:release-audit ├── bin/ │ └── lint-report # виконуваний файл, на PATH Bash tool ├── scripts/ │ └── format.sh # лише конвенція: на скрипти посилаються hooks ├── evals/ # кейси для claude plugin eval ├── settings.json # лише ключі agent і subagentStatusLine ├── package.json # якщо є й lockfile — залежності встановляться в кеш └── package-lock.json
| Шлях | Формат | Примітка |
|---|---|---|
.claude-plugin/plugin.json | JSON-маніфест | Необов’язковий. Компоненти, збережені в цій теці, не вантажаться |
skills/<name>/SKILL.md | Markdown + frontmatter | Теки скілів додаються також через поле skills (воно додає до skills/, а не замінює) |
commands/*.md | Markdown + frontmatter | Плоскі файли; той самий frontmatter, що в скілів. Поле commands замінює цю теку |
agents/**/*.md | Markdown + frontmatter | Сканується рекурсивно; підтеки входять в ім’я агента |
hooks/hooks.json | JSON з обгорткою "hooks" | Необов’язково верхній ключ description; зливається з полем hooks маніфесту |
.mcp.json | JSON як проєктний .mcp.json | Обгортка mcpServers необов’язкова |
.lsp.json | JSON: ім’я сервера → конфігурація | Без обгортки. claude plugin validate цей файл не читає |
output-styles/*.md | Markdown з name, description | Поле outputStyles замінює теку |
workflows/*.js | JavaScript з export const meta | Поле workflows замінює теку |
themes/*.json | JSON теми | Ключ experimental.themes замінює теку |
monitors/monitors.json | JSON-масив | Ключ experimental.monitors замінює файл |
bin/ | Виконувані файли | Потрібен chmod +x. Плагін із верхньорівневим bin/ claude.ai та Cowork не встановлюють |
settings.json | JSON | Діють тільки agent і subagentStatusLine |
Що Claude Code не завантажує
CLAUDE.mdу корені плагіна. Він не стає контекстом проєкту, аclaude plugin validateпопереджає:CLAUDE.md at the plugin root is not loaded as project context. Інструкції для Claude оформлюйте як скіл.- Усе в
.claude-plugin/, крімplugin.json. Часта помилка — покласти тудиskills/(скіли «зникають»). .mcp.jsonу~/.claude/: корінь плагіна — це його власна тека, а не~/.claude/.- Проєктна тека
.claude/plugins/. Claude Code її не сканує. Щоб поділитись плагіном через репозиторій, внесіть його вenabledPluginsфайла.claude/settings.jsonабо покладіть у.claude/skills/<name>/з власним.claude-plugin/plugin.json. - Файли поза текою плагіна і symlink’и, що ведуть за її межі: шляхи, які виходять за корінь (
../shared), відхиляються з помилкоюpath escapes plugin directory. Шляхи зі зворотними скісними рисками на macOS/Linux відхиляються теж — пишіть./commands/deploy.md.
Плагін з одного скілу
Якщо в корені є SKILL.md, немає skills/ і немає ключа skills, плагін завантажується як один скіл. Обов’язково задайте name у frontmatter, інакше при установці з маркетплейсу скіл назветься за текою кешу. Саме так виглядає результат claude plugin init: кореневий скіл викликається як /my-tool (він також особистий скіл), а скіли в skills/ — як /my-tool:example.
bin/ на PATH
Поки плагін увімкнений, його bin/ потрапляє на PATH оболонки, у якій Bash tool виконує команди — тож Claude (або інструкція скілу) викликає утиліту за іменем, а користувачеві нічого ставити не треба. Теки плагінів стоять після ваших власних записів PATH, тому плагін не може підмінити git чи ls. Змінні ${CLAUDE_PLUGIN_ROOT} та ін. у середовищі команд Bash tool відсутні: в утиліті розраховуйте шлях від власного розташування, а в тексті скілу пишіть ${CLAUDE_PLUGIN_ROOT} — Claude Code підставить його при завантаженні. Запуск утиліти з bin/ — звичайний виклик Bash: на нього діють ваші правила permissions.
settings.json плагіна
{
"agent": "security-reviewer"
}agentзапускає головний потік сесії як агента плагіна: діють його системний промпт, обмеження інструментів і модель.subagentStatusLineзадає рядок статусу субагентів. Будь-які інші ключі відкидаються.- Той самий об’єкт можна вказати у полі
settingsманіфесту; якщо файлsettings.jsonзадає хоча б один підтримуваний ключ, він перемагає, аsettingsігнорується. - Налаштування плагіна — найнижчий шар: ваш власний
agentу~/.claude/settings.jsonйого перекриває. Якщо два плагіни задали один ключ, діє той, що завантажений останнім (уclaude --debugбудеoverrides setting).
Специфікація формату: Standard layout.
Маніфест — файл .claude-plugin/plugin.json. Він несе метадані, значення userConfig і оголошення компонентів, що лежать не за замовчуванням або описані прямо в JSON. Обов’язкове лише name. Невідомий ключ верхнього рівня відкидається (плагін вантажиться, а validate попереджає); невідомий ключ усередині userConfig, channels, lspServers чи monitors — помилка, плагін не завантажиться.
Усі поля
| Поле | Тип | Зміст |
|---|---|---|
$schema | string | URL JSON Schema для автодоповнення в редакторі. Під час завантаження ігнорується |
name | string, обов’язкове | Ідентифікатор у kebab-case; без пробілів, @, :, роздільників шляху. Простір імен усіх компонентів |
displayName | string | Назва в інтерфейсі замість name; для пошуку й просторів імен не використовується. Значення з запису маркетплейсу має пріоритет |
version | string | Не перевіряється на semver. Закріплює користувачів на цій версії, доки ви не змінете рядок |
description | string | Короткий опис — текст у /plugin |
author | object | name обов’язкове; email, url необов’язкові |
homepage | string | URL документації. Має розбиратись як URL — інакше плагін не завантажиться |
repository | string | URL репозиторію. Не перевіряється |
license | string | SPDX-ідентифікатор: MIT, Apache-2.0 |
keywords | string[] | Теги для пошуку |
metadata | object | Довільні ваші дані (каталог, entitlements); Claude Code їх не читає. З v2.1.222 |
icon, documentationUrl, supportUrl, privacyPolicyUrl, termsOfServiceUrl | string | Лише для картки плагіна в каталозі Anthropic; Claude Code їх ігнорує. Задавайте тільки в plugin.json, не в записі маркетплейсу |
defaultEnabled | boolean | Чи ввімкнений плагін, якщо користувач ще не задав значення. За замовчуванням true. Запис користувача в enabledPlugins переживає оновлення, тож зміна в релізі існуючих не зачепить |
dependencies | (string|object)[] | Плагіни, які мають бути ввімкнені: "name", "name@marketplace" або {name, marketplace, version} |
settings | object | Лише agent і subagentStatusLine; файл settings.json перемагає |
userConfig | object | Параметри, які Claude Code запитує, коли плагін вмикається |
channels | object[] | Канали повідомлень, прив’язані до MCP-серверів плагіна |
types | path | Файл .d.ts для мода |
skills | path | path[] | Теки скілів (з <name>/SKILL.md або одна тека з SKILL.md); "." = корінь. Додає до skills/ |
commands | path | path[] | object | Файли/теки команд або мапа «ім’я → source чи content». Замінює commands/ |
agents | path | path[] | Лише файли .md, теки не приймаються. Замінює agents/ |
hooks | path | object | array | Файли .json або вбудована конфігурація. Зливається з hooks/hooks.json |
mcpServers | path | object | array | Файл .json, бандл .mcpb/.dxt (шлях або https-URL) чи вбудована мапа. Зливається з .mcp.json; пізніше оголошене ім’я замінює раніше |
lspServers | path | object | array | Те саме для LSP; зливається з .lsp.json |
outputStyles | path | path[] | Файли або теки. Замінює output-styles/ |
workflows | path | path[] | Файли .js або теки. Замінює workflows/ |
experimental | object | Контейнер для themes, monitors, evals — їхня форма ще може змінитись |
experimental.themes | path | path[] | Замінює themes/. Старий ключ верхнього рівня themes ще працює, але validate попереджає |
experimental.monitors | path | масив | Замінює monitors/monitors.json. Монітори — лише в інтерактивних сесіях і не на Bedrock/Google Cloud/Foundry |
experimental.evals | path | path[] | Тека eval-кейсів, якщо це не evals/; прапорець --eval-dir перекриває. Береться лише перший елемент масиву |
Назва плагіна
claude plugin validate перевіряє, що назва не видає себе за плагін Anthropic (регістр і роздільники ігноруються):
| Назва | Результат |
|---|---|
Починається з claude-, anthropic-, anthropics-, cc-plugin- | Помилка |
Дорівнює claude, anthropic, anthropics, claude-code, claude-mods | Помилка |
official поруч із claude/anthropic (напр. official-claude-tools) | Помилка |
claude / anthropic окремим словом деінде (mcp-for-claude) | Попередження |
claude plugin init і claude plugin tag відмовляться від такої назви; сам Claude Code все одно встановить і завантажить плагін. Назва — постійна: від неї залежать усі префікси, тож змінювати її після релізу боляче.
Шляхи компонентів: додає чи замінює
- Кожен шлях у маніфесті — відносно кореня плагіна й мусить починатись з
./(commands/foo.mdне пройде валідацію). Винятки:skillsприймає".",mcpServers— https-URL бандла. - Шлях має вести всередину кореня і існувати. Інакше:
<component> path escapes plugin directoryабо<component> path not foundна вкладці Errors.
| Поведінка | Ключі | Що це означає |
|---|---|---|
| Замінює типове розташування | commands, agents, outputStyles, workflows, experimental.themes, experimental.monitors | Типова тека не скануватиметься. Щоб лишити її й додати своє: "commands": ["./commands/", "./extras/"] |
| Додає до типового | skills | skills/ сканується як і раніше, перелічені теки вантажаться разом із нею |
| Зливає | hooks, mcpServers, lspServers | Типовий файл вантажиться першим, оголошене в маніфесті зливається з ним |
commands/ і водночас маніфест задає commands, Claude Code завантажить шляхи з маніфесту, а теку ігноруватиме та покаже Default commands/ folder is ignored because the manifest sets "commands". Щоб уникнути, вкажіть файли всередині теки: "commands": ["./commands/deploy.md"].Поле commands як об’єкт: ключ стає іменем команди після префікса плагіна, значення має рівно одне з source (шлях до .md) чи content (вбудований Markdown); необов’язкові description, argumentHint, model, allowedTools. Файл hooks, на який посилається hooks, мусить мати обгортку "hooks"; вбудований об’єкт у маніфесті — це одразу мапа подій без обгортки.
Реалістичний приклад
{
"name": "acme-django",
"displayName": "Acme Django Toolkit",
"version": "1.4.0",
"description": "Стандарти Django/DRF і Vue 3: review, перевірка міграцій, GitLab MCP",
"author": {
"name": "Acme Platform Team",
"email": "platform@acme.example",
"url": "https://gitlab.acme.example/platform"
},
"homepage": "https://gitlab.acme.example/platform/claude-plugins/-/tree/main/acme-django",
"repository": "https://gitlab.acme.example/platform/claude-plugins.git",
"license": "MIT",
"keywords": ["django", "drf", "vue", "gitlab"],
"dependencies": [
"secrets-vault",
{ "name": "db-migrate", "version": "^3.0" }
],
"skills": ["./extra-skills/"],
"agents": ["./agents/security-reviewer.md", "./agents/vue-reviewer.md"],
"hooks": "./config/extra-hooks.json",
"mcpServers": {
"gitlab": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/servers/gitlab-mcp.js"],
"env": {
"GITLAB_URL": "${user_config.gitlab_url}",
"GITLAB_TOKEN": "${user_config.gitlab_token}"
}
}
},
"outputStyles": "./styles/",
"experimental": {
"monitors": "./config/monitors.json"
},
"userConfig": {
"gitlab_url": {
"type": "string",
"title": "GitLab URL",
"description": "Адреса вашого GitLab, напр. https://gitlab.acme.example",
"required": true
},
"gitlab_token": {
"type": "string",
"title": "GitLab token",
"description": "Personal access token зі scope read_api",
"sensitive": true
}
}
}Тут agents перелічує файли з типової теки — це замінює сканування, але без попередження, бо шляхи лежать усередині agents/. Теку skills/ Claude Code сканує й так, extra-skills/ додається до неї. Перевірте результат: claude plugin validate ./acme-django --strict. Як ці поля поєднуються із записом у marketplace.json (strict) — у розділі «Власний маркетплейс».
Довідка: Plugin manifest reference.
Компоненти плагіна
Скіли, команди, агенти, hooks, MCP, LSP, output styles, workflows, теми, монітори
Кожен компонент має типову теку, необов’язковий ключ маніфесту, що її замінює чи доповнює, і назву, яку бачить користувач. Після додавання компонента виконайте /reload-plugins у відкритій сесії (або почніть нову), а файл перевірте claude plugin validate . з теки плагіна.
Скіли
Кожен скіл — окрема тека в skills/ із файлом SKILL.md. Формат і frontmatter — як у звичайних скілів (сторінка Скіли); у плагіні змінюється лише ім’я: /<plugin>:<тека>.
--- description: Перевіряє нові Django-міграції на зворотність і порядок залежностей. Використовуй, коли в diff є файли migrations/. disable-model-invocation: true --- Знайди нові файли в `*/migrations/` у поточній гілці. Для кожної міграції перевір: є `reverse_code` у `RunPython`, немає `RunSQL` без `reverse_sql`, залежності вказують на існуючі міграції. Запусти `${CLAUDE_PLUGIN_ROOT}/scripts/check_migrations.py` і поясни кожну знахідку.
- У тілі скілу працює підстановка
${CLAUDE_PLUGIN_ROOT}та інших змінних плагіна (у Bash-командах Claude вони відсутні). - Хто запускає скіл (Claude, користувач чи обидва), керується frontmatter, як у звичайних скілів.
- Додаткові теки: ключ
skillsдодає їх до скануванняskills/. - Інструкції для Claude — тільки через скіл:
CLAUDE.mdплагіна не вантажиться. Правило, яке має виконуватись завжди, краще оформити як hook.
Команди
Команда — один Markdown-файл у commands/: commands/about.md → /acme-django:about, commands/db/migrate.md → /acme-django:db:migrate. Frontmatter той самий, що в скілів. Це старіший формат: скіл запускається так само й може мати допоміжні файли, тож нові речі пишіть скілами, а commands/ лишайте для перенесених з .claude/commands/.
Команду можна задати і прямо в маніфесті, без файла. Поле commands тоді замінює скан теки:
{
"name": "acme-django",
"commands": {
"about": {
"content": "Коротко опиши, що робить цей репозиторій (3 речення).",
"description": "Опис репозиторію"
},
"status": {
"source": "./commands/status.md",
"argumentHint": "[env]"
}
}
}Агенти
Кожен .md-файл в agents/ — субагент із власним промптом і вікном контексту. Ім’я — <plugin>:<name> (де name — з frontmatter, а за його відсутності — ім’я файла); явний виклик — @agent-acme-django:security-reviewer. Теки в agents/ вантажаться рекурсивно: agents/review/security.md → acme-django:review:security. Ключ agents замінює скан теки.
--- name: security-reviewer description: Перевіряє зміни на проблеми безпеки. Використовуй після правок автентифікації, серіалізаторів DRF чи обробки введення. model: sonnet tools: Read, Grep, Glob --- Ти — рецензент безпеки Django/DRF. Прочитай змінені файли й повідом про: SQL-ін’єкції у raw-запитах, відсутні permission_classes, небезпечні serializer fields, секрети в коді.
| Frontmatter агента в плагіні | Поля |
|---|---|
| Підтримуються | name, description, model, effort, maxTurns, tools, disallowedTools, skills, memory, background, omitClaudeMd, isolation (лише "worktree"), color, ключ cacheTtl у experimental |
| Ігноруються (з міркувань безпеки) | permissionMode, hooks, mcpServers, initialPrompt |
- Агент не може додати власні hooks чи MCP-сервери — оголошуйте їх як hooks і MCP-сервери плагіна (вони діють, поки плагін увімкнений). Або скопіюйте агента в
.claude/agents/— там ці поля працюють. - Якщо frontmatter не розбирається, агент усе одно завантажиться — з усіма ігнорованими полями, під ім’ям файла й описом
Agent from my-plugin plugin. Такі файли знаходитьclaude plugin validate. - У matcher’ах hooks для агента плагіна ставте прив’язку:
^acme-django:security-reviewer$.
Hooks
Hooks плагіна лежать у hooks/hooks.json під верхнім ключем "hooks" — формат такий самий, як hooks у settings, тож існуючий hook можна скопіювати без змін. Опційно додайте верхній ключ description. Hooks з файла й з поля hooks маніфесту завантажуються разом. Подія й типи handler’ів — на сторінці Hooks.
{
"description": "Форматування Python/Vue після правок і захист від небезпечних Bash-команд",
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{ "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT}/scripts/format.sh\"" }
]
}
],
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3",
"args": ["${CLAUDE_PLUGIN_ROOT}/scripts/check_command.py"]
}
]
}
]
}
}- Shell-форма і exec-форма. Без
argscommandіде через оболонку — шлях із${CLAUDE_PLUGIN_ROOT}беріть у подвійні лапки (як у першому hook), щоб шлях із пробілами лишився одним словом. Зargs(другий hook) команда запускається напряму, кожен елемент — окремий аргумент, лапки не потрібні. - Середовище. Кожен процес hook отримує
CLAUDE_PLUGIN_ROOT,CLAUDE_PLUGIN_DATAіCLAUDE_PROJECT_DIR, а такожCLAUDE_PLUGIN_OPTION_<KEY>для кожного значення userConfig. - Коли спрацьовують. Hooks реєструються при завантаженні плагіна й не чекають на виклик його скілів. Звужуйте за допомогою
matcher. - MCP-інструменти плагіна у matcher’і — повною назвою
mcp__plugin_<plugin>_<server>__<tool>. Matcher лише з іменем сервера ніколи не спрацює. - Файл мусить мати обгортку
"hooks", а об’єкт, вбудований у маніфест, — без неї. Файл без обгортки не завантажиться. - Якщо той самий hook лишився в settings, він спрацює двічі: у hooks немає префіксів.
- Модуль із JS-функціями-хуками (ключ
modulesу цьому ж файлі) робить плагін модом; моди не ізольовані sandbox і мають доступ до вашої сесії, тож ставте їх лише з довірених джерел.
MCP-сервери
Сервери оголошують у .mcp.json у корені, у форматі проєктного .mcp.json (обгортка mcpServers необов’язкова). У /mcp сервер з’явиться як plugin:acme-django:gitlab, а його інструменти називатимуться mcp__plugin_acme-django_gitlab__<tool> — саме цю назву вживайте в правилах permissions і matcher’ах hooks.
{
"mcpServers": {
"gitlab": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/servers/gitlab-mcp.js"],
"env": {
"GITLAB_URL": "${user_config.gitlab_url}",
"GITLAB_TOKEN": "${user_config.gitlab_token}"
}
},
"docs": {
"type": "http",
"url": "https://mcp.acme.example/docs",
"headers": { "Authorization": "Bearer ${user_config.docs_token}" }
}
}
}- У
command,argsіenvпідставляються змінні плагіна; вargsлапки не потрібні. Для http/sse/ws-серверів змінні діють уurl,headers,headersHelper. - Ключ
mcpServersманіфесту приймає вбудовану мапу, шлях до JSON-файла або масив таких; однойменний сервер із маніфесту замінює сервер із.mcp.json. - Також приймається запакований сервер:
"mcpServers": "./servers/db.mcpb"(файли.mcpb/.dxt, шлях або https-URL). Його власні обов’язкові налаштування вводять на вкладці Installed (Configure) або черезclaude plugin install --config <server>.<key>=<value>(v2.1.285+). - Локальний stdio-сервер працює в Claude Code та Cowork на вашій машині, але не на claude.ai; для claude.ai вказуйте віддалений https-сервер.
claude plugin validateперевіряє записи.mcp.jsonі повідомляє про ті, які Claude Code відкинув би (v2.1.281+); помилкою є й посилання${user_config.KEY}на опцію, не оголошену вuserConfig(у прикладі вище плагін має оголосити ще йdocs_token).- При
/reload-pluginsсервер із незмінною конфігурацією зберігає з’єднання, змінений — перепідключається, видалений — відключається.
LSP-сервери
LSP-сервер дає Claude діагностику після правок і навігацію по символах. Якщо для вашої мови є офіційний плагін (наприклад, pyright-lsp для Python чи typescript-lsp для TypeScript/JavaScript) — ставте його. Для Vue такого плагіна в офіційному списку немає: тоді пишіть власний .lsp.json зі своїм сервером. Формат файла: без обгортки, ім’я сервера → конфігурація.
{
"pyright": {
"command": "pyright-langserver",
"args": ["--stdio"],
"extensionToLanguage": {
".py": "python"
}
}
}| Поле | Обов’язкове | Зміст |
|---|---|---|
command | так | Бінарний файл сервера; без пробілів (окрім шляху від /), аргументи — в args |
extensionToLanguage | так | Мапа «розширення → LSP language ID», мінімум один запис, ключі починаються з крапки |
args, env, initializationOptions, settings, workspaceFolder | ні | Аргументи, змінні середовища, опції ініціалізації, налаштування для workspace/didChangeConfiguration, робоча тека |
transport | ні | stdio (за замовчуванням) або socket — але Claude Code запускає всі сервери по stdio |
startupTimeout, shutdownTimeout, requestTimeout | ні | Мілісекунди; requestTimeout за замовчуванням 60000 (v2.1.288+) |
restartOnCrash, maxRestarts | ні | Перезапуск після збою (за замовчуванням так) і ліміт спроб |
diagnostics | ні | Чи додавати діагностику в контекст після правок (за замовчуванням так) |
- Плагін налаштовує підключення, але сам сервер не ставить: бінарний файл має бути в PATH (інакше
LSP server <name> failed to start). - Одне розширення — один сервер: якщо два увімкнені сервери претендують на нього, працює перший, а на вкладці Errors буде попередження.
- Логи пишіть у stderr; stdout сервера — лише протокол (заголовок до 64 KiB, тіло до 32 MiB, інакше з’єднання розривається).
claude plugin validateцей файл не читає; один невалідний запис призводить до пропуску всього файла (Invalid LSP server config for ".lsp.json"). У хмарних сесіях LSP-сервери плагінів не запускаються.
Output styles
Файл output-styles/<name>.md з frontmatter name і description (формат власних output styles) з’являється в /output-style як acme-django:terse. Ключ outputStyles замінює теку. Тільки для плагінів є поле force-for-plugin: true: стиль застосовується автоматично, коли плагін увімкнений, і перекриває outputStyle користувача (якщо таких плагінів кілька — перший завантажений).
--- name: terse description: Короткі відповіді без вступів і підсумків keep-coding-instructions: true --- Відповідай коротко. Без вступів, без повторення питання, без підсумку наприкінці.
Workflows
Файли .js у workflows/: блок meta і скрипт, що оркеструє кількох субагентів. Запуск — /<plugin>:<meta.name> (тут /acme-django:audit-routes). Ключ workflows замінює теку. Докладніше про формат — документація workflows.
export const meta = {
name: 'audit-routes',
description: 'Перевірити всі DRF-в’юхи на відсутні permission_classes',
}
const found = await agent('Знайди всі файли views.py та viewsets.py у backend/.', {
schema: { type: 'object', required: ['files'], properties: { files: { type: 'array', items: { type: 'string' } } } },
})
const audits = await pipeline(found.files, file =>
agent(`Перевір ${file}: чи в кожного view є permission_classes?`, { label: file }),
)
return audits.filter(Boolean)Теми
Файл themes/<slug>.json у форматі власної теми Claude Code з’являється в /theme під своїм name з позначкою плагіна. Теми плагінів лише для читання: правка в /theme зберігається копією у вашій теці тем. Ключ — experimental.themes.
{
"name": "Dracula",
"base": "dark",
"overrides": {
"claude": "#bd93f9",
"error": "#ff5555"
}
}Монітори
Монітор — shell-команда, яку Claude Code запускає у фоні на початку сесії й тримає до кінця; її вивід приходить Claude як сповіщення, тож він реагує на лог чи зміну статусу без прохання стежити. Записи — в monitors/monitors.json:
[
{
"name": "django-error-log",
"command": "tail -F ./logs/django-error.log",
"description": "Помилки Django-сервера"
},
{
"name": "pipeline-status",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/poll-pipeline.sh",
"description": "Зміни статусу пайплайна GitLab",
"when": "on-skill-invoke:deploy"
}
]| Поле | Обов’язкове | Зміст |
|---|---|---|
name | так | Ідентифікатор, унікальний у плагіні |
command | так | Shell-команда у робочій теці сесії |
description | так | Підпис у панелі задач і в сповіщеннях |
when | ні | "always" (типово) — на старті сесії та при перезавантаженні плагіна; "on-skill-invoke:<skill>" — при першому запуску скілу |
- Працює з повними правами користувача, поза sandbox.
- Тільки інтерактивні сесії (ніколи
-p), і не там, де API-провайдер чи налаштування телеметрії роблять недоступним інструмент Monitor (зокрема Bedrock, Google Cloud, Foundry). - У
commandдіють змінні шляхів плагіна й${ENV_VAR}, але не${user_config.*}(такий монітор не запуститься), і процес не отримуєCLAUDE_PLUGIN_OPTION_<KEY>. - Вимкнення плагіна посеред сесії монітори не зупиняє — вони живуть до кінця сесії. Після оновлення плагіна нову версію монітора підхоплює лише перезапуск.
- Монітори плагіна, що прийшов з репозиторію (проєктний плагін у
.claude/skills/), не завантажуються.
Решта: bin/, settings.json, канали
- bin/ і settings.json описані в розділі «Структура плагіна».
- Канали (
channelsу маніфесті): запис має обов’язковеserver(ключ ізmcpServersплагіна), необов’язковіdisplayNameтаuserConfig(значення підставляються вenvсервера). Канал дозволяє зовнішній системі, як-от чат-бот, надсилати повідомлення в сесію; на Team/Enterprise потрібенchannelsEnabled.
Довідка: Add components to a plugin, Code intelligence plugins.
Налаштування користувача та змінні середовища
userConfig, CLAUDE_PLUGIN_ROOT, CLAUDE_PLUGIN_DATA, залежності
Плагіну часто потрібні значення від користувача: адреса GitLab, токен, тека проєкту. Замість того щоб просити редагувати settings.json, плагін оголошує їх у ключі userConfig — Claude Code покаже діалог. Ключі налаштувань, що стосуються плагінів (pluginConfigs тощо), описані на сторінці Налаштування → plugins; тут — те, що потрібно автору плагіна.
Поля userConfig
Ключ опції — ідентифікатор із літер, цифр і підкреслень, що не починається з цифри. Кожне значення — строгий об’єкт: невідоме поле — помилка, плагін не завантажиться.
| Поле | Обов’язкове | Зміст |
|---|---|---|
type | так | string, number, boolean, directory або file |
title | так | Підпис поля в діалозі |
description | так | Підказка під полем |
required | ні | true — діалог не прийме порожнє значення |
default | ні | Значення, якщо користувач нічого не ввів: рядок, число, boolean або масив рядків |
options | ні | Для string: фіксований список (вибір у /config). Мітка — 1–64 символи; не поєднується з multiple чи sensitive; задайте default зі списку або required: true. З v2.1.271 — старіші версії такий плагін взагалі не завантажать |
multiple | ні | Для string: дозволяє масив рядків |
sensitive | ні | true — ввід маскується, значення йде в безпечне сховище облікових даних, а не в settings.json |
min / max | ні | Межі для number |
{
"userConfig": {
"gitlab_url": {
"type": "string",
"title": "GitLab URL",
"description": "Адреса вашого GitLab",
"required": true
},
"gitlab_token": {
"type": "string",
"title": "GitLab token",
"description": "Personal access token (scope read_api)",
"sensitive": true
},
"review_tone": {
"type": "string",
"title": "Тон review",
"description": "Як формулювати зауваження",
"options": ["neutral", "strict", "mentoring"],
"default": "neutral"
},
"max_files": {
"type": "number",
"title": "Ліміт файлів",
"description": "Скільки файлів перевіряти за один запуск",
"min": 1,
"max": 200,
"default": 50
}
}
}Коли з’являється діалог і де зберігаються значення
- Діалог — частина інтерактивного
/plugin: він відкривається для незаданих опцій під час установки в панелі,/plugin install <plugin>@<marketplace>у сесії або вмикання на вкладці Installed. У будь-який момент його можна відкрити командою/plugin configure <plugin>@<marketplace>. Розширення VS Code показує форму після установки (v2.1.285+). - Не з’являється при завантаженні через
--plugin-dirі приclaude plugin installу shell. З shell:--config KEY=VALUEпід час установки абоclaude plugin configure <plugin@marketplace> --values-stdin < values.json(JSON з рядковими значеннями) пізніше. Якщо опції лишились незаданими, install друкуєN userConfig options not yet set. - Кожна опція (крім
sensitiveіmultiple) є рядком у панелі/config(v2.1.269+). - Сховище: не секретні значення — у
pluginConfigsкористувацьких налаштувань; секретні — у сховищі облікових даних платформи (macOS Keychain; запасний варіант — файл~/.claude/.credentials.json). Проєктні й локальніpluginConfigsігноруються, щоб клонований репозиторій не підсунув значення. - Видалення плагіна з останнього scope стирає й збережені опції та секрети.
Як компонент отримує значення
| Форма | Де працює |
|---|---|
${user_config.KEY} | Конфігурація MCP- та LSP-серверів, args hooks в exec-формі, текст скілів/агентів. У скілах і агентах підставляються лише несекретні значення; секретне стає заповнювачем |
CLAUDE_PLUGIN_OPTION_<KEY> | Змінна середовища для процесів hooks, для кожної опції, ім’я KEY — ВЕЛИКИМИ літерами. Shell-hook читає $CLAUDE_PLUGIN_OPTION_GITLAB_TOKEN для gitlab_token |
${user_config.*} відхиляється у shell-form hook (command без args), у командах моніторів і в MCP headersHelper: компонент отримає помилку й не запуститься, бо підстановку міг би повторно розібрати shell. Для hook використайте exec-форму з args або читайте CLAUDE_PLUGIN_OPTION_<KEY>. Монітори й headersHelper значень опцій не отримують узагалі — скрипт має взяти їх сам.Змінні шляхів
| Змінна | Значення | Для чого |
|---|---|---|
${CLAUDE_PLUGIN_ROOT} | Абсолютний шлях до встановленої версії плагіна | Скрипти, бінарні файли й конфіги всередині плагіна. Змінюється при оновленні — не пишіть туди стан |
${CLAUDE_PLUGIN_DATA} | ~/.claude/plugins/data/<id>/; створюється при першому зверненні й переживає оновлення | Встановлені залежності (node_modules, venv), згенерований код, кеші. <id> — id плагіна, де все крім літер, цифр, _ і - замінено на -: my-plugin@my-marketplace → my-plugin-my-marketplace |
${CLAUDE_PROJECT_DIR} | Корінь проєкту | Локальні скрипти й конфіги проєкту |
| Компонент плагіна | Де підставляється ${...} | Що ще експортується в процес |
|---|---|---|
| Команди hooks | command і args — у будь-якому місці | CLAUDE_PLUGIN_ROOT, CLAUDE_PLUGIN_DATA, CLAUDE_PROJECT_DIR, CLAUDE_PLUGIN_OPTION_<KEY> |
| Команди моніторів | command | нічого |
| MCP stdio-сервери | command, args, env | CLAUDE_PLUGIN_ROOT, CLAUDE_PLUGIN_DATA |
| MCP http/sse/ws | url, headers, headersHelper | — |
| LSP-сервери | command, args, env, workspaceFolder | CLAUDE_PLUGIN_ROOT, CLAUDE_PLUGIN_DATA, CLAUDE_PROJECT_DIR |
| Текст скілів, команд, агентів | у будь-якому місці Markdown | — |
- У командах, які Claude запускає через Bash tool (головна сесія чи субагент), цих змінних немає. Пишіть
${CLAUDE_PLUGIN_ROOT}у тексті скілу — Claude Code підставить шлях при завантаженні. - Лапки. У shell-формі hook і в командах моніторів беріть змінну в подвійні лапки (
"\"${CLAUDE_PLUGIN_ROOT}\"/scripts/x.sh"у JSON), інакше шлях із пробілами розпадеться;validateпопереджає про незакриту лапками змінну в shell-формі hook (крімshell: "powershell"). В exec-формі (args) лапки не потрібні. - На Windows підставлені шляхи мають прямі скісні риски (
C:/Users/...), щоб shell не сприйняв зворотні як екранування.
Приклад: залежності в каталозі даних. Для плагіна з Node-залежностями при установці з маркетплейсу Claude Code сам ставить npm/Bun-пакети (якщо є package.json і package-lock.json / npm-shrinkwrap.json / bun.lock; тільки реєстрові пакети з точними версіями, без lifecycle-скриптів, ліміт 60 с; вимкнути не можна). Python-залежності, yarn/pnpm та пакети, що збираються в install-скриптах, ставте самі — hook на SessionStart кладе їх у ${CLAUDE_PLUGIN_DATA} і повторює після зміни файла залежностей:
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "diff -q \"${CLAUDE_PLUGIN_ROOT}/requirements.txt\" \"${CLAUDE_PLUGIN_DATA}/requirements.txt\" >/dev/null 2>&1 || (python3 -m venv \"${CLAUDE_PLUGIN_DATA}/venv\" && \"${CLAUDE_PLUGIN_DATA}/venv/bin/pip\" install -r \"${CLAUDE_PLUGIN_ROOT}/requirements.txt\" && cp \"${CLAUDE_PLUGIN_ROOT}/requirements.txt\" \"${CLAUDE_PLUGIN_DATA}/requirements.txt\") || rm -f \"${CLAUDE_PLUGIN_DATA}/requirements.txt\""
}
]
}
]
}
}Після першої сесії скрипти плагіна запускають ${CLAUDE_PLUGIN_DATA}/venv/bin/python. Якщо встановлення впало, копія файла видаляється, і наступна сесія спробує знову.
Залежності між плагінами
Поле dependencies каже, які плагіни мають бути ввімкнені, щоб цей працював. Запис — рядок "name" (в тому ж маркетплейсі), "name@marketplace" або об’єкт { "name", "version", "marketplace" }. Без обмеження версії залежність рухається за останнім релізом свого маркетплейсу — і якщо в ньому перейменують MCP-інструмент, що ви викликаєте, ваш плагін зламається в усіх, хто оновився.
{
"name": "backend-standard",
"version": "1.0.0",
"description": "Стандартний набір плагінів для бекенд-інженерів",
"dependencies": [
"secrets-vault",
"deploy-kit",
{ "name": "db-migrate", "version": "^3.0" },
"oncall-runbook"
]
}- Бандл для ролі. Плагін лише з
nameтаdependencies— валідний; установка ставить усі залежності. Платформна команда публікуєbackend-standardіfrontend-standard, а нова людина виконує одну команду. Щоб додати плагін у набір, випустіть нову версію бандла. - Діапазон версій — semver-діапазон npm:
~2.1.0,^2.0,>=1.4,=2.1.0. Залежність встановлюється з найвищого git-тега, що задовольняє діапазон. Пререлізи (2.0.0-beta.1) не підходять, якщо діапазон не має суфікса на кшталт^2.0.0-0. - Теги релізів мають вигляд
<plugin-name>--v<version>(наприкладsecrets-vault--v2.1.0) у репозиторії, на який вказує джерело плагіна: дляgithub/url/git-subdir— власний репозиторій плагіна, для відносного шляху — репозиторій маркетплейсу. Створює тегclaude plugin tag --push. - Немає тега, що підходить: для плагіна з власним репозиторієм установка падає (
has no git tag satisfying); для відносного шляху береться поточна копія маркетплейсу, а на завантаженні перевіряється діапазон — залежний плагін лишається вимкненим (Requires "x@m" ~2.1.0, installed 3.0.0). - Кілька плагінів із різними діапазонами на одну залежність → найвища версія, що задовольняє всі; без перетину встановлення другого плагіна падає з
has conflicting version requirements.=2.1.0заморожує залежність, і автооновлення її не рухає. - Для джерел
npm,archive,commandдіапазон не керує тим, що завантажується, але перевіряється при завантаженні протиversionуplugin.jsonзалежності — задайте її там. - Інший маркетплейс: без дозволу не встановлюється. Корінний маркетплейс має перелічити ціль у
allowCrossMarketplaceDependenciesOnуmarketplace.json(або користувач уже має залежність увімкненою в тому ж scope). - Поведінка команд: install ставить залежності в тому ж scope; enable вмикає встановлені, але вимкнені (нестачу — помилка); disable відмовляє, поки на плагін спирається інший; uninstall залишає автоматично встановлені залежності до
claude plugin prune. - Локальна розробка:
claude --plugin-dir ./my-dependency --plugin-dir ./my-plugin— локальна копія задовольняє запис без установки й безversion.
Довідка: Plugin dependencies, User configuration.
Маркетплейс для розробки не потрібен: плагін вантажиться просто з папки. Цикл такий: створити → завантажити → змінити → /reload-plugins → перевірити → протестувати → позначити версію.
Створення: claude plugin init
claude plugin init acme-tools --description "Командні інструменти" --with skills hooks # ✔ Created plugin "acme-tools" at ~/.claude/skills/acme-tools # It will auto-load next session as acme-tools@skills-dir. Run /reload-plugins to load it now.
| Прапорець | Що робить |
|---|---|
--description <text> | Опис у маніфесті |
--author <name>, --author-email <email> | За замовчуванням беруться з git config user.name / user.email |
--with <components...> | Додатково створює стартові файли для skills, agents, hooks, mcp, lsp, output-style, channel |
-f, --force | Перезаписати існуючу .claude-plugin/ у цілі |
- Плагін створюється в
~/.claude/skills/<name>/(синонім команди —new) і вантажиться в кожній вашій сесії як<name>@skills-dir— без прапорців і установки. Зупинити: видалити теку абоclaude plugin disable <name>@skills-dir. Іншого місця прапорцем не задати. - Для спільного репозиторію зробіть таку ж структуру вручну:
<проєкт>/.claude/skills/<name>/.claude-plugin/plugin.json. Він вантажиться лише з.claude/skills/основної робочої теки сесії і лише після діалогу довіри — з підтеки, де запущено Claude, плагін у корені репозиторію не підхопиться (запустіть з кореня або/cd). - Хочете, щоб Claude допоміг спроєктувати й перевірити плагін? Поставте офіційний
plugin-devі запустіть/plugin-dev:create-plugin <опис>.
Те саме вручну (мінімальний плагін зі скілом):
mkdir -p acme-tools/.claude-plugin acme-tools/skills/hello
cat > acme-tools/.claude-plugin/plugin.json <<'EOF'
{ "name": "acme-tools", "description": "Мій перший плагін", "version": "0.1.0", "author": { "name": "Taras" } }
EOF
cat > acme-tools/skills/hello/SKILL.md <<'EOF'
---
name: hello
description: Привітатись з користувачем
disable-model-invocation: true
---
Привітай користувача й запитай, чим допомогти.
EOF
claude plugin validate ./acme-tools
claude --plugin-dir ./acme-tools # у сесії: /acme-tools:helloЗавантаження без маркетплейсу
| Спосіб | Що робить |
|---|---|
claude --plugin-dir <path> | Каталог або .zip на одну сесію; прапорець повторюваний. Передайте теку з плагінами — вантажиться кожна дочірня тека, де є .claude-plugin/plugin.json (v2.1.265+; тека з marketplace.json поруч теж, v2.1.281+, але сам файл не читається) |
claude --plugin-url <url> | Завантажує .zip з URL на сесію — наприклад, артефакт CI; кілька — повторенням або пробілами в лапках. Вказуйте лише архіви, яким довіряєте |
CLAUDE_CODE_PLUGIN_DIRS | Абсолютні шляхи через : (Windows — ;), коли прапорець додати не можна. З v2.1.280. Налаштування проєкту й local цю змінну задати не можуть |
- Це «session-only» плагіни з id
<name>@inline: нічого не пишеться в settings. Правите файли →/reload-plugins. Додавання й видалення підтек-плагінів у теці з плагінами підхоплюється під час сесії. - Якщо назва збігається зі встановленим плагіном, перемагає завантажений прапорцем (мовчки; про це лише запис у debug-логу). Не хочете цього —
"enabledPlugins": {"acme-tools@inline": false}. Плагіни, закріплені managed settings, прапорець не перекриє. - Адміністратор може заборонити ці прапорці й змінну через
disableSideloadFlags. - Типова помилка:
--plugin-dirна корінь маркетплейсу нічого не завантажує й не пише помилки. Вказуйте теку одного плагіна або додайте маркетплейс. claude plugin listпоказує такі плагіни лише якщо прапорець стоїть перед підкомандою:claude --plugin-dir ./acme-tools plugin list.
Перевірка: claude plugin validate
claude plugin validate ./acme-django # ✔ Validation passed claude plugin validate ./acme-django --strict # попередження теж роблять збій claude plugin validate ./acme-django --json # звіт одним JSON-об’єктом (v2.1.259+)
| Код | Вердикт | Значення |
|---|---|---|
| 0 | Validation passed / passed with warnings | Маніфест завантажиться. З --strict — ще й без попереджень |
| 1 | Validation failed | Помилка (або попередження під --strict) |
| 2 | Unexpected error during validation | Збій самого валідатора, напр. нечитабельний шлях |
- Перевіряє маніфест, frontmatter скілів/агентів/команд, JSON hooks, записи
.mcp.json(v2.1.281+) та шляхи компонентів. Попередження: невідомі поля, назва не в kebab-case, відсутніversion/description/author,CLAUDE.mdу корені, нецитована${CLAUDE_PLUGIN_ROOT}у shell-формі hook. - Не читає:
.lsp.json,SKILL.mdу корені плагіна; з каталогу маркетплейсу не відкриває файли компонентів інших плагінів — перевіряйте кожен окремо. Symlink’и не розкриває. - Що саме перевіряється в теці, залежить від вмісту:
marketplace.json→plugin.json→ компонентні теки (skills,agents,commands,.claude; v2.1.233+). Якщо є обидва маніфести, перевіряються обидва (v2.1.289+). - Якщо ви свідомо не вказуєте
version, не вживайте--strict: відсутність версії теж є попередженням. - У сесії те саме робить
/plugin validate <path>. Ідеальне місце для pre-commit та CI.
Налагодження
claude plugin validate <path>— синтаксис і схема./reload-pluginsу сесії: має з’явитись рядокReloaded: …; перевірте, що/acme-tools:helloіснує./plugin→ Installed (які компоненти знайдено) і Errors (що й чому не завантажилось, напр.commands path not found).claude plugin list— секції Session-only/Skills-directory ізStatus: ✔ loadedабо помилкою./mcp— стан MCP-сервера; для hooks спровокуйте подію й читайте debug-лог:claude --debug(лог у~/.claude/debug/<session-id>.txt, у термінал не друкується) абоclaude --debug-file <path>; докладніші рядки —CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose.
- Скіли «зникли» →
skills/опинилась у.claude-plugin/або записskillsведе на файл, а не теку. - Hook не спрацьовує → регістр назви події,
matcher, чи справді була така подія; файл без обгортки"hooks". - Працює з
--plugin-dir, але не після установки → посилання на файли поза плагіном, або шляхи без${CLAUDE_PLUGIN_ROOT}. - Діалог
userConfigне з’являється → він є лише в/plugin; при--plugin-dirвикличте/plugin configure <plugin-name>. - Повний перелік повідомлень — розділ «Типові проблеми».
Локальний маркетплейс перед публікацією
claude plugin marketplace add ./my-marketplace # ✔ Successfully added marketplace: my-marketplace (declared in user settings) claude plugin install acme-django@my-marketplace claude plugin list # Status: ✔ enabled claude plugin details acme-django # Skills (N) ... claude plugin marketplace remove my-marketplace # прибрати експеримент (разом з його плагінами)
Релізний тег: claude plugin tag
Створює анотований git-тег <name>--v<version>. Перед тим перевіряє плагін, що plugin.json і запис маркетплейсу збігаються за версією, що робоче дерево чисте і що тега ще немає.
claude plugin tag plugins/acme-django --dry-run # лише показати план claude plugin tag plugins/acme-django --push # Created tag acme-django--v1.4.0 / Pushed to origin
| Прапорець | Зміст |
|---|---|
[path] | Тека плагіна (за замовчуванням поточна) |
--push, --remote <name> | Надіслати тег (remote за замовчуванням origin); якщо push не вдався, тег лишається локально |
--dry-run | Показати, що було б зроблено |
-f, --force | Пропустити перевірки брудного дерева й існуючого тега |
-m, --message <msg> | Анотація тега; %s — версія. За замовчуванням <name> <version> |
claude plugin test [dir] запускає тести модів (плагінів із JS-хуками): усі файли *.test.ts / *.test.tsx у теці, без сесії й мережі; код виходу 1, якщо тест падає. Для звичайних плагінів тестуйте поведінку через eval.
Тести поведінки: claude plugin eval
Валідатор перевіряє файли, але не те, чи плагін справді спрямовує Claude. claude plugin eval (v2.1.269+) ганяє набір кейсів: кожен — реалістичний промпт плюс graders (автоматичні перевірки). Кожен кейс виконується (за замовчуванням 3 рази) у свіжій ізольованій неінтерактивній сесії, де завантажено лише ваш плагін, і ще стільки ж разів без плагіна — звіт показує WITH, W/OUT і різницю Δ. Якщо кейс проходить і без плагіна, значить, не плагін його «витягнув».
llm, baseline) — виклик моделі на вашому акаунті; вони йдуть у ліміти плану або рахунок API. Орієнтовна вартість показується у звіті за прайсом, і її можна обмежити прапорцем --max-cost-usd. Потрібен git 2.31+ (якщо git встановлено).claude plugin eval init # інтерв’ю: Claude читає плагін, пропонує кейси й graders, пише evals/ claude plugin eval init --bare first-case # порожній шаблон (для CI та середовищ без терміналу) claude plugin eval . # усі кейси з evals/ claude plugin eval . --case migration-check --runs 1 --ablation none # швидка ітерація, одна гілка
acme-django/ └── evals/ ├── migration-check-fires/ │ ├── prompt.md # frontmatter: ліміти й інструменти; тіло: промпт │ └── graders/ │ ├── criteria.md # type: llm — рубрика для судді │ └── skill-fired.md # type: tool_used, tool: Skill ├── ignores-unrelated/ │ └── ... ├── mocks/ # необов’язково: моки MCP-інструментів для всього набору └── results/ # пишеться кожним запуском — додайте у .gitignore
--- max_turns: 10 allowed_tools: [Read, Glob, Grep, Skill] --- Я додав у модель Order поле status і згенерував міграцію. Переглянь, чи міграція безпечна для відкату.
--- type: tool_used tool: Skill input_match: '"skill"\s*:\s*"(?:[\w-]+:)?migration-check"' ---
---
type: llm
---
PASS, якщо відповідь явно перевіряє зворотність міграції (reverse_code / reverse_sql) і перелічує знахідки.
FAIL, якщо відповідь загальна й не згадує зворотність або відкат.- Промпт пишіть так, як його б написала людина, не називаючи скіл — інакше перевіряєте не опис, а ім’я. Робоча тека кожного запуску порожня; усе потрібне вкладайте в промпт або готуйте через
case.yaml(context.scaffold_script,history_file,add_dirs). - Кейс без жодного grader не завантажується. Оцінка запуску — частка пройдених graders (з вагами
weight); оцінка кейса — середнє по запусках; кейс проходить, коли оцінка ≥--threshold(за замовчуванням 1.0). - Найтиповіша знахідка — Δ ≈ 0 і падаючий grader
tool_used: Skill: Claude не обирає скіл на природне формулювання. Правтеdescriptionскілу й запускайте знову.
| Тип grader | Опції | Проходить, коли | Вартість |
|---|---|---|---|
regex | pattern, flags, match, target | JS-регулярка знайдена в цілі. match: not_contains — відсутня; "count:N" — рівно N збігів. Регістр — flags: i (без (?i)) | безкоштовний |
tool_used | tool, input_match, min, max | Кількість викликів інструмента (з input, що збігається з regex) між min (1) і max. «Ніколи не викликався»: min: 0 + max: 0 | безкоштовний |
tool_order | before, after | Обидва інструменти викликано і перший before передує першому after | безкоштовний |
file_exists | path (glob), exists | Серед створених під час запуску файлів є збіг (або немає — при exists: false) | безкоштовний |
llm | criteria (тіло файла), focus | Суддя голосує PASS щонайменше у 2 із 3 голосів за рубрикою | платний |
baseline | baseline_file, criteria | Суддя вважає, що запуск не гірший за еталонний транскрипт (.jsonl) | платний |
- Спільні поля grader:
type,weight(1),arm(with-only/both). Власних grader-ів із кодом немає. - Що бачить grader (
targetдля regex,focusдля llm):last_message(за замовчуванням),trace(JSON по рядку на повідомлення; лапки екрануються),files(перелік створених шляхів, не вміст),{ source: file, path: <path> }(вміст файла) таmock_calls. - Перевірка «скіл спрацював» (
tool_used: Skill) і graders по моках власних серверів плагіна у двогілковому прогоні не входять в оцінку — вони лише індикатори; примусово оцінювати можна черезarm: both. - Права: за замовчуванням дозволені лише читальні інструменти зі списку
allowed_toolsкейса. Bash, Write, Edit, WebFetch, WebSearch прибрані з сесії, доки ви не дасте--allow-tools Write Edit "Bash(npm test *)"(діє на всі кейси). Bash виконується під OS-sandbox; без sandbox-бекенду запуск відхиляється (Windows — через WSL2, Linux — потрібні bubblewrap і socat). - MCP-сервери плагіна за замовчуванням не стартують: їх підміняють моки з
evals/mocks/<server>/<tool>.md(тіло — відповідь, підстановки{{input.<field>}}, перевіркаexpect:). Реальні сервери —--allow-real-serversабо--mocks offплюс--allow-tools "mcp__plugin_<plugin>_<server>__*". - Ізоляція: тимчасові home/cwd/конфіг; ваші settings, hooks, CLAUDE.md, MCP, інші плагіни й пам’ять не завантажуються. Hooks та реальні сервери самого плагіна працюють поза sandbox, тож результати — орієнтовні, доки ви не ганяєте їх у контейнері чи на CI-раннері.
- Перший запуск на теці питає
Trust this plugin directory?; без TTY і з--jsonзапуск відхиляється, доки не передано--trust-plugin(тільки для плагінів, яким довіряєте).
Опція eval | За замовчуванням | Дія |
|---|---|---|
[target] | . | Теку плагіна, окремий prompt.md/case.yaml, встановлений плагін (name[@marketplace]) або name@skills-dir. Ставте перед --tag, --allow-tools, --json |
--runs <n> | runs кейса, інакше 3 | Запусків на кейс у кожній гілці (1–50) |
-j, --concurrency <n> | 1 | Паралельні сесії (1–8); діляться вашим rate limit |
--model, --judge-model | типові | Модель агента й суддів. У CI закріпіть обидві |
--ablation none|with-without | за кейсом | none — одна гілка, вдвічі дешевше |
--threshold <0..1> | 1.0 | Нижче — код виходу 1 |
--max-cost-usd <usd> | без ліміту | Зупинка перед наступним запуском, код 2, часткові результати |
--case <glob>, --tag <tag> | — | Фільтр кейсів |
--json [path.json] | — | Результат у stdout або у файл; тихий режим |
--no-publish, --publish-report | — | Звіт лишається локальним / публікується як приватний артефакт, якщо акаунт це дозволяє |
--eval-dir <dir> | evals або experimental.evals | Інша тека кейсів |
--mocks record|off | record | record — MCP-виклики обслуговують моки, реальні сервери плагіна не стартують; off — моки ігноруються, стартують реальні сервери |
--trust-plugin, --scaffold, --allow-real-servers, --keep-temp | вимкнено | Довіра без запиту, scaffold-скрипти, реальні сервери для інструментів без моків, збереження робочих тек |
| Код виходу | Значення |
|---|---|
| 0 | Кожен кейс ≥ порогу, усі файли кейсів завантажились |
| 1 | Кейс нижче порогу, помилка завантаження, кейсів не знайдено, тека не довірена, невалідна опція |
| 2 | Частковий запуск: досягнуто --max-cost-usd або відхилено облікові дані (результат має partial: true) |
| 130 / 143 | Перервано / завершено (наприклад, таймаутом CI) |
У CI (офіційний рецепт; зверніть увагу — Δ ніколи не впливає на код виходу):
claude plugin eval . --trust-plugin --json results.json --threshold 0.8 \ --model claude-sonnet-5 --judge-model claude-haiku-4-5 --no-publish --max-cost-usd 20
JSON-результат (schemaVersion: 1) містить aggregates.overallScore, casesPassed/casesTotal, meanDelta, cases[].aggregates.score/delta, partial/partialReason, costUsd. Частковий результат не включайте в графіки трендів.
plugin-checks: stage: test script: - claude plugin validate . --strict - claude plugin eval . --trust-plugin --json results.json --threshold 0.8 --ablation none --no-publish --max-cost-usd 20 artifacts: when: always paths: [results.json, evals/results/] # Claude Code має бути встановлений в образі, а ANTHROPIC_API_KEY — masked CI/CD variable
--ablation none, а повний набір з llm-суддями ганяйте за розкладом чи перед релізом.Перенесення існуючого .claude/ у плагін
mkdir -p my-plugin/.claude-pluginіplugin.jsonзname,description,version.cp -r .claude/commands .claude/agents .claude/skills my-plugin/(лише ті теки, що є).- Перенесіть об’єкт
hooksіз.claude/settings.jsonуmy-plugin/hooks/hooks.jsonв обгортці{"hooks": {...}}— формат той самий. claude --plugin-dir ./my-pluginі перевірте: скіл/deployстав/my-plugin:deploy, агентreviewer—my-plugin:reviewer, hooks спрацьовують.- Видаліть оригінали з
.claude/іhooksзі settings: поки вони є, скіли й агенти існують у двох іменах, а hooks виконуються двічі.
Довідка: Create a plugin, Plugin commands reference, Test plugins with evals, Measure plugin cost and usage.
Маркетплейс — це каталог плагінів: один файл marketplace.json, який каже Claude Code, які плагіни існують і звідки кожен із них завантажувати. Це може бути git-репозиторій (наприклад, на вашому self-hosted GitLab), URL до готового JSON-файлу або тека на спільному диску. Користувач реєструє каталог один раз (marketplace add) і далі встановлює з нього плагіни як plugin@marketplace.
Файл лежить у .claude-plugin/marketplace.json. Тека, що містить .claude-plugin/, — корінь маркетплейсу; усі відносні шляхи плагінів рахуються від нього, а не від .claude-plugin/. Якщо файл лежить деінде в репозиторії, користувачі мусять оголосити маркетплейс у extraKnownMarketplaces із полем path (команда marketplace add такої опції не має). Кожен користувач може мати лише один маркетплейс з певною name.
Claude Code ігнорує невідомий ключ верхнього рівня чи запису плагіна, тож помилка в назві поля завантажується без жодного повідомлення. claude plugin validate показує кожен такий ключ як попередження (Unknown field); з --strict воно стає помилкою. Запускайте його в CI.
Мінімальний каталог
{
"name": "acme-tools",
"owner": { "name": "Acme Platform Team", "email": "platform@acme.example" },
"description": "Командні плагіни Claude Code для Django/Vue",
"plugins": [
{
"name": "acme-django-vue",
"source": "./plugins/acme-django-vue",
"description": "Міграції Django, рев’ю, лінтинг, GitLab MCP",
"category": "development",
"tags": ["django", "vue", "gitlab"]
}
]
}Повний робочий приклад із плагіном усередині — у розділі «Приклад».
Поля верхнього рівня
Обов’язкові: name, owner, plugins.
| Поле | Тип | Опис |
|---|---|---|
name | string | Ідентифікатор: літери, цифри, ., _, -; починається з літери/цифри; без ... Користувачі пишуть його після @ (plugin@acme-tools). Інше ім’я — помилка validate, бо встановити з такого маркетплейсу неможливо. Див. зарезервовані імена |
owner | object | Мейнтейнер: name обов’язкове, email і url — ні |
plugins | array | Записи плагінів. Кожен перевіряється окремо — один невалідний запис не ламає весь маркетплейс |
$schema | string | URL JSON Schema для автодоповнення в редакторі; під час завантаження ігнорується |
description | string | Опис для користувачів; validate попереджає, якщо його немає |
version | string | Версія маніфесту маркетплейсу |
metadata.description, metadata.version | string | Альтернативне місце для description і version |
metadata.pluginRoot | string | Тека, відносно якої розв’язуються «голі» імена в source ("formatter" замість "./plugins/formatter"). Потрібен Claude Code v2.1.239+ |
forceRemoveDeletedPlugins | boolean | Якщо true, плагін, який ви прибрали з plugins, автоматично видаляється на машинах користувачів |
allowCrossMarketplaceDependenciesOn | string[] | Імена маркетплейсів, плагіни яких можуть бути залежностями плагінів цього маркетплейсу. Діє лише список маркетплейсу, з якого встановлюють кореневий плагін |
renames | object | Мапа «колишнє ім’я плагіна → нове ім’я» або null для видаленого |
Поля запису плагіна
Обов’язкові: name і source. Крім перелічених, запис приймає будь-яке поле plugin.json (author, commands, hooks, mcpServers …), але не «directory listing» поля (icon, documentationUrl, supportUrl, privacyPolicyUrl, termsOfServiceUrl) — їх задають тільки в plugin.json.
| Поле | Тип | Опис |
|---|---|---|
name | string | Ідентифікатор плагіна (ті самі правила символів, що й у маркетплейсу). Саме його пишуть перед @ при встановленні, навіть якщо в plugin.json інше name |
source | string | object | Звідки брати плагін. Див. типи джерел |
description | string | Показується в списках і деталях /plugin |
version | string | Версія плагіна. Якщо plugin.json теж має version, перемагає plugin.json (а validate попереджає) |
category, tags | string, string[] | Довільна категорія та теги для пошуку |
strict | boolean | За замовчуванням true. Чи є plugin.json остаточним джерелом компонентів. Див. строгий режим |
relevance | object | Сигнали, коли Claude Code має підказати цей плагін (потребує managed-ключа pluginSuggestionMarketplaces) |
dependencies | array | Плагіни, які мають бути ввімкнені: "name", "name@marketplace" або об’єкт із version |
defaultEnabled | boolean | За замовчуванням true. Чи вмикається плагін, якщо користувач не задав його в enabledPlugins. Значення запису перекриває plugin.json |
displayName | string | Назва в UI. Без неї показується name |
metadata | object | Довільні ваші поля; Claude Code їх не читає (v2.1.222+) |
headers | object | HTTP-заголовки для завантаження archive-джерела; перекривають однойменні з джерела маркетплейсу (v2.1.238+) |
headersHelper | string | Команда, що друкує заголовки JSON-об’єктом (для токенів з коротким терміном життя). Потрібен "strict": false (v2.1.238+) |
Відображувані поля (displayName, description, author, homepage, repository, license, keywords) можна задати і в записі, і в plugin.json: якщо запис їх задав — користувач бачить значення запису, інакше — з plugin.json. До встановлення plugin.json можна прочитати лише для записів із відносним шляхом; для решти типів джерел видно тільки поля запису.
Строгий режим (strict)
Якщо у плагіна немає власного plugin.json, запис сам є маніфестом незалежно від strict (діють усі поля, зокрема mcpServers, lspServers, userConfig, channels). Якщо plugin.json є, він — маніфест, а strict вирішує, що робити з компонентними полями запису (commands, agents, skills, hooks, outputStyles, themes). Поля mcpServers, lspServers, userConfig, channels у записі при наявному plugin.json не діють — оголошуйте їх у plugin.json.
| strict | plugin.json | Компонентні поля запису | Результат |
|---|---|---|---|
| будь-яке | відсутній | будь-які | Запис є маніфестом |
true (за замовчуванням) | є | будь-які | plugin.json — авторитет; поля запису додаються до нього, крім hooks: matcher’и запису замінюють маніфестні по кожній події |
false | є | немає | plugin.json — маніфест |
false | є | одне чи більше | Конфлікт: Plugin <name> has conflicting manifests: both plugin.json and marketplace entry specify components |
Пишіть hooks у записі лише як інлайновий об’єкт «подія → масив matcher’ів». Шлях до файлу чи масив validate пропускає, але хуки не працюватимуть, а Claude Code покаже помилку not yet supported in a marketplace entry. Файлові хуки кладіть у hooks/hooks.json плагіна.
Типи джерел плагіна (source)
source запису — або рядок (відносний шлях), або об’єкт, де поле source називає тип. Імена url і github зустрічаються й серед джерел маркетплейсу, але мають там інший зміст (див. нижче).
| Тип | Поля | Примітки |
|---|---|---|
| Відносний шлях | сам рядок | Тека всередині маркетплейсу, від його кореня. Має починатися з ./ (або «голе» ім’я під metadata.pluginRoot); "." — сам корінь. Шлях із .. не проходить валідацію |
github | repo, ref, sha | Репозиторій GitHub у формі owner/repo |
url | url, ref, sha | Будь-який git-репозиторій за URL — це шлях для вашого GitLab |
git-subdir | url, path, ref, sha | Одна підтека репозиторію (sparse checkout). Для монорепо |
npm | package, version, registry | Пакет npm-реєстру або tarball; ставиться вашим npm-клієнтом без виконання install-скриптів |
archive | url, sha256 | Zip по HTTPS. Потрібен v2.1.224+ |
command | command, timeout, mode | Тека, яку друкує команда, що Claude Code запускає на машині користувача. Потрібен v2.1.229+ |
Спільні для github, url, git-subdir: ref — гілка чи тег (за замовчуванням — типова гілка репозиторію); sha — повний 40-символьний commit SHA малими літерами. Якщо задано обидва, береться sha: установка спрацює, навіть якщо гілку/тег потім видалили (на GitHub, GitLab, Bitbucket; деякі сервери на кшталт AWS CodeCommit не вміють видавати коміт за SHA).
Відносний шлях. Підходить для плагіна в тому ж репозиторії, що й каталог. Розв’язується лише тоді, коли Claude Code має файли маркетплейсу (джерела github, git, file, directory); для маркетплейсу-url відносні шляхи не працюють, для settings — відхиляються. У macOS/Linux зворотний слеш у шляху відхиляється.
{ "name": "acme-django-vue", "source": "./plugins/acme-django-vue" }З metadata.pluginRoot (v2.1.239+) можна писати «голі» імена; шлях із / усе одно потребує ./:
{
"name": "acme-tools",
"owner": { "name": "Acme Platform Team" },
"metadata": { "pluginRoot": "./plugins" },
"plugins": [ { "name": "acme-django-vue", "source": "acme-django-vue" } ]
}github — із фіксацією на тег і коміт:
{
"name": "formatter",
"source": {
"source": "github",
"repo": "your-org/formatter",
"ref": "v2.0.0",
"sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"
}
}url — повний git URL (https://, http://, file:// або git@); суфікс .git не обов’язковий; скорочення owner/repo тут не працює. Окремий репозиторій плагіна на GitLab:
{
"name": "acme-django-vue",
"source": {
"source": "url",
"url": "https://gitlab.example.com/platform/acme-django-vue.git",
"ref": "v1.0.0"
}
}git-subdir — підтека монорепо; url приймає повний URL або GitHub owner/repo. Через https/SSH Claude Code просить у сервера partial clone, тож плагін із великого монорепо не тягне решту репозиторію:
{
"name": "acme-django-vue",
"source": {
"source": "git-subdir",
"url": "https://gitlab.example.com/platform/monorepo.git",
"path": "tools/claude/acme-django-vue",
"ref": "main"
}
}npm — package (ім’я, ім’я@версія або https-посилання на tarball), version (версія, діапазон semver або dist-tag; без нього береться latest), registry (https, якщо не реєстр за замовчуванням). Відхиляються git-адреси, шляхи file:, aliases npm:, tarball-посилання на github.com / gist.github.com / gitlab.com / bitbucket.org / git.sr.ht (виняток — npm-реєстр GitLab за gitlab.com/api/v4/) та http-tarball, окрім власного реєстру користувача.
{
"name": "formatter",
"source": {
"source": "npm",
"package": "@your-org/formatter",
"version": "^2.0.0",
"registry": "https://npm.example.com"
}
}archive — zip по https:// (не на loopback, link-local чи cloud-metadata хости); корінь плагіна — у корені архіву або на один рівень глибше. Із sha256 (64 hex-символи) Claude Code відхиляє файл, що не збігається. Зручно для користувачів без акаунта в git-хостингу.
{
"name": "formatter",
"source": {
"source": "archive",
"url": "https://artifacts.example.com/formatter-2.0.0.zip",
"sha256": "6bfa50e3d2e00c052b46abe51fff89346ac803e45771f76dcf6df1ab74cca5e1"
}
}command — для плагінів, які генерує встановлений на машині інструмент (наприклад, IDE). Команда виконується через sh (на Windows — cmd.exe) з домашньої теки при встановленні, оновленні та раз на сесію; вона має надрукувати одним рядком абсолютний шлях до теки плагіна й завершитися з кодом 0. Команду показують користувачу й просять підтвердити (--yes у скриптах). Адміністратор може вимкнути такі джерела ключем disableCommandPluginSources.
{
"name": "formatter",
"source": {
"source": "command",
"command": "my-tool claude-plugin-path",
"timeout": 120
}
}Поле command | Вимоги |
|---|---|
command | Друкований ASCII, до 500 символів, без послідовності з 4+ пробілів |
timeout | Ціле, 1–600 секунд; за замовчуванням 60 |
mode | copy (за замовчуванням): тека копіюється в кеш, версія — хеш файлів, ліміт 256 MiB / 20 000 елементів. link: файли вантажаться «на місці» через посилання, без копіювання (тека має лишатися на місці й містити node_modules); на Windows не підтримується |
Типи джерел маркетплейсу
Джерело маркетплейсу каже, звідки брати сам marketplace.json. Його будує marketplace add або ви пишете в extraKnownMarketplaces; адміністратори використовують ті самі об’єкти в allowlist/blocklist. Імена url, git, github мають тут інший зміст, ніж у джерелах плагінів: маркетплейс-url — це пряме посилання на JSON-файл (git-репозиторій він не клонує), а git існує тільки як джерело маркетплейсу.
| Тип | Поля | Що вводить користувач у marketplace add |
|---|---|---|
github | repo, ref, path, sparsePaths | owner/repo, owner/repo@ref або owner/repo#ref |
git | url, ref, path, sparsePaths | user@host:path[.git][#ref]; http(s) URL, що закінчується на .git, містить /_git/ або є репозиторієм на github.com / gitlab.com |
url | url, headers, headersHelper | Будь-який інший http(s):// URL — завантажується як marketplace.json |
file | path | Шлях до .json-файлу |
directory | path | Шлях до теки з .claude-plugin/marketplace.json |
settings | name, plugins, owner | Не створюється командою; інлайн-каталог у extraKnownMarketplaces без жодного файлу. Відносні шляхи в ньому не працюють |
npm | package | Не реалізовано: у extraKnownMarketplaces не завантажується (NPM marketplace sources not yet implemented) |
hostPattern, pathPattern, skills-dir, owner/* | — | Лише в політиках strictKnownMarketplaces / blockedMarketplaces. Див. розділ «Для команди» |
path для github/git — розташування файлу в репозиторії (типово .claude-plugin/marketplace.json). sparsePaths — масив тек для sparse checkout (--sparse у CLI). Для file корінь маркетплейсу — тека на два рівні вище файлу, тож тримайте його як <root>/.claude-plugin/marketplace.json. Приклад у settings:
{
"extraKnownMarketplaces": {
"acme-tools": {
"source": {
"source": "git",
"url": "https://gitlab.example.com/platform/acme-claude-plugins.git",
"ref": "main"
}
}
}
}Усі параметри ключа — на сторінці settings: extraKnownMarketplaces.
Приватний маркетплейс на self-hosted GitLab
Репозиторій з каталогом — звичайний git-проєкт. Рекомендована схема для команди: marketplace.json у корені репозиторію і плагіни у plugins/<name>/ з відносними шляхами. Тоді все, що потрібно, клонується одним запитом, а доступ до плагінів дає доступ до самого репозиторію.
acme-claude-plugins/ ├── .claude-plugin/ │ └── marketplace.json ├── plugins/ │ ├── acme-django-vue/ │ │ ├── .claude-plugin/plugin.json │ │ └── skills/ … │ └── acme-release-tools/ │ └── … └── README.md
Як користувачі додають маркетплейс
| Що ввести | Що станеться |
|---|---|
claude plugin marketplace add https://gitlab.example.com/platform/acme-claude-plugins.git | Правильно. URL із .git клонується як git-репозиторій |
… add git@gitlab.example.com:platform/acme-claude-plugins.git | Клонування по SSH |
… add https://gitlab.example.com/platform/acme-claude-plugins.git#v1.0.0 | Фіксація каталогу на тег/гілку (#ref) |
… add https://gitlab.example.com/platform/acme-claude-plugins (без .git) | Пастка: для self-hosted хоста це розцінюється як URL до marketplace.json і завантажується як JSON-файл, а не клонується. Додавайте .git. (Репозиторії на самому gitlab.com, зокрема з вкладеними підгрупами, клонуються й без нього) |
… add platform/acme-claude-plugins або gitlab.example.com/platform/… | Скорочення owner/repo завжди означає GitHub; голий хост відхиляється як невалідне скорочення (is not a valid GitHub owner/repo shorthand) |
Хост, чиї clone-URL не мають суфікса .git (наприклад, AWS CodeCommit), додають як git-запис у extraKnownMarketplaces — тоді URL клонується як є. Після успішного додавання Claude Code пише Successfully added marketplace: acme-tools; ім’я береться з поля name у marketplace.json, а не з назви репозиторію.
Автентифікація до приватного репозиторію
У marketplace.json немає поля для токена, і сам Claude Code git-токена не має. Він запускає git на машині користувача без інтерактивних запитів і покладається на облікові дані, які там уже є. Тому кожен розробник має заздалегідь налаштувати доступ.
| Протокол | Вимоги | Перевірка |
|---|---|---|
SSH (git@host:path.git) | Ключ працює без passphrase-запиту (наприклад, завантажений у ssh-agent); хост уже є в known_hosts (Claude Code клонує з StrictHostKeyChecking=yes) | ssh -T git@gitlab.example.com один раз вручну. Якщо ключ хоста змінився — ssh-keygen -R <host> |
HTTPS (https://…git) | git credential helper вже зберігає облікові дані (наприклад, personal access token GitLab); helper може віддати збережене, але не може питати | git ls-remote <url> без запиту пароля |
Змінна на кшталт GITLAB_TOKEN не спрацює для клонування, якщо її не читає credential helper. Токен має потрапити саме в git credential helper. Окремої інструкції з GitLab CI документація для маркетплейсів не дає (є лише приклад GitHub Actions: змінна GH_TOKEN + gh auth setup-git) — у CI також налаштуйте credential helper до встановлення плагінів із приватних репозиторіїв.
Користувачам без акаунта в GitLab (підрядники, CI-образи) підійдуть: джерела archive (потрібен лише HTTPS-доступ до URL), публічні git-репозиторії, directory-маркетплейс на спільному диску або seed-тека. Для GitHub-репозиторію з owner/repo є CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1 (клонувати по HTTPS замість SSH); для GitLab потреби в ньому немає, бо ви все одно даєте повний URL.
Версії, теги й оновлення
Користувач отримує нову копію плагіна лише тоді, коли змінюється його обчислена версія. Порядок: version у plugin.json → version у записі маркетплейсу → ознака з типу джерела.
| Джерело | Версія, якщо version не задано |
|---|---|
github, url, git-subdir | Commit SHA, скорочений до 12 символів (для git-subdir додається хеш шляху) |
| Відносний шлях у git-маркетплейсі | Commit SHA встановленої теки |
archive | SHA-256, скорочений до 12 символів |
npm, локальна тека без git | unknown |
command | Завжди з результату команди: 12-символьний хеш або <версія маніфесту>-<хеш>, якщо plugin.json задає version (version запису ігнорується) |
- Задали
version(наприклад,1.0.0) і запушили нові коміти без зміни рядка — користувачі нічого не отримають. Піднімайте версію з кожним релізом. - Не задавали
version— користувачі йдуть за комітами (кожен новий коміт = нова версія). - Не задавайте
versionодночасно вplugin.jsonі записі: перемагаєplugin.jsonбез попередження (validateпокаже розбіжність). - Теги релізів:
<plugin>--v<version>. Створює їхclaude plugin tag --push(перевіряє, що версії вplugin.jsonі записі збігаються, робоче дерево чисте, тег ще не існує). Теги потрібні, щоб залежності з діапазоном версій (^2.0) мали проти чого розв’язуватися. - Закріпити користувачів на версії:
ref/shaу джерелі плагіна, або#refу команді додавання маркетплейсу (…git#stable). - Плагіни з відносним шляхом у маркетплейсі, доданому з локального шляху, вантажаться «на місці» й не залежать від
version— зміни видно в наступній сесії чи після/reload-plugins.
Автооновлення для сторонніх маркетплейсів вимкнене за замовчуванням, і в marketplace.json поля для його вмикання немає. Увімкнути можна так: користувач — /plugin → Marketplaces → маркетплейс → Enable auto-update; адміністратор — "autoUpdate": true у managed-записі extraKnownMarketplaces. Без нього зміни приходять після /plugin marketplace update <name> та claude plugin update <plugin>@<name>. Фонова перевірка приватного репозиторію використовує ті самі git-облікові дані без запитів; якщо credential helper мусить питати, оновлення тихо не відбудеться, а наявна копія лишиться. В інтерактивній сесії автооновлення стартує після першого повідомлення з випадковою затримкою до десяти хвилин; запущена сесія зберігає завантажені версії й показує Plugin updated: … Run /reload-plugins to apply.
Канали стабільний/ранній доступ. У Claude Code немає поняття каналів: створіть два маркетплейси з різними name (stable-tools, latest-tools), чиї записи вказують на різні ref того самого плагіна, і давайте командам потрібний. Версії на цих ref мають відрізнятися (або не задавайте version).
Перейменування й видалення плагінів
name плагіна — його ідентифікатор у enabledPlugins, pluginConfigs та /plugin install, тож зміна ламає наявні встановлення. Щоб змінити лише підпис у UI, міняйте displayName. Якщо ім’я змінити мусите — додайте renames:
{
"name": "acme-tools",
"owner": { "name": "Acme Platform Team" },
"forceRemoveDeletedPlugins": true,
"plugins": [
{ "name": "acme-django-vue", "source": "./plugins/acme-django-vue" }
],
"renames": {
"django-helpers": "acme-django-vue",
"legacy-linter": null
}
}- Перейменований запис: плагін завантажується під новим ім’ям, один раз показується
Renamed to "…" in the "…" marketplace, а Claude Code переписує старий ключ на новий вenabledPluginsіpluginConfigsу user/project/local. Managed-settings він переписати не може — нагадування повторюватиметься, доки адмін не оновитьenabledPlugins. Для git/URL-маркетплейсів користувач одноразово виконує/plugin install acme-django-vue@acme-tools(інакшеPlugin "…" not cached at …). null: старий ключ видаляється, користувач бачитьRemoved from the "…" marketplace.renames— «лише додавати»: після повного переходу старі рядки не видаляють; при новому перейменуванні додають ще один рядок (ланцюжок іде від найстарішого імені).claude plugin validate .відхиляє цикли та ланцюжки, що не завершуються наnullабо імені зplugins(renames.<name>: chain does not resolve).forceRemoveDeletedPlugins: true: на кожному старті сесії плагіни, яких немає ні вplugins, ні вrenames, видаляються з user/project/local (встановлені лише через managed — лишаються) і показуються в/pluginпід заголовком Flagged зі статусомRemoved from marketplace. Без поля видалений запис лишається встановленим і скаржитьсяPlugin "…" not found in marketplace.
Залежності між маркетплейсами
За замовчуванням залежність з іншого маркетплейсу не ставиться (якщо користувач сам не встановив її на тому ж scope): це захист від мовчазного встановлення з неперевіреного джерела. Щоб дозволити, перелічіть ім’я цільового маркетплейсу в allowCrossMarketplaceDependenciesOn кореневого маркетплейсу (того, звідки встановлюють плагін); діє лише його список, на весь ланцюг залежностей.
{
"name": "acme-tools",
"owner": { "name": "Acme Platform Team" },
"allowCrossMarketplaceDependenciesOn": ["acme-shared"],
"plugins": [
{
"name": "acme-release-tools",
"source": "./plugins/acme-release-tools",
"dependencies": [
{ "name": "audit-logger", "marketplace": "acme-shared" }
]
}
]
}Якщо поля немає чи цільовий маркетплейс у ньому не названий: залежність із запису маркетплейсу — встановлення відхиляється повідомленням … is in marketplace "…", which is not in the allowlist; залежність із plugin.json — установка завершується без неї, і плагін не завантажується. Діапазон version у залежності (^2.0, ~2.1.0) розв’язується проти git-тегів <plugin>--v<version>; для npm/archive/command діапазон лише перевіряється під час завантаження за version у plugin.json. Пакетний плагін (лише name + dependencies) зручний для ролей: «backend-standard» ставить усе потрібне однією командою.
Маркетплейс як URL, спільна тека, Git LFS, симлінки
- Hosted
marketplace.jsonза URL: Claude Code завантажує лише цей файл (до 5 MiB, відповідь протягом 10 с, редирект на інший origin лише по https). Відносні шляхи в записах не працюють (its marketplace entry path does not stay inside the marketplace directory) — давайте кожному запису самодостатнє джерело (github,url,archive…) або тримайте каталог у git-репозиторії. - Спільна тека (
/plugin marketplace add /Volumes/shared/claude-plugins): плагіни з відносними шляхами читаються прямо звідти, правки видно з наступної сесії чи/reload-pluginsбез підняття версії. - Git LFS: клон не завантажує LFS-вміст, файли лишаються pointer-файлами — не кладіть файли плагіна в LFS.
- Симлінки в плагіні: усередині теки плагіна зберігаються; на інше місце того ж маркетплейсу — розіменовуються (вміст копіюється в кеш); за межі маркетплейсу — пропускаються. Для локальних шляхів і
commandу режиміcopyзберігаються лише внутрішні посилання. - Організаційна синхронізація: на планах Team/Enterprise каталог можна роздавати через Organization settings → Plugins & skills на claude.ai (через GitHub/GitLab-з’єднання організації, без git-облікових даних користувачів). Репозиторій на github.com/gitlab.com має бути private/internal, приймаються не всі типи джерел, а плагін із верхньорівневим
bin/claude.ai відхиляє (тримайте виконувані файли вscripts/).
Зарезервовані імена маркетплейсу
| Категорія | Імена / правило |
|---|---|
| Офіційні | claude-code-marketplace, claude-code-plugins, claude-plugins-official, anthropic-marketplace, anthropic-plugins, agent-skills, anthropic-agent-skills, life-sciences, knowledge-work-plugins, claude-for-legal, claude-for-financial-services, financial-services-plugins, first-party-plugins, claude-tag-plugins. Дозволені лише для маркетплейсів із github/git джерела під github.com/anthropics/ |
| Спільнота | claude-community, claude-plugins-community, healthcare (те саме правило) |
| Каталог плагінів | anthropic-plugin-directory, claude-plugin-directory |
| Імітація офіційних | Назви на кшталт official-claude-plugins, claude-plugins-v2, будь-яке ім’я з не-ASCII символом → Marketplace name impersonates an official Anthropic/Claude marketplace. Також керівні й bidi-символи. Інші написання зарезервованого імені (крапка в кінці, символ замість дефіса: claude.code.plugins) — v2.1.280+ |
| Службові | inline (--plugin-dir), builtin, skills-dir, synced, claude-plugin-test |
| Інструменти | npm, pip, uv, cargo, github, gh — у будь-якому регістрі (v2.1.275+) |
| Префікс | claudeai- — лише для маркетплейсів, що живуть на claude.ai |
| Тека GitHub-маркетплейсу | <owner>-<repo> зареєстрованого GitHub-маркетплейсу, поки той зареєстрований під іншим іменем (v2.1.290+) |
Зареєстрований маркетплейс із забороненим іменем перестає завантажуватися разом із плагінами; claude plugin list і /plugin пишуть Claude Code refuses the marketplace name "…" — вилучення маркетплейсу також видалить його плагіни та їхні збережені дані. Claude Desktop додатково відхиляє імена org, org-provisioned, unknown та імена довші за 128 символів (validate попереджає). Тримайте імена плагінів у kebab-case.
Команди marketplace
| Команда | Прапорці | Що робить |
|---|---|---|
claude plugin marketplace add <source> | --scope user|project|local (типово user; короткої форми -s немає), --sparse <paths…> (sparse checkout для монорепо; лише github/git), --claudeai (читає аргумент як ім’я маркетплейсу з claude.ai; v2.1.273+, несумісний із --scope/--sparse), --json (v2.1.287+) | Реєструє маркетплейс і записує його у settings відповідного scope. Повторне додавання: already on disk — declared in project settings, код 0. Хибний формат: Invalid marketplace source format. Try: owner/repo, https://..., or ./path, код 1 |
claude plugin marketplace list | --json | Друкує Configured marketplaces: із Source: на кожен. JSON: name, source (github/git/url/directory/file/claudeai), repo, url, path, ref, installLocation |
claude plugin marketplace remove <name> (rm) | --scope user|project|local (без нього — з усіх scope), --json | Прибирає оголошення. З останнього scope видаляє кеш і деінсталює всі плагіни з цього маркетплейсу разом із збереженими опціями, секретами й даними. Приймає ім’я з list, не джерело |
claude plugin marketplace update [name] | --json (лише з іменем) | Оновлює каталог із джерела (для #ref — до останнього коміту цього ref). Без імені оновлює всі маркетплейси (Successfully updated N marketplaces) |
У сесії те саме: /plugin marketplace add|list|update|remove (псевдоніми /plugin market …, /plugins, /marketplace). Повна шпаргалка — у розділі «Шпаргалка команд».
Є два рівні роздачі плагінів. Репозиторій (.claude/settings.json у проєкті) — для команди, що працює над одним кодом. Managed settings — для всієї компанії, коли політику не можна обійти. Обидва використовують пару ключів: extraKnownMarketplaces реєструє маркетплейс, enabledPlugins вмикає плагіни (plugin@marketplace).
1. Проєктні налаштування (.claude/settings.json)
{
"extraKnownMarketplaces": {
"acme-tools": {
"source": {
"source": "git",
"url": "https://gitlab.example.com/platform/acme-claude-plugins.git",
"ref": "main"
}
}
},
"enabledPlugins": {
"acme-django-vue@acme-tools": true
}
}Те саме можна отримати командою claude plugin marketplace add <url> --scope project (вона й запише extraKnownMarketplaces у .claude/settings.json) та claude plugin install … --scope project; результат закомітьте. Що саме станеться в колеги після git pull:
| Крок | Чи автоматично | Умова / деталі |
|---|---|---|
Реєстрація маркетплейсу з extraKnownMarketplaces | Так, після прийняття workspace trust dialog для цієї теки | У недовіреній теці ключ ігнорується без жодного повідомлення. У -p/CI — лише якщо довіру вже прийнято інтерактивно або прапорець hasTrustDialogAccepted виставлено в ~/.claude.json |
| Клонування каталогу | Так, у фоні після старту сесії | Потрібен git-доступ до GitLab (SSH-ключ в агенті або credential helper із PAT) — див. розділ про GitLab |
| Плагін із відносним шляхом у цьому маркетплейсі | Так — нічого ставити не треба | Завантажується з копії маркетплейсу, окремий install-запис не потрібен |
Плагін із зовнішнім джерелом (github, url, git-subdir, npm, archive …) | Ні | Репозиторій лише вмикає його, але не встановлює. У вкладці Errors: Plugin "…" is enabled in project settings but isn't installed here. Кожен розробник один раз виконує claude plugin install <name>@<marketplace> --scope project |
Зовнішній плагін, ввімкнений у user settings, untracked settings.local.json, --settings чи managed | Так | Лише ці чотири джерела дають true, за яким Claude Code сам завантажує зовнішнє джерело |
| Хмарні сесії (claude.ai/code) | Ні | Не додають маркетплейси з репозиторію (немає trust dialog) і не вантажать плагіни з його enabledPlugins |
Тримайте плагіни в тому ж репозиторії, що й каталог, з відносними шляхами (./plugins/<name>) — тоді колегам не потрібен жоден додатковий крок, крім trust і git-доступу. Якщо плагін живе у власному репозиторії, додайте в onboarding одну команду claude plugin install … --scope project.
- Відмовитись особисто: вимкнення в
~/.claude/settings.jsonне допоможе (проєктнеtrueсильніше). Запишіть"acme-django-vue@acme-tools": falseу.claude/settings.local.json— він має вищий пріоритет. У/plugin→ Uninstall для плагіна, який вмикає проєкт, питає: y — вимкнути лише для себе (запишеfalseу local), u — видалити з спільногоsettings.jsonдля всіх. - Пріоритет
enabledPlugins:--add-dir< user < project < local <--settings< managed. Для кожного id перемагає значення з найвищого джерела, яке його згадує; у managedtrueпримусово вмикає,falseблокує. - Локальне
directory/file-джерело з відносним шляхом розв’язується від головного checkout; у git worktree шлях усе одно вказує на головний checkout. - Набір для ролі: опублікуйте пакетний плагін (лише
name+dependencies) і вмикайте тільки його — решта встановиться як залежності. - Плагіни, закомічені в
.claude/skills/репозиторію (skills-dir, project scope): вантажаться лише після workspace trust; їхні MCP-сервери проходять той самий покроковий approval, що й проєктний.mcp.json; MCPB-бандли та MCP-файли поза текою плагіна пропускаються; монітори не вантажаться.
2. Managed-роздача на всю компанію
{
"extraKnownMarketplaces": {
"acme-tools": {
"source": {
"source": "git",
"url": "https://gitlab.example.com/platform/acme-claude-plugins.git"
},
"autoUpdate": true
}
},
"enabledPlugins": {
"acme-django-vue@acme-tools": true
}
}На відміну від репозиторію, managed extraKnownMarketplaces + enabledPlugins справді встановлюють плагіни на початку наступної сесії користувача (для будь-якого типу джерела). Користувач бачить їх у /plugin, але вимкнути не може: managed має вищий пріоритет за всі scope, а false блокує плагін усюди й ховає з каталогу. Managed-запис маркетплейсу повністю замінює однойменний із нижчого рівня (поля не зливаються). autoUpdate у managed-записі закріплює політику: спроба вимкнути перемикач у /plugin завершується помилкою Auto-update for '…' is set by …. Якщо приватний каталог — користувачам усе одно потрібен git-доступ.
| Механізм доставки | Деталі |
|---|---|
| Server-managed settings | claude.ai → Organization settings → Claude Code → Managed settings; потрібна роль Owner. Одна конфігурація на всю організацію (різні групи — не можна) |
| MDM | macOS — plist, ключі верхнього рівня = ключі settings; Windows — увесь JSON рядком у значенні реєстру |
| Файл | managed-settings.json у системному шляху платформи плюс тека managed-settings.d/ поруч |
За замовчуванням діє лише одне джерело: перше, що доставляє ключ політики (server → MDM → файл). Якщо server-managed доставляє бодай один сторонній ключ, плагінні ключі з MDM чи файлу на тій машині ігноруються; щоб застосувати всі джерела, задайте managedSourcesBehavior: "merge". Різні канали для різних груп (stable/latest) — окремі endpoint-managed налаштування або політики шлюзу Claude apps.
CI та контейнери
- У
claude -p/CI маркетплейси й плагіни встановлюються у фоні, тому плагіна може не бути на першому ході.CLAUDE_CODE_SYNC_PLUGIN_INSTALL=1змушує чекати встановлення (обмежити очікування —CLAUDE_CODE_SYNC_PLUGIN_INSTALL_TIMEOUT_MS;CLAUDE_CODE_ENABLE_BACKGROUND_PLUGIN_REFRESH=1оновлює стан плагінів на межах ходів після фонового встановлення). - Seed-тека для образів без доступу до git: під час збірки
CLAUDE_CODE_PLUGIN_CACHE_DIR=/opt/claude-seed claude plugin marketplace add …та… claude plugin install …; у рантайміCLAUDE_CODE_PLUGIN_SEED_DIR=/opt/claude-seed(кілька — через:, на Windows;). Seed лише для читання,autoUpdateпримусово вимкнений, його записи перекривають однойменні користувацькі;marketplace update/removeдаютьis seed-managed. Плагіни з seed треба ще й увімкнути черезenabledPlugins. Політика (allowlist/blocklist) застосовується і до seed. - Перевірити: на машині —
/plugin; у CI —claude -p --output-format stream-json --verbose, у подіїinitє списокplugins; для seed шляхи плагінів починаються з seed-теки. - Без вихідного git: seed + маркетплейс
directory/fileна спільному диску +CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1(також вимикає автооновлення плагінів).
3. Політики обмеження
Параметри ключів описані на сторінці settings — тут лише огляд. enabledPlugins і extraKnownMarketplaces діють з будь-якого рівня, pluginConfigs — з user або managed, syncClaudeAiPlugins — з user/local/managed; решта ключів працює лише з managed settings.
| Ключ | Що забезпечує | Чого не вміє |
|---|---|---|
strictKnownMarketplaces (псевдонім allowedMarketplaces, v2.1.232+) | Allowlist джерел маркетплейсів; [] блокує все, зокрема офіційний. Збіг точний (repo/url + ref + path); є owner/*, hostPattern, pathPattern | Нічого не реєструє, не обмежує записи всередині дозволеного маркетплейсу, не блокує --plugin-dir |
blockedMarketplaces | Blocklist джерел; перевіряється першим; збіг ширший (канонізація git URL, github ≡ git) | Не блокує вже зареєстрований маркетплейс із джерела, що не збігається |
enabledPlugins | true — примусово вмикає, false — блокує на всіх рівнях і ховає плагін | Не встановить плагін, чий маркетплейс не зареєстрований чи не дозволений |
extraKnownMarketplaces (псевдонім additionalMarketplaces) | Реєструє маркетплейс (+ autoUpdate) | У managed-записі має проходити allowlist |
disableSideloadFlags | Відхиляє --plugin-dir, --plugin-url, --agents, SDK-опцію plugins, не-SDK --mcp-config та CLAUDE_CODE_PLUGIN_DIRS | Не обмежує .mcp.json і claude mcp add — поєднуйте з allowedMcpServers |
disableCommandPluginSources | Блокує плагіни з джерелом command та їхні headersHelper; якщо не задано — повторює allowManagedHooksOnly | Інші типи джерел не зачіпає |
allowManagedHooksOnly | Лише хуки з managed settings та плагінів, примусово ввімкнених у managed enabledPlugins | Хуки плагінів, які користувач увімкнув сам, не вважаються довіреними |
strictPluginOnlyCustomization | Блокує скіли, агентів, хуки, MCP, що не з плагіна/managed/вбудованих (true або масив ["skills","hooks"]) | Не обмежує, які плагіни ставити — поєднуйте з allowlist |
pluginSuggestionMarketplaces | Маркетплейси, чиї плагіни можуть з’являтися як підказки (relevance) | Вбудовані підказки не зачіпає |
pluginTrustMessage | Додає ваш текст до попередження про довіру в /plugin | Не змінює власний текст попередження |
syncClaudeAiPlugins | false — не завантажувати плагіни, синхронізовані з акаунта claude.ai (v2.1.273+) | Один синхронізований плагін вимикають через "<name>@synced": false |
pluginConfigs | Значення userConfig (читається з user або managed; project/local ігнорується) | — |
CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL=1 | Не реєструвати офіційний маркетплейс автоматично (через managed env) | Не видаляє вже зареєстрований |
Приклад «дозволити лише наш GitLab і офіційний маркетплейс»:
{
"strictKnownMarketplaces": [
{ "source": "github", "repo": "anthropics/claude-plugins-official" },
{ "source": "hostPattern", "hostPattern": "^gitlab\\.example\\.com$" },
{ "source": "skills-dir" }
],
"extraKnownMarketplaces": {
"claude-plugins-official": {
"source": { "source": "github", "repo": "anthropics/claude-plugins-official" }
},
"acme-tools": {
"source": { "source": "git", "url": "https://gitlab.example.com/platform/acme-claude-plugins.git" }
}
},
"enabledPlugins": { "acme-django-vue@acme-tools": true },
"disableSideloadFlags": true
}- Будь-який allowlist без запису
{"source": "skills-dir"}мовчки вимикає плагіни зі skills-директорій (.claude/skills/із.claude-plugin/plugin.json); звичайні скіли без маніфесту працюють. hostPattern— регулярний вираз, що збігається будь-де в імені хоста, тож обмежуйте його якорями^…$; у JSON крапку екранують як\\.. Для GitLab, де розробники створюють власні маркетплейси, це зручніше, ніж точні URL (форми.git,ssh://, слеш у кінці — різні значення).- Allowlist ніяк не реєструє маркетплейс — для цього потрібні явні записи в
extraKnownMarketplaces, які мають самі пройти allowlist. Офіційний маркетплейс сам реєструється лише в інтерактивному терміналі й лише якщо політика дозволяє. - Політика застосовується до завантаження й при кожному старті: встановлений плагін із маркетплейсу, що більше не підпадає під allowlist, не завантажується (
Marketplace "…" is not in the allowed marketplace list). - Окремих ключів немає для: політики по групах (використовуйте окремі endpoint-налаштування чи шлюз), обмеження окремих записів усередині дозволеного маркетплейсу (ставте їм
falseу managedenabledPlugins), приховування/plugin. - Аудит: OpenTelemetry-події
claude_code.plugin_installedіclaude_code.plugin_loaded(імена сторонніх плагінів редагуються безOTEL_LOG_TOOL_DETAILS=1), Analytics API на Enterprise,/status→Enterprise managed settingsу Setting sources.
Onboarding нового розробника
- Налаштувати доступ до GitLab без запитів: SSH-ключ в
ssh-agent+ssh -T git@gitlab.example.comодин раз, або PAT у git credential helper; перевіритиgit ls-remote https://gitlab.example.com/platform/acme-claude-plugins.git. - Клонувати проєкт, запустити
claudeу корені репозиторію і прийняти workspace trust dialog. - Дочекатися фонового клонування каталогу; за повідомленням
Plugins changed. Run /reload-plugins to activate.виконати/reload-plugins. - Якщо плагін із зовнішнім джерелом — виконати у shell
claude plugin install acme-django-vue@acme-tools --scope project. - Ввести значення
userConfig(URL GitLab, токен) у діалозі або/plugin configure acme-django-vue@acme-tools. - Перевірити:
claude plugin list(статус enabled), у сесії/показує/acme-django-vue:…,/mcp— серверplugin:acme-django-vue:gitlab. - Ввімкнути автооновлення маркетплейсу в
/plugin→ Marketplaces (якщо його не задано політикою).
Сценарій: платформна команда Acme веде Django-бекенд і Vue-фронтенд у self-hosted GitLab. Вона публікує репозиторій-каталог acme-claude-plugins з одним плагіном acme-django-vue: скіл для міграцій, агент-рев’юер, хук лінтингу після правок та два MCP-сервери (GitLab, Sentry).
Усі URL вигляду gitlab.example.com, platform/…, e-mail platform@acme.example — умовні: підставте свої. Адреса /api/v4/mcp для GitLab MCP — також плейсхолдер: перевірте реальний шлях MCP-ендпоінта у вашому інстансі. Sentry-адреса https://mcp.sentry.dev/mcp взята з прикладу документації Claude Code.
Дерево репозиторію
acme-claude-plugins/ ├── .claude-plugin/ │ └── marketplace.json ├── plugins/ │ └── acme-django-vue/ │ ├── .claude-plugin/ │ │ └── plugin.json │ ├── skills/ │ │ └── django-migrations/ │ │ ├── SKILL.md │ │ └── checklist.md │ ├── agents/ │ │ └── code-reviewer.md │ ├── hooks/ │ │ └── hooks.json │ ├── scripts/ │ │ └── lint-after-edit.sh │ ├── .mcp.json │ └── README.md └── README.md
У .claude-plugin/ лежить тільки plugin.json; усі компоненти — у корені плагіна. CLAUDE.md у корені плагіна не завантажується — інструкції живуть у скілі.
plugin.json
{
"name": "acme-django-vue",
"displayName": "Acme Django + Vue",
"version": "1.0.0",
"description": "Міграції Django, рев’ю, лінтинг після правок, GitLab і Sentry MCP",
"author": { "name": "Acme Platform Team", "email": "platform@acme.example" },
"homepage": "https://gitlab.example.com/platform/acme-claude-plugins",
"keywords": ["django", "vue", "gitlab"],
"userConfig": {
"gitlab_url": {
"type": "string",
"title": "GitLab URL",
"description": "Адреса інстансу GitLab",
"default": "https://gitlab.example.com"
},
"gitlab_token": {
"type": "string",
"title": "GitLab token",
"description": "Personal access token з правом read_api",
"sensitive": true,
"required": true
}
}
}version задано лише тут (не в записі маркетплейсу): користувачі оновлюються, коли ви піднімаєте цей рядок. Ключі userConfig — літери, цифри, підкреслення. sensitive: true маскує введення й зберігає значення в захищеному сховищі системи, а не в settings.json.
Скіл django-migrations
--- name: django-migrations description: Створює та перевіряє міграції Django. Use when a task changes models.py, adds a field, or the user asks about migrations, makemigrations, or schema changes. allowed-tools: Bash(python manage.py makemigrations *) Bash(python manage.py sqlmigrate *) Read Grep --- # Міграції Django 1. Після змін у `models.py` запусти `python manage.py makemigrations --dry-run -v 3` і покажи, що саме буде створено. 2. Для полів `NOT NULL` без default — роби в три кроки: nullable → data migration → NOT NULL. 3. Перед завершенням переглянь SQL: `python manage.py sqlmigrate <app> <номер>`. 4. Не редагуй уже застосовані міграції; не змінюй чужі файли в `migrations/`. Деталі й типові пастки — у [checklist.md](checklist.md).
Команда скілу буде /acme-django-vue:django-migrations; Claude може викликати його й сам за описом. Рядок allowed-tools дозволяє перелічені команди без запиту лише на час ходу, у якому викликано скіл.
Агент code-reviewer
--- name: code-reviewer description: Рев’ю змін у Django-бекенді та Vue-компонентах. Use after finishing a feature or before opening a merge request. model: sonnet tools: Read, Grep, Glob, Bash maxTurns: 15 --- Ти рев’юер коду команди Acme. Перевір зміни (`git diff main...HEAD`): - Django: N+1 запити, відсутні індекси, небезпечні міграції, права доступу в DRF. - Vue 3: реактивність, зайві watcher’и, типізація props, доступність. - Тести: чи покриті нові гілки. Відповідай списком зауважень за важливістю; сам код не виправляй.
Агент називається acme-django-vue:code-reviewer; користувач може викликати його явно як @agent-acme-django-vue:code-reviewer. Для агентів плагіна ігноруються поля permissionMode, hooks, mcpServers, initialPrompt — їх не варто писати у frontmatter.
Хук: лінтинг після правок
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "\"${CLAUDE_PLUGIN_ROOT}/scripts/lint-after-edit.sh\""
}
]
}
]
}
}#!/usr/bin/env bash # Читає JSON події з stdin, форматує змінений файл. Потрібні jq, ruff, eslint у проєкті. file=$(jq -r '.tool_input.file_path // empty') [ -z "$file" ] && exit 0 cd "$CLAUDE_PROJECT_DIR" || exit 0 case "$file" in *.py) ruff check --fix --quiet "$file" ruff format --quiet "$file" ;; *.vue|*.ts|*.js) npx --no-install eslint --fix "$file" >&2 ;; esac exit 0
Зробіть скрипт виконуваним (chmod +x scripts/lint-after-edit.sh) і закомітьте з цим бітом. Шлях узято в подвійні лапки: інакше шлях встановлення з пробілом розламає shell-команду. У файлі обов’язковий зовнішній ключ "hooks". Хуки плагіна реєструються при завантаженні плагіна й діють усю сесію — не чекають на виклик скілу.
.mcp.json: GitLab і Sentry
{
"mcpServers": {
"gitlab": {
"type": "http",
"url": "${user_config.gitlab_url}/api/v4/mcp",
"headers": { "Authorization": "Bearer ${user_config.gitlab_token}" }
},
"sentry": {
"type": "http",
"url": "https://mcp.sentry.dev/mcp"
}
}
}${user_config.KEY}підставляється уurl,headersта інші поля MCP-конфігурації; у shell-хуках іheadersHelperвоно заборонене.- Інший варіант без
userConfig— змінні оточення зі стандартним синтаксисом.mcp.json:${GITLAB_URL:-https://gitlab.example.com}і${VAR}. Але змінні з «обліковими» іменами (якANTHROPIC_API_KEY,NPM_TOKEN) уurl/headersвіддалених серверів читаються порожніми; для секретів надійнішеuserConfigізsensitive. - Sentry-сервер без секретів у файлі: автентифікація йде через OAuth окремим кроком (у
/mcp). - Сервери в
/mcpназиваютьсяplugin:acme-django-vue:gitlabтаplugin:acme-django-vue:sentry, а їхні інструменти —mcp__plugin_acme-django-vue_gitlab__<tool>(саме так їх треба писати в permission-правилах і matcher’ах хуків).
marketplace.json у GitLab-репозиторії
{
"name": "acme-tools",
"owner": { "name": "Acme Platform Team", "email": "platform@acme.example" },
"description": "Командні плагіни Claude Code Acme",
"plugins": [
{
"name": "acme-django-vue",
"source": "./plugins/acme-django-vue",
"description": "Міграції Django, рев’ю, лінтинг, GitLab і Sentry MCP",
"category": "development",
"tags": ["django", "vue", "gitlab", "sentry"]
}
]
}Перевірка перед пушем
# перевірка каталогу (marketplace.json) і окремо плагіна claude plugin validate . --strict claude plugin validate ./plugins/acme-django-vue --strict # пробний запуск без встановлення claude --plugin-dir ./plugins/acme-django-vue # реліз: тег acme-django-vue--v1.0.0 cd plugins/acme-django-vue && claude plugin tag --push
Валідація з каталогу не відкриває файли скілів, агентів і хуків плагінів в інших теках, тому плагін перевіряють окремо. Підключення командою колегам і в проєкт:
claude plugin marketplace add https://gitlab.example.com/platform/acme-claude-plugins.git --scope project
claude plugin install acme-django-vue@acme-tools --scope project
git add .claude/settings.json && git commit -m "Enable acme-django-vue plugin"Що відбувається при встановленні
1. Оновлення каталогу назва містить @acme-tools → Claude Code спершу оновлює цей маркетплейс (git fetch/clone по GitLab) 2. Панель деталей і згода Will install: skill, agent, hook, 2 MCP servers (для власного маркетплейсу може бути «Components will be discovered at installation») попередження «Make sure you trust a plugin before installing…» вибір scope: user / project (для колег) / local 3. Копіювання в кеш ~/.claude/plugins/cache/acme-tools/acme-django-vue/1.0.0/ ← ${CLAUDE_PLUGIN_ROOT} запис у installed_plugins.json, enabledPlugins у settings обраного scope 4. Діалог userConfig gitlab_url, gitlab_token → url у settings (pluginConfigs), токен у захищеному сховищі 5. Активація «Plugin is now active.» (або «Run /reload-plugins to apply.» — Claude Code виконає reload сам) 6. Результат у сесії /acme-django-vue:django-migrations ← скіл з простором імен @agent-acme-django-vue:code-reviewer ← агент PostToolUse hook (Write|Edit) ← активний від завантаження, не чекає на скіл /mcp → plugin:acme-django-vue:gitlab, plugin:acme-django-vue:sentry Sentry: пройти OAuth; GitLab: токен уже підставлений з userConfig
- Якщо reload змінює MCP-інструменти і це знецінює prompt cache, Claude Code не застосовує зміни мовчки, а пише
This reload changes MCP tools … Run /reload-plugins --force to apply.Один запит буде без кешу. - Перевірка:
claude plugin list(версія, scope,Status: ✔ enabled),/plugin→ Installed,claude plugin details acme-django-vue(інвентар компонентів і витрата токенів). - Для колег, які відкрили проєкт з уже закоміченим
.claude/settings.json(відносний шлях у маркетплейсі): trust dialog → фонове клонування каталогу →Plugins changed. Run /reload-plugins to activate.→ плагін завантажується з копії маркетплейсу. ЗначенняuserConfigзадайте через/plugin configure acme-django-vue@acme-tools, інакше GitLab-сервер не стартує. Установка з shell (claude plugin install) діалогuserConfigтеж не показує — значення передають--config gitlab_url=… --config gitlab_token=…або пізніше/plugin configure. - Оновлення: підніміть
versionуplugin.json(1.0.1), запушіть, поставте тег. Колеги отримують зміни післяclaude plugin marketplace update acme-tools+claude plugin update acme-django-vue@acme-toolsабо автоматично, якщо в маркетплейсу ввімкнено автооновлення; у відкритій сесії —/reload-plugins.
Шукайте точний текст повідомлення: Claude Code показує помилки завантаження у вкладці Errors панелі /plugin (кожна помилка з рядком-підказкою), а claude plugin list у shell додає їх до рядка плагіна. Повні довідники: Troubleshoot plugins.
Швидка діагностика
# 1. Що встановлено, у якому scope, чи є помилки (errors / notes / errorDetails) claude plugin list claude plugin list --json # 2. Що саме додає плагін (компоненти, витрата токенів); для ще не встановленого — з теки claude plugin details acme-django-vue claude --plugin-dir ./plugins/acme-django-vue plugin details acme-django-vue # 3. Валідація маніфестів і компонентів (код 1 = помилка; --strict: попередження теж помилки) claude plugin validate ./plugins/acme-django-vue --strict # 4. Лог запуску: хуки, MCP, LSP (--debug у термінал не друкує) claude --debug # файл ~/.claude/debug/<session-id>.txt claude --debug-file /tmp/claude-debug.log # 5. Доступ до приватного репозиторію каталогу — так само, як це робить Claude Code git ls-remote https://gitlab.example.com/platform/acme-claude-plugins.git ssh -T git@gitlab.example.com
У сесії: /plugin → Installed та Errors; /reload-plugins (друкує Reloaded: N plugins · N skills · N agents · N hooks · N plugin MCP servers · N plugin LSP servers і N errors during load. Run /plugin for details.); /mcp — статус MCP-серверів; /status — чи завантажилися managed-налаштування (Enterprise managed settings у Setting sources).
Маркетплейс: додавання й доступ
| Симптом / повідомлення | Причина | Виправлення |
|---|---|---|
Invalid marketplace source format | Голе ім’я чи хост замість допустимої форми | Використайте owner/repo (лише GitHub), https://…, user@host:path або ./path |
'gitlab.example.com/group/project' is not a valid GitHub owner/repo shorthand | owner/repo завжди GitHub | Повний clone-URL: https://gitlab.example.com/group/project.git |
Додавання GitLab-URL падає при спробі розібрати відповідь як marketplace.json (замість клонування) | URL self-hosted GitLab без .git трактується як hosted marketplace.json | Додайте .git до URL |
Marketplace file not found at …/.claude-plugin/marketplace.json | Файл не там, де очікується | Покладіть у .claude-plugin/marketplace.json кореня або оголосіть path у extraKnownMarketplaces |
SSH authentication failed / HTTPS authentication failed, Cannot prompt because user interactivity has been disabled | Claude Code запускає git без запитів; облікових даних немає або репозиторій названо неправильно | Перевірте git ls-remote <url>. SSH: ключ в ssh-agent без passphrase-запиту. HTTPS: PAT у credential helper. Змінна оточення з токеном сама не діє |
SSH host key is not in your known_hosts file / has changed | Клонування йде зі StrictHostKeyChecking=yes | ssh -T git@gitlab.example.com один раз; при зміні ключа — ssh-keygen -R <host> |
Git clone timed out after 120s | Великий репозиторій чи повільна мережа | CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS=300000 або marketplace add … --sparse <paths> |
| Оновлення маркетплейсу постійно падають офлайн | Фонова перевірка не бачить хоста й пробує перекопіювати | CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1 або seed-тека |
Marketplace "x" not found | Маркетплейс не додано (або ім’я з помилкою); /plugin install <source> з шляхом/URL не встановлює | Додайте джерело (/plugin marketplace add), звірте ім’я в /plugin marketplace list; або --marketplace <source> |
Marketplace "x" is already added from a different source | Ім’я збігається з уже доданим маркетплейсом з іншого джерела | Ставте з наявного (plugin@x) або спершу /plugin marketplace remove x |
Cannot add marketplace "x": its source doesn't match its extraKnownMarketplaces entry … | Джерело відрізняється від оголошеного в user/managed settings (інший ref, github-URL замість github-джерела) | Додайте саме в оголошеному вигляді (напр. owner/repo#ref) або змініть оголошення |
Marketplace "x" is added but ignored | Мережевий диск, .. у шляху, нечитний URL або розбіжність з extraKnownMarketplaces | claude plugin marketplace remove x і додати знову; мережеву теку оголосіть у user/managed settings |
Marketplace "x" is registered from an untrusted source | Офіційне/спільнотне ім’я не з github.com/anthropics/ | Видалити й додати з офіційного джерела; свій маркетплейс — перейменувати |
Plugin source path refused, its marketplace entry path does not stay inside the marketplace directory | Відносний шлях у маркетплейсі, доданому як URL до marketplace.json | Об’єктні джерела (github/url/archive) або каталог у git-репозиторії |
Встановлення
| Симптом / повідомлення | Причина | Виправлення |
|---|---|---|
Plugin "x" not found in marketplace "m" (з підказкою про оновлення) | Локальна копія каталогу застаріла (чи офлайн) | /plugin marketplace update m, потім повторити |
Plugin "x" not found in marketplace (без підказки) | Помилка в імені; ім’я запису ≠ name в plugin.json; плагін перейменовано | Скопіюйте ім’я з вкладки Discover; власнику — тримайте name запису й маніфесту однаковими; додайте renames |
Plugin "x" not found in any marketplace | Ім’я без @marketplace, а каталог не оновлено | Назвіть маркетплейс: x@m |
Plugin 'x@m' is already installed globally | Уже встановлено в user scope чи managed | Керуйте через /plugin → Installed |
"a" was not installed: it would share its folder with "b" | Id збігаються після заміни . і @ на - (або регістру на macOS/Windows) | Видалити інший плагін; якщо обидва в одному встановленні — власник маркетплейсу перейменовує один |
This plugin uses a source type your Claude Code version does not support | Старий Claude Code | claude update |
Plugin archive integrity check failed | sha256 у записі не збігається зі скачаним файлом | Власник: перерахувати shasum -a 256 file.zip; користувач: оновити каталог |
Plugin x has a corrupt manifest file / invalid manifest file | Невалідний JSON або схема plugin.json | Автору: claude plugin validate <dir> |
Plugin directory not found at path: … | Відносний source вказує на неіснуючу теку | Виправити шлях у записі чи відновити теку |
Could not move the new copy of this plugin version into … | Папку кешу тримає інша програма (антивірус, інша сесія) | Закрити інші сесії, що використовують плагін, і повторити |
Failed to install: x (…) у меню | Причина скорочена | Відкрийте деталі плагіна (Enter) і встановіть звідти — буде повна помилка |
Plugin "x" is blocked by your organization's policy …, Marketplace source … is blocked by enterprise policy | Політика managed settings | Див. політики; просіть адміністратора дозволити джерело |
Плагін встановлено, але не працює
| Симптом / повідомлення | Причина | Виправлення |
|---|---|---|
| Плагін не завантажується / немає його скілів | Не ввімкнено, зміни не застосовано, помилка завантаження | /plugin → Installed і Errors; claude plugin list; після встановлення в цій сесії — /reload-plugins |
Plugin "x" is enabled in project settings but isn't installed here | Проєкт вмикає плагін із зовнішнім джерелом, але не встановлює його | claude plugin install x@m --scope project, потім /reload-plugins. Ці плагіни не ставляться з одних лише repo-settings |
Plugin "x" not cached at <path> | Є запис про встановлення, але папка кешу зникла (чистка кешу, перейменований плагін) | claude plugin install x@m (перекачає), потім /reload-plugins |
| Скіли не з’являються, хоча помилок немає | Тека skills/ (або commands/) лежить усередині .claude-plugin/; запис skills у маніфесті веде на файл | Компоненти — у корені плагіна; skills має вказувати на теку з SKILL.md (Path is a file; skills entries must be directories containing SKILL.md) |
--plugin-dir мовчки нічого не завантажує | Прапорець вказує на корінь маркетплейсу, а не плагіна | claude --plugin-dir ./marketplace/plugins/my-plugin |
| Скіл запускається вручну, але Claude його не викликає | disable-model-invocation: true або слабкий/обрізаний description | Прибрати поле; переписати опис; перевірити evals |
commands path not found: … (skills, agents, hooks) | Шлях з маніфесту/запису не існує відносно кореня плагіна | Виправити шлях (відносний, з ./) і /reload-plugins |
… path escapes plugin directory | Шлях (чи симлінк) виходить за межі плагіна; на macOS/Linux — шлях зі зворотним слешем | Тримайте файли в плагіні, шляхи з / |
Працює з --plugin-dir, не працює після встановлення | Шляхи до файлів поза текою плагіна (../shared) чи жорстко прописані; встановлений плагін копіюється в кеш | Усе потрібне — всередині плагіна; шляхи через ${CLAUDE_PLUGIN_ROOT} |
Plugin x has conflicting manifests | strict: false + компонентні поля в записі при наявному plugin.json | Прибрати поля із запису або поставити strict: true |
Dependency "d" is not installed / is disabled / Requires "d" ^2.0, installed 3.0.0 / no git tag satisfying | Залежність відсутня, вимкнена, поза діапазоном або без тегів d--vX.Y.Z | claude plugin install d@m, увімкнути, оновити; власнику залежності — створити теги (claude plugin tag); для іншого маркетплейсу — allowCrossMarketplaceDependenciesOn |
Плагін, вимкнений у user settings, усе одно працює (Disabled in ~/.claude/settings.json but still loads) | Вищий пріоритет (проєкт, --settings, managed) вмикає його | false у .claude/settings.local.json; для managed — лише адмін |
The packages it lists are not installed / were not installed, because … | Не завершилась авто-інсталяція npm-залежностей кешованої копії або lock-файл Yarn/pnpm/bun | claude plugin update x@m; автору — npm lock-файл або встановлення залежностей у хуку в ${CLAUDE_PLUGIN_DATA} |
installed_plugins.json … cannot read / was rebuilt | Запис іншої версії Claude Code чи пошкоджений файл | claude update; або видалити запис; .kept-файл містить старий вміст |
Хуки
| Симптом | Причина | Виправлення |
|---|---|---|
Failed to load hooks from <path>: … | hooks/hooks.json — невалідний JSON або схема (немає зовнішнього ключа "hooks") | Виправити; claude plugin validate <dir> |
hooks path not found: … | Поле hooks маніфесту вказує на відсутній файл | Виправити шлях |
| Хук завантажився, але не спрацьовує | Назва події чутлива до регістру (PostToolUse); matcher не збігається з іменем інструмента; подія не відбулась | Звірити назву й matcher, спровокувати подію (попросити змінити файл), дивитись debug-лог — він показує, які хуки збіглись і з яким кодом вийшли |
… hook error: Failed with non-blocking status code: …node: command not found | У PATH сесії немає потрібної програми | Встановіть її або запускайте claude з терміналу, де вона в PATH |
| У stderr шлях плагіна обрізано на пробілі | ${CLAUDE_PLUGIN_ROOT} без лапок у shell-формі | Взяти в подвійні лапки або перейти на exec-форму з args; validate попереджає про це |
| Хук блокує дію | Код виходу 2 — це блокування; повідомлення закінчується на This hook comes from the <plugin> plugin. (v2.1.281+) | Виправити скрипт або вимкнути плагін |
| Хук виконується двічі | Той самий хук залишився і в settings.json, і в плагіні (префікса немає) | Видалити дубль із settings |
Shell-хук із ${user_config.*} падає | У shell-формі підстановка заборонена | Читати $CLAUDE_PLUGIN_OPTION_<KEY> або exec-форма з args |
На Windows скрипт отримує C:/… замість C:\… | Shell-хуки йдуть через Git Bash, підставляється прямий слеш | Exec-форма або "shell": "powershell" |
MCP-сервери
| Симптом / повідомлення | Причина | Виправлення |
|---|---|---|
Invalid MCP server config for "s": Missing environment variables: … | У .mcp.json є ${VAR} без значення й без :-default | Задайте змінну в оболонці, з якої стартує claude (нова сесія), або додайте ${VAR:-default} |
… URL is unset or invalid | Не задано опцію ${user_config.*}, що входить в URL | /plugin configure x@m |
Bundled MCP server "s" was not started: it needs configuration | Пакований MCPB-сервер потребує налаштувань | Installed → плагін → Configure |
Сервер у списку, але в /mcp не підключається | Помилка запуску/автентифікації | /mcp; лог claude --debug; невалідні записи .mcp.json потрапляють тільки в debug-лог — claude plugin validate (v2.1.281+) покаже їх помилкою |
401 від віддаленого сервера, заголовок Bearer порожній | Змінна з «обліковим» ім’ям у url/headers віддаленого сервера читається порожньою | Скопіюйте значення у змінну з власним ім’ям або використайте userConfig |
| Matcher хука на сервер не спрацьовує | Для серверів плагіна ім’я інструмента — mcp__plugin_<plugin>_<server>__<tool> | Запишіть повне ім’я в matcher і правила дозволів |
This reload changes MCP tools … Run /reload-plugins --force | Reload додає/прибирає MCP-сервер і знецінює prompt cache | /reload-plugins --force (один запит без кешу) або нова сесія |
Нічого не підключилось у claude -p / SDK після /reload-plugins | У сесіях без інтерактивного терміналу reload не підключає MCP-сервери | Діє з наступної сесії |
LSP: Executable not found in $PATH | Мовний сервер треба встановити окремо | Встановіть бінарник, перевірте which, нова сесія |
Версії, кеш і оновлення
| Симптом | Причина | Виправлення |
|---|---|---|
x is already at the latest version (1.0.0), хоча є нові коміти | У plugin.json (або записі) закріплено version, обчислена версія не змінилася | Власнику: піднімати version за кожним релізом або прибрати поле (тоді версія = commit SHA) |
Версія є і в plugin.json, і в записі | Перемагає plugin.json без попередження | claude plugin validate: Entry declares version "a" but …/plugin.json says "b" — залишіть одну |
| Оновлення не приходять самі | У сторонніх маркетплейсів автооновлення вимкнене | /plugin → Marketplaces → Enable auto-update або вручну marketplace update + plugin update |
Після plugin update нічого не змінилось у сесії | Запущена сесія тримає завантажені версії | /reload-plugins або нова сесія (Restart to apply changes.); монітори — лише новий старт |
| Хуки/MCP показують шлях старої версії після оновлення в сесії | Шлях у копії змінюється з версією | /reload-plugins |
| Старі версії лишаються на диску | Стара версія і видалені плагіни чистяться з кешу через 14 днів | За потреби видалити ~/.claude/plugins/cache/<marketplace>/<plugin>/ вручну |
| Зміни в локальному маркетплейсі видно без зміни версії | Плагін з відносним шляхом у локально доданому маркетплейсі вантажиться «на місці» | Так і задумано; для перевірки версій використовуйте git-джерело |
| Перейменований плагін не знайдено | Немає запису в renames | Додати renames; користувач одноразово /plugin install new@m |
Конфлікти імен
Якщо кілька ввімкнених плагінів мають однакове name у маніфесті, завантажується один — за пріоритетом (від вищого):
- Плагін, чий id є в managed
enabledPlugins(trueчиfalse);--plugin-dir-копія ігнорується:--plugin-dir copy of "x" ignored: plugin is locked by managed settings. - Ввімкнений
--plugin-dir/--plugin-url/CLAUDE_CODE_PLUGIN_DIRS— мовчки заміщує встановлений маркетплейсний плагін (лише debug-лог:Plugin "x" from --plugin-dir overrides installed version); skills-dir плагін отримує рядокNot loadedу Errors. - Встановлений плагін із маркетплейсу.
- Плагін зі skills-директорії; між двома — копія в
~/.claude/skills/перемагає проєктну. - Плагін, синхронізований з claude.ai (
@synced) — програє будь-якому іншому з тим самим ім’ям.
- Щоб
--plugin-dirнічого не затінював, запишіть у settings"x@inline": false. - Два маркетплейси з однаковим
nameне можна зареєструвати одночасно; якщо два маркетплейси пропонують однакове ім’я плагіна, пишітьplugin@marketplace. - Ім’я запису в
marketplace.json— ключ встановлення (enabledPlugins, папка кешу), аnameманіфесту — простір імен і те, що порівнюється при конфліктах. Тримайте їх однаковими. - Імена скілів —
/plugin:skill, агентів —plugin:agent; хуки префікса не мають.
Помилки валідації
Повідомлення claude plugin validate | Що робити |
|---|---|
No manifest found in directory. Expected .claude-plugin/marketplace.json or .claude-plugin/plugin.json | Запускайте для кореня плагіна/маркетплейсу |
Invalid JSON syntax: … | Виправити JSON (до виправлення hooks/hooks.json сесія завантажить плагін без хуків з цього файлу) |
Path not found: …, Path contains ".." … | Виправити шлях; шляхи — всередині кореня плагіна |
No frontmatter block found / YAML frontmatter failed to parse | Додати або виправити frontmatter між --- у скілі/агенті/команді |
Plugin name "x" is reserved: it passes as one of Anthropic's own | Імена з префіксами claude-, anthropic-, anthropics-, cc-plugin- тощо недопустимі |
Unknown field 'x' | Прибрати або виправити (на рантаймі ігнорується; з --strict — помилка) |
Duplicate plugin name "x" found in marketplace | Унікальні name записів |
plugins.i.source: Invalid string: must start with "./" (до v2.1.285 — Invalid input) | Відносні шляхи — з ./ |
Claude Code cannot install plugin "x". Each part of a plugin id … | Допустимі лише a-z, A-Z, цифри, ., _, -; починати з літери/цифри |
CLAUDE.md at the plugin root is not loaded as project context | Перенесіть інструкції в скіл |
renames.<old>: chain does not resolve | Ланцюжок має закінчуватися іменем із plugins або null, без циклів |
Помилки отримання source (недоступний репозиторій, хибний sha256) виявляються лише при встановленні; hooks у записі маркетплейсу як шлях/масив проходять валідацію, але не працюють. Перевіряйте також реальним claude --plugin-dir і тестовим встановленням.
Команди запускаються або з shell як claude plugin … (псевдонім claude plugins), або у сесії як /plugin … (псевдоніми /plugins, /marketplace; лише в інтерактивному терміналі — у claude -p відповідь /plugin isn't available in this environment). У shell ці команди вводять без слеша: /plugin там не існує (zsh: no such file or directory: /plugin). Спільне: код виходу 0/1 (validate додає 2); <plugin> — name або name@marketplace; --scope приймає user | project | local (update ще й managed). claude plugin <sub> --help показує повний перелік опцій вашої версії.
Команди claude plugin
| Команда (псевдоніми) | Ключові прапорці | Примітки |
|---|---|---|
init <name> (new) | --description, --author, --author-email, --with <skills agents hooks mcp lsp output-style channel>, -f/--force | Створює плагін у ~/.claude/skills/<name>/; наступної сесії вантажиться як <name>@skills-dir без install |
install <plugin> (i) | -s/--scope (типово user), --config key=value (повторюваний; v2.1.285+: <server>.<key>), -y/--yes (v2.1.229+), --accept-command <sha256> (v2.1.271+), --json (v2.1.268+), --marketplace <source> (v2.1.292+) | Не питає userConfig. Для плагінів із command/headersHelper показує команду й питає Run this command now? [y/N]. Без TTY і без -y відмовляє (код 1). Усередині Bash-інструмента Claude -y ігнорується |
uninstall <plugin> (remove, rm) | -s/--scope, --keep-data, --prune, -y, --json | З останнього scope видаляє опції, секрети й теку даних (крім --keep-data) |
enable <plugin> | -s/--scope (авто: local → project → user), --json | Уже ввімкнений → код 1 (already_in_goal_state у JSON). Вмикає й залежності |
disable [plugin] | -a/--all, -s/--scope, --json | Відмовляє, якщо від плагіна залежить інший ввімкнений або його вимагає організація |
update <plugin> | -s/--scope (авто: local → project → user → managed; до v2.1.281 — user), -y, --accept-command, --json | Можна голе ім’я (v2.1.246+). Нова версія діє з наступної сесії чи після /reload-plugins |
list | --json, --available (разом з --json), --data-size [plugin] (v2.1.285+) | Групи: Installed, Session-only (--plugin-dir), Skills-directory, Synced from claude.ai. Сесійні плагіни видно лише з claude --plugin-dir ./p plugin list |
details <name> | — | Інвентар компонентів + проєктована витрата токенів (Always-on / per-component) |
configure <plugin@marketplace> | --values-stdin (JSON-об’єкт рядків зі stdin), --json | v2.1.285+. Лише повний id. Без прапорців показує, які опції задані (значень не друкує) |
prune (autoremove) | -s/--scope, --dry-run, -y | Прибирає авто-встановлені залежності, що більше нікому не потрібні |
validate <path> | --strict, --json (v2.1.259+) | Код 0 — ок, 1 — помилка (або попередження зі --strict), 2 — збій самого валідатора |
tag [path] | --push, --dry-run, -f/--force, -m/--message, --remote | Створює анотований тег <name>--v<version>; перевіряє збіг версій, чисте дерево, відсутність тегу |
eval [target], eval init [name] | --runs, -j, --threshold, --max-cost-usd, --json … | Evals плагіна, v2.1.269+; коди 0/1/2/130/143. Деталі — у розділі про розробку |
test [dir] | — | Тести «модів» (плагінів з JS-обробниками подій) |
Команди claude plugin marketplace
| Команда | Прапорці |
|---|---|
add <source> | --scope user|project|local, --sparse <paths…>, --claudeai, --json (v2.1.287+) |
list | --json |
remove <name> (rm) | --scope, --json |
update [name] | --json (потребує імені) |
Форми <source> та їх розбір — у розділі «Власний маркетплейс».
Команди /plugin у сесії
| Команда | Що робить |
|---|---|
/plugin (або невідоме слово) | Відкриває панель на вкладці Discover |
/plugin help (--help, -h) | Список підкоманд |
/plugin list [--enabled|--disabled] (ls) | Інлайн-список плагінів; — run /reload-plugins to apply позначає неприйняті зміни |
/plugin install (i) | Відкриває Discover |
/plugin install <plugin>[@marketplace] | Деталі плагіна для вибору scope (сама по собі нічого не ставить без підтвердження) |
/plugin install <plugin> --marketplace <source> | Додає маркетплейс (з підтвердженням) і відкриває деталі; v2.1.275+. Джерело без пробілів |
/plugin manage | Вкладка Installed |
/plugin stats | Вкладка Stats (там, де є /skill-doctor) |
/plugin enable|disable|uninstall <plugin> | Відкриває Installed на плагіні й виконує дію |
/plugin configure <plugin> (config) | Діалог userConfig |
/plugin validate <path> | Той самий звіт, що й claude plugin validate |
/plugin tag [path] [--push] [--dry-run] [--force] | Тег релізу |
/plugin marketplace add [source] (market add) | З джерелом — додає; без — відкриває поле вводу |
/plugin marketplace list | Імена маркетплейсів інлайн |
/plugin marketplace update [name] | Вкладка Marketplaces, оновлення |
/plugin marketplace remove [name] (market rm) | Вкладка Marketplaces, видалення |
/reload-plugins [--force] | Застосовує зміни без перезапуску. Підсумок: Reloaded: N plugins · N skills · N agents · N hooks · N plugin MCP servers · N plugin LSP servers. Якщо reload знецінює prompt cache — просить --force. Працює й без інтерактивного терміналу (v2.1.260+), але не підключає MCP-сервери |
Команд без форми в сесії: init, update, details, prune, eval, test. Закриття панелі /plugin з відкладеними змінами саме запускає /reload-plugins.
Панель /plugin
| Вкладка | Призначення |
|---|---|
| Discover | Каталог плагінів зі всіх маркетплейсів; друкуйте для пошуку, Enter — деталі (Will install, Last updated, Context cost, Open homepage / View on GitHub, вибір scope) |
| Installed | Tab — перейти; друкуйте для фільтра, Space — увімк./вимк., f — обране, Enter — деталі (Disable/Enable, Update now, Uninstall, Configure options, Configure). Згорнуті вимкнені; «Not used recently»; плагіни зі scope Managed не змінюються |
| Marketplaces | Список маркетплейсів, Update marketplace, Enable/Disable auto-update, видалення; маркетплейси claude.ai |
| Errors | Усі помилки завантаження з підказками |
| Stats | Статистика використання (де доступний /skill-doctor) |
Прапорці сесії та змінні оточення
| Що | Опис |
|---|---|
claude --plugin-dir <path> | Плагін із теки або .zip, лише на цю сесію; прапорець повторюваний. Тека з кількома плагінами вантажить кожну дочірню з .claude-plugin/plugin.json (v2.1.265+). Id — name@inline |
claude --plugin-url <url> | Zip-архів плагіна за URL; кілька — повторенням або через пробіл в одному значенні в лапках |
CLAUDE_CODE_PLUGIN_DIRS | Те саме, що --plugin-dir, через змінну; абсолютні шляхи або ~, розділювач : (Windows ;); v2.1.280+ |
CLAUDE_CODE_PLUGIN_CACHE_DIR | Змінює корінь плагінів (типово ~/.claude/plugins) |
CLAUDE_CODE_PLUGIN_SEED_DIR | Seed-теки лише для читання |
CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1 | GitHub owner/repo клонувати по HTTPS |
CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS | Таймаут клонування (типово 120000) |
CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1 | Не перекопіювати каталог, якщо віддалений недоступний |
CLAUDE_CODE_SYNC_PLUGIN_INSTALL=1 | У -p чекати на встановлення плагінів перед першим запитом (+ _TIMEOUT_MS) |
CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL=1 | Не реєструвати офіційний маркетплейс автоматично |
DISABLE_AUTOUPDATER=1 / FORCE_AUTOUPDATE_PLUGINS=1 | Вимкнути автооновлення (вимикає й оновлення Claude Code); FORCE… лишає оновлення плагінів. Те саме вимикає CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 |
Агент SDK має еквівалент --plugin-dir — опцію plugins. Адміністратор може заборонити все це ключем disableSideloadFlags.
Неіснуючі написання
| Хибно | Правильно |
|---|---|
claude plugin add <source> | claude plugin marketplace add <source> (маркетплейс) або claude plugin install <plugin>@<marketplace> |
claude plugin install x --project | claude plugin install x@m --scope project |
/install x | /plugin install x@m |
/plugin add <source> (відкриває Discover) | /plugin marketplace add <source> |
marketplace.anthropic.com як джерело | anthropics/claude-plugins-official |
Встановлений плагін може виконувати довільний код на вашій машині з вашими правами користувача. Назва маркетплейсу каже, хто публікує каталог, а не що робить кожен плагін у ньому. Власні плагіни команди теж проходять code review, як будь-який код, що запускається на машинах розробників.
Що плагін може зробити
| Компонент | Що відбувається | Під контролем permissions / sandbox? |
|---|---|---|
| Хуки | Shell-команди на подіях життєвого циклу (до/після інструментів тощо) | Ні — повні права користувача, поза sandbox |
| Монітори | Фонові shell-команди, які Claude Code сам запускає (на старті сесії, reload чи першому виклику скіла) | Ні |
| Моди | JavaScript усередині Claude Code з вашими правами | Ні |
| MCP- і LSP-сервери | Claude Code підключає сервери ввімкненого плагіна; stdio-сервер — процес на вашій машині | Самі процеси — ні; виклики їхніх інструментів — так, діють правила дозволів |
Каталог bin/ | Додається в PATH Bash-інструмента (після ваших записів, тож git чи ls підмінити не вдасться) | Команди Bash, що запускають ці файли, — це виклики інструмента, правила діють |
| Скіли, команди, агенти | Потрапляють у контекст Claude як інструкції — впливають на те, що він робить наявними інструментами | Так, на рівні інструментів |
| Оновлення | За ввімкненого автооновлення переглянуті файли можуть змінитися на диску | — |
Встановлення також вмикає плагін, якщо його маніфест чи запис не задають defaultEnabled: false. Імена й описи моделе-викликуваних скілів/агентів увімкнених плагінів витрачають контекст на кожному ході (claude plugin details показує витрату).
Довіра й перевірка перед встановленням
claude plugin marketplace list— з якого джерела додано маркетплейс./plugin→ деталі плагіна: розділ Will install (команди, агенти, скіли, хуки, MCP/LSP).- Прочитати у вихідному коді:
hooks/hooks.json(які команди),.mcp.json(команди/URL серверів), усі файли вbin/. Will install показує, що хук існує, але не що він виконує. claude --plugin-dir <клон> plugin details <name>— інвентар компонентів без запуску сесії; після встановлення —claude plugin details <name>.- Видалення недовіреного:
claude plugin uninstall <plugin> --scope …; дані стираються з останнього scope; файли в кеші лежать ще 14 днів — видаліть~/.claude/plugins/cache/<marketplace>/<plugin>/вручну; за потреби видаліть і маркетплейс.
- Рівні маркетплейсів: офіційний (перелік імен у розділі «Власний маркетплейс»), спільнотний (
claude-community,claude-plugins-community,healthcare) і третьосторонній (усе інше, зокрема ваш). Офіційні/спільнотні імена приймаються лише для джерел підgithub.com/anthropics/, тож сторонній маркетплейс не видасть себе за них; перевірка повторюється при кожному завантаженні. Спільнотний каталог фіксує майже всі плагіни на commit SHA — інший коміт Claude Code не встановить. - Claude Code перед встановленням показує: «Make sure you trust a plugin before installing, updating, or using it …»; організація може додати свій текст через
pluginTrustMessage. - Установка npm-залежностей плагіна ніколи не запускає lifecycle-скрипти; npm-джерело теж встановлюється без install-скриптів.
- Плагіни, закомічені в
.claude/skills/репозиторію (skills-dir, project scope), вантажаться лише після workspace trust; їхні MCP-сервери проходять покроковий approval, MCPB-бандли не вантажаться, монітори — теж.
Обмеження субагентів плагіна
З міркувань безпеки агенти, що постачаються плагіном, ігнорують частину полів frontmatter:
| Підтримуються | Ігноруються |
|---|---|
name, description, model, effort, maxTurns, tools, disallowedTools, skills, memory, background, omitClaudeMd, isolation (лише "worktree"), color, experimental.cacheTtl | permissionMode, hooks, mcpServers, initialPrompt |
- Хуки й MCP-сервери агента додавайте на рівні плагіна:
hooks/hooks.jsonі.mcp.json(вони діють, поки плагін увімкнений). Інший шлях — скопіювати агента в.claude/agents/, де ці поля працюють. - Якщо frontmatter агента не розбирається, агент усе одно завантажується, але з усіма ігнорованими полями, під іменем файлу та описом
Agent from <plugin> plugin. - Ім’я агента не може містити
:(зарезервовано для plugin-scoped id). Для хуків на агентів плагіна обмежуйте matcher якорями:^acme-django-vue:code-reviewer$.
Чого плагіни не вміють
CLAUDE.mdу корені плагіна не завантажується як контекст (validateпопереджає). Інструкції — у скіл.settings.jsonплагіна (як і ключsettingsу маніфесті) діє лише дляagentтаsubagentStatusLine; решта ключів відкидається. Через плагін не можна задати permissions, env чи моделі.- Компоненти всередині
.claude-plugin/не завантажуються (там лишеplugin.json); плагін ≠~/.claude/; тека проєкту.claude/plugins/не сканується — діліться черезenabledPluginsчи.claude/skills/. - Файли за межами теки плагіна не копіюються в кеш; шляхи за межі кореня (та симлінки назовні) відхиляються.
- Змінні
${CLAUDE_PLUGIN_ROOT}/${CLAUDE_PLUGIN_DATA}недоступні в командах, які Claude запускає через Bash-інструмент; у тілі скіла/агента пишіть${…}— підставиться інлайн. Надійні дані зберігайте в${CLAUDE_PLUGIN_DATA}:${CLAUDE_PLUGIN_ROOT}змінюється з кожною версією. - Ключі
commands,agents,outputStyles,workflows, теми та монітори в маніфесті замінюють типові теки;skills— додає;hooksтаmcpServers— зливаються. - Однаковий хук у
settings.jsonі в плагіні виконується двічі (префікса в хуків немає) — після міграції видаляйте оригінали. skillOverridesне діє на скіли плагінів — ними керують через/plugin.- Ключ
version, закріплений в маніфесті, блокує оновлення, доки його не змінити. ОпціяoptionsуuserConfigробить плагін непрацездатним у Claude Code до v2.1.271. - Файли в Git LFS не завантажуються (лише pointer-файли).
- Монітори працюють лише в інтерактивних сесіях; при вимкненні плагіна монітор триває до кінця сесії, а після оновлення потребує перезапуску сесії.
- Встановлення з shell (
claude plugin install) ніколи не питає значенняuserConfig. - Видалення маркетплейсу деінсталює всі його плагіни й стирає їхні дані.
- Облікових даних для git у
marketplace.jsonнемає; окремого поля автооновлення, аудиторії чи deprecation-стану в каталозі — теж.
Де плагіни доступні (surface)
| Середовище | Як працюють плагіни |
|---|---|
| Термінал (інтерактивний) | Повна підтримка: /plugin, claude plugin …, managed-ключі застосовуються на старті |
| Desktop app (локальна/SSH-сесія) | Браузер плагінів: + → Plugins → Add plugin; керування — + → Plugins → Manage plugins. Ті самі settings-файли, що й у терміналі. У хмарних сесіях браузера плагінів немає |
| VS Code | /plugins відкриває Manage plugins; зміни застосовуються без перезапуску; /plugin з аргументами повертає /plugin isn't available in this environment |
| JetBrains | Claude Code працює в терміналі IDE — користуйтеся кроками для терміналу |
claude -p, CI | /plugin недоступний; встановлені плагіни вантажаться; керуйте через claude plugin …; встановлення з settings — у фоні (CLAUDE_CODE_SYNC_PLUGIN_INSTALL=1) |
| Agent SDK | Опція plugins (аналог --plugin-dir) |
| Хмарні сесії (claude.ai/code) | Не вантажать плагіни, встановлені на вашій машині, ні ті, що ввімкнено в .claude/settings.json репозиторію, і не додають extraKnownMarketplaces з репозиторію. Плагіни організації доходять лише через server-managed settings |
| claude.ai, Cowork | Той самий формат, але вантажиться інший набір компонентів; локальний stdio MCP-сервер на claude.ai не працює, тож для охоплення додавайте віддалений сервер за https://. Плагіни з вашого акаунта claude.ai доходять у термінал як name@synced (v2.1.273+) |
Платформа, середовище й числові обмеження
| Тема | Факт |
|---|---|
| Git | Потрібен у PATH (на Windows — Git for Windows; інакше Command 'git' not found or is in an unsafe location). Клонування й оновлення — без інтерактивних запитів |
| Windows | Шлях у ${CLAUDE_PLUGIN_ROOT} з прямими слешами; shell-хуки — через Git Bash; exec-форма потребує справжнього виконуваного файлу (.cmd/.bat шими npm — ні, запускайте node …js); command-джерело в режимі link не підтримується; симлінки — через mklink /D чи Developer Mode |
| macOS / Linux | Шляхи зі зворотним слешем у записах і маніфесті відхиляються — пишіть лише / |
| Клонування | 120 с на clone/refresh (CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS) |
marketplace.json за URL | до 5 MiB, відповідь до 10 с, редирект на інший origin лише по https |
Zip для archive | до 256 MiB, 120 с, до 5 редиректів; розпакування: 100 000 елементів, 512 MiB на файл, 1 GiB загалом, ступінь стиснення до 50× |
command-джерело | timeout 1–600 с (60); copy — до 256 MiB і 20 000 елементів; команда та headersHelper — до 500 символів ASCII; headersHelper — 10 с, кеш виводу 60 с |
| Автооновлення | Стартує після першого повідомлення з випадковою затримкою до 10 хвилин |
| Кеш старих версій | Прибирається через 14 днів |
| userConfig | Мітки options у userConfig — 1–64 символи |
| MCP-інструменти плагіна | Ім’я mcp__plugin_<plugin>_<server>__<tool>; символи поза A-Za-z0-9_- замінюються на _ |
Чекліст аудиту стороннього плагіна
claude plugin marketplace list)hooks/hooks.json: які команди й на які події, чи немає мережевих викликів і запису поза проєктом.mcp.json: куди підключаються сервери, які команди запускають, які секрети передаютьсяbin/ та скриптах, на які посилаються хукиallowed-tools чи ідуть всупереч політикамref/sha або version), автооновлення — свідомий вибір; зміни проходять reviewstrictKnownMarketplaces), disableSideloadFlags і, за потреби, strictPluginOnlyCustomizationДокладніше про політики — в розділі «Для команди»; офіційний довідник: Plugin security and trust.
claude plugin validate ./plugin --strict без помилок і попереджень; name у kebab-case, без зарезервованих префіксів (claude-, anthropic-, anthropics-, cc-plugin-).claude-plugin/ лише plugin.json; skills/, agents/, hooks/, .mcp.json — у корені плагіна; немає CLAUDE.md із розрахунком на завантаження../; шляхи в хуках і MCP — через ${CLAUDE_PLUGIN_ROOT} (у shell-хуках у подвійних лапках або exec-форма з args); стан — у ${CLAUDE_PLUGIN_DATA}version задана лише в одному місці (краще plugin.json) і піднімається з кожним релізом — або не задана взагалі, тоді користувачі йдуть за комітамиclaude plugin tag --push створює <name>--v<version>, якщо від плагіна залежать з діапазонами версійuserConfig із sensitive: true, а не зашиті у файли; у репозиторії немає ключів"hooks" у hooks.json; назви подій з правильним регістром; matcher’и вузькі; скрипти виконувані (chmod +x) і завжди завершуються передбачуваним кодомpermissionMode, hooks, mcpServers, initialPrompt (плагін їх ігнорує)description із «Use when …»; ручні дії з побічними ефектами — disable-model-invocation: true; обов’язкові правила — у хукахclaude --plugin-dir ./plugin, потім /reload-plugins після правок; claude plugin details — склад і витрата токенівmarketplace add ./path), встановлено плагін, перевірено скіли, хуки, /mcp — бо інсталяція копіює плагін у кеш і ламає шляхи, що працювали з --plugin-dirmarketplace.json має name, owner, description; імена записів унікальні; відносні шляхи починаються з ./; не використовує зарезервованих іменgit ls-remote до репозиторію без запиту пароля (SSH-агент чи PAT у credential helper); URL з .gitrenames; видалені плагіни — forceRemoveDeletedPlugins; зовнішні залежності з іншого маркетплейсу — у allowCrossMarketplaceDependenciesOnextraKnownMarketplaces + enabledPlugins (для зовнішніх джерел — інструкція --scope project); для компанії — managed-ключі й allowlistuserConfigvalidate, зі «живими» токенами, з version: "1.0.0" без наміру його піднімати, або з кодом, який читає файли поза плагіном