תיעוד 90
עיון במניפסט התוסף
עיון מלא ב-
plugin.json: כל שדה עם הסוג וערך ברירת המחדל שלו, צורות הנתיב המקובלות, וסכמותuserConfigומשתני הסביבה.
מניפסט תוסף הוא קובץ plugin.json בתיקייה .claude-plugin/ של התוסף. הוא נושא את המטא נתונים של התוסף ואת ערכי userConfig ש-Claude Code מבקש מהמשתמש. הוא גם מצהיר על כל רכיב שאתה מגדיר בשורה או שומר מחוץ למיקום ברירת המחדל שלו.
העיון הזה מיועד ליוצרי תוספים, ולבעלי marketplace שמכניסים שדות רכיב ברשומת marketplace.
[!NOTE]
המקרים האלה מכוסים בדפים אחרים:
- ללמוד לבנות תוסף: התחל ביצירת תוסף
- מה כל רכיב עושה בזמן ריצה: ראה רכיבי תוסף
התחל בסעיף שמתאים למה שאתה מחפש:
- שדה: טבלת השדות נותנת לכל שדה את הסוג, האם הוא חובה, את ברירת המחדל שלו, ומה הוא מקבל. כללי נתיב מכסים את הקידומת
./ואת ההכלה לכל נתיב רכיב - אפשרות
userConfigאו רשומתchannels: הסכמות הגדרת משתמש וערוצים ${CLAUDE_PLUGIN_ROOT}או משתנה אחר שתוסף יכול להפנות אליו: משתני סביבה- לאן הולכים הקבצים של כל רכיב: פריסה סטנדרטית
- הודעה מ-
claude plugin validate: דף פתרון הבעיות מפרט כל הודעה עם התיקון שלה ומקשר לסעיפים הרלוונטיים בדף הזה
#קובץ המניפסט
המניפסט אופציונלי. בלעדיו, Claude Code טוען את הרכיבים שהוא מוצא בפריסה הסטנדרטית. שם התוסף מגיע אז מרשומת ה-marketplace, או משם התיקייה כשטוענים את התוסף עם --plugin-dir.
כתוב מניפסט כשאתה רוצה מטא נתונים, רכיב מחוץ לתיקיית ברירת המחדל שלו, userConfig, או הגדרת רכיב בשורה.
שמור את המניפסט ב-.claude-plugin/plugin.json מתחת לשורש התוסף. שים כל קובץ תוסף אחר בשורש התוסף, לא בתוך .claude-plugin/. זה כולל את skills/, commands/ ו-hooks/.
הדוגמה הבאה מגדירה את רוב המפתחות בטבלת השדות. היא עוברת אימות בתיקיית תוסף שמכילה כל נתיב שמוזכר.
{
"name": "deploy-tools",
"displayName": "Deploy Tools",
"version": "1.2.0",
"description": "Deployment commands, a review agent, and a status monitor",
"author": {
"name": "Example Team",
"email": "[email protected]",
"url": "https://example.com"
},
"homepage": "https://example.com/docs/deploy-tools",
"repository": "https://github.com/example/deploy-tools",
"license": "MIT",
"keywords": ["deployment", "ci"],
"defaultEnabled": true,
"dependencies": ["secrets-vault"],
"metadata": { "catalogId": "cat-123" },
"skills": ["./extra-skills/"],
"commands": {
"status": {
"source": "./commands/status.md",
"description": "Show the current deployment status"
},
"about": {
"content": "Explain what the deploy-tools plugin provides.",
"description": "Describe this plugin"
}
},
"agents": ["./agents/reviewer.md"],
"hooks": "./config/extra-hooks.json",
"mcpServers": {
"deploy-api": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/server.js"]
}
},
"lspServers": "./.lsp.json",
"outputStyles": "./styles/",
"experimental": {
"themes": "./themes/",
"monitors": "./config/monitors.json"
},
"userConfig": {
"api_token": {
"type": "string",
"title": "API token",
"description": "Token for the deployment API",
"sensitive": true
}
}
}#שדות לא מזוהים
מפתח ברמה העליונה שלא מזוהה מוסר, ומפתח שלא מזוהה בתוך אפשרות userConfig, רשומת channels, הגדרת lspServers או רשומת monitors נדחה:
- שדות ברמה העליונה: השדה מוסר והתוסף נטען.
claude plugin validateמדווח על כל שדה ברמה העליונה שלא מזוהה כאזהרה - אובייקטים מחמירים: אפשרויות
userConfig, רשומותchannels, הגדרותlspServersורשומותmonitorsמחמירים. מפתח לא ידוע בתוך אחד מהם הוא שגיאה, והתוסף לא נטען
#אימות המניפסט
claude plugin validate הוא הבדיקה הסמכותית למניפסט. הרץ אותו מהמעטפת מול תיקיית התוסף:
claude plugin validate ./my-pluginהפקודה מדווחת על אחת מהתוצאות האלה:
Validation passed: המניפסט נטעןValidation passed with warnings: המניפסט נטען, אבל המאמת מצא משהו לתקן, כמו שדה ברמה העליונה לא ידוע ש-Claude Code מסיר,nameשאינו ב-kebab-case, אוversion,descriptionאוauthorחסרים. העבר את--strictכדי להפוך אזהרות לכשלים ב-CIValidation failed: למניפסט יש אי התאמה של סוג, נתיב שחסר או יוצא משורש התוסף, או מפתח לא ידוע בתוך אפשרותuserConfig, רשומתchannels, הגדרתlspServersאו רשומתmonitors. Claude Code מדווח על אותה בעיה כשהוא טוען את התוסף
הפקודה גם בודקת כל רשומת שרת MCP שהתוסף מצהיר עליה ב-.mcp.json, בקובץ .json ש-mcpServers מציין, או בשורה ב-plugin.json. בדיקות MCP אלה דורשות Claude Code v2.1.281 או חדש יותר וכוללות:
- שגיאות: רשומה ש-Claude Code היה משמיט כשהוא טוען את התוסף, הפניה
${user_config.KEY}לאפשרות שהמניפסט לא מצהיר עליה, ו-urlמרוחק שאינו URL מוחלט תקין - אזהרות: URL מסוג
http://אוws://למארח שאינו loopback, וערך header שנראה כמו credential מילולי
#שדות
הטבלה מפרטת את המפתחות ברמה העליונה ב-plugin.json. name הוא המפתח החובה היחיד. כששם שדה הוא קישור, בסעיף המקושר יש את הכללים המלאים שלו.
למפתחות רכיב כמו commands ו-hooks, צורות נתיב של רכיב מציגה כל צורה מקובלת עם דוגמה, וכל נתיב עוקב אחרי כללי הנתיב לקידומת ./, לסיומות ולהכלה.
| שדה | סוג | תיאור |
|---|---|---|
$schema | מחרוזת | כתובת URL של JSON Schema להשלמה אוטומטית בעורך. Claude Code מתעלם ממנה בזמן הטעינה |
name | מחרוזת | מזהה התוסף, חובה. השתמש ב-kebab-case. כל רכיב מקבל מרחב שמות תחתיו |
displayName | מחרוזת | שם שמוצג בממשק במקום name |
version | מחרוזת | מחרוזת גרסה. הגדרתה משאירה משתמשים על הגרסה הזו עד שתשנה אותה |
description | מחרוזת | הסבר קצר על מה שהתוסף מספק |
author | אובייקט | name, שהוא חובה, ועוד email ו-url אופציונליים |
homepage | מחרוזת | כתובת URL לתיעוד. חייבת להתפרש כ-URL, אחרת התוסף נכשל בטעינה |
repository | מחרוזת | כתובת URL של מאגר המקור. לא מאומתת |
license | מחרוזת | מזהה SPDX כמו MIT או Apache-2.0 |
keywords | מערך של מחרוזות | תגיות לגילוי |
metadata | אובייקט | אובייקט חופשי לנתונים שלך. Claude Code לא קורא אותו |
icon | מחרוזת | סמל לרישום התוסף במדריך של Anthropic. Claude Code לא קורא אותו |
documentationUrl | מחרוזת | קישור תיעוד לרישום התוסף במדריך של Anthropic. Claude Code לא קורא אותו |
supportUrl | מחרוזת | קישור תמיכה לרישום התוסף במדריך של Anthropic. Claude Code לא קורא אותו |
privacyPolicyUrl | מחרוזת | קישור למדיניות פרטיות לרישום התוסף במדריך של Anthropic. Claude Code לא קורא אותו |
termsOfServiceUrl | מחרוזת | קישור לתנאי שימוש לרישום התוסף במדריך של Anthropic. Claude Code לא קורא אותו |
defaultEnabled | בוליאני | האם התוסף מתחיל מופעל כשהמשתמש לא הגדיר אותו. ברירת המחדל היא true |
dependencies | מערך של מחרוזות או אובייקטים | תוספים שחייבים להיות מופעלים כדי שהתוסף הזה יעבוד |
settings | אובייקט | הגדרות ש-Claude Code מחיל בזמן שהתוסף מופעל. רק agent ו-subagentStatusLine נכנסים לתוקף |
userConfig | אובייקט | ערכים ש-Claude Code מבקש מהמשתמש כשהתוסף מופעל |
types | נתיב | קובץ .d.ts שמצהיר על ערכי $.state ועל שמות העצם $ של מוד |
channels | מערך של אובייקטים | ערוצי הודעות שהתוסף מספק, כל אחד קשור לאחד משרתי ה-MCP שלו |
skills | נתיב, או מערך של נתיבים | תיקיות לסריקה לאיתור skills, כל אחת תיקייה של תיקיות <name>/SKILL.md או תיקייה אחת שמחזיקה SKILL.md ישירות. "." מציין את שורש התוסף. מתווסף לסריקת ברירת המחדל של skills/ |
commands | נתיב, מערך של נתיבים, או אובייקט | קבצי פקודה .md שטוחים, תיקיות שלהם, או מיפוי אובייקט משם פקודה אל source או content. מחליף את סריקת ברירת המחדל של commands/ |
agents | נתיב, או מערך של נתיבים | קבצי .md של סוכן. תיקיות לא מתקבלות. מחליף את סריקת ברירת המחדל של agents/ |
hooks | נתיב, אובייקט, או מערך של אחד מהם | קבצי hook ב-.json או הגדרת hook בשורה. נטענים יחד עם hooks/hooks.json |
mcpServers | נתיב, אובייקט, או מערך של אחד מהם | קבצי הגדרת MCP ב-.json, חבילות .mcpb או .dxt, או הגדרות שרת בשורה לפי שם. נטענים יחד עם .mcp.json. שם שרת שמוצהר מאוחר יותר מחליף שם קודם |
lspServers | נתיב, אובייקט, או מערך של אחד מהם | קבצי הגדרת LSP ב-.json או הגדרות שרת בשורה לפי שם. נטענים יחד עם .lsp.json |
outputStyles | נתיב, או מערך של נתיבים | קבצי סגנון פלט או תיקיות. מחליף את סריקת ברירת המחדל של output-styles/ |
workflows | נתיב, או מערך של נתיבים | קבצי .js או תיקיות של Workflow. מחליף את סריקת ברירת המחדל של workflows/ |
experimental | אובייקט | מיכל עבור themes, monitors ו-evals, שצורת המניפסט שלהם עדיין עשויה להשתנות |
experimental.themes | נתיב, או מערך של נתיבים | קבצי ערכת נושא או תיקיות. מחליף את סריקת ברירת המחדל של themes/. מפתח themes ברמה העליונה עדיין נטען, עם אזהרה של claude plugin validate |
experimental.monitors | נתיב, או מערך בשורה | קובץ .json שמחזיק את מערך ה-monitors, או המערך עצמו. ברירת המחדל היא monitors/monitors.json. מפתח monitors ברמה העליונה עדיין נטען, עם אזהרה של claude plugin validate. מוניטורים לא מתחילים עם הדגל -p |
experimental.evals | נתיב, או מערך של נתיבים | תיקייה שמחזיקה את מקרי ה-eval של התוסף כשזו לא evals/ שבברירת המחדל. claude plugin eval --eval-dir דורס אותה |
בעמודת הסוג, נתיב הוא מחרוזת יחסית לשורש התוסף, כמו "./custom/commands".
#name
מזהה התוסף. הוא חייב להיות לא ריק, בלי רווחים, @, :, מפרידי נתיב, תווי בקרה או תווי עיצוב דו כיווני. השתמש ב-kebab-case.
Claude Code נותן לכל רכיב מרחב שמות תחתיו, כך שסוכן reviewer בתוסף deploy-tools מופיע כ-deploy-tools:reviewer.
claude plugin validate גם בודק שהשם לא עובר כאחד מהתוספים של Anthropic עצמה. הבדיקה מתעלמת מרישיות ומתייחסת לכל רצף של מפרידים כאחד:
| שם | תוצאה |
|---|---|
מתחיל ב-claude-, anthropic-, anthropics- או cc-plugin- | שגיאה |
הוא claude, anthropic, anthropics, claude-code או claude-mods | שגיאה |
שם את official לצד claude או anthropic, כמו official-claude-tools | שגיאה |
מכיל את claude, anthropic או anthropics כמילה שלמה בכל מקום אחר, כמו mcp-for-claude | אזהרה |
השגיאה היא Plugin name "<name>" is reserved: it passes as one of Anthropic's own, והאזהרה היא Plugin name "<name>" reads as one of Anthropic's own. claude plugin init ו-claude plugin tag מסרבים לשם שמעורר את השגיאה. Claude Code עדיין מתקין וטוען תוסף שאת שמו הם מסרבים.
#displayName
השם שמוצג בממשק במקום name. הוא יכול להכיל רווחים וכל רישיות, והוא לא משמש למרחב שמות או לחיפוש.
בתוסף שהותקן מ-marketplace, displayName ברשומת ה-marketplace גובר על הערך הזה.
#version
מחרוזת גרסה, שלא נבדקת מול semver. הגדרתה מצמידה את התוסף לגרסה הזו עד שתשנה אותה. ראה גרסאות ועדכונים. תוסף עם מקור command, תוסף מ-marketplace שמתארח ב-claude.ai, ותוסף שנטען במקום מ-marketplace שנוסף מנתיב מקומי לא מוצמדים על ידי השדה הזה.
#metadata
אובייקט חופשי לנתונים שלך, כמו שדות קטלוג או זכאות. Claude Code לא קורא אותו. דורש Claude Code v2.1.222 או חדש יותר.
#שדות רישום במדריך
המדריך של Anthropic קורא את השדות icon, documentationUrl, supportUrl, privacyPolicyUrl ו-termsOfServiceUrl מ-plugin.json עבור הרישום של התוסף שלך כשאתה שולח את התוסף. Claude Code מתעלם מהם בזמן הטעינה. הגדר אותם רק ב-plugin.json. ברשומת marketplace, claude plugin validate מדווח על כל אחד מהם כשדה לא ידוע.
הגדר את icon לנתיב של קובץ תמונה בתוך התוסף, כמו ./logo.png, וכל אחד מארבעת שדות ה-URL לכתובת https://.
[!NOTE]
claude plugin validateלא מדווח על השדות האלה ב-plugin.jsonכלא ידועים ב-Claude Code v2.1.281 או חדש יותר. גרסאות קודמות מדפיסות אזהרתUnknown fieldלכל אחד מהם, ולכן הרצה עם--strictנכשלת בגרסאות האלה.
#defaultEnabled
האם התוסף מתחיל מופעל כשהמשתמש לא הגדיר אותו ב-enabledPlugins. ברירת המחדל היא true. תוסף שתוסף מופעל תלוי בו מתחיל מופעל בכל מקרה. אותו שדה ברשומת ה-marketplace דורס את זה.
אחרי שרשומת enabledPlugins של משתמש נכתבת, היא נשמרת לאורך עדכוני תוסף, ולכן שינוי defaultEnabled במהדורה מאוחרת יותר לא משנה את ההגדרה למשתמש קיים.
#dependencies
תוספים שחייבים להיות מופעלים כדי שהתוסף הזה יעבוד. כל רשומה היא "name", "name@marketplace", או { "name": "...", "marketplace": "...", "version": "..." }. שמות חשופים נפתרים מול ה-marketplace של התוסף הזה עצמו. ראה אילוצי תלות.
#settings
הגדרות ש-Claude Code מחיל בזמן שהתוסף מופעל. רק agent ו-subagentStatusLine נכנסים לתוקף. מפתחות אחרים מושמטים בטעינה. settings.json בשורש התוסף גובר על המפתח הזה. ראה הגדרות ברירת מחדל.
#צורות נתיב של רכיבים
כל מפתח רכיב מקבל נתיב יחסי לשורש התוסף. hooks, mcpServers, lspServers ו-experimental.monitors מקבלים גם הגדרה מוטמעת, commands מקבל גם מפת אובייקטים, ו-mcpServers מקבל גם נתיבי חבילת MCP וכתובות URL. הדוגמאות הבאות מציגות כל צורה מקובלת פעם אחת. למה שכל רכיב עושה בזמן ריצה, ראו רכיבי תוסף.
#שדות של נתיב בלבד
agents, skills, outputStyles, workflows ו-experimental.themes מקבלים נתיב אחד או מערך של נתיבים. רשומות agents חייבות להיות קבצי .md, ורשומות skills חייבות להיות ספריות. שלושת האחרים מקבלים ספרייה או קובץ.
{
"agents": ["./custom-agents/reviewer.md", "./custom-agents/tester.md"],
"skills": ["./extra-skills/", "."],
"outputStyles": "./styles/"
}#commands
commands מקבל נתיב, מערך של נתיבים, או מפת אובייקטים. נתיב מציין קובץ פקודה שטוח מסוג .md או ספרייה. במפת האובייקטים, כל מפתח הופך לשם הפקודה אחרי קידומת התוסף. לדוגמה, "about" בתוסף deploy-tools רץ כ-/deploy-tools:about.
כל ערך מגדיר בדיוק אחד מבין source או content, ורשומה שמגדירה את שניהם או אף אחד מהם נכשלת באימות. שאר השדות בטבלה הזו הם אופציונליים:
| שדה | סוג | תיאור |
|---|---|---|
source | string | נתיב לקובץ ה-Markdown של הפקודה, יחסית לשורש התוסף |
content | string | Markdown מוטמע לגוף הפקודה, במקום source |
description | string | תיאור שמוצג עבור הפקודה |
argumentHint | string | רמז לארגומנט שמוצג אחרי שם הפקודה, כגון [file] |
model | string | מודל ברירת המחדל עבור הפקודה |
allowedTools | array of strings | כלים שהפקודה רשאית להשתמש בהם בלי בקשת אישור |
המפה הזו מצהירה על פקודה אחת מקובץ ועל פקודה אחת מתוכן מוטמע:
{
"commands": {
"status": { "source": "./commands/status.md", "argumentHint": "[env]" },
"about": { "content": "Explain what this plugin provides." }
}
}#hooks
hooks מקבל נתיב לקובץ .json, אובייקט hooks מוטמע באותה צורה כמו hooks ב-settings.json, או מערך שמערבב את שניהם. לאירועי hook ולשדות מטפל, ראו את הפניית ה-hooks.
קובץ hooks עוטף את מפת האירועים במפתח "hooks" ברמה העליונה, הצורה ש-hooks/hooks.json משתמש בה. קובץ שמכיל רק את מפת האירועים, בלי העטיפה הזו, נכשל בטעינה. אובייקט מוטמע הוא מפת האירועים עצמה, בלי עטיפה.
Claude Code ממזג את מה שמצהירים עם hooks/hooks.json כשהקובץ הזה קיים. המערך הזה טוען קובץ hooks אחד ומצהיר על hook מוטמע אחד מסוג PostToolUse:
{
"hooks": [
"./config/extra-hooks.json",
{
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{ "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/format.sh" }
]
}
]
}
]
}הקובץ שהמערך מציין נושא את עטיפת "hooks" סביב מפת האירועים שלו:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/check-command.sh" }
]
}
]
}
}#mcpServers
mcpServers מקבל נתיב לקובץ .json, נתיב או URL של חבילת MCP, מפה מוטמעת, או מערך שמערבב אותם. לשדות הגדרת שרת, ראו שרתי MCP שמסופקים על ידי תוסף.
Claude Code טוען את .mcp.json בשורש התוסף תחילה, ואחר כך כל צורה מוצהרת לפי הסדר. שם שרת שמוצהר מאוחר יותר מחליף שם קודם.
ערך mcpServers מקבל אחת מהצורות האלה:
| צורה | ערך לדוגמה | מה Claude Code עושה |
|---|---|---|
נתיב לקובץ .json | "./mcp/servers.json" | קורא את הקובץ כמפת mcpServers |
| נתיב לחבילת MCP | "./bundle.mcpb" | מחלץ את חבילת .mcpb או .dxt אל .mcpb-cache/ מתחת לשורש התוסף וקורא את הגדרת השרת שלה |
| URL של חבילת MCP | "https://example.com/server.mcpb" | מוריד את החבילה אל .mcpb-cache/, ואז קורא אותה |
| מפה מוטמעת | { "deploy-api": { "command": "node", "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"] } } | משתמש במפה כהגדרות שרת לפי שם |
נתיב או URL של חבילה חייב להסתיים ב-.mcpb או .dxt. כל סיומת אחרת נכשלת באימות.
#lspServers
lspServers מקבל נתיב לקובץ .json, מפה מוטמעת משם שרת להגדרה, או מערך של אחד מהם.
Claude Code טוען את .lsp.json בשורש התוסף תחילה, ואחר כך כל הגדרה מוצהרת לפי הסדר. שם שרת שמוצהר מאוחר יותר מחליף שם קודם.
כל הגדרת שרת היא אובייקט קשיח עם השדות האלה. מפתח לא מוכר נכשל באימות.
| שדה | חובה | תיאור |
|---|---|---|
command | כן | קובץ ההרצה של שרת השפה. בלי רווחים, אלא אם הערך מתחיל ב-/. שים ארגומנטים ב-args |
extensionToLanguage | כן | מפה מסיומת קובץ למזהה שפה של LSP, לפחות רשומה אחת. מפתחות מתחילים בנקודה, כגון ".go" |
args | לא | ארגומנטים שמועברים לשרת |
transport | לא | תעבורת תקשורת: stdio (ברירת מחדל) או socket. Claude Code מקבל socket אבל מריץ כל שרת מעל stdio, ולכן כללי פרוטוקול stdout חלים על כל השרתים |
env | לא | משתני סביבה לתהליך השרת |
initializationOptions | לא | אפשרויות שנשלחות בבקשת initialize |
settings | לא | הגדרות שנשלחות על ידי workspace/didChangeConfiguration |
workspaceFolder | לא | נתיב תיקיית סביבת העבודה עבור השרת |
startupTimeout | לא | מילישניות להמתנה להפעלה, מספר שלם חיובי |
shutdownTimeout | לא | מילישניות להמתנה לכיבוי מסודר, מספר שלם חיובי. כשזמן ההמתנה חולף, Claude Code מסיים את תהליך השרת. כשהשדה לא מוגדר, לא חל זמן המתנה |
requestTimeout | לא | מילישניות להמתנה שהשרת יענה לבקשה, מספר שלם חיובי. ברירת המחדל היא 60000, ולכן בקשה שהשרת לא עונה לה נכשלת אחרי 60 שניות. דורש v2.1.288 או חדש יותר |
restartOnCrash | לא | האם להפעיל מחדש את השרת אחרי שהוא קורס. ברירת המחדל היא true. הגדר ל-false כדי להשאיר שרת שקרס עצור במקום להפעיל אותו מחדש |
maxRestarts | לא | ניסיונות הפעלה מחדש לפני ויתור, אפס או יותר |
diagnostics | לא | האם לדחוף אבחון אל ההקשר אחרי עריכות. ברירת המחדל היא true |
ההגדרה המוטמעת הזו מריצה את gopls עבור קבצי .go:
{
"lspServers": {
"go": {
"command": "gopls",
"args": ["serve"],
"extensionToLanguage": { ".go": "go" }
}
}
}לשרתי השפה ש-Anthropic מפרסמת כתוספים ולאופן שבו השרתים מתנהגים בזמן ריצה, ראו אינטליגנציית קוד.
#monitors
experimental.monitors מקבל נתיב לקובץ .json או את המערך המוטמע. כשמשמיטים את המפתח, Claude Code טוען את monitors/monitors.json אם הוא קיים.
כל רשומה היא אובייקט קשיח עם השדות האלה.
| שדה | חובה | תיאור |
|---|---|---|
name | כן | מזהה ייחודי בתוך התוסף |
command | כן | פקודת מעטפת ש-Claude Code מריץ כתהליך רקע מתמשך בתיקיית העבודה של הסשן |
description | כן | סיכום קצר שמוצג בלוח המשימות ובסיכומי ההתראות |
when | לא | עם "always", ברירת המחדל, המוניטור מתחיל בתחילת הסשן ובעת טעינה מחדש של התוסף. עם "on-skill-invoke:<skill>", הוא מתחיל בפעם הראשונה שהמיומנות הזו רצה |
המערך המוטמע הזה מצהיר על מוניטור אחד שמתחיל בפעם הראשונה שמיומנות deploy רצה:
{
"experimental": {
"monitors": [
{
"name": "deploy-status",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/poll-deploy.sh",
"description": "Deployment status changes",
"when": "on-skill-invoke:deploy"
}
]
}
}command של מוניטור לא יכול להפנות אל ${user_config.*}. ראו שדות שרצים דרך מעטפת.
#כללי נתיב
כל נתיב רכיב במניפסט הוא יחסי לשורש התוסף וחייב להתחיל ב-./. נתיב כגון commands/foo.md נכשל באימות. skills ו-mcpServers מקבלים כל אחד צורה אחת מחוץ לכלל הזה:
skills: מקבל גם".". גם"."וגם"./"מציינים את שורש התוסף. לפני v2.1.221,"."נכשל באימות המניפסט, ולכן השתמש ב-"./"כשהתוסף חייב להיטען בגרסאות מוקדמות יותרmcpServers: מקבל גם URL של חבילה מסוגhttps://
experimental.evals אינו נתיב רכיב, ולכן הכללים בסעיף הזה לא מכסים אותו, ו-claude plugin eval בודק את הערך כשהוא רץ. הוא מציין ספרייה מתחת לשורש התוסף, כגון "quality/evals", עם קידומת ./ או בלעדיה. עם מערך, רק הרשומה הראשונה בשימוש. למה שהערך מקבל ולמה שקורה עם ערך בלתי שמיש, ראו שימוש בספריית eval אחרת.
#הכלה וקיום
כל נתיב רכיב חייב להיפתר בתוך שורש התוסף וחייב להתקיים. claude plugin validate בודק את הנתיבים תחת כל מפתח רכיב:
- הכלה: נתיב שנפתר מחוץ לשורש התוסף לא נטען, ולשונית Errors של
/pluginמציגה<component> path escapes plugin directory: <path>. נתיב שמכיל..הוא המקרה הרגיל, ו-claude plugin validateמדווח על השגיאהPath contains ".." which could be a path traversal attempt - קיום: נתיב שלא קיים לא נטען, ולשונית Errors של
/pluginמציגה<component> path not found: <path>.claude plugin validateמדווח על השגיאהPath not found
עבור נתיבי outputStyles, lspServers, monitors ו-themes, הבדיקה של claude plugin validate דורשת Claude Code v2.1.283 או חדש יותר.
#איך כל מפתח משתלב עם מיקום ברירת המחדל שלו
כל מפתח רכיב מחליף את מיקום ברירת המחדל שלו, מוסיף אליו, או מתמזג איתו:
- מחליף את ברירת המחדל:
commands,agents,outputStyles,workflows,experimental.themes,experimental.monitors. כשמגדירים אתcommands, ספריית ברירת המחדלcommands/לא נסרקת. כדי לשמור את ברירת המחדל ולהוסיף עוד, פרט אותה במפורש:"commands": ["./commands/", "./extras/"] - מוסיף לברירת המחדל:
skills. ספרייתskills/עדיין נסרקת, והספריות שברשימה נטענות לצידה - מתמזג:
hooks,mcpServers,lspServers. קובץ ברירת המחדל נטען תחילה, ומה שהמניפסט מצהיר מתמזג לתוכו, כפי שמתואר תחת צורות נתיב של רכיבים
אם לתוסף יש תיקיית ברירת מחדל כגון commands/ והוא גם מגדיר את מפתח המניפסט שמחליף אותה, Claude Code טוען את נתיבי המניפסט, והתיקייה לא נטענת. claude plugin list וממשק /plugin מציגים אז את האזהרה Default <folder>/ folder is ignored because the manifest sets "<key>".
כדי להימנע מהאזהרה, הגדר את המפתח לנתיב בתוך התיקייה הזו: "commands": ["./commands/deploy.md"] מציין קובץ בתיקיית ברירת המחדל, בלי אזהרה.
#הגדרת משתמש
userConfig מצהיר על ערכים ש-Claude Code מבקש מהמשתמש כשהתוסף מופעל, כדי שמשתמשים לא יערכו את settings.json בעצמם.
מפתחות הם מזהים שמורכבים מאותיות, ספרות וקווים תחתונים, ולא יכולים להתחיל בספרה.
כל ערך הוא אובייקט קשיח עם השדות האלה. מפתח לא מוכר נכשל באימות.
| שדה | חובה | תיאור |
|---|---|---|
type | כן | אחד מבין string, number, boolean, directory או file |
title | כן | תווית שמוצגת בחלון ההגדרה |
description | כן | טקסט עזרה שמוצג מתחת לשדה |
required | לא | אם true, חלון ההגדרה לא מקבל ערך ריק |
default | לא | ערך שבשימוש כשהמשתמש לא מספק כלום: מחרוזת, מספר, בוליאני, או מערך של מחרוזות |
options | לא | עבור string, הערכים שהשדה מקבל, שמוצגים כבורר ב-/config. ראו הגבלת שדה לאפשרויות קבועות. דורש Claude Code v2.1.271 או חדש יותר |
multiple | לא | עבור string, מאפשר מערך של מחרוזות |
sensitive | לא | אם true, מסווה את הקלט ושומר את הערך באחסון מאובטח, לא ב-settings.json |
min / max | לא | גבולות עבור number |
כל אפשרות של כל תוסף מופעל מופיעה גם כשורה בלוח /config, חוץ מאפשרויות sensitive ורשימות multiple. שורות /config דורשות Claude Code v2.1.269 או חדש יותר.
userConfig הזה מצהיר על נקודת קצה ועל אסימון מוסווה:
{
"userConfig": {
"api_endpoint": {
"type": "string",
"title": "API endpoint",
"description": "Your team's API endpoint"
},
"api_token": {
"type": "string",
"title": "API token",
"description": "API authentication token",
"sensitive": true
}
}
}#הגבלת שדה לאפשרויות קבועות
הגדר options על שדה userConfig כדי שמשתמשים יבחרו את הערך שלו מרשימה קבועה.
כדי להגביל שדה tone לשלוש אפשרויות, פרט אותן ב-options והגדר את default לאחת מהן:
{
"userConfig": {
"tone": {
"type": "string",
"title": "Tone",
"description": "Voice for generated replies",
"options": ["neutral", "warm", "formal"],
"default": "neutral"
}
}
}אם מצהירים על options בכל שדה, משתמשים בגרסאות Claude Code שלפני v2.1.271 לא יכולים לטעון את התוסף.
options חל על שדה string שאינו multiple או sensitive. הגדר את default לאחד מהערכים שברשימה, או הגדר required: true כדי שהמשתמש חייב לבחור אחד. כל אפשרות היא תווית פשוטה של 1 עד 64 תווים, ו-claude plugin validate, שמריצים במעטפת, מדווח על כל דבר אחר שהוא דוחה. תוסף ש-options שלו שובר את הכללים האלה נכשל בטעינה.
#איפה הערכים נשמרים
ערכים שאינם רגישים נשמרים תחת pluginConfigs ב-settings.json של המשתמש. ערכים רגישים נשמרים במאגר האישורים המאובטח של הפלטפורמה. עמוד ההגדרות מפרט מאילו קבצי הגדרות נקרא pluginConfigs.
#הפניה לערך שמור
הפנה לערך שמור במקום שבו התוסף צריך אותו, באחת משתי צורות:
${user_config.KEY}: מוחלף בהגדרת שרת MCP, בהגדרת שרת LSP, ב-argsשל hook ב-צורת exec, ובתוכן של מיומנות וסוכן. בתוכן של מיומנות וסוכן, רק ערכים שאינם רגישים מוחלפים, וערך רגיש שם הופך למציין מקוםCLAUDE_PLUGIN_OPTION_<KEY>: מיוצא לתהליכי hook עבור כל אפשרות, כש-<KEY>באותיות גדולות. hook בצורת מעטפת קורא את$CLAUDE_PLUGIN_OPTION_API_TOKENעבורapi_token
#שדות שרצים דרך מעטפת
פקודות hook בצורת מעטפת, פקודות מוניטור, ו-headersHelper של MCP דוחים את ${user_config.*}. רכיב שמפנה אליו באחד מהשדות האלה נכשל עם שגיאה ולא רץ, כי ערך השדה מועבר למעטפת שהייתה מנתחת מחדש את הערך המוחלף.
הטבלה מראה איך הערך יכול להגיע לכל אחד מהשדות האלה.
| שדה | איך הערך יכול להגיע אליו |
|---|---|
| פקודות hook בצורת מעטפת | השתמש ב-צורת exec עם args, או קרא את CLAUDE_PLUGIN_OPTION_<KEY> מסביבת ה-hook |
| פקודות מוניטור | לא דרך Claude Code. תהליכי מוניטור לא מקבלים את CLAUDE_PLUGIN_OPTION_<KEY>, ולכן סקריפט המוניטור צריך להשיג את הערך בעצמו |
headersHelper של MCP | לא דרך Claude Code. הסביבה של העוזר נושאת את CLAUDE_PLUGIN_ROOT, CLAUDE_CODE_MCP_SERVER_NAME ו-CLAUDE_CODE_MCP_SERVER_URL אבל בלי ערכי אפשרויות, ולכן סקריפט העוזר צריך להשיג את הערך בעצמו |
#ערוצים
channels מצהיר על ערוצי ההודעות שתוסף מספק, כגון גשר לאפליקציית צ'אט. כשמצהירים על אחד, Claude Code יכול לבקש את הגדרת הערוץ כשהתוסף מופעל. לאופן שבו השרת מזריק הודעות, ראו את הפניית הערוצים.
כל רשומה היא אובייקט קשיח שקשור לאחד משרתי ה-MCP של התוסף, עם השדות האלה:
| שדה | חובה | תיאור |
|---|---|---|
server | כן | מפתח של שרת ה-MCP ב-mcpServers של התוסף הזה שהערוץ נקשר אליו |
displayName | לא | שם שמוצג בכותרת חלון ההגדרה. ברירת המחדל היא שם השרת |
userConfig | לא | אפשרויות לבקש, באותה צורה כמו userConfig ברמה העליונה. ערכים שמורים מוחלפים בהפניות ${user_config.KEY} ב-env של השרת |
המניפסט הזה קושר ערוץ לשרת ה-MCP telegram של התוסף ומבקש אסימון בוט שמוחלף ב-env של השרת:
{
"mcpServers": {
"telegram": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/server.js"],
"env": { "BOT_TOKEN": "${user_config.bot_token}" }
}
},
"channels": [
{
"server": "telegram",
"displayName": "Telegram",
"userConfig": {
"bot_token": {
"type": "string",
"title": "Bot token",
"description": "Telegram bot token",
"sensitive": true
}
}
}
]
}#משתני סביבה
קלוד קוד מספק שלושה משתני נתיב לרכיבי תוסף. הפנו אליהם כ-${NAME} בשדות שמפורטים תחת איפה כל משתנה נפתר, וקראו אותם כמשתני סביבה בתהליכים שמקבלים אותם.
| משתנה | נפתר אל | שימוש |
|---|---|---|
${CLAUDE_PLUGIN_ROOT} | הנתיב המוחלט של גרסת התוסף המותקנת | סקריפטים, קבצים בינאריים וקבצי הגדרות שמגיעים עם התוסף |
${CLAUDE_PLUGIN_DATA} | ~/.claude/plugins/data/<id>/, נוצרת בהפניה הראשונה ונשמרת בין עדכוני תוסף. <id> הוא מזהה התוסף, ובו כל תו שאינו אות, ספרה, _ או - מוחלף ב-- | תלויות מותקנות כגון node_modules, קוד שנוצר ומטמונים |
${CLAUDE_PROJECT_DIR} | שורש הפרויקט | סקריפטים וקבצי הגדרות מקומיים לפרויקט |
${CLAUDE_PLUGIN_ROOT} משתנה כשהתוסף מתעדכן, ולכן אל תכתבו שם מצב. למידע על המקום שאליו השורש עובר ומתי הספרייה הישנה מנוקה, ראו את דף הטעינה.
כברירת מחדל, קלוד קוד מוחק את ספריית ${CLAUDE_PLUGIN_DATA} כשמסירים את התוסף מהמקום האחרון שבו הוא מותקן. לגבי --keep-data והמקרים האחרים שבהם היא נשארת, ראו הסרת תוסף.
#איפה כל משתנה נפתר
בכל רכיב תוסף, הפניות ${...} נפתרות בתוך השורה בשדות מסוימים, וחלק מהרכיבים גם מקבלים את המשתנים בסביבת התהליך שלהם:
| רכיב תוסף | שדות שבהם ${...} נפתר | מיוצא לתהליך |
|---|---|---|
| פקודות hook | בכל מקום ב-command וב-args | CLAUDE_PLUGIN_ROOT, CLAUDE_PLUGIN_DATA, CLAUDE_PROJECT_DIR ו-CLAUDE_PLUGIN_OPTION_<KEY> |
| פקודות monitor | בכל מקום ב-command | לא מיוצא |
שרתי MCP מסוג stdio | command, args, env | CLAUDE_PLUGIN_ROOT, CLAUDE_PLUGIN_DATA, CLAUDE_PROJECT_DIR |
שרתי MCP מסוג http, sse, ws | url, headers, headersHelper | לא רלוונטי |
| שרתי LSP | command, args, env, workspaceFolder | CLAUDE_PLUGIN_ROOT, CLAUDE_PLUGIN_DATA, CLAUDE_PROJECT_DIR |
| תוכן skill, command ו-agent | בכל מקום בגוף ה-Markdown | לא רלוונטי |
המשתנים אינם נוכחים בסביבה של פקודות שקלוד מריץ דרך כלי Bash, בסשן הראשי או בסוכן משנה. בתוכן של skill, command ו-agent, כתבו את ההפניה ${...} בגוף ה-Markdown, וקלוד קוד מחליף את הנתיב בתוך השורה כשהוא טוען את התוכן.
#ציטוט ומפרידי נתיב
שמרו על כל נתיב מוחלף כארגומנט יחיד:
- פקודות hook: השתמשו ב-צורת exec עם
args, כך שכל נתיב הוא ארגומנט אחד בלי ציטוט - hooks בצורת shell ופקודות monitor: עטפו את המשתנה במירכאות כפולות, כדי שנתיב עם רווחים יישאר מילה אחת
אם משאירים אחד מהמשתנים האלה מחוץ למירכאות בפקודה בצורת shell בקובץ hooks, claude plugin validate מזהיר על כך, אלא אם ה-hook מגדיר את shell ל-"powershell".
ה-hook הזה בצורת shell מריץ סקריפט שמגיע עם התוסף:
{
"hooks": {
"PostToolUse": [
{
"hooks": [
{
"type": "command",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/process.sh"
}
]
}
]
}
}ב-Windows, רוב הנתיבים המוחלפים משתמשים בלוכסנים קדמיים, כמו ב-C:/Users/you/.... הם שומרים על הלוכסנים האחוריים המקוריים שלהם ב-hook בצורת exec וב-hook שרץ דרך PowerShell, שהיא מעטפת ברירת המחדל ב-Windows כש-Git Bash אינו מותקן.
#פריסה סטנדרטית
לכל סוג רכיב יש מיקום ברירת מחדל מתחת לשורש התוסף, שנעשה בו שימוש כשהמניפסט לא מצביע למקום אחר.
| רכיב | מיקום ברירת מחדל | תוכן |
|---|---|---|
| מניפסט | .claude-plugin/plugin.json | מטא-נתונים והגדרות של התוסף. אופציונלי |
| Skills | skills/ | קובץ <name>/SKILL.md אחד לכל skill. תוסף עם SKILL.md בשורש שלו, בלי skills/, ובלי מפתח skills נטען כ-skill יחיד |
| Commands | commands/ | קבצי פקודה שטוחים ב-Markdown. העדיפו skills/ לתוספים חדשים |
| Agents | agents/ | קבצי Markdown של agent. תת-תיקיות הן חלק משם ה-agent |
| Hooks | hooks/hooks.json | הגדרת hooks |
| שרתי MCP | .mcp.json | הגדרות שרתי MCP |
| שרתי LSP | .lsp.json | הגדרות שרתי LSP |
| סגנונות פלט | output-styles/ | קבצי Markdown של סגנון פלט |
| Workflows | workflows/ | קבצי .js של workflow |
| ערכות נושא | themes/ | קבצי JSON של ערכת נושא |
| Monitors | monitors/monitors.json | מערך ה-monitors |
| קבצים להרצה | bin/ | הקבצים כאן נמצאים ב-PATH של כלי Bash בזמן שהתוסף מופעל, ולכן קלוד מריץ אותם כפקודות לפי שם בלבד. claude.ai ו-Cowork לא מתקינים תוסף שיש לו את הספרייה הזו, כולל תוסף שאתם מפיצים דרך הגדרות ארגון של claude.ai |
| הגדרות | settings.json | ברירות מחדל של agent ו-subagentStatusLine שחלות בזמן שהתוסף מופעל |
תוסף שמשתמש בכל מיקום ברירת מחדל, ובנוסף בתיקיית scripts/ שה-hooks שלו קוראים לה, פרוס כך:
deploy-tools/
├── .claude-plugin/
│ └── plugin.json
├── skills/
│ └── deploy/
│ └── SKILL.md
├── commands/
│ └── status.md
├── agents/
│ └── reviewer.md
├── hooks/
│ └── hooks.json
├── monitors/
│ └── monitors.json
├── output-styles/
│ └── terse.md
├── themes/
│ └── dracula.json
├── workflows/
│ └── release-audit.js
├── bin/
│ └── deploy-tool
├── scripts/
│ └── format.sh
├── settings.json
├── .mcp.json
└── .lsp.jsonכדי לעבור על הפריסה הזו ולקרוא מה כל קובץ עושה, פתחו את סייר התוספים.
CLAUDE.md בשורש התוסף אינו נטען כהקשר, ו-claude plugin validate מזהיר כשהוא מוצא אחד. כדי לכלול הוראות שנטענות להקשר של קלוד, שימו אותן ב-skill.
#רשומות marketplace והמניפסט
רשומת marketplace מקבלת שדות משלה, כולל strict, וכל שדה בדף הזה חוץ משדות רשימת הספריות.
שדה strict קובע אם הרשומה רשאית להוסיף רכיבים לתוסף שיש לו plugin.json משלו. ברירת המחדל היא true.
#איך שדות הרשומה משתלבים עם plugin.json
הרשומה משמשת כמניפסט, מוסיפה אליו רכיבים, או מתנגשת איתו:
- אין
plugin.json: הרשומה היא המניפסט, בלי קשר ל-strict.hooksשל הרשומה נטען רק בצורת אובייקט בתוך השורה. עבור נתיב קובץ או מערך שם, לשונית Errors של/pluginמציגה שגיאהnot yet supported in a marketplace entry plugin.jsonקיים,strictלא מוגדר אוtrue: קלוד קוד טוען את המניפסט ומצרף אליו אתcommands,agents,skills,outputStylesו-themesשל הרשומה. עבורhooks, ה-matchers של הרשומה לאירוע מחליפים את ה-matchers של המניפסט לאותו אירוע, ואירועים שרק המניפסט מצהיר עליהם שומרים על שלהםplugin.jsonקיים,strict: false: רשומה שמצהירה על אחד מ-commands,agents,skills,hooks,outputStylesאוthemesהיא התנגשות, והתוסף נכשל בטעינה עםPlugin <name> has conflicting manifests
כשרשומת marketplace ש-source שלה הוא שורש ה-marketplace מפרטת תת-ספריות skills מסוימות, רק תת-הספריות האלה נטענות, וספריית skills/ שברירת המחדל של התוסף אינה נסרקת. מפתח skills במניפסט במקום זאת מוסיף לברירת המחדל.
#קדימות מטא-נתונים
לחלק משדות המטא-נתונים יש קדימות קבועה בלי קשר ל-strict:
defaultEnabledושדות תצוגה:defaultEnabledשל הרשומה ושדות התצוגה שלה, כגוןdisplayName, גוברים על אלה של המניפסטversion:versionשל המניפסט גובר על זה של הרשומהname: כשהרשומה מפרטת את התוסף תחתnameשונה מזה של המניפסט,enabledPluginsמשתמש בשם הרשומה, והרכיבים מקבלים מרחב שמות תחת שם המניפסט
לטבלת הקדימות המלאה, ראו מצב strict.
#הצעדים הבאים
- הוספת רכיבים לתוסף: מה כל רכיב עושה בזמן ריצה, עם דוגמה שעוברת אימות
- הפניית marketplace: שדות הרשומה ש-marketplace יכול להגדיר לתוסף שלכם
- הפניית פקודות תוסף: דגלים ופלט של
claude plugin validate - פתרון בעיות בתוספים: כל הודעת אימות עם התיקון שלה