ПосібникІнструкція 04 · Claude Code v2.1.295 · оновлено 09.10.2026 · ~110 хв читання

Плагіни у Claude Code

Як встановлювати, створювати, тестувати й розповсюджувати плагіни: структура, plugin.json, усі типи компонентів, власний маркетплейс у GitLab, політики для команди, обмеження та безпека.

01

Що таке плагін

Один пакет зі скілами, агентами, hooks, MCP та іншим

#

Плагін — це каталог із компонентами (скіли, агенти, 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
Hookshooks/hooks.jsonКоманди, HTTP-запити, виклики MCP-інструментів, промпти чи субагенти на подіях життєвого циклубез префікса — спрацьовують самі на своїх подіях
MCP-сервери.mcp.jsonІнструменти зовнішніх систем (GitLab, БД тощо)сервер plugin:<plugin>:<server>, інструмент mcp__plugin_<plugin>_<server>__<tool>
LSP-сервери.lsp.jsonДіагностика після правок і навігація по символахінструмент LSP
Output stylesoutput-styles/*.mdСтилі відповідей Claude/output-style → plugin:name
Workflowsworkflows/*.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.jsonJS/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.

Офіційні джерела: огляд плагінів, компоненти.

02

Навіщо потрібні плагіни і коли їх обирати

Плагін проти файлів у .claude/ проєкту

#

Усе, що можна покласти в плагін, працює й без нього. Тож правило просте: поки налаштування обслуговує один проєкт або лише вас — лишайте його у .claude/ чи ~/.claude/. Робіть плагін, коли треба роздати налаштування команді, поставити їх у кілька репозиторіїв або випускати версіями.

Особисте, проєктне чи плагін

Особисте ~/.claude/Проєкт .claude/Плагін
Хто отримуєЛише ви, в усіх проєктах на цій машиніУсі, хто працює з репозиторіємТі, хто встановив: scope user, project або local; через managed settings — уся організація
Як потрапляє до людиниВручну на кожну машинуgit clone / git pullclaude 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 (формат той самий). Покроково — у розділі «Розробка і тестування».

Коли плагін — правильний вибір

✓
Одну й ту саму конфігурацію (скіли, hooks, MCP) використовують кілька репозиторіїв — наприклад, усі Django-сервіси компанії
✓
Команді треба одна команда замість інструкції з п’яти кроків: claude plugin install acme-django@acme-plugins
✓
Потрібні версії та оновлення: випустили 1.4.0, команда отримала його автоматично або після claude plugin update
✓
Конфігурація вимагає параметрів і секретів (URL GitLab, токен) — userConfig ховає токен у сховищі облікових даних
✓
Потрібен набір інструментів для ролі: плагін-«бандл» із 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
Робота з GitLabMCP-сервер у .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) — розділ «Для команди»
Ціна плагіна
Кожен увімкнений плагін додає назви й описи своїх скілів та агентів у контекст кожної сесії. Перед встановленням дивіться розділ Context cost у панелі /plugin (є для плагінів офіційного маркетплейсу), а для вже встановленого — claude plugin details <name>. Не ставте плагіни «про запас»: вимкніть або видаліть невикористані (вкладка Installed підсвічує їх як Not used recently).
03

Як плагін потрапляє в сесію

Від маркетплейсу до завантажених компонентів — покроково

#

Плагін проходить шлях «маркетплейс → встановлення → кеш на диску → ввімкнення → завантаження компонентів у сесію → оновлення». Кожен крок змінює свій шар: налаштування, диск або запущену сесію — і розуміння цього шару пояснює більшість «чому плагін не працює».

1 · Маркетплейс /plugin marketplace add your-group/plugins ├─ каталог = репозиторій із .claude-plugin/marketplace.json ├─ клон/завантаження → ~/.claude/plugins/marketplaces/<name>/ └─ записи: known_marketplaces.json (диск) + extraKnownMarketplaces (user settings) 2 · Встановлення /plugin install name@marketplace (вибір scope) ├─ копія плагіна → cache/<marketplace>/<plugin>/<version>/ (це і є ${CLAUDE_PLUGIN_ROOT}) ├─ запис про встановлення → installed_plugins.json (scope, installPath, version) ├─ оголошені dependencies ставляться в тому ж scope; Node-залежності — якщо є lockfile └─ запис у enabledPlugins файлу налаштувань обраного scope 3 · Ввімкнення └─ "name@marketplace": true у settings; plugin.json може вимкнути за замовчуванням (defaultEnabled: false) 4 · Старт сесії без мережі — з installed_plugins.json та кешу ├─ у контекст потрапляють назви й описи скілів, агентів, команд ├─ реєструються hooks; запускаються MCP- та LSP-сервери; bin/ іде на PATH ├─ стартують монітори; застосовуються settings.json плагіна та значення userConfig └─ помилки завантаження → вкладка Errors у /plugin 5 · Робота └─ hooks спрацьовують на подіях; скіли запускаються через /plugin:skill або самим Claude 6 · Оновлення ├─ автооновлення: після першого повідомлення, із випадковою затримкою до 10 хв; кеш оновлюється, сесія лишається на старій версії ├─ сповіщення Plugin updated: name · Run /reload-plugins to apply └─ стара версія помічається .orphaned_at і видаляється через 14 днів

Три шари: налаштування, диск, сесія

ШарЩо цеКоли змінюється
Оголошено (settings)enabledPlugins — які плагіни мають бути ввімкнені; extraKnownMarketplaces — які маркетплейси існуютьКоманди /plugin, claude plugin ..., ручне редагування settings
Завантажено на диск~/.claude/plugins/: known_marketplaces.json, installed_plugins.json, cache/Установка, оновлення, синхронізація; маркетплейс, оголошений у settings, але відсутній на диску, клонується у фоні
Завантажено в сесіюНабір плагінів, прочитаний на старті або при останньому /reload-pluginsЛише /reload-plugins або нова сесія
Звідси: «я змінив — а нічого не змінилося»
Зміни в settings чи на диску не потрапляють у запущену сесію самі. Тому 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.

04

Встановлення, оновлення та керування

/plugin, CLI, скоупи, оновлення

#

Плагінами керують двома способами: інтерактивною панеллю /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; --jsonv2.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
Скрипти й CI
У неінтерактивному режимі /plugin недоступний, але вже встановлені плагіни завантажуються. У -p плагіни, які ще треба встановити, ставляться у фоні й можуть не встигнути до першого запиту — додайте CLAUDE_CODE_SYNC_PLUGIN_INSTALL=1, щоб дочекатись. На чистій машині офіційний маркетплейс ще не зареєстрований: перед установкою з нього виконайте claude plugin marketplace add anthropics/claude-plugins-official.

Scope: хто отримує плагін

ScopeКуди пишетьсяКому доступний
userenabledPlugins у ~/.claude/settings.jsonВам, в усіх проєктах (за замовчуванням для CLI)
project.claude/settings.json (комітиться)Усім, хто працює з репозиторієм — але не завантажує файли на їхні машини
local.claude/settings.local.jsonВам, лише в цьому репозиторії
managedКеровані налаштування організаціїУсім, на кого поширюється політика; з панелі не змінити. Через update оновлюється, а ставиться лише адміністратором
Project scope ≠ автоматично встановлено
Запис у .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., якщо були помилки).

Prompt cache
Якщо перезавантаження додає чи прибирає MCP-сервер або інструмент LSP, воно скидає prompt cache — наступне повідомлення перечитає всю розмову. Тоді Claude Code не застосовує зміни, а пише це та пропонує /reload-plugins --force (коштуватиме одного запиту без кешу). Те саме стосується автоматичного перезавантаження після закриття панелі. Монітори після оновлення підхоплюються лише після перезапуску сесії; хуки, MCP та LSP — після /reload-plugins.

Офіційний маркетплейс і де шукати плагіни

ОфіційнийСпільнотнийДемо
Назва після @claude-plugins-officialclaude-communityclaude-code-plugins
Репозиторійanthropics/claude-plugins-officialanthropics/claude-plugins-communityanthropics/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.

05

Структура плагіна

Каталоги, файли та простори імен

#

Корінь плагіна — каталог, який ви передаєте в --plugin-dir (або який Claude Code копіює в кеш). Усе, крім маніфесту, лежить у корені, а не всередині .claude-plugin/. Додавайте лише ті теки, які потрібні, — жодна не обов’язкова.

acme-django (повна структура)
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.jsonJSON-маніфестНеобов’язковий. Компоненти, збережені в цій теці, не вантажаться
skills/<name>/SKILL.mdMarkdown + frontmatterТеки скілів додаються також через поле skills (воно додає до skills/, а не замінює)
commands/*.mdMarkdown + frontmatterПлоскі файли; той самий frontmatter, що в скілів. Поле commands замінює цю теку
agents/**/*.mdMarkdown + frontmatterСканується рекурсивно; підтеки входять в ім’я агента
hooks/hooks.jsonJSON з обгорткою "hooks"Необов’язково верхній ключ description; зливається з полем hooks маніфесту
.mcp.jsonJSON як проєктний .mcp.jsonОбгортка mcpServers необов’язкова
.lsp.jsonJSON: ім’я сервера → конфігураціяБез обгортки. claude plugin validate цей файл не читає
output-styles/*.mdMarkdown з name, descriptionПоле outputStyles замінює теку
workflows/*.jsJavaScript з export const metaПоле workflows замінює теку
themes/*.jsonJSON темиКлюч experimental.themes замінює теку
monitors/monitors.jsonJSON-масивКлюч experimental.monitors замінює файл
bin/Виконувані файлиПотрібен chmod +x. Плагін із верхньорівневим bin/ claude.ai та Cowork не встановлюють
settings.jsonJSONДіють тільки 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 плагіна

settings.json
{
  "agent": "security-reviewer"
}
  • agent запускає головний потік сесії як агента плагіна: діють його системний промпт, обмеження інструментів і модель. subagentStatusLine задає рядок статусу субагентів. Будь-які інші ключі відкидаються.
  • Той самий об’єкт можна вказати у полі settings маніфесту; якщо файл settings.json задає хоча б один підтримуваний ключ, він перемагає, а settings ігнорується.
  • Налаштування плагіна — найнижчий шар: ваш власний agent у ~/.claude/settings.json його перекриває. Якщо два плагіни задали один ключ, діє той, що завантажений останнім (у claude --debug буде overrides setting).

Специфікація формату: Standard layout.

06

Маніфест plugin.json

Усі поля маніфесту

#

Маніфест — файл .claude-plugin/plugin.json. Він несе метадані, значення userConfig і оголошення компонентів, що лежать не за замовчуванням або описані прямо в JSON. Обов’язкове лише name. Невідомий ключ верхнього рівня відкидається (плагін вантажиться, а validate попереджає); невідомий ключ усередині userConfig, channels, lspServers чи monitors — помилка, плагін не завантажиться.

Усі поля

ПолеТипЗміст
$schemastringURL JSON Schema для автодоповнення в редакторі. Під час завантаження ігнорується
namestring, обов’язковеІдентифікатор у kebab-case; без пробілів, @, :, роздільників шляху. Простір імен усіх компонентів
displayNamestringНазва в інтерфейсі замість name; для пошуку й просторів імен не використовується. Значення з запису маркетплейсу має пріоритет
versionstringНе перевіряється на semver. Закріплює користувачів на цій версії, доки ви не змінете рядок
descriptionstringКороткий опис — текст у /plugin
authorobjectname обов’язкове; email, url необов’язкові
homepagestringURL документації. Має розбиратись як URL — інакше плагін не завантажиться
repositorystringURL репозиторію. Не перевіряється
licensestringSPDX-ідентифікатор: MIT, Apache-2.0
keywordsstring[]Теги для пошуку
metadataobjectДовільні ваші дані (каталог, entitlements); Claude Code їх не читає. З v2.1.222
icon, documentationUrl, supportUrl, privacyPolicyUrl, termsOfServiceUrlstringЛише для картки плагіна в каталозі Anthropic; Claude Code їх ігнорує. Задавайте тільки в plugin.json, не в записі маркетплейсу
defaultEnabledbooleanЧи ввімкнений плагін, якщо користувач ще не задав значення. За замовчуванням true. Запис користувача в enabledPlugins переживає оновлення, тож зміна в релізі існуючих не зачепить
dependencies(string|object)[]Плагіни, які мають бути ввімкнені: "name", "name@marketplace" або {name, marketplace, version}
settingsobjectЛише agent і subagentStatusLine; файл settings.json перемагає
userConfigobjectПараметри, які Claude Code запитує, коли плагін вмикається
channelsobject[]Канали повідомлень, прив’язані до MCP-серверів плагіна
typespathФайл .d.ts для мода
skillspath | path[]Теки скілів (з <name>/SKILL.md або одна тека з SKILL.md); "." = корінь. Додає до skills/
commandspath | path[] | objectФайли/теки команд або мапа «ім’я → source чи content». Замінює commands/
agentspath | path[]Лише файли .md, теки не приймаються. Замінює agents/
hookspath | object | arrayФайли .json або вбудована конфігурація. Зливається з hooks/hooks.json
mcpServerspath | object | arrayФайл .json, бандл .mcpb/.dxt (шлях або https-URL) чи вбудована мапа. Зливається з .mcp.json; пізніше оголошене ім’я замінює раніше
lspServerspath | object | arrayТе саме для LSP; зливається з .lsp.json
outputStylespath | path[]Файли або теки. Замінює output-styles/
workflowspath | path[]Файли .js або теки. Замінює workflows/
experimentalobjectКонтейнер для themes, monitors, evals — їхня форма ще може змінитись
experimental.themespath | path[]Замінює themes/. Старий ключ верхнього рівня themes ще працює, але validate попереджає
experimental.monitorspath | масивЗамінює monitors/monitors.json. Монітори — лише в інтерактивних сесіях і не на Bedrock/Google Cloud/Foundry
experimental.evalspath | 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/"]
Додає до типовогоskillsskills/ сканується як і раніше, перелічені теки вантажаться разом із нею
Зливаєhooks, mcpServers, lspServersТиповий файл вантажиться першим, оголошене в маніфесті зливається з ним
Попередження «Default folder is ignored»
Якщо в плагіні є тека 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"; вбудований об’єкт у маніфесті — це одразу мапа подій без обгортки.

Реалістичний приклад

.claude-plugin/plugin.json
{
  "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.

07

Компоненти плагіна

Скіли, команди, агенти, hooks, MCP, LSP, output styles, workflows, теми, монітори

#

Кожен компонент має типову теку, необов’язковий ключ маніфесту, що її замінює чи доповнює, і назву, яку бачить користувач. Після додавання компонента виконайте /reload-plugins у відкритій сесії (або почніть нову), а файл перевірте claude plugin validate . з теки плагіна.

Скіли

Кожен скіл — окрема тека в skills/ із файлом SKILL.md. Формат і frontmatter — як у звичайних скілів (сторінка Скіли); у плагіні змінюється лише ім’я: /<plugin>:<тека>.

skills/migration-check/SKILL.md
---
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 тоді замінює скан теки:

plugin.json (фрагмент)
{
  "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 замінює скан теки.

agents/security-reviewer.md
---
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.

hooks/hooks.json
{
  "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-форма. Без args command іде через оболонку — шлях із ${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.

.mcp.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}"
      }
    },
    "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 зі своїм сервером. Формат файла: без обгортки, ім’я сервера → конфігурація.

.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 користувача (якщо таких плагінів кілька — перший завантажений).

output-styles/terse.md
---
name: terse
description: Короткі відповіді без вступів і підсумків
keep-coding-instructions: true
---

Відповідай коротко. Без вступів, без повторення питання, без підсумку наприкінці.

Workflows

Файли .js у workflows/: блок meta і скрипт, що оркеструє кількох субагентів. Запуск — /<plugin>:<meta.name> (тут /acme-django:audit-routes). Ключ workflows замінює теку. Докладніше про формат — документація workflows.

workflows/audit-routes.js
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.

themes/dracula.json
{
  "name": "Dracula",
  "base": "dark",
  "overrides": {
    "claude": "#bd93f9",
    "error": "#ff5555"
  }
}

Монітори

Монітор — shell-команда, яку Claude Code запускає у фоні на початку сесії й тримає до кінця; її вивід приходить Claude як сповіщення, тож він реагує на лог чи зміну статусу без прохання стежити. Записи — в monitors/monitors.json:

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.

08

Налаштування користувача та змінні середовища

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
plugin.json (фрагмент userConfig)
{
  "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
Заборонено в shell-формі
${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}Корінь проєктуЛокальні скрипти й конфіги проєкту
Компонент плагінаДе підставляється ${...}Що ще експортується в процес
Команди hookscommand і args — у будь-якому місціCLAUDE_PLUGIN_ROOT, CLAUDE_PLUGIN_DATA, CLAUDE_PROJECT_DIR, CLAUDE_PLUGIN_OPTION_<KEY>
Команди моніторівcommandнічого
MCP stdio-сервериcommand, args, envCLAUDE_PLUGIN_ROOT, CLAUDE_PLUGIN_DATA
MCP http/sse/wsurl, headers, headersHelper—
LSP-сервериcommand, args, env, workspaceFolderCLAUDE_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/hooks.json
{
  "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-інструмент, що ви викликаєте, ваш плагін зламається в усіх, хто оновився.

plugin.json
{
  "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.

09

Розробка, тестування та evals

init, --plugin-dir, validate, test, eval

#

Маркетплейс для розробки не потрібен: плагін вантажиться просто з папки. Цикл такий: створити → завантажити → змінити → /reload-plugins → перевірити → протестувати → позначити версію.

Створення: claude plugin init

bash
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 <опис>.

Те саме вручну (мінімальний плагін зі скілом):

bash
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

bash
claude plugin validate ./acme-django            # ✔ Validation passed
claude plugin validate ./acme-django --strict   # попередження теж роблять збій
claude plugin validate ./acme-django --json     # звіт одним JSON-об’єктом (v2.1.259+)
КодВердиктЗначення
0Validation passed / passed with warningsМаніфест завантажиться. З --strict — ще й без попереджень
1Validation failedПомилка (або попередження під --strict)
2Unexpected 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.

Налагодження

  1. claude plugin validate <path> — синтаксис і схема.
  2. /reload-plugins у сесії: має з’явитись рядок Reloaded: …; перевірте, що /acme-tools:hello існує.
  3. /plugin → Installed (які компоненти знайдено) і Errors (що й чому не завантажилось, напр. commands path not found).
  4. claude plugin list — секції Session-only/Skills-directory із Status: ✔ loaded або помилкою.
  5. /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>.
  • Повний перелік повідомлень — розділ «Типові проблеми».

Локальний маркетплейс перед публікацією

bash
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 і запис маркетплейсу збігаються за версією, що робоче дерево чисте і що тега ще немає.

bash
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 і різницю Δ. Якщо кейс проходить і без плагіна, значить, не плагін його «витягнув».

Це реальні виклики моделі
Кожен запуск і кожен grader-суддя (llm, baseline) — виклик моделі на вашому акаунті; вони йдуть у ліміти плану або рахунок API. Орієнтовна вартість показується у звіті за прайсом, і її можна обмежити прапорцем --max-cost-usd. Потрібен git 2.31+ (якщо git встановлено).
bash
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   # швидка ітерація, одна гілка
структура evals/
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
evals/migration-check-fires/prompt.md
---
max_turns: 10
allowed_tools: [Read, Glob, Grep, Skill]
---

Я додав у модель Order поле status і згенерував міграцію. Переглянь, чи міграція безпечна для відкату.
evals/migration-check-fires/graders/skill-fired.md
---
type: tool_used
tool: Skill
input_match: '"skill"\s*:\s*"(?:[\w-]+:)?migration-check"'
---
evals/migration-check-fires/graders/criteria.md
---
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ОпціїПроходить, колиВартість
regexpattern, flags, match, targetJS-регулярка знайдена в цілі. match: not_contains — відсутня; "count:N" — рівно N збігів. Регістр — flags: i (без (?i))безкоштовний
tool_usedtool, input_match, min, maxКількість викликів інструмента (з input, що збігається з regex) між min (1) і max. «Ніколи не викликався»: min: 0 + max: 0безкоштовний
tool_orderbefore, afterОбидва інструменти викликано і перший before передує першому afterбезкоштовний
file_existspath (glob), existsСеред створених під час запуску файлів є збіг (або немає — при exists: false)безкоштовний
llmcriteria (тіло файла), focusСуддя голосує PASS щонайменше у 2 із 3 голосів за рубрикоюплатний
baselinebaseline_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|offrecordrecord — MCP-виклики обслуговують моки, реальні сервери плагіна не стартують; off — моки ігноруються, стартують реальні сервери
--trust-plugin, --scaffold, --allow-real-servers, --keep-tempвимкненоДовіра без запиту, scaffold-скрипти, реальні сервери для інструментів без моків, збереження робочих тек
Код виходуЗначення
0Кожен кейс ≥ порогу, усі файли кейсів завантажились
1Кейс нижче порогу, помилка завантаження, кейсів не знайдено, тека не довірена, невалідна опція
2Частковий запуск: досягнуто --max-cost-usd або відхилено облікові дані (результат має partial: true)
130 / 143Перервано / завершено (наприклад, таймаутом CI)

У CI (офіційний рецепт; зверніть увагу — Δ ніколи не впливає на код виходу):

bash
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. Частковий результат не включайте в графіки трендів.

.gitlab-ci.yml (схема, адаптуйте під свій образ)
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
Про GitLab CI
Офіційна документація наводить лише приклад командного рядка (і Actions для GitHub): жодних GitLab-специфічних налаштувань облікових даних чи образу там немає. Наведений YAML — лише схема. Для дешевих перевірок на кожен коміт беріть лише безкоштовні graders і --ablation none, а повний набір з llm-суддями ганяйте за розкладом чи перед релізом.

Перенесення існуючого .claude/ у плагін

  1. mkdir -p my-plugin/.claude-plugin і plugin.json з name, description, version.
  2. cp -r .claude/commands .claude/agents .claude/skills my-plugin/ (лише ті теки, що є).
  3. Перенесіть об’єкт hooks із .claude/settings.json у my-plugin/hooks/hooks.json в обгортці {"hooks": {...}} — формат той самий.
  4. claude --plugin-dir ./my-plugin і перевірте: скіл /deploy став /my-plugin:deploy, агент reviewer — my-plugin:reviewer, hooks спрацьовують.
  5. Видаліть оригінали з .claude/ і hooks зі settings: поки вони є, скіли й агенти існують у двох іменах, а hooks виконуються двічі.

Довідка: Create a plugin, Plugin commands reference, Test plugins with evals, Measure plugin cost and usage.

10

Власний маркетплейс

marketplace.json, джерела плагінів, хостинг у GitLab

#

Маркетплейс — це каталог плагінів: один файл 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.

Мінімальний каталог

.claude-plugin/marketplace.json
{
  "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.

ПолеТипОпис
namestringІдентифікатор: літери, цифри, ., _, -; починається з літери/цифри; без ... Користувачі пишуть його після @ (plugin@acme-tools). Інше ім’я — помилка validate, бо встановити з такого маркетплейсу неможливо. Див. зарезервовані імена
ownerobjectМейнтейнер: name обов’язкове, email і url — ні
pluginsarrayЗаписи плагінів. Кожен перевіряється окремо — один невалідний запис не ламає весь маркетплейс
$schemastringURL JSON Schema для автодоповнення в редакторі; під час завантаження ігнорується
descriptionstringОпис для користувачів; validate попереджає, якщо його немає
versionstringВерсія маніфесту маркетплейсу
metadata.description, metadata.versionstringАльтернативне місце для description і version
metadata.pluginRootstringТека, відносно якої розв’язуються «голі» імена в source ("formatter" замість "./plugins/formatter"). Потрібен Claude Code v2.1.239+
forceRemoveDeletedPluginsbooleanЯкщо true, плагін, який ви прибрали з plugins, автоматично видаляється на машинах користувачів
allowCrossMarketplaceDependenciesOnstring[]Імена маркетплейсів, плагіни яких можуть бути залежностями плагінів цього маркетплейсу. Діє лише список маркетплейсу, з якого встановлюють кореневий плагін
renamesobjectМапа «колишнє ім’я плагіна → нове ім’я» або null для видаленого

Поля запису плагіна

Обов’язкові: name і source. Крім перелічених, запис приймає будь-яке поле plugin.json (author, commands, hooks, mcpServers …), але не «directory listing» поля (icon, documentationUrl, supportUrl, privacyPolicyUrl, termsOfServiceUrl) — їх задають тільки в plugin.json.

ПолеТипОпис
namestringІдентифікатор плагіна (ті самі правила символів, що й у маркетплейсу). Саме його пишуть перед @ при встановленні, навіть якщо в plugin.json інше name
sourcestring | objectЗвідки брати плагін. Див. типи джерел
descriptionstringПоказується в списках і деталях /plugin
versionstringВерсія плагіна. Якщо plugin.json теж має version, перемагає plugin.json (а validate попереджає)
category, tagsstring, string[]Довільна категорія та теги для пошуку
strictbooleanЗа замовчуванням true. Чи є plugin.json остаточним джерелом компонентів. Див. строгий режим
relevanceobjectСигнали, коли Claude Code має підказати цей плагін (потребує managed-ключа pluginSuggestionMarketplaces)
dependenciesarrayПлагіни, які мають бути ввімкнені: "name", "name@marketplace" або об’єкт із version
defaultEnabledbooleanЗа замовчуванням true. Чи вмикається плагін, якщо користувач не задав його в enabledPlugins. Значення запису перекриває plugin.json
displayNamestringНазва в UI. Без неї показується name
metadataobjectДовільні ваші поля; Claude Code їх не читає (v2.1.222+)
headersobjectHTTP-заголовки для завантаження archive-джерела; перекривають однойменні з джерела маркетплейсу (v2.1.238+)
headersHelperstringКоманда, що друкує заголовки 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.

strictplugin.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); "." — сам корінь. Шлях із .. не проходить валідацію
githubrepo, ref, shaРепозиторій GitHub у формі owner/repo
urlurl, ref, shaБудь-який git-репозиторій за URL — це шлях для вашого GitLab
git-subdirurl, path, ref, shaОдна підтека репозиторію (sparse checkout). Для монорепо
npmpackage, version, registryПакет npm-реєстру або tarball; ставиться вашим npm-клієнтом без виконання install-скриптів
archiveurl, sha256Zip по HTTPS. Потрібен v2.1.224+
commandcommand, 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 зворотний слеш у шляху відхиляється.

marketplace.json → plugins[]
{ "name": "acme-django-vue", "source": "./plugins/acme-django-vue" }

З metadata.pluginRoot (v2.1.239+) можна писати «голі» імена; шлях із / усе одно потребує ./:

marketplace.json
{
  "name": "acme-tools",
  "owner": { "name": "Acme Platform Team" },
  "metadata": { "pluginRoot": "./plugins" },
  "plugins": [ { "name": "acme-django-vue", "source": "acme-django-vue" } ]
}

github — із фіксацією на тег і коміт:

marketplace.json → plugins[]
{
  "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:

marketplace.json → plugins[]
{
  "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, тож плагін із великого монорепо не тягне решту репозиторію:

marketplace.json → plugins[]
{
  "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, окрім власного реєстру користувача.

marketplace.json → plugins[]
{
  "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-хостингу.

marketplace.json → plugins[]
{
  "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.

marketplace.json → plugins[]
{
  "name": "formatter",
  "source": {
    "source": "command",
    "command": "my-tool claude-plugin-path",
    "timeout": 120
  }
}
Поле commandВимоги
commandДрукований ASCII, до 500 символів, без послідовності з 4+ пробілів
timeoutЦіле, 1–600 секунд; за замовчуванням 60
modecopy (за замовчуванням): тека копіюється в кеш, версія — хеш файлів, ліміт 256 MiB / 20 000 елементів. link: файли вантажаться «на місці» через посилання, без копіювання (тека має лишатися на місці й містити node_modules); на Windows не підтримується

Типи джерел маркетплейсу

Джерело маркетплейсу каже, звідки брати сам marketplace.json. Його будує marketplace add або ви пишете в extraKnownMarketplaces; адміністратори використовують ті самі об’єкти в allowlist/blocklist. Імена url, git, github мають тут інший зміст, ніж у джерелах плагінів: маркетплейс-url — це пряме посилання на JSON-файл (git-репозиторій він не клонує), а git існує тільки як джерело маркетплейсу.

ТипПоляЩо вводить користувач у marketplace add
githubrepo, ref, path, sparsePathsowner/repo, owner/repo@ref або owner/repo#ref
giturl, ref, path, sparsePathsuser@host:path[.git][#ref]; http(s) URL, що закінчується на .git, містить /_git/ або є репозиторієм на github.com / gitlab.com
urlurl, headers, headersHelperБудь-який інший http(s):// URL — завантажується як marketplace.json
filepathШлях до .json-файлу
directorypathШлях до теки з .claude-plugin/marketplace.json
settingsname, plugins, ownerНе створюється командою; інлайн-каталог у extraKnownMarketplaces без жодного файлу. Відносні шляхи в ньому не працюють
npmpackageНе реалізовано: у 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:

.claude/settings.json
{
  "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/
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-subdirCommit SHA, скорочений до 12 символів (для git-subdir додається хеш шляху)
Відносний шлях у git-маркетплейсіCommit SHA встановленої теки
archiveSHA-256, скорочений до 12 символів
npm, локальна тека без gitunknown
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:

marketplace.json
{
  "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 кореневого маркетплейсу (того, звідки встановлюють плагін); діє лише його список, на весь ланцюг залежностей.

marketplace.json
{
  "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). Повна шпаргалка — у розділі «Шпаргалка команд».

11

Розповсюдження в команді та компанії

Проєктні налаштування, managed-політики

#

Є два рівні роздачі плагінів. Репозиторій (.claude/settings.json у проєкті) — для команди, що працює над одним кодом. Managed settings — для всієї компанії, коли політику не можна обійти. Обидва використовують пару ключів: extraKnownMarketplaces реєструє маркетплейс, enabledPlugins вмикає плагіни (plugin@marketplace).

1. Проєктні налаштування (.claude/settings.json)

.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 перемагає значення з найвищого джерела, яке його згадує; у managed true примусово вмикає, 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-роздача на всю компанію

managed settings
{
  "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 settingsclaude.ai → Organization settings → Claude Code → Managed settings; потрібна роль Owner. Одна конфігурація на всю організацію (різні групи — не можна)
MDMmacOS — 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
blockedMarketplacesBlocklist джерел; перевіряється першим; збіг ширший (канонізація git URL, github ≡ git)Не блокує вже зареєстрований маркетплейс із джерела, що не збігається
enabledPluginstrue — примусово вмикає, 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Не змінює власний текст попередження
syncClaudeAiPluginsfalse — не завантажувати плагіни, синхронізовані з акаунта claude.ai (v2.1.273+)Один синхронізований плагін вимикають через "<name>@synced": false
pluginConfigsЗначення userConfig (читається з user або managed; project/local ігнорується)—
CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL=1Не реєструвати офіційний маркетплейс автоматично (через managed env)Не видаляє вже зареєстрований

Приклад «дозволити лише наш GitLab і офіційний маркетплейс»:

managed settings
{
  "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 у managed enabledPlugins), приховування /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 нового розробника

  1. Налаштувати доступ до 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.
  2. Клонувати проєкт, запустити claude у корені репозиторію і прийняти workspace trust dialog.
  3. Дочекатися фонового клонування каталогу; за повідомленням Plugins changed. Run /reload-plugins to activate. виконати /reload-plugins.
  4. Якщо плагін із зовнішнім джерелом — виконати у shell claude plugin install acme-django-vue@acme-tools --scope project.
  5. Ввести значення userConfig (URL GitLab, токен) у діалозі або /plugin configure acme-django-vue@acme-tools.
  6. Перевірити: claude plugin list (статус enabled), у сесії / показує /acme-django-vue:…, /mcp — сервер plugin:acme-django-vue:gitlab.
  7. Ввімкнути автооновлення маркетплейсу в /plugin → Marketplaces (якщо його не задано політикою).
12

Приклад: командний плагін для Django/Vue

Повний плагін і що відбувається при встановленні

#

Сценарій: платформна команда 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/
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

plugins/acme-django-vue/.claude-plugin/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

skills/django-migrations/SKILL.md
---
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

agents/code-reviewer.md
---
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/hooks.json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "\"${CLAUDE_PLUGIN_ROOT}/scripts/lint-after-edit.sh\""
          }
        ]
      }
    ]
  }
}
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

.mcp.json
{
  "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-репозиторії

.claude-plugin/marketplace.json
{
  "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"]
    }
  ]
}

Перевірка перед пушем

shell
# перевірка каталогу (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

Валідація з каталогу не відкриває файли скілів, агентів і хуків плагінів в інших теках, тому плагін перевіряють окремо. Підключення командою колегам і в проєкт:

shell
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"

Що відбувається при встановленні

/plugin install acme-django-vue@acme-tools (інтерактивна сесія)
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.
13

Типові проблеми та налагодження

#

Шукайте точний текст повідомлення: Claude Code показує помилки завантаження у вкладці Errors панелі /plugin (кожна помилка з рядком-підказкою), а claude plugin list у shell додає їх до рядка плагіна. Повні довідники: Troubleshoot plugins.

Швидка діагностика

shell
# 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 shorthandowner/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 disabledClaude 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=yesssh -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 або розбіжність з extraKnownMarketplacesclaude 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 Codeclaude update
Plugin archive integrity check failedsha256 у записі не збігається зі скачаним файломВласник: перерахувати 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 manifestsstrict: 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.Zclaude 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/bunclaude 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 --forceReload додає/прибирає 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 у маніфесті, завантажується один — за пріоритетом (від вищого):

  1. Плагін, чий id є в managed enabledPlugins (true чи false); --plugin-dir-копія ігнорується: --plugin-dir copy of "x" ignored: plugin is locked by managed settings.
  2. Ввімкнений --plugin-dir / --plugin-url / CLAUDE_CODE_PLUGIN_DIRS — мовчки заміщує встановлений маркетплейсний плагін (лише debug-лог: Plugin "x" from --plugin-dir overrides installed version); skills-dir плагін отримує рядок Not loaded у Errors.
  3. Встановлений плагін із маркетплейсу.
  4. Плагін зі skills-директорії; між двома — копія в ~/.claude/skills/ перемагає проєктну.
  5. Плагін, синхронізований з 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, без циклів
Чого validate не ловить

Помилки отримання source (недоступний репозиторій, хибний sha256) виявляються лише при встановленні; hooks у записі маркетплейсу як шлях/масив проходять валідацію, але не працюють. Перевіряйте також реальним claude --plugin-dir і тестовим встановленням.

14

Шпаргалка команд

#

Команди запускаються або з 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), --jsonv2.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)
InstalledTab — перейти; друкуйте для фільтра, 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_DIRSeed-теки лише для читання
CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1GitHub 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 --projectclaude 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
15

Обмеження та безпека

Плагін виконує код з вашими правами

#
Головне правило

Встановлений плагін може виконувати довільний код на вашій машині з вашими правами користувача. Назва маркетплейсу каже, хто публікує каталог, а не що робить кожен плагін у ньому. Власні плагіни команди теж проходять 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 показує витрату).

Довіра й перевірка перед встановленням

  1. claude plugin marketplace list — з якого джерела додано маркетплейс.
  2. /plugin → деталі плагіна: розділ Will install (команди, агенти, скіли, хуки, MCP/LSP).
  3. Прочитати у вихідному коді: hooks/hooks.json (які команди), .mcp.json (команди/URL серверів), усі файли в bin/. Will install показує, що хук існує, але не що він виконує.
  4. claude --plugin-dir <клон> plugin details <name> — інвентар компонентів без запуску сесії; після встановлення — claude plugin details <name>.
  5. Видалення недовіреного: 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.cacheTtlpermissionMode, 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
JetBrainsClaude 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), автооновлення — свідомий вибір; зміни проходять review
✓
Для компанії: allowlist (strictKnownMarketplaces), disableSideloadFlags і, за потреби, strictPluginOnlyCustomization
✗
Не вважайте плагін безпечним лише тому, що маркетплейс «внутрішній» або ім’я схоже на офіційне
✗
Не очікуйте, що permissions чи sandbox обмежують хуки, монітори та MCP/LSP-процеси плагіна

Докладніше про політики — в розділі «Для команди»; офіційний довідник: 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>, якщо від плагіна залежать з діапазонами версій
✓
Секрети: токени й URL вводяться через userConfig із sensitive: true, а не зашиті у файли; у репозиторії немає ключів
✓
Хуки: зовнішній ключ "hooks" у hooks.json; назви подій з правильним регістром; matcher’и вузькі; скрипти виконувані (chmod +x) і завжди завершуються передбачуваним кодом
✓
Агенти: у frontmatter немає 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-dir
✓
Каталог: marketplace.json має name, owner, description; імена записів унікальні; відносні шляхи починаються з ./; не використовує зарезервованих імен
✓
Доступ: колеги можуть зробити git ls-remote до репозиторію без запиту пароля (SSH-агент чи PAT у credential helper); URL з .git
✓
Оновлення й видалення: перейменування — через renames; видалені плагіни — forceRemoveDeletedPlugins; зовнішні залежності з іншого маркетплейсу — у allowCrossMarketplaceDependenciesOn
✓
Розповсюдження: у проєкті — extraKnownMarketplaces + enabledPlugins (для зовнішніх джерел — інструкція --scope project); для компанії — managed-ключі й allowlist
✓
Документація: README із командою додавання маркетплейсу, переліком компонентів, вимог (jq, ruff, node) і значень userConfig
✗
Не публікуйте плагін із неперевіреним validate, зі «живими» токенами, з version: "1.0.0" без наміру його піднімати, або з кодом, який читає файли поза плагіном

Корисні посилання