الـ plugins هي أعلى مستوى من آليات التوسعة في Claude Code. بتجمع skills و subagents و hooks و MCP servers وإعدادات LSP في حزمة واحدة قابلة للتثبيت. الفريق بيثبّت plugin واحد وكل حاجة بتتضبط فورًا — مفيش setup يدوي لكل مكوّن. الموديول ده بيغطي هيكل الـ plugin، صيغة الـ manifest، طرق التوزيع، وإزاي تبني واحد بنفسك.
هيكل الـ Plugin
الـ plugin هو مجلد بهيكل محدد. الـ manifest، .claude-plugin/plugin.json، بيعرّف هوية الـ plugin — بس هو اختياري: لو حذفته، Claude Code بيكتشف المكونات في مواقعها الافتراضية (skills/، agents/، hooks/، .mcp.json، .lsp.json، إلخ). واسم الـ plugin بييجي من الـ marketplace entry، أو من اسم المجلد لما تحمّل الـ plugin بـ --plugin-dir. حط manifest فيه حقل name صريح لما تكون عايز هوية ثابتة أو metadata — لأن الـ plugin اللي بيتنسخ في الـ cache بيبقى اسم مجلده عبارة عن version string بيتغيّر مع كل تحديث. الاسم ده هو كمان الهوية اللي Claude Code بيعمل عليها إزالة تكرار: لما plugin-ين مفعّلين يطلع ليهم نفس الاسم، واحد بس بيكسب والتاني الـ hooks بتاعته بتتشال بدل ما تشتغل مرتين. من v2.1.296، /plugin بيعرض ملاحظة بتسمّي الـ plugin اللي اتشالت hooks-اته للسبب ده، فتعارض الأسماء الصامت بيبان بدل ما يطلّع سلوك ناقص وبس. كل حاجة بتتبع conventions اللي Claude Code بيتعرّف عليها:
my-plugin/
├── .claude-plugin/
│ └── plugin.json # Plugin manifest (optional)
├── skills/ # SKILL.md files
│ └── my-skill/
│ └── SKILL.md
├── agents/ # Subagent definitions
│ └── specialist.md
├── commands/ # Legacy command files (also work)
│ └── my-command.md
├── hooks/
│ └── hooks.json # Plugin-scoped hooks
├── .mcp.json # MCP server configs
├── .lsp.json # LSP server configs
├── settings.json # Default settings
└── bin/
└── helper.sh
plugin اللي بشحن skill واحد بس يقدر يحط SKILL.md مباشرة في root الـ plugin من غير ما يعمل مجلد skills/. Claude Code بيحمّلها كـ skill واحد وبيستخدم حقل name في الـ frontmatter كاسم للاستدعاء. استخدم هيكل skills/ للـ plugins اللي ممكن تكبر لأكثر من skill واحد.
الـ manifest بيعرّف الـ plugin والـ metadata بتاعه:
{
"name": "pr-review",
"description": "Complete PR review workflow with security and test coverage checks",
"version": "1.0.0",
"author": {
"name": "Your Name"
},
"repository": "https://github.com/you/pr-review",
"license": "MIT"
}
أوامر الـ plugin والـ skills اللي بيوفّرها بتكون namespaced كـ plugin-name:command-name عشان ما يحصلش تعارض مع إعدادات المشروع. شغّلها بالاسم الكامل، زي /pr-review:check-security.
ميزات الـ Manifest
الـ manifest بيدعم عدة خصائص قوية لضبط سلوك الـ plugin. خاصية userConfig بتعلن عن خيارات قابلة للتخصيص من المستخدم. الحقول المعلّمة بـ sensitive: true بتتخزّن في الـ system keychain بدل الإعدادات النصية:
{
"name": "my-plugin",
"version": "1.0.0",
"userConfig": {
"apiKey": {
"description": "API key for the integration",
"sensitive": true
},
"region": {
"description": "Deployment region",
"default": "us-east-1"
}
}
}
المستخدم مش بيعدّل settings.json بإيده عشان يملأ الخيارات دي — شغّل /plugin configure <plugin> جوه الجلسة (الاختصار /plugin config، من v2.1.147) عشان تفتح نافذة الـ userConfig بتاعة الـ plugin وتحطّ القيم، أو يقول لك إن الـ plugin مش معلن أي خيارات. القيم غير الحساسة بتتخزّن تحت pluginConfigs في settings.json، والقيم المعلّمة بـ sensitive بتروح لمخزن بيانات الاعتماد الآمن بتاع النظام. لو سمّيت plugin مش متثبّت في المشروع الحالي بيطبع Plugin "<plugin>" is not installed in this project بدل ما ينفّذ.
الـ plugins بتوصّل لحالة بيانات دائمة عبر ${CLAUDE_PLUGIN_DATA} (من v2.1.78) — ده متغيّر shell بيفضل موجود بعد تحديثات الـ plugin، فده بيخلّيه مناسب للـ caches وملفات الحالة والـ databases. استخدم ${CLAUDE_PLUGIN_ROOT} عشان تشير لمسارات نسبية من مجلد تثبيت الـ plugin — ضروري للـ hooks وإعدادات الـ MCP:
{
"hooks": {
"PostToolUse": [
{
"hooks": [
{
"type": "command",
"command": "node ${CLAUDE_PLUGIN_ROOT}/bin/audit.js"
}
]
}
]
}
}
مراقبات الـ plugins محتاجة Claude Code v2.1.105 أو أحدث. عرّفها في ملف monitors/monitors.json في root الـ plugin، أو inline تحت مفتاح experimental.monitors في الـ manifest. مفتاح الـ monitors في الـ manifest بيربط الـ plugin بأداة Monitor. ورّيه JSON file (أو حط الإعداد inline) وكل المراقبات اللي في الخلفية هتتفعّل تلقائي أول ما الـ plugin يتفعّل في بداية الجلسة، أو لما skill من الـ plugin يتستدعى. ده بيخلّي الـ plugin يشحن سلوك زي “راقب الـ CI وبلّغني على الفشل” أو “tail للـ dev server log” من غير ما المستخدم يضبط أي حاجة:
{
"name": "ci-watcher",
"version": "1.0.0",
"experimental": {
"monitors": "./monitors.json"
}
}
لما الـ manifest بيحدد مسار monitors خاص، الموقع الافتراضي monitors/monitors.json مبيتفحصش تاني — أضف الافتراضي صراحةً لو لسه عايزه يتحمّل مع ملفك المخصص.
أداة Monitor ليها حد إصدار خاص بيها. على Amazon Bedrock أو Claude Platform on AWS أو Google Cloud’s Agent Platform أو Microsoft Foundry، أو مع DISABLE_TELEMETRY أو CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC مضبوطة، Monitor محتاجة Claude Code v2.1.310 أو أحدث.
دعم LSP بيضيف تكامل language server protocol في الوقت الفعلي. حط ملف .lsp.json في root الـ plugin عشان تضبط language servers بتوفّر تشخيصات فورية، go-to-definition، وبحث عن symbols وأنت بتشتغل. الحقول restartOnCrash وshutdownTimeout (من v2.1.205) بتضبط سلوك الـ shutdown والـ restart الآمن — قبل v2.1.205، وضع أي منهم كان بيخلّي Claude Code يتخطى الـ LSP server ده عند بدء التشغيل تمامًا.
ملف settings.json بتاع الـ plugin بيدعم بس مفتاحي agent وsubagentStatusLine؛ أي حقول تانية بتتجاهل بدون رسالة.
{
"typescript": {
"command": "typescript-language-server",
"args": ["--stdio"],
"extensionToLanguage": {
".ts": "typescript",
".tsx": "typescriptreact"
}
}
}
الـ Mods — hooks كدوال JavaScript
الـ mod هو plugin بيغيّر شكل Claude Code وسلوكه من جوه. الـ hooks اللي شُفتها في موديول الـ Hooks بتشتغل كـ shell command أو HTTP request أو prompt متظبّط في ملف إعدادات؛ أما hooks الـ mod فهي دوال JavaScript أو TypeScript بتشتغل جوه عملية Claude Code نفسها. الـ plugin اللي بيشحن hooks module زي ده بيتسمّى mod. الـ mods محتاجة Claude Code v2.1.287 أو أحدث وهي مفعّلة افتراضيًا — claude --version بيقولك إصدارك جديد كفاية ولا لأ.
التشغيل جوه العملية هو اللي بيخلّي الـ mod يعمل حاجات الـ settings hook والـ skill والـ MCP server ما يقدروش عليها:
- يرسم واجهة. يضيف pane جنب الـ transcript أو band فوق الـ prompt، بـ tabs وbuttons وحقول نص — مثلًا pane بيرسم شارت لمدى امتلاء الـ context window بعد كل request.
- يعيد تنسيق اللي Claude Code بيرسمه أصلاً. يستبدل أو يعيد تنسيق صف الـ tool call، أو الـ spinner، أو نافذة الأسئلة اللي Claude بيسأل فيها. الحاجة الوحيدة اللي الـ mod عمره ما يقدر يلمسها هي الـ permission prompt.
- يتدخّل في tool call أو request. يمسك tool call لحد ما يسأل المستخدم سؤال، أو يجاوبه من غير ما يشغّل الأداة، أو يوجّه request واحد لموديل مختلف.
- يضيف command.
/commandبيشغّل دالتك فورًا، من غير دور لـ Claude، حتى وClaude شغّال. - يطلق ويوجّه الـ subagents. عن طريق الـ
$.agentAPI الـ mod يقدر يسجّل نوع subagent، ويبدأ subagent — أو teammate في agent team — من كوده بنفسه بـ$.agent.spawn، ويسرد agents الجلسة بـ$.agent.list()(كل عنصر بيحملstatusزيrunningأوcompletedأوfailed، فلازم تفحصه مش تفترض إن كل نتيجة شغّالة). وكمان يقدر يتدخّل في حدثagent.spawnبتاع Claude نفسه عشان يختار موديل الـ agent اللي اتطلق أو يمنعه، أو يحجب نوع subagent عن Claude عن طريقagent.offer. - يشارك الحالة بين الـ hooks. hooks الـ mod بتشارك المتغيرات اللي في ملفها، فـ hook يقدر يعدّ الـ tool calls وآخر يعرض العدد جنب الـ spinner.
الـ mod عبارة عن plugin، فله نفس الشكل اللي تعرفه — manifest في plugin.json ومجلد hooks/. الفرق إن hooks/hooks.json بيشير لملف كود (الـ hooks module) اللي بيسجّل الـ event handlers:
// hooks/register.js — counts tool calls and shows the running total by the spinner
let calls = 0;
export function register(on) {
on("tool.call", async ($, e, next) => {
calls += 1;
$.ui.invalidate("ui.render"); // ask Claude Code to redraw
return next(e); // let the tool run as usual
});
on("ui.render", { component: "Spinner" }, async ($, e, next) => {
return next({ ...e, props: { ...e.props, suffix: ` · tool calls: ${calls}…` } });
});
}
كل hook يقدر يراقب حدث ويسيبه يكمل، أو يعيد كتابته قبل ما يكمل، أو يجاوبه بحيث السلوك المعتاد ما يحصلش. أي حاجة الـ hook بيعملها خارج كوده — رسم، إضافة command، استدعاء موديل، قراءة ملف، عمل network request — بتمر عبر الـ mods API. اللي بيخلّي claude plugin validate ./some-mod يقدر يسرد hooks: وcalls: بتاعة الـ mod قبل ما تحمّله أصلاً.
لما الـ mod يتعامل مع حدث tool.check — الحدث اللي Claude Code بيقرر فيه هل نداء الأداة ينفع يشتغل — الحدث كمان بيقولك إن نداء الأداة ده read-only ولا لأ. e.isReadOnly بيبقى true لما الأداة تبلّغ إن النداء read-only؛ في غير كده الحقل بيكون مش موجود، مش false. الحقل ده محتاج Claude Code v2.1.304 أو أحدث. ودي بلاغ الأداة نفسها مش إشارة اعتماد: ماتعتمدش على الحقل ده لوحده فالموافقة، لأن WebFetch وAgent بيبلّغوا إنهم read-only مع إنهم بيجيبوا URL أو يشغّلوا subagent. نفس القيمة بتشتغل كـ matcher، فبتخلي الـ handler ميوصلوش غير النداءات اللي انت عايزها:
on("tool.check", { tool: "Bash", isReadOnly: true }, async ($, e, next) => {
// غير نداءات Bash read-only بيوصلوا للـ handler ده
return next(e);
});
بتثبّت الـ mod زي أي plugin تاني — /plugin install token-chart@your-org، أو claude plugin install token-chart@your-org من الـ shell وبعدها /reload-plugins. hooks الـ mod بتشتغل في كل مكان الجلسة بتحمّل فيه الـ plugin (الـ terminal، تبويب Code في الـ Desktop app، الـ VS Code chat panel، claude -p والـ Agent SDK، الـ Remote Control، والـ cloud sessions)، لكن اللي بيرسمه بيظهر في الـ terminal والـ Desktop app والـ VS Code extension — الـ extension برضه بيرسم، من نسخة 2.1.299 (2.1.304 في جلسة مش بتجيب feature flags). بعض ميزات Claude Code نفسها عبارة عن mods مدمجة — /diff بيرسم الـ pane بتاعه كواحدة منها، وcc-plugin-you-should-know@builtin (متقفّل افتراضيًا) بيشغّل side agent بيحط note فوق الـ prompt لما يلاقي حاجة أنت أو Claude ممكن تفوّتوها في مهمة طويلة. فعّل الأخير بـ /plugin enable cc-plugin-you-should-know@builtin.
لأن الـ mod بيشتغل بكامل صلاحياتك ومش داخل sandbox، ثبّت mods بس من مؤلفين وmarketplaces موثوقة — يقدر يقرا ويكتب ملفاتك، ويصرف من الـ usage بتاعك، ويوافق على tool calls نيابة عنك. عشان تطفّي الـ mods، عطّل الـ plugin من /plugin، أو ابدأ جلسة بـ --safe-mode عشان تسقط كل التخصيصات مرة واحدة، أو اضبط "disableAllHooks": true في ~/.claude/settings.json عشان توقّفها في كل جلسة.
CLAUDE_CODE_PLUGIN_DIR_WATCH بيتحكم في هل Claude Code بيعيد تحميل الـ mod لما ملفات الـ mod تتغير. إعادة التحميل بتشتغل مع الـ mod اللي بتحمّله من مجلد بـ --plugin-dir، وهي شغّالة افتراضيًا في الجلسات التفاعلية. اضبطه على 1 عشان تشغّلها كمان في الجلسات غير التفاعلية، أو 0 عشان تطفّيها في كل الجلسات. محتاج Claude Code v2.1.287 أو أحدث.
التوزيع والتطوير
جرّب الـ plugin محليًا بـ flag الـ --plugin-dir قبل ما توزّعه. ده بيحمّل الـ plugin للجلسة دي بس — بدون تثبيت:
claude --plugin-dir ./my-plugin
# Test multiple plugins simultaneously:
claude --plugin-dir ./my-plugin --plugin-dir ./another-plugin
للـ plugins المستضافة كأرشيفات .zip، --plugin-url بيحمّلها ويثبّتها للجلسة الحالية بس من غير تثبيت دائم. كرّر الـ flag لعدة plugins:
claude --plugin-url https://example.com/my-plugin.zip
claude --plugin-url https://example.com/a.zip --plugin-url https://example.com/b.zip
استخدم --plugin-url بس مع روابط موثوقة — تحميل أرشيفات من مصادر خارجية بيشغّل كود طرف ثالث على جهازك.
الـ plugin evals هي الـ eval cases بتاعة الـ plugin نفسه: مفتاح experimental.evals في الـ manifest بيشاور على المجلد اللي فيه الحالات دي (evals/ افتراضيًا)، و claude plugin eval بيشغّلها — والـ --eval-dir بيتجاوز المجلد ده في run واحد. Claude Code v2.1.299 ضاف flag اسمه --disallow-tools لأمر claude plugin eval، ومعه case field اسمه disallowed_tools، عشان تفضي أدوات معيّنة مدمجة — زي Agent مثلًا — من الـ eval runs. الـ flag بياخد اسم أداة واحدة أو أكتر:
# سيب أداة Agent المدمجة بره الـ eval run
claude plugin eval --disallow-tools Agent
استخدم /reload-plugins عشان تعمل hot-reload لملفات الـ plugin خلال التطوير من غير ما تعيد تشغيل الجلسة. ده بيعيد قراءة كل الـ manifests والـ skills والـ agents والـ hooks وإعدادات الـ MCP فورًا.
شاشات /plugin بتاعت Discover و Browse بقت بتعرض inventory كامل لكل اللي الـ plugin هيثبّته قبل ما تقرر — commands و agents و skills و hooks وأي MCP أو LSP servers بيشحنها. ده بيخلّي تقييم plugin من الـ marketplace قرار في شاشة واحدة: تقدر تتأكد إن plugin زي pr-review مش بيسجّل MCP servers أو hooks ما كنتش متوقعها، أو تشيك إن plugin للـ deploy فعلًا بيشحن الـ skill اللي جاي عشانها. Browse بيعرض المثبت عندك بنفس التفصيل؛ Discover بيعمل نفس الحاجة لكتالوج الـ marketplace. المعاينة للعلم بس — لازم تثبّت الـ plugin قبل ما أي مكون يشتغل.
توزيع الـ plugins بيتبع نموذج marketplace. الـ marketplace الرسمي من Anthropic هو claude-plugins-official. ضيف marketplaces تانية بـ /plugin marketplace add owner/repo-name. ثبّت plugins بـ /plugin install plugin-name أو claude plugin install plugin-name@marketplace:
# Install from official marketplace
/plugin install pr-review
# Install from marketplace مضاف من GitHub (استخدم اختصار owner/repo العادي — صيغة github: غير موثّقة)
/plugin marketplace add owner/repo-name
/plugin install plugin-name@marketplace-name
# ضيف marketplace وثبّت في خطوة واحدة (v2.1.275+): حدّد المصدر بـ --marketplace
/plugin install plugin-name --marketplace owner/repo-name
# Install from local path (for testing)
/plugin install ./path/to/plugin
عشان تثبّت من marketplace لسه ما أضفتوش، حدّد مصدره بـ --marketplace (Claude Code v2.1.275+) بدل ما تضيفه الأول بـ /plugin marketplace add منفصل. المصدر بياخد نفس صيغ /plugin marketplace add — اختصار GitHub بصيغة owner/repo، أو رابط git، أو مسار محلي (بس من غير مسافات) — وتكتب اسم الـ plugin مجرّد من غير لاحقة @marketplace. لو الـ marketplace ده لسه مش مسجّل، Claude Code بيعرض المصدر اللي حلّه ويطلب تأكيدك قبل ما يضيفه؛ والرفض بيلغي التثبيت وما بيضيف حاجة.
لما الـ plugin source يكون اختصار GitHub بصيغة owner/repo، Claude Code بيتأكد هل الـ SSH key بيساعد في الوصول لـ github.com ولا لأ، ف بيعمل clone عن طريق SSH لو الإجابة أيوه، و HTTPS لو لأ، و لو الـ clone عبر SSH فشل بيرجع للـ HTTPS. اضبط CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1 عشان يتخطى الفحص ده ويعمل clone عن طريق HTTPS دايمًا — وده الاختيار المضمون في الـ CI runners والـ containers. وباقي عملية التثبيت بتفضل زي ما هي:
# اجبر HTTPS في الـ CI لما تثبّت plugins
CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1 claude plugin install owner/repo
لبيئات المؤسسات، ملف managed-mcp.json بيتحكم في أي MCP servers الـ plugins تقدر تستخدمها. إعدادات enabledPlugins وextraKnownMarketplaces وstrictKnownMarketplaces وblockedMarketplaces في الـ managed policy بتتحكم في أي plugins و marketplaces مسموح بيها على مستوى المؤسسة. كل من strictKnownMarketplaces (قائمة سماح) وblockedMarketplaces (قائمة حظر) بيقبلوا owner wildcard (Claude Code v2.1.223+): مدخل GitHub بالشكل { "source": "github", "repo": "owner/*" } بيغطّي كل مستودعات الـ marketplace تحت الـ owner ده في سطر واحد — تسمح بمؤسسة موثوقة كاملة، أو تحظر واحدة غير موثوقة كاملة، من غير ما تسرد كل مستودع. قواعد المطابقة بتختلف بين قائمة السماح وقائمة الحظر، فراجع مرجع owner-wildcards قبل ما تعتمد على واحدة. الـ subagents بتاعة الـ plugins عندها frontmatter محدود — ما يقدروش يعرّفوا hooks أو mcpServers أو permissionMode عشان يمنعوا privilege escalation.
allowManagedPermissionRulesOnly هو الـ managed setting اللي بيضيّق كل ده على الـ managed policy لوحدها: Claude Code بيحتفظ بقواعد السماح الموجودة في الـ managed policy بس، وبيسقط قواعد السماح اللي المضيف بيقدّمها كـ parent settings أو كـ --allowedtools أو في ملف settings. ابتداءً من v2.1.305، الـ plugins اللي Claude Desktop بيركّبها by path مبقتش تحتفظ بـ allowed-tools بتاعها لما الـ managed settings بتاع مؤسستك تضبط المفتاح ده.
أوامر دورة الحياة المفيدة تشمل claude plugin list وclaude plugin enable وclaude plugin disable وclaude plugin uninstall وclaude plugin validate وclaude plugin prune (جديد في v2.1.121، وله الاسم البديل autoremove) اللي بيشيل الـ dependencies اللي اتثبّتت تلقائيًا ومفيش أي plugin مثبّت تاني محتاجها — الـ plugins اللي ثبّتها بنفسك مبتتلمسش؛ وعشان تشيل plugin وتنضّف dependencies بتاعته في خطوة واحدة، شغّل claude plugin uninstall <plugin> --prune. وclaude plugin details <name> بيعرض inventory مكونات الـ plugin مصنّفة كـ Skills وAgents وHooks وMCP servers وLSP servers، بالإضافة لتقدير عدد الـ tokens اللي بيزوّدهم في كل جلسة. وclaude plugin tag (اتضاف في v2.1.118) بيعمّل release git tag مع التحقق من الإصدار. الـ marketplaces بتقدر تجيب plugins من GitHub repositories (بصيغة owner/repo)، أو git URLs، أو local paths، أو روابط remote لملفات marketplace.json.
claude plugin enable وclaude plugin disable بيشغّلوا ويوقّفوا plugin مثبّت من غير ما يشيلوه. الاتنين بياخدوا <plugin> (أو <plugin>@<marketplace> لو في تعارض في الأسماء) و--scope بقيمة user أو project أو local (الافتراضي: user). التعطيل على نطاق project بيكتب الخيار في .claude/settings.json فالفريق كله يستلمه، أما user فبيخليه شخصي:
# شخصي: عطّل plugin مزعج ليك إنت بس
claude plugin disable formatter@anthropics/claude-plugins
# فريق: سيب الـ plugin في الإعدادات لكن عطّله على مستوى المشروع
claude plugin disable formatter --scope project
# فعّله تاني بعدين من غير ما تمسّ التثبيت أو الإصدار
claude plugin enable formatter --scope project
من الـ shell، claude plugin configure <plugin> (من v2.1.285) بيفحص ويحفظ القيم اللي الـ plugin بيكشفها من خلال userConfig في الـ manifest بتاعه — ده النظير اللي ينفع في السكريبتات لنافذة /plugin configure التفاعلية جوه الجلسة. من غير flags بيسرد كل خيار مُعلَن، مُعلَّم بـ required أو optional، وsensitive لو الـ manifest علّمه كده، وset أو not set — وعمره ما بيطبع قيمة محفوظة. عشان تحفظ القيم من غير تفاعل، مرّر JSON object من نصوص بسطر واحد على stdin وضيف --values-stdin — مفيد لسكريبتات الـ CI والإعداد التلقائي؛ الخيارات اللي بتسيبها بتحتفظ بقيمها المحفوظة. مرّر الـ id الكامل بصيغة <plugin>@<marketplace> زي ما claude plugin list بيعرضه — configure مش بيقبل الاسم المجرّد — وأي key مش معلن أو قيمة بترسب في فحص النوع بتخلّيه ما يحفظش حاجة ويخرج بكود 1:
# اسرد خيارات الـ plugin وأنهي متضبط (من غير طباعة أي قيمة محفوظة)
claude plugin configure formatter@anthropics/claude-plugins
# احفظ القيم من JSON object على stdin — من غير prompts تفاعلية
echo '{"region":"us-east-1"}' \
| claude plugin configure formatter@anthropics/claude-plugins --values-stdin
claude plugin list بيعرض كل plugin متثبّت بإصداره والـ scope بتاعه وحالته. والـ flag بتاعه --data-size [plugin] (من v2.1.285) بيقيس مجلد البيانات المحفوظة بتاع كل plugin — فولدر ~/.claude/plugins/data/<id>/ اللي الـ plugin بيكتب فيه الـ caches وملفات الحالة والـ databases — عشان تشوف الـ uninstall هيمسح إيه. بيشتغل بس مع --json، اللي بيضيف وقتها حقل dataDirSize (bytes وhuman) لكل plugin؛ مرّر id بصيغة <plugin>@<marketplace> عشان تقيس واحد بس:
# قيس مجلد البيانات المحفوظة لكل plugin متثبّت
claude plugin list --json --data-size
# قيس بيانات plugin واحد محفوظة
claude plugin list --json --data-size formatter@anthropics/claude-plugins
نمط الـ inline plugin (source: 'settings' من version 2.1.80) بيخلّيك تعرّف plugin مباشرة في ملف إعدادات من غير ما تحتاج repo منفصل. ده مفيد للأدوات الداخلية الصغيرة اللي ما تستاهلش repo كامل:
{
"pluginMarketplaces": [
{
"name": "internal-tools",
"source": "settings",
"plugins": [
{
"name": "code-standards",
"source": "./local-plugins/code-standards"
}
]
}
]
}