6 6
7> Fügen Sie Skills, Hooks, MCP-Server und alle anderen Komponententypen zu einem Claude Code-Plugin hinzu, mit einem Beispiel, das für jeden validiert.7> Fügen Sie Skills, Hooks, MCP-Server und alle anderen Komponententypen zu einem Claude Code-Plugin hinzu, mit einem Beispiel, das für jeden validiert.
8 8
9export const Piece = ({id, children}) => <div className="pe-piece" data-piece={id}>{children}</div>;
10
11export const PluginExplorer = ({children}) => {
12 const PIECES = [{
13 id: 'manifest',
14 name: 'Manifest',
15 path: '.claude-plugin/plugin.json',
16 lines: [{
17 depth: 0,
18 kind: 'folder',
19 text: '.claude-plugin/'
20 }, {
21 depth: 1,
22 kind: 'file',
23 text: 'plugin.json'
24 }],
25 href: '/en/plugins/manifest-reference#manifest-file',
26 linkText: 'Go to the manifest reference'
27 }, {
28 id: 'skills',
29 name: 'Skills',
30 path: 'skills/review/SKILL.md',
31 lines: [{
32 depth: 0,
33 kind: 'folder',
34 text: 'skills/'
35 }, {
36 depth: 1,
37 kind: 'folder',
38 text: 'review/'
39 }, {
40 depth: 2,
41 kind: 'file',
42 text: 'SKILL.md'
43 }],
44 href: '/en/plugins/components#skills',
45 linkText: 'Go to the Skills section'
46 }, {
47 id: 'commands',
48 name: 'Commands',
49 path: 'commands/about.md',
50 lines: [{
51 depth: 0,
52 kind: 'folder',
53 text: 'commands/'
54 }, {
55 depth: 1,
56 kind: 'file',
57 text: 'about.md'
58 }],
59 href: '/en/plugins/components#commands',
60 linkText: 'Go to the Commands section'
61 }, {
62 id: 'agents',
63 name: 'Agents',
64 path: 'agents/security-reviewer.md',
65 lines: [{
66 depth: 0,
67 kind: 'folder',
68 text: 'agents/'
69 }, {
70 depth: 1,
71 kind: 'file',
72 text: 'security-reviewer.md'
73 }],
74 href: '/en/plugins/components#agents',
75 linkText: 'Go to the Agents section'
76 }, {
77 id: 'hooks',
78 name: 'Hooks',
79 path: 'hooks/hooks.json',
80 lines: [{
81 depth: 0,
82 kind: 'folder',
83 text: 'hooks/'
84 }, {
85 depth: 1,
86 kind: 'file',
87 text: 'hooks.json'
88 }],
89 href: '/en/plugins/components#hooks',
90 linkText: 'Go to the Hooks section'
91 }, {
92 id: 'monitors',
93 name: 'Monitors',
94 path: 'monitors/monitors.json',
95 lines: [{
96 depth: 0,
97 kind: 'folder',
98 text: 'monitors/'
99 }, {
100 depth: 1,
101 kind: 'file',
102 text: 'monitors.json'
103 }],
104 href: '/en/plugins/components#monitors',
105 linkText: 'Go to the Monitors section'
106 }, {
107 id: 'output-styles',
108 name: 'Output styles',
109 path: 'output-styles/terse.md',
110 lines: [{
111 depth: 0,
112 kind: 'folder',
113 text: 'output-styles/'
114 }, {
115 depth: 1,
116 kind: 'file',
117 text: 'terse.md'
118 }],
119 href: '/en/plugins/components#themes-and-output-styles',
120 linkText: 'Go to the Themes and output styles section'
121 }, {
122 id: 'themes',
123 name: 'Themes',
124 path: 'themes/dracula.json',
125 lines: [{
126 depth: 0,
127 kind: 'folder',
128 text: 'themes/'
129 }, {
130 depth: 1,
131 kind: 'file',
132 text: 'dracula.json'
133 }],
134 href: '/en/plugins/components#themes-and-output-styles',
135 linkText: 'Go to the Themes and output styles section'
136 }, {
137 id: 'workflows',
138 name: 'Workflows',
139 path: 'workflows/audit-routes.js',
140 lines: [{
141 depth: 0,
142 kind: 'folder',
143 text: 'workflows/'
144 }, {
145 depth: 1,
146 kind: 'file',
147 text: 'audit-routes.js'
148 }],
149 href: '/en/workflows#distribute-a-workflow-in-a-plugin',
150 linkText: 'Go to Distribute a workflow in a plugin'
151 }, {
152 id: 'bin',
153 name: 'Executables',
154 path: 'bin/hello-plugin',
155 lines: [{
156 depth: 0,
157 kind: 'folder',
158 text: 'bin/'
159 }, {
160 depth: 1,
161 kind: 'file',
162 text: 'hello-plugin'
163 }],
164 href: '/en/plugins/components#executables',
165 linkText: 'Go to the Executables section'
166 }, {
167 id: 'scripts',
168 name: 'Scripts',
169 path: 'scripts/format.sh',
170 lines: [{
171 depth: 0,
172 kind: 'folder',
173 text: 'scripts/'
174 }, {
175 depth: 1,
176 kind: 'file',
177 text: 'format.sh'
178 }],
179 href: '/en/plugins/components#hooks',
180 linkText: 'Go to the Hooks section'
181 }, {
182 id: 'settings',
183 name: 'Default settings',
184 path: 'settings.json',
185 lines: [{
186 depth: 0,
187 kind: 'file',
188 text: 'settings.json'
189 }],
190 href: '/en/plugins/components#default-settings',
191 linkText: 'Go to the Default settings section'
192 }, {
193 id: 'mcp',
194 name: 'MCP servers',
195 path: '.mcp.json',
196 lines: [{
197 depth: 0,
198 kind: 'file',
199 text: '.mcp.json'
200 }],
201 href: '/en/plugins/components#mcp-servers',
202 linkText: 'Go to the MCP servers section'
203 }, {
204 id: 'lsp',
205 name: 'LSP servers',
206 path: '.lsp.json',
207 lines: [{
208 depth: 0,
209 kind: 'file',
210 text: '.lsp.json'
211 }],
212 href: '/en/plugins/components#lsp-servers',
213 linkText: 'Go to the LSP servers section'
214 }];
215 const [selectedId, setSelectedId] = useState('manifest');
216 const [isFullscreen, setIsFullscreen] = useState(false);
217 const rootRef = useRef(null);
218 useEffect(() => {
219 const onFsChange = () => setIsFullscreen(!!document.fullscreenElement);
220 document.addEventListener('fullscreenchange', onFsChange);
221 return () => document.removeEventListener('fullscreenchange', onFsChange);
222 }, []);
223 const toggleFullscreen = () => {
224 if (!rootRef.current) return;
225 if (document.fullscreenElement) document.exitFullscreen(); else rootRef.current.requestFullscreen().catch(() => {});
226 };
227 const selected = PIECES.find(p => p.id === selectedId) || PIECES[0];
228 const onTreeKeyDown = e => {
229 const keys = ['ArrowDown', 'ArrowUp', 'Home', 'End'];
230 if (keys.indexOf(e.key) === -1) return;
231 const i = PIECES.findIndex(p => p.id === selectedId);
232 let next = i;
233 if (e.key === 'ArrowDown') next = Math.min(PIECES.length - 1, i + 1);
234 if (e.key === 'ArrowUp') next = Math.max(0, i - 1);
235 if (e.key === 'Home') next = 0;
236 if (e.key === 'End') next = PIECES.length - 1;
237 e.preventDefault();
238 if (next === i) return;
239 const id = PIECES[next].id;
240 setSelectedId(id);
241 const el = document.getElementById('pe-node-' + id);
242 if (el) el.focus();
243 };
244 const FolderIcon = () => <svg className="pe-icon" width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinejoin="round" aria-hidden="true">
245 <path d="M1.5 4.5a1 1 0 0 1 1-1h3.2l1.3 1.5h6a1 1 0 0 1 1 1V12a1 1 0 0 1-1 1h-10.5a1 1 0 0 1-1-1z" />
246 </svg>;
247 const FileIcon = () => <svg className="pe-icon" width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinejoin="round" aria-hidden="true">
248 <path d="M4 1.5h5.5L13 5v9.5H4z" />
249 <path d="M9.5 1.5V5H13" />
250 </svg>;
251 return <div ref={rootRef} className={isFullscreen ? 'pe-root pe-fullscreen not-prose' : 'pe-root not-prose'} data-selected={selected.id}>
252 <style>{`
253 .pe-root {
254 --pe-mono: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
255 --pe-accent: #D97757;
256 --pe-accent-text: #A8502F;
257 --pe-accent-bg: rgba(217,119,87,0.10);
258 --pe-bg: #FFFFFF;
259 --pe-surface: #FAFAF7;
260 --pe-hover: #F0EEE6;
261 --pe-border: #E8E6DC;
262 --pe-text: #141413;
263 --pe-text-2: #3D3D3A;
264 --pe-text-3: #5E5D59;
265 font-family: inherit;
266 background: var(--pe-bg);
267 color: var(--pe-text);
268 border: 1px solid var(--pe-border);
269 border-radius: 12px;
270 margin: 1.5rem 0;
271 overflow: hidden;
272 box-sizing: border-box;
273 }
274 .dark .pe-root {
275 --pe-accent-text: #EBA98F;
276 --pe-accent-bg: rgba(217,119,87,0.18);
277 --pe-bg: #1A1918;
278 --pe-surface: #232221;
279 --pe-hover: #2E2D2B;
280 --pe-border: #3A3936;
281 --pe-text: #F1EFE9;
282 --pe-text-2: #D6D4CA;
283 --pe-text-3: #B8B5AD;
284 }
285 .pe-root *, .pe-root *::before, .pe-root *::after { box-sizing: border-box; }
286 .pe-head { display: flex; align-items: flex-start; gap: 12px; padding: 18px 24px 16px; border-bottom: 1px solid var(--pe-border); }
287 .pe-head-text { flex: 1; min-width: 0; }
288 .pe-fs-btn { flex-shrink: 0; width: 32px; height: 32px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--pe-border); border-radius: 6px; background: var(--pe-surface); color: var(--pe-text-2); font-size: 15px; line-height: 1; cursor: pointer; }
289 .pe-fs-btn:hover { background: var(--pe-hover); }
290 .pe-fs-btn:focus-visible { outline: 2px solid var(--pe-accent); outline-offset: 2px; }
291 .pe-fullscreen { border-radius: 0; height: 100vh; display: flex; flex-direction: column; overflow: auto; }
292 .pe-fullscreen .pe-body { flex: 1; }
293 .pe-title { font-size: 19px; font-weight: 600; line-height: 1.3; color: var(--pe-text); margin: 0; }
294 .pe-sub { font-size: 15px; line-height: 1.5; color: var(--pe-text-3); margin: 4px 0 0; }
295 .pe-sub code { font-family: var(--pe-mono); font-size: 0.88em; padding: 1px 5px; border-radius: 4px; background: var(--pe-surface); border: 1px solid var(--pe-border); }
296 .pe-body { display: flex; align-items: stretch; }
297 .pe-tree-pane { width: 270px; flex-shrink: 0; background: var(--pe-surface); border-right: 1px solid var(--pe-border); padding: 16px 0 12px; }
298 .pe-panel { flex: 1; min-width: 0; padding: 16px 24px 24px; }
299 .pe-caption { font-size: 13px; font-weight: 600; color: var(--pe-text-3); margin: 0 0 10px; }
300 .pe-tree-pane .pe-caption { padding: 0 16px; }
301 .pe-rootline { display: flex; align-items: center; gap: 7px; padding: 3px 16px; font-family: var(--pe-mono); font-size: 13.5px; color: var(--pe-text-3); }
302 .pe-node {
303 display: block; width: 100%; margin: 0; padding: 3px 16px 3px 30px; text-align: left; cursor: pointer;
304 background: transparent; color: var(--pe-text-2);
305 border: none; border-left: 3px solid transparent;
306 font-family: var(--pe-mono); font-size: 13.5px; line-height: 1.4;
307 }
308 .pe-node:hover { background: var(--pe-hover); }
309 .pe-node:focus-visible { outline: 2px solid var(--pe-accent); outline-offset: -2px; }
310 .pe-node[aria-pressed="true"] { background: var(--pe-accent-bg); border-left-color: var(--pe-accent); color: var(--pe-accent-text); font-weight: 600; }
311 .pe-line { display: flex; align-items: center; gap: 7px; padding: 2px 0; }
312 .pe-line-tree { flex-wrap: wrap; }
313 .pe-line-tree .pe-req { flex-basis: 100%; margin: 2px 0 0 22px; white-space: normal; width: fit-content; max-width: calc(100% - 22px); }
314 .pe-line span { overflow-wrap: anywhere; }
315 .pe-piece { display: none; font-size: 16px; line-height: 1.6; color: var(--pe-text-2); }
316 .pe-root[data-selected="manifest"] .pe-piece[data-piece="manifest"],
317 .pe-root[data-selected="skills"] .pe-piece[data-piece="skills"],
318 .pe-root[data-selected="commands"] .pe-piece[data-piece="commands"],
319 .pe-root[data-selected="agents"] .pe-piece[data-piece="agents"],
320 .pe-root[data-selected="hooks"] .pe-piece[data-piece="hooks"],
321 .pe-root[data-selected="monitors"] .pe-piece[data-piece="monitors"],
322 .pe-root[data-selected="output-styles"] .pe-piece[data-piece="output-styles"],
323 .pe-root[data-selected="themes"] .pe-piece[data-piece="themes"],
324 .pe-root[data-selected="workflows"] .pe-piece[data-piece="workflows"],
325 .pe-root[data-selected="bin"] .pe-piece[data-piece="bin"],
326 .pe-root[data-selected="scripts"] .pe-piece[data-piece="scripts"],
327 .pe-root[data-selected="settings"] .pe-piece[data-piece="settings"],
328 .pe-root[data-selected="mcp"] .pe-piece[data-piece="mcp"],
329 .pe-root[data-selected="lsp"] .pe-piece[data-piece="lsp"] { display: block; }
330 .pe-piece p { margin: 0 0 10px; }
331 .pe-piece p:last-child { margin-bottom: 0; }
332 .pe-piece code { font-family: var(--pe-mono); font-size: 0.88em; padding: 1px 5px; border-radius: 4px; background: var(--pe-surface); border: 1px solid var(--pe-border); }
333 .pe-piece .code-block { margin: 12px 0 0; }
334 .pe-piece pre code { padding: 0; border: none; background: none; }
335 .pe-piece a { color: var(--pe-accent-text); }
336 .pe-line-compact { display: none; }
337 .pe-icon { flex-shrink: 0; }
338 .pe-req { margin-left: 8px; padding: 0 6px; border-radius: 999px; font-size: 11px; line-height: 18px; letter-spacing: .02em; color: var(--pe-accent-text); border: 1px solid var(--pe-border); background: var(--pe-surface); white-space: nowrap; font-weight: 500; vertical-align: middle; }
339 .pe-name { font-size: 22px; font-weight: 600; line-height: 1.25; letter-spacing: -0.2px; color: var(--pe-text); margin: 0; }
340 .pe-path { font-family: var(--pe-mono); font-size: 13.5px; color: var(--pe-accent-text); margin: 4px 0 0; overflow-wrap: anywhere; }
341 .pe-block { margin: 20px 0 0; }
342 .pe-link {
343 display: inline-block; margin: 24px 0 0; padding: 8px 14px; border-radius: 8px;
344 font-size: 14.5px; font-weight: 600; text-decoration: none;
345 color: var(--pe-accent-text); background: var(--pe-accent-bg); border: 1px solid var(--pe-accent);
346 }
347 .pe-link:hover { filter: brightness(0.97); }
348 .pe-link:focus-visible { outline: 2px solid var(--pe-accent); outline-offset: 2px; }
349 @media (max-width: 700px) {
350 .pe-head { padding: 16px 16px 14px; }
351 .pe-body { flex-direction: column; }
352 .pe-tree-pane { width: 100%; border-right: none; border-bottom: 1px solid var(--pe-border); }
353 .pe-line-tree { display: none; }
354 .pe-line-compact { display: flex; }
355 .pe-panel { padding: 16px 16px 20px; }
356 }
357 `}</style>
358
359 <div className="pe-head">
360 <div className="pe-head-text">
361 <div className="pe-title">What goes in a plugin</div>
362 <div className="pe-sub">This example plugin, <code>my-plugin</code>, has one of every kind of component, each in its default location. Select a file or folder to read what it’s for and see what goes in it.</div>
363 </div>
364 <button type="button" className="pe-fs-btn" onClick={toggleFullscreen} aria-label={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'} title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}>
365 {isFullscreen ? '⤡' : '⛶'}
366 </button>
367 </div>
368
369 <div className="pe-body">
370 <div className="pe-tree-pane">
371 <div className="pe-caption" id="pe-tree-caption">Plugin directory</div>
372 <div role="group" aria-labelledby="pe-tree-caption" onKeyDown={onTreeKeyDown}>
373 <div className="pe-rootline"><FolderIcon /><span>my-plugin/</span></div>
374 {PIECES.map(p => <button key={p.id} id={'pe-node-' + p.id} type="button" className="pe-node" aria-pressed={p.id === selected.id} aria-label={p.name + ', ' + p.path} onClick={() => setSelectedId(p.id)}>
375 {p.lines.map((line, i) => <span key={i} className="pe-line pe-line-tree" style={{
376 paddingLeft: line.depth * 18 + 'px'
377 }}>
378 {line.kind === 'folder' ? <FolderIcon /> : <FileIcon />}
379 <span>{line.text}</span>
380 {p.required && i === p.lines.length - 1 ? <span className="pe-req">{p.required}</span> : null}
381 </span>)}
382 <span className="pe-line pe-line-compact">
383 <FileIcon />
384 <span>{p.path}</span>
385 {p.required ? <span className="pe-req">{p.required}</span> : null}
386 </span>
387 </button>)}
388 </div>
389 </div>
390
391 <div className="pe-panel" role="region" aria-labelledby="pe-panel-caption" aria-live="polite" aria-atomic="true">
392 <div className="pe-caption" id="pe-panel-caption">Selected piece</div>
393 <div className="pe-name">{selected.name}{selected.required ? <span className="pe-req">{selected.required}</span> : null}</div>
394 <div className="pe-path">{selected.path}</div>
395
396 <div className="pe-block">{children}</div>
397
398 <a className="pe-link" href={selected.href}>{selected.linkText}</a>
399 </div>
400 </div>
401 </div>;
402};
403
404Ein Claude Code-Plugin wird aus Komponenten erstellt, wie Skills, Agents, Hooks und MCP-Servern. Jede Komponente hat einen Standard-Ordner im Plugin, einen optionalen Manifest-Schlüssel in `.claude-plugin/plugin.json`, der diesen Ordner ersetzt oder ergänzt, und einen Namen, den der Benutzer sieht. Für jede Schlüssels vollständige Feldtabelle siehe die [Manifest-Referenz](/docs/de/plugins/manifest-reference#fields).9Ein Claude Code-Plugin wird aus Komponenten erstellt, wie Skills, Agents, Hooks und MCP-Servern. Jede Komponente hat einen Standard-Ordner im Plugin, einen optionalen Manifest-Schlüssel in `.claude-plugin/plugin.json`, der diesen Ordner ersetzt oder ergänzt, und einen Namen, den der Benutzer sieht. Für jede Schlüssels vollständige Feldtabelle siehe die [Manifest-Referenz](/docs/de/plugins/manifest-reference#fields).
405 10
406Verwenden Sie diese Seite, um eine Komponente zu einem Plugin hinzuzufügen, das bereits geladen wird.11Verwenden Sie diese Seite, um eine Komponente zu einem Plugin hinzuzufügen, das bereits geladen wird.
407 12
408Nachdem Sie eine Komponente hinzugefügt haben, führen Sie `/reload-plugins` in einer laufenden Sitzung aus oder starten Sie eine neue, damit Claude Code sie lädt. Um die Datei der Komponente vor dem Laden zu überprüfen, führen Sie [`claude plugin validate .`](/docs/de/plugins/cli-reference#plugin-validate) in Ihrer Shell aus dem Plugin-Verzeichnis aus.13Nachdem Sie eine Komponente hinzugefügt haben, führen Sie `/reload-plugins` in einer laufenden Sitzung aus oder starten Sie eine neue, damit Claude Code sie lädt. Um die Datei der Komponente vor dem Laden zu überprüfen, führen Sie [`claude plugin validate .`](/docs/de/plugins/cli-reference#plugin-validate) in Ihrer Shell aus dem Plugin-Verzeichnis aus.
409 14
410<Note>15> [!NOTE]
411 Diese Fälle werden auf anderen Seiten behandelt:16>
412 17> Diese Fälle werden auf anderen Seiten behandelt:
413 * **Ihr erstes Plugin erstellen**: Beginnen Sie mit [Plugin erstellen](/docs/de/plugins/create)18>
414 * **Plugin von jemand anderem installieren**: Siehe [Plugins installieren](/docs/de/plugins/install)19> * **Ihr erstes Plugin erstellen**: Beginnen Sie mit [Plugin erstellen](/docs/de/plugins/create)
415 * **Ihre Plugin-Benutzer sind auf claude.ai oder in Cowork**: Ein anderer Satz von Komponenten wird dort geladen. Siehe [Plugin-Struktur und Tests](https://claude.com/docs/plugins/build) und die [Komponentenunterstützungstabelle](https://claude.com/docs/plugins/platform-support#compare-component-support-by-app)20> * **Plugin von jemand anderem installieren**: Siehe [Plugins installieren](/docs/de/plugins/install)
416</Note>21> * **Ihre Plugin-Benutzer sind auf claude.ai oder in Cowork**: Ein anderer Satz von Komponenten wird dort geladen. Siehe [Plugin-Struktur und Tests](https://claude.com/docs/plugins/build) und die [Komponentenunterstützungstabelle](https://claude.com/docs/plugins/platform-support#compare-component-support-by-app)
417 22
418<h2 id="explore-the-plugin-directory">23## Plugin-Verzeichnis erkunden
419 Plugin-Verzeichnis erkunden
420</h2>
421 24
422Der Explorer zeigt ein Beispiel-Plugin, `my-plugin`, das an seinem Standard-Speicherort eine von jeder Art von Komponente hat:25Der Explorer zeigt ein Beispiel-Plugin, `my-plugin`, das an seinem Standard-Speicherort eine von jeder Art von Komponente hat:
423 26
433 36
434Jede Datei ist das kleinste gültige Beispiel ihres Formats, um die Form zu zeigen, nicht um nützlich zu sein: Ein echter Skill oder Agent trägt vollständige Anweisungen und oft unterstützende Dateien, und ein echter Hook oder Monitor führt echte Arbeit aus. Die Abschnitte nach dem Explorer verwenden die gleichen Dateien als ihre Beispiele und verlinken auf vollständigere. Wählen Sie eine Datei oder einen Ordner aus, um zu lesen, wofür sie gedacht ist, zu sehen, was darin geht, und den Abschnitt zu finden, der sie behandelt.37Jede Datei ist das kleinste gültige Beispiel ihres Formats, um die Form zu zeigen, nicht um nützlich zu sein: Ein echter Skill oder Agent trägt vollständige Anweisungen und oft unterstützende Dateien, und ein echter Hook oder Monitor führt echte Arbeit aus. Die Abschnitte nach dem Explorer verwenden die gleichen Dateien als ihre Beispiele und verlinken auf vollständigere. Wählen Sie eine Datei oder einen Ordner aus, um zu lesen, wofür sie gedacht ist, zu sehen, was darin geht, und den Abschnitt zu finden, der sie behandelt.
435 38
436<PluginExplorer>39What goes in a plugin
437 <Piece id="manifest">
438 Das [Manifest](/docs/de/plugins/manifest-reference) ist die `plugin.json`-Datei im `.claude-plugin/`-Verzeichnis eines Plugins. Sie enthält die Metadaten des Plugins und die `userConfig`-Werte, die Claude Code den Benutzer fragt. Claude Code lädt ein Plugin auch ohne eines. In der Datei ist nur `name` erforderlich. In diesem Fall ist `description` der Text, den Benutzer für das Plugin in `/plugin` sehen, und `version` hält Benutzer auf dieser Version, bis Sie sie ändern:
439 40
440 ```json theme={null}41This example plugin, `my-plugin`, has one of every kind of component, each in its default location. Select a file or folder to read what it’s for and see what goes in it.
441 {42
43Plugin directory
44
45my-plugin/
46
47Selected piece
48
49Das [Manifest](/docs/de/plugins/manifest-reference) ist die `plugin.json`-Datei im `.claude-plugin/`-Verzeichnis eines Plugins. Sie enthält die Metadaten des Plugins und die `userConfig`-Werte, die Claude Code den Benutzer fragt. Claude Code lädt ein Plugin auch ohne eines. In der Datei ist nur `name` erforderlich. In diesem Fall ist `description` der Text, den Benutzer für das Plugin in `/plugin` sehen, und `version` hält Benutzer auf dieser Version, bis Sie sie ändern:
50
51```json theme={null}
52{
442 "name": "my-plugin",53 "name": "my-plugin",
443 "version": "1.0.0",54 "version": "1.0.0",
444 "description": "Review, formatting, and database tools for this team"55 "description": "Review, formatting, and database tools for this team"
445 }56}
446 ```57```
447 </Piece>
448 58
449 <Piece id="skills">59Ein [Skill](/docs/de/skills) ist eine `SKILL.md`-Datei. Speichern Sie jeden Skill in seinem eigenen Verzeichnis unter `skills/`. Claude liest die `description` jedes Skills, und wenn das, was der Benutzer fragt, damit übereinstimmt, wie zum Beispiel Claude zu bitten, einen Pull Request zu überprüfen, lädt Claude die Anweisungen des Skills und folgt ihnen. Der Benutzer kann ihn auch direkt als `/my-plugin:review` ausführen:
450 Ein [Skill](/docs/de/skills) ist eine `SKILL.md`-Datei. Speichern Sie jeden Skill in seinem eigenen Verzeichnis unter `skills/`. Claude liest die `description` jedes Skills, und wenn das, was der Benutzer fragt, damit übereinstimmt, wie zum Beispiel Claude zu bitten, einen Pull Request zu überprüfen, lädt Claude die Anweisungen des Skills und folgt ihnen. Der Benutzer kann ihn auch direkt als `/my-plugin:review` ausführen:
451 60
452 ```markdown theme={null}61```markdown theme={null}
453 ---62---
454 description: Reviews a pull request for style and test coverage. Use when asked to review code.63description: Reviews a pull request for style and test coverage. Use when asked to review code.
455 ---64---
456 65
457 Review the changed files. Report style problems first, then missing tests.66Review the changed files. Report style problems first, then missing tests.
458 ```67```
459 </Piece>
460 68
461 <Piece id="commands">69Ein Befehl ist eine einzelne Markdown-Datei, die der Benutzer nach Name ausführt. Befehle sind das ältere Format: Ein Skill wird auf die gleiche Weise nach Name ausgeführt und kann auch unterstützende Dateien in seinem eigenen Verzeichnis tragen, daher schreiben Sie neue als Skills und behalten Sie `commands/` für Dateien, die Sie bereits haben. Diese Datei wird zu `/my-plugin:about` und nimmt die gleiche Frontmatter wie ein Skill:
462 Ein Befehl ist eine einzelne Markdown-Datei, die der Benutzer nach Name ausführt. Befehle sind das ältere Format: Ein Skill wird auf die gleiche Weise nach Name ausgeführt und kann auch unterstützende Dateien in seinem eigenen Verzeichnis tragen, daher schreiben Sie neue als Skills und behalten Sie `commands/` für Dateien, die Sie bereits haben. Diese Datei wird zu `/my-plugin:about` und nimmt die gleiche Frontmatter wie ein Skill:
463 70
464 ```markdown theme={null}71```markdown theme={null}
465 ---72---
466 description: Summarize the repository73description: Summarize the repository
467 ---74---
468 75
469 Summarize what this repository does in three sentences.76Summarize what this repository does in three sentences.
470 ```77```
471 </Piece>
472 78
473 <Piece id="agents">79Ein [Subagent](/docs/de/sub-agents) ist ein separater Assistent mit seinen eigenen Anweisungen und seinem eigenen Kontextfenster, dem Claude eine Aufgabe delegieren und ein Ergebnis zurückbekommen kann. Jede Markdown-Datei unter `agents/` definiert einen: Die Frontmatter benennt ihn und sagt, wann er zu verwenden ist, und der Text ist sein System-Prompt. Dieser wird `my-plugin:security-reviewer` genannt, und der Benutzer kann ihn mit `@agent-my-plugin:security-reviewer` aufrufen:
474 Ein [Subagent](/docs/de/sub-agents) ist ein separater Assistent mit seinen eigenen Anweisungen und seinem eigenen Kontextfenster, dem Claude eine Aufgabe delegieren und ein Ergebnis zurückbekommen kann. Jede Markdown-Datei unter `agents/` definiert einen: Die Frontmatter benennt ihn und sagt, wann er zu verwenden ist, und der Text ist sein System-Prompt. Dieser wird `my-plugin:security-reviewer` genannt, und der Benutzer kann ihn mit `@agent-my-plugin:security-reviewer` aufrufen:
475 80
476 ```markdown theme={null}81```markdown theme={null}
477 ---82---
478 name: security-reviewer83name: security-reviewer
479 description: Reviews code changes for security issues. Use after edits to authentication or input handling.84description: Reviews code changes for security issues. Use after edits to authentication or input handling.
480 model: sonnet85model: sonnet
481 ---86---
482 87
483 You are a security reviewer. Read the changed files and report injection, authentication, and secrets-handling risks.88You are a security reviewer. Read the changed files and report injection, authentication, and secrets-handling risks.
484 ```89```
485 </Piece>
486 90
487 <Piece id="hooks">91Ein [Hook](/docs/de/hooks-guide) führt etwas automatisch an einem Punkt im Lebenszyklus von Claude Code aus, wie zum Beispiel nach jeder Dateibearbeitung: ein Shell-Befehl, eine HTTP-Anfrage, ein MCP-Tool-Aufruf, ein Prompt an ein Modell oder ein Subagent. Speichern Sie die Hooks des Plugins in `hooks/hooks.json` im Plugin-Root. Dieser führt das `scripts/format.sh` des Plugins nach jedem Write oder Edit aus:
488 Ein [Hook](/docs/de/hooks-guide) führt etwas automatisch an einem Punkt im Lebenszyklus von Claude Code aus, wie zum Beispiel nach jeder Dateibearbeitung: ein Shell-Befehl, eine HTTP-Anfrage, ein MCP-Tool-Aufruf, ein Prompt an ein Modell oder ein Subagent. Speichern Sie die Hooks des Plugins in `hooks/hooks.json` im Plugin-Root. Dieser führt das `scripts/format.sh` des Plugins nach jedem Write oder Edit aus:
489 92
490 ```json theme={null}93```json theme={null}
491 {94{
492 "hooks": {95 "hooks": {
493 "PostToolUse": [96 "PostToolUse": [
494 {97 {
502 }105 }
503 ]106 ]
504 }107 }
505 }108}
506 ```109```
507 </Piece>
508 110
509 <Piece id="monitors">111Ein Monitor ist ein Shell-Befehl, den Claude Code beim Start der Sitzung im Hintergrund startet und bis zu deren Ende weiterlaufen lässt. Was er ausgibt, erreicht Claude als Benachrichtigungen. Ein `when`-Feld kann ihn stattdessen starten, wenn ein benannter Skill zum ersten Mal ausgeführt wird. Dieser verfolgt ein Fehler-Log:
510 Ein Monitor ist ein Shell-Befehl, den Claude Code beim Start der Sitzung im Hintergrund startet und bis zu deren Ende weiterlaufen lässt. Was er ausgibt, erreicht Claude als Benachrichtigungen. Ein `when`-Feld kann ihn stattdessen starten, wenn ein benannter Skill zum ersten Mal ausgeführt wird. Dieser verfolgt ein Fehler-Log:
511 112
512 ```json theme={null}113```json theme={null}
513 [114[
514 {115 {
515 "name": "error-log",116 "name": "error-log",
516 "command": "tail -F ./logs/error.log",117 "command": "tail -F ./logs/error.log",
517 "description": "Application error log"118 "description": "Application error log"
518 }119 }
519 ]120]
520 ```121```
521 </Piece>
522 122
523 <Piece id="output-styles">123Ein Plugin kann [Output-Stile](/docs/de/output-styles) enthalten, die ändern, wie Claude seine Antworten formatiert und formuliert. Speichern Sie jeden Output-Stil als `output-styles/<name>.md`. Dieser erscheint in `/output-style` als `my-plugin:terse`:
524 Ein Plugin kann [Output-Stile](/docs/de/output-styles) enthalten, die ändern, wie Claude seine Antworten formatiert und formuliert. Speichern Sie jeden Output-Stil als `output-styles/<name>.md`. Dieser erscheint in `/output-style` als `my-plugin:terse`:
525 124
526 ```markdown theme={null}125```markdown theme={null}
527 ---126---
528 name: terse127name: terse
529 description: Answer in as few words as possible128description: Answer in as few words as possible
530 keep-coding-instructions: true129keep-coding-instructions: true
531 ---130---
532 131
533 Keep every reply short. Skip preambles and summaries.132Keep every reply short. Skip preambles and summaries.
534 ```133```
535 </Piece>
536 134
537 <Piece id="themes">135Ein Plugin kann [Farbschemas](/docs/de/terminal-config#create-a-custom-theme) für die Claude Code-Schnittstelle enthalten. Speichern Sie jedes Schema als `themes/<slug>.json`. Dieses erscheint in `/theme` als `Dracula`, markiert als von `my-plugin`:
538 Ein Plugin kann [Farbschemas](/docs/de/terminal-config#create-a-custom-theme) für die Claude Code-Schnittstelle enthalten. Speichern Sie jedes Schema als `themes/<slug>.json`. Dieses erscheint in `/theme` als `Dracula`, markiert als von `my-plugin`:
539 136
540 ```json theme={null}137```json theme={null}
541 {138{
542 "name": "Dracula",139 "name": "Dracula",
543 "base": "dark",140 "base": "dark",
544 "overrides": {141 "overrides": {
545 "claude": "#bd93f9",142 "claude": "#bd93f9",
546 "error": "#ff5555"143 "error": "#ff5555"
547 }144 }
548 }145}
549 ```146```
550 </Piece>
551 147
552 <Piece id="workflows">148Der `workflows/`-Ordner enthält [Workflow](/docs/de/workflows) `.js`-Dateien: einen `meta`-Block, dann einen Script-Text, der mehrere Subagenten orchestriert. Dieser läuft als `/my-plugin:audit-routes`:
553 Der `workflows/`-Ordner enthält [Workflow](/docs/de/workflows) `.js`-Dateien: einen `meta`-Block, dann einen Script-Text, der mehrere Subagenten orchestriert. Dieser läuft als `/my-plugin:audit-routes`:
554 149
555 ```javascript theme={null}150```javascript theme={null}
556 export const meta = {151export const meta = {
557 name: 'audit-routes',152 name: 'audit-routes',
558 description: 'Audit every route handler for missing auth checks',153 description: 'Audit every route handler for missing auth checks',
559 }154}
560 155
561 const found = await agent('List every .ts file under src/routes/.', {156const found = await agent('List every .ts file under src/routes/.', {
562 schema: { type: 'object', required: ['files'], properties: { files: { type: 'array', items: { type: 'string' } } } },157 schema: { type: 'object', required: ['files'], properties: { files: { type: 'array', items: { type: 'string' } } } },
563 })158})
564 159
565 const audits = await pipeline(found.files, file =>160const audits = await pipeline(found.files, file =>
566 agent(`Audit ${file} for missing authentication checks.`, { label: file }),161 agent(`Audit ${file} for missing authentication checks.`, { label: file }),
567 )162)
568 163
569 return audits.filter(Boolean)164return audits.filter(Boolean)
570 ```165```
571 </Piece>
572 166
573 <Piece id="bin">167`bin/` ist, wie ein Plugin ein Befehlszeilentool versendet. Während das Plugin aktiviert ist, setzt Claude Code diesen Ordner auf den `PATH` der Shell, in der es Befehle ausführt, damit Claude oder die Anweisungen eines Skills das Tool nach Name ausführen können, ohne dass der Benutzer etwas installieren muss. Mit dieser [ausführbaren Datei](#executables) an Ort und Stelle ist `hello-plugin` ein Befehl, den Claude ausführen kann:
574 `bin/` ist, wie ein Plugin ein Befehlszeilentool versendet. Während das Plugin aktiviert ist, setzt Claude Code diesen Ordner auf den `PATH` der Shell, in der es Befehle ausführt, damit Claude oder die Anweisungen eines Skills das Tool nach Name ausführen können, ohne dass der Benutzer etwas installieren muss. Mit dieser [ausführbaren Datei](#executables) an Ort und Stelle ist `hello-plugin` ein Befehl, den Claude ausführen kann:
575 168
576 ```bash theme={null}169```bash theme={null}
577 #!/bin/bash170#!/bin/bash
578 echo "hello from my-plugin"171echo "hello from my-plugin"
579 ```172```
580 </Piece>
581 173
582 <Piece id="scripts">174Der Hook in `hooks/hooks.json` führt ein Script aus, und dieser Ordner ist, wo das Beispiel es behält. Der Name `scripts/` ist eine Konvention, nicht etwas, das Claude Code sucht: Der Hook zeigt auf die Datei nach ihrem Pfad, `${CLAUDE_PLUGIN_ROOT}/scripts/format.sh`. Ein Formatter-Script könnte so aussehen:
583 Der Hook in `hooks/hooks.json` führt ein Script aus, und dieser Ordner ist, wo das Beispiel es behält. Der Name `scripts/` ist eine Konvention, nicht etwas, das Claude Code sucht: Der Hook zeigt auf die Datei nach ihrem Pfad, `${CLAUDE_PLUGIN_ROOT}/scripts/format.sh`. Ein Formatter-Script könnte so aussehen:
584 175
585 ```bash theme={null}176```bash theme={null}
586 #!/bin/bash177#!/bin/bash
587 npx prettier --write .178npx prettier --write .
588 ```179```
589 </Piece>
590 180
591 <Piece id="settings">181Eine `settings.json` im Plugin-Root hält [Einstellungen](/docs/de/settings-reference), die gelten, während das Plugin aktiviert ist, damit ein Plugin ändern kann, wie sich die Sitzung verhält, und nicht nur Komponenten hinzufügt. Nur zwei Schlüssel wirken sich von einem Plugin aus, [`agent`](/docs/de/settings-reference#agent) und [`subagentStatusLine`](/docs/de/settings-reference#subagentstatusline); jeder andere Schlüssel wird gelöscht. Siehe [Standard-Einstellungen](#default-settings).
592 Eine `settings.json` im Plugin-Root hält [Einstellungen](/docs/de/settings-reference), die gelten, während das Plugin aktiviert ist, damit ein Plugin ändern kann, wie sich die Sitzung verhält, und nicht nur Komponenten hinzufügt. Nur zwei Schlüssel wirken sich von einem Plugin aus, [`agent`](/docs/de/settings-reference#agent) und [`subagentStatusLine`](/docs/de/settings-reference#subagentstatusline); jeder andere Schlüssel wird gelöscht. Siehe [Standard-Einstellungen](#default-settings).
593 182
594 Dieser setzt `agent`, der die Haupt-Thread-Sitzung als den eigenen `security-reviewer`-Agent des Plugins ausführt, damit der System-Prompt, die Tool-Einschränkungen und das Modell dieses Agenten auf die ganze Sitzung angewendet werden:183Dieser setzt `agent`, der die Haupt-Thread-Sitzung als den eigenen `security-reviewer`-Agent des Plugins ausführt, damit der System-Prompt, die Tool-Einschränkungen und das Modell dieses Agenten auf die ganze Sitzung angewendet werden:
595 184
596 ```json theme={null}185```json theme={null}
597 {186{
598 "agent": "security-reviewer"187 "agent": "security-reviewer"
599 }188}
600 ```189```
601 </Piece>
602 190
603 <Piece id="mcp">191Ein [MCP-Server](/docs/de/mcp) gibt Claude Tools von einem externen System. Deklarieren Sie ihn in `.mcp.json` im Plugin-Root. Dieser startet einen lokalen Server aus einem Script im Plugin und erscheint in `/mcp` als `plugin:my-plugin:db`:
604 Ein [MCP-Server](/docs/de/mcp) gibt Claude Tools von einem externen System. Deklarieren Sie ihn in `.mcp.json` im Plugin-Root. Dieser startet einen lokalen Server aus einem Script im Plugin und erscheint in `/mcp` als `plugin:my-plugin:db`:
605 192
606 ```json theme={null}193```json theme={null}
607 {194{
608 "mcpServers": {195 "mcpServers": {
609 "db": {196 "db": {
610 "command": "node",197 "command": "node",
611 "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"]198 "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"]
612 }199 }
613 }200 }
614 }201}
615 ```202```
616 </Piece>
617 203
618 <Piece id="lsp">204Ein LSP-Server gibt Claude [Diagnostik und Code-Navigation](/docs/de/plugins/code-intelligence) für eine Sprache. Deklarieren Sie den Server in `.lsp.json` im Plugin-Root. Dieser verbindet den Go-Sprachserver für `.go`-Dateien:
619 Ein LSP-Server gibt Claude [Diagnostik und Code-Navigation](/docs/de/plugins/code-intelligence) für eine Sprache. Deklarieren Sie den Server in `.lsp.json` im Plugin-Root. Dieser verbindet den Go-Sprachserver für `.go`-Dateien:
620 205
621 ```json theme={null}206```json theme={null}
622 {207{
623 "gopls": {208 "gopls": {
624 "command": "gopls",209 "command": "gopls",
625 "args": ["serve"],210 "args": ["serve"],
627 ".go": "go"212 ".go": "go"
628 }213 }
629 }214 }
630 }215}
631 ```216```
632 </Piece>
633</PluginExplorer>
634 217
635<h2 id="add-each-kind-of-component">218## Jede Art von Komponente hinzufügen
636 Fügen Sie jede Art von Komponente hinzu
637</h2>
638 219
639Jeder Abschnitt unten behandelt eine Art von Komponente: wo ihre Dateien im Plugin gehen, ein Beispiel, das validiert, was der Benutzer sieht, sobald das Plugin geladen wird, und der Manifest-Schlüssel, der den Standard-Speicherort ändert. Fügen Sie die hinzu, die Ihr Plugin benötigt; keine ist erforderlich.220Jeder der folgenden Abschnitte behandelt eine Art von Komponente: wo ihre Dateien im Plugin liegen, ein Beispiel, das die Validierung besteht, was der Benutzer sieht, sobald das Plugin geladen ist, und den Manifest-Schlüssel, der den Standardspeicherort ändert. Fügen Sie diejenigen hinzu, die Ihr Plugin benötigt; keine ist erforderlich.
640 221
641<h3 id="skills">222### Skills
642 Skills
643</h3>
644 223
645Ein [Skill](/docs/de/skills) ist eine `SKILL.md`-Datei, die Claude laden kann, wenn ihre Beschreibung der Aufgabe entspricht. Der Benutzer kann ihn auch als Befehl ausführen. Speichern Sie jeden Skill in seinem eigenen Verzeichnis unter `skills/`:224Ein [Skill](/docs/de/skills) ist eine `SKILL.md`-Datei, die Claude laden kann, wenn ihre Beschreibung zur Aufgabe passt. Der Benutzer kann ihn auch als Befehl ausführen. Speichern Sie jeden Skill in einem eigenen Verzeichnis unter `skills/`:
646 225
647```text theme={null}226```text theme={null}
648my-plugin/227my-plugin/
653 └── SKILL.md232 └── SKILL.md
654```233```
655 234
656Geben Sie der `SKILL.md` eine `description`, damit Claude weiß, wann er sie verwenden soll:235Geben Sie der `SKILL.md` eine `description`, damit Claude weiß, wann er verwendet werden soll:
657 236
658```markdown skills/review/SKILL.md theme={null}237```markdown skills/review/SKILL.md theme={null}
659---238---
665 244
666Nachdem Sie das Plugin geladen haben, führt `/my-plugin:review` den Skill aus. Der Befehlsname und wer ihn aufrufen kann, folgen diesen Regeln:245Nachdem Sie das Plugin geladen haben, führt `/my-plugin:review` den Skill aus. Der Befehlsname und wer ihn aufrufen kann, folgen diesen Regeln:
667 246
668* **Befehlsname**: `/<plugin>:<directory>`, also `skills/review/SKILL.md` in `my-plugin` ist `/my-plugin:review`. Wenn Sie `name` in der Frontmatter setzen, ersetzt es das letzte Segment und das Plugin-Präfix bleibt. Siehe [wie ein Skill seinen Befehlsnamen erhält](/docs/de/skills#how-a-skill-gets-its-command-name)247* **Befehlsname**: `/<plugin>:<directory>`, also ist `skills/review/SKILL.md` in `my-plugin` gleich `/my-plugin:review`. Wenn Sie `name` im Frontmatter festlegen, ersetzt es das letzte Segment, und das Plugin-Präfix bleibt erhalten. Siehe [wie ein Skill seinen Befehlsnamen erhält](/docs/de/skills#how-a-skill-gets-its-command-name)
669* **Wer ruft ihn auf**: Claude, der Benutzer oder beide, gesteuert durch Frontmatter. Siehe [Kontrollieren Sie, wer einen Skill aufruft](/docs/de/skills#control-who-invokes-a-skill)248* **Wer ihn aufruft**: Claude, der Benutzer oder beide, gesteuert über das Frontmatter. Siehe [Steuern, wer einen Skill aufruft](/docs/de/skills#control-who-invokes-a-skill)
670 249
671Sie können auch Skills außerhalb des Standard-`skills/`-Verzeichnisses platzieren:250Sie können Skills auch außerhalb des Standardverzeichnisses `skills/` ablegen:
672 251
673* **Zusätzliche Verzeichnisse**: Listen Sie sie im `skills`-Manifest-Schlüssel auf. Sie ergänzen den Standard-`skills/`-Scan, anstatt ihn zu ersetzen, anders als `commands` und `agents`252* **Zusätzliche Verzeichnisse**: Führen Sie sie im Manifest-Schlüssel `skills` auf. Sie ergänzen den Standard-Scan von `skills/`, anstatt ihn zu ersetzen, anders als bei `commands` und `agents`
674* **Ein einzelner Skill im Plugin-Root**: Ohne `skills/`-Verzeichnis und ohne `skills`-Manifest-Schlüssel lädt eine `SKILL.md` im Plugin-Root als ein Skill. Setzen Sie `name` in seiner Frontmatter, da sonst eine Marketplace-Installation den Skill nach seinem [Cache-Verzeichnis](/docs/de/plugins/loading#find-plugins-on-disk) benennt, anstatt nach Ihrem Plugin253* **Ein einzelner Skill im Plugin-Stammverzeichnis**: Ohne `skills/`-Verzeichnis und ohne Manifest-Schlüssel `skills` wird eine `SKILL.md` im Plugin-Stammverzeichnis als ein Skill geladen. Legen Sie `name` in ihrem Frontmatter fest, da eine Marketplace-Installation den Skill sonst nach seinem [Cache-Verzeichnis](/docs/de/plugins/loading#find-plugins-on-disk) benennt statt nach Ihrem Plugin
675 254
676Um Anweisungen in ein Plugin einzubeziehen, schreiben Sie sie als Skill. Claude Code lädt keine `CLAUDE.md` im Plugin-Root, und `claude plugin validate` warnt `CLAUDE.md at the plugin root is not loaded as project context`.255Um Anweisungen in ein Plugin aufzunehmen, schreiben Sie sie als Skill. Claude Code lädt keine `CLAUDE.md` im Plugin-Stammverzeichnis, und `claude plugin validate` warnt mit `CLAUDE.md at the plugin root is not loaded as project context`.
677 256
678Wenn eine Regel jedes Mal gelten muss, wie zum Beispiel [Bearbeitungen von geschützten Dateien blockieren](/docs/de/hooks-guide#block-edits-to-protected-files), fügen Sie sie dem Plugin als [Hook](#hooks) hinzu, anstatt als Skill. Um zwischen den beiden zu wählen, siehe die Registerkarte Hook vs Skill unter [Vergleichen Sie ähnliche Funktionen](/docs/de/features-overview#compare-similar-features).257Wenn eine Regel jedes Mal gelten muss, etwa das [Blockieren von Bearbeitungen geschützter Dateien](/docs/de/hooks-guide#block-edits-to-protected-files), fügen Sie sie dem Plugin als [Hook](#hooks) statt als Skill hinzu. Um zwischen beiden zu wählen, siehe den Tab „Hook vs Skill“ unter [Ähnliche Funktionen vergleichen](/docs/de/features-overview#compare-similar-features).
679 258
680Für Frontmatter-Felder und unterstützende Dateien siehe [Skills](/docs/de/skills).259Informationen zu Frontmatter-Feldern und unterstützenden Dateien finden Sie unter [Skills](/docs/de/skills).
681 260
682<h3 id="commands">261### Befehle
683 Befehle
684</h3>
685 262
686Ein Befehl ist eine einzelne Markdown-Datei, die der Benutzer nach Name ausführt, wie `/my-plugin:about`.263Ein Befehl ist eine einzelne Markdown-Datei, die der Benutzer über ihren Namen ausführt, etwa `/my-plugin:about`.
687 264
688<Note>265> [!NOTE]
689 Befehle sind das ältere Format, und [Skills](#skills) ersetzen sie für neue Arbeiten. Ein Skill wird auf die gleiche Weise nach Name ausgeführt, und er kann auch unterstützende Dateien in seinem Verzeichnis tragen. Behalten Sie `commands/` für Dateien, die Sie von `.claude/commands/` verschieben.266>
690</Note>267> Befehle sind das ältere Format, und [Skills](#skills) lösen sie für neue Arbeiten ab. Ein Skill wird auf dieselbe Weise über seinen Namen ausgeführt und kann zusätzlich unterstützende Dateien in seinem Verzeichnis mitführen. Behalten Sie `commands/` für Dateien bei, die Sie aus `.claude/commands/` übernehmen.
691 268
692Speichern Sie einen Befehl unter `commands/<file>.md` und er wird zu `/<plugin>:<file>`. Ein Unterverzeichnis fügt ein Segment hinzu, also ist `commands/db/migrate.md` `/my-plugin:db:migrate`.269Speichern Sie einen Befehl unter `commands/<file>.md`, und er wird zu `/<plugin>:<file>`. Ein Unterverzeichnis fügt ein Segment hinzu, sodass `commands/db/migrate.md` zu `/my-plugin:db:migrate` wird.
693 270
694Befehlsdateien nehmen die gleiche Frontmatter wie Skills.271Befehlsdateien verwenden dasselbe Frontmatter wie Skills.
695 272
696<h4 id="define-commands-in-the-manifest">273#### Befehle im Manifest definieren
697 Definieren Sie Befehle im Manifest
698</h4>
699 274
700Sie brauchen dies nur, wenn Sie Befehlsdateien irgendwo anders als `commands/` behalten möchten, oder um einen kurzen Befehl in `plugin.json` ohne separate Markdown-Datei zu definieren. Setzen Sie den `commands`-Manifest-Schlüssel, und Claude Code liest ihn statt `commands/` zu scannen. Der Schlüssel nimmt einen Pfad, ein Array von Pfaden oder ein Objekt, das jeden Befehlsnamen entweder auf eine `source`-Datei oder inline `content` abbildet.275Dies benötigen Sie nur, wenn Sie Befehlsdateien an einem anderen Ort als `commands/` ablegen oder einen kurzen Befehl direkt in `plugin.json` ohne separate Markdown-Datei definieren möchten. Legen Sie den Manifest-Schlüssel `commands` fest, und Claude Code liest ihn, anstatt `commands/` zu scannen. Der Schlüssel akzeptiert einen Pfad, ein Array von Pfaden oder ein Objekt, das jedem Befehlsnamen entweder eine `source`-Datei oder Inline-`content` zuordnet.
701 276
702Dieses Manifest definiert `/my-plugin:about` inline, ohne Markdown-Datei:277Dieses Manifest definiert `/my-plugin:about` inline, ohne Markdown-Datei:
703 278
713}288}
714```289```
715 290
716Laden Sie das Plugin und führen Sie `/my-plugin:about` in der Sitzung aus, um zu bestätigen, dass es geladen wurde.291Laden Sie das Plugin und führen Sie `/my-plugin:about` in der Sitzung aus, um zu bestätigen, dass er geladen wurde.
717 292
718Für die vollständige Schlüsselsyntax siehe [`commands`](/docs/de/plugins/manifest-reference#commands).293Die vollständige Syntax des Schlüssels finden Sie unter [`commands`](/docs/de/plugins/manifest-reference#commands).
719 294
720<h3 id="agents">295### Agenten
721 Agents
722</h3>
723 296
724Ein [Subagent](/docs/de/sub-agents) ist ein separater Assistent mit seinen eigenen Anweisungen und Kontextfenster, dem Claude eine Aufgabe delegieren kann. Jede Markdown-Datei unter `agents/` definiert einen:297Ein [Subagent](/docs/de/sub-agents) ist ein separater Assistent mit eigenen Anweisungen und eigenem Kontextfenster, an den Claude eine Aufgabe delegieren kann. Jede Markdown-Datei unter `agents/` definiert einen:
725 298
726```markdown agents/security-reviewer.md theme={null}299```markdown agents/security-reviewer.md theme={null}
727---300---
733You are a security reviewer. Read the changed files and report injection, authentication, and secrets-handling risks.306You are a security reviewer. Read the changed files and report injection, authentication, and secrets-handling risks.
734```307```
735 308
736Dieser Agent wird `my-plugin:security-reviewer` genannt, und der Benutzer kann ihn [explizit aufrufen](/docs/de/sub-agents#invoke-subagents-explicitly) mit `@agent-my-plugin:security-reviewer`. Die Namensform ist `<plugin>:<name>`, wobei `<name>` aus dem Frontmatter-Feld `name` stammt oder, wenn dieses Feld fehlt, aus dem Dateinamen.309Dieser Agent heißt `my-plugin:security-reviewer`, und der Benutzer kann [ihn explizit aufrufen](/docs/de/sub-agents#invoke-subagents-explicitly) mit `@agent-my-plugin:security-reviewer`. Die Namensform ist `<plugin>:<name>`, wobei `<name>` aus dem Frontmatter-Feld `name` stammt oder aus dem Dateinamen, wenn dieses Feld fehlt.
737 310
738Der `agents`-Manifest-Schlüssel ersetzt den `agents/`-Scan.311Der Manifest-Schlüssel `agents` ersetzt den Scan von `agents/`.
739 312
740<h4 id="organize-agents-in-subfolders">313#### Agenten in Unterordnern organisieren
741 Organisieren Sie Agents in Unterordnern
742</h4>
743 314
744Sie können Plugin-Agent-Dateien in Unterordnern von `agents/` platzieren. Claude Code [lädt sie rekursiv](/docs/de/sub-agents#choose-the-subagent-scope) und verbindet den Plugin-Namen, jeden Unterordnernamen und den Dateinamen mit Doppelpunkten, um den scoped Namen des Agenten zu bilden. Zum Beispiel lädt `agents/review/security.md` in einem Plugin namens `my-plugin` als `my-plugin:review:security`. Zwei Einstellungen ändern diesen Namen:315Sie können Agentendateien eines Plugins in Unterordnern von `agents/` ablegen. Claude Code [lädt sie rekursiv](/docs/de/sub-agents#choose-the-subagent-scope) und verbindet den Plugin-Namen, jeden Unterordnernamen und den Dateinamen mit Doppelpunkten zum bereichsbezogenen Namen des Agenten. Beispielsweise wird `agents/review/security.md` in einem Plugin namens `my-plugin` als `my-plugin:review:security` geladen. Zwei Einstellungen ändern diesen Namen:
745 316
746* Frontmatter `name`: Sie ersetzt nur den Dateinamen, also `name: audit` in `agents/review/security.md` lädt als `my-plugin:review:audit`317* Frontmatter `name`: Es ersetzt nur den Dateinamen, sodass `name: audit` in `agents/review/security.md` als `my-plugin:review:audit` geladen wird
747* Manifest [`agents`](/docs/de/plugins/manifest-reference#fields)-Feld: Eine Datei, die Sie dort auflisten, lädt ohne Unterordnernamen, also `"agents": "./custom/review/security.md"` lädt als `my-plugin:security`318* Manifest-Feld [`agents`](/docs/de/plugins/manifest-reference#fields): Eine dort aufgeführte Datei wird ohne Unterordnernamen geladen, sodass `"agents": "./custom/review/security.md"` als `my-plugin:security` geladen wird
748 319
749<h4 id="frontmatter-fields-in-plugin-agents">320#### Frontmatter-Felder in Plugin-Agenten
750 Frontmatter-Felder in Plugin-Agents
751</h4>
752 321
753Die Frontmatter eines Plugin-Agenten folgt diesen Regeln:322Das Frontmatter eines Plugin-Agenten folgt diesen Regeln:
754 323
755* **Unterstützte Felder**: `name`, `description`, `model`, `effort`, `maxTurns`, `autoCompactWindow`, `tools`, `disallowedTools`, `skills`, `memory`, `background`, `omitClaudeMd`, `isolation`, `color` und der `cacheTtl`-Schlüssel von `experimental`. Der einzige gültige `isolation`-Wert ist `"worktree"`. Siehe [unterstützte Frontmatter-Felder](/docs/de/sub-agents#supported-frontmatter-fields) für das, was jedes tut324* **Unterstützte Felder**: `name`, `description`, `model`, `effort`, `maxTurns`, `autoCompactWindow`, `tools`, `disallowedTools`, `skills`, `memory`, `background`, `omitClaudeMd`, `isolation`, `color` und der Schlüssel `cacheTtl` von `experimental`. Der einzige gültige Wert für `isolation` ist `"worktree"`. Was jedes Feld bewirkt, erfahren Sie unter [unterstützte Frontmatter-Felder](/docs/de/sub-agents#supported-frontmatter-fields)
756* **Ignorierte Felder**: `permissionMode`, `hooks`, `mcpServers` und `initialPrompt`. Eine Agent-Datei kann nicht auf eigene Faust Hooks oder MCP-Server hinzufügen, daher fügen Sie diese stattdessen als Plugin-[Hooks](#hooks) und [MCP-Server](#mcp-servers) hinzu325* **Ignorierte Felder**: `permissionMode`, `hooks`, `mcpServers` und `initialPrompt`. Eine Agentendatei kann selbst keine Hooks oder MCP-Server hinzufügen, fügen Sie diese daher stattdessen als Plugin-[Hooks](#hooks) und [MCP-Server](#mcp-servers) hinzu
757* **Frontmatter, die nicht analysiert wird**: Der Agent lädt immer noch mit jedem Feld ignoriert. Er wird nach der Datei benannt, und seine Beschreibung liest `Agent from my-plugin plugin`. Führen Sie [`claude plugin validate`](/docs/de/plugins/cli-reference#plugin-validate) in Ihrer Shell aus, um diese Dateien zu finden326* **Frontmatter, das sich nicht parsen lässt**: Der Agent wird trotzdem geladen, wobei alle Felder ignoriert werden. Er wird nach der Datei benannt, und seine Beschreibung lautet `Agent from my-plugin plugin`. Führen Sie [`claude plugin validate`](/docs/de/plugins/cli-reference#plugin-validate) in Ihrer Shell aus, um diese Dateien zu finden
758 327
759Für das, was jedes Feld tut und die Vorrangregeln, siehe [Subagents](/docs/de/sub-agents#supported-frontmatter-fields).328Was jedes Feld bewirkt und welche Vorrangregeln gelten, erfahren Sie unter [Subagenten](/docs/de/sub-agents#supported-frontmatter-fields).
760 329
761<h3 id="hooks">330### Hooks
762 Hooks
763</h3>
764 331
765Ein [Hook](/docs/de/hooks-guide) führt etwas automatisch an einem Punkt im Lebenszyklus von Claude Code aus, wie zum Beispiel nach jeder Dateibearbeitung: ein Shell-Befehl, eine HTTP-Anfrage, ein MCP-Tool-Aufruf, ein Prompt an ein Modell oder ein Subagent. Speichern Sie die Hooks des Plugins in `hooks/hooks.json` im Plugin-Root, unter einem Top-Level-`"hooks"`-Schlüssel, in der gleichen Form wie das `hooks`-Objekt in `settings.json`. Das ermöglicht es Ihnen, einen bestehenden Settings-Hook unverändert zu kopieren.332Ein [Hook](/docs/de/hooks-guide) führt an einem Punkt im Lebenszyklus von Claude Code automatisch etwas aus, etwa nach jeder Dateibearbeitung: einen Shell-Befehl, eine HTTP-Anfrage, einen MCP-Tool-Aufruf, einen Prompt an ein Modell oder einen Subagenten. Speichern Sie die Hooks des Plugins in `hooks/hooks.json` im Plugin-Stammverzeichnis unter einem `"hooks"`-Schlüssel auf oberster Ebene, in derselben Form wie das `hooks`-Objekt in `settings.json`. So können Sie einen vorhandenen Einstellungs-Hook unverändert übernehmen.
766 333
767Dieser Hook führt ein gebündeltes Script nach jedem `Write` oder `Edit` aus:334Dieser Hook führt nach jedem `Write` oder `Edit` ein mitgeliefertes Skript aus:
768 335
769```json hooks/hooks.json theme={null}336```json hooks/hooks.json theme={null}
770{337{
784}351}
785```352```
786 353
787Speichern Sie das Script unter `scripts/format.sh` und machen Sie es ausführbar.354Speichern Sie das Skript unter `scripts/format.sh` und machen Sie es ausführbar.
788 355
789Laden Sie das Plugin und bitten Sie Claude, eine Datei zu bearbeiten. Ein `PostToolUse`-Hook, der 0 beendet, zeigt nichts im Transkript, daher bestätigen Sie, dass er mit [Debug-Logging](/docs/de/hooks#debug-hooks) oder durch das, was das Script selbst ändert, gelaufen ist.356Laden Sie das Plugin und bitten Sie Claude, eine Datei zu bearbeiten. Ein `PostToolUse`-Hook, der mit 0 beendet wird, zeigt im Transkript nichts an. Bestätigen Sie daher seine Ausführung mit [Debug-Logging](/docs/de/hooks#debug-hooks) oder anhand dessen, was das Skript selbst ändert.
790 357
791Hooks in `hooks/hooks.json` und im `hooks`-Manifest-Schlüssel laden beide. Für jedes Ereignis und seine Nutzlast siehe [Hook-Ereignisse](/docs/de/hooks#hook-events).358Hooks in `hooks/hooks.json` und im Manifest-Schlüssel `hooks` werden beide geladen. Alle Ereignisse und ihre Payloads finden Sie unter [Hook-Ereignisse](/docs/de/hooks#hook-events).
792 359
793Wenn ein anderes aktiviertes Plugin denselben Namen hat, registriert eines der beiden seine Hooks aus `hooks/hooks.json`, und die des anderen werden ausgelassen. Unter [Hooks, wenn zwei aktivierte Plugins denselben Namen haben](/docs/de/plugins/loading#hooks-when-two-enabled-plugins-share-a-name) erfahren Sie, welches es ist, und finden den Hinweis in `/plugin`, der Sie darauf aufmerksam macht.360Wenn ein anderes aktiviertes Plugin denselben Namen hat, registriert eines der beiden seine Hooks aus `hooks/hooks.json`, und die des anderen werden ausgelassen. Welches das ist und welcher Hinweis in `/plugin` Sie darüber informiert, erfahren Sie unter [Hooks, wenn zwei aktivierte Plugins denselben Namen haben](/docs/de/plugins/loading#hooks-when-two-enabled-plugins-share-a-name).
794 361
795Um Hooks als JavaScript-Funktionen zu schreiben, die in Claude Code ausgeführt werden und in seiner Benutzeroberfläche zeichnen können, listen Sie eine Moduldatei unter einem `modules`-Schlüssel in der gleichen `hooks/hooks.json` auf. Ein Plugin mit einem ist ein Mod. Siehe [Erstellen Sie einen Mod](/docs/de/plugins/mods/create).362Um Hooks als JavaScript-Funktionen zu schreiben, die innerhalb von Claude Code laufen und in dessen Oberfläche zeichnen können, führen Sie eine Moduldatei unter einem `modules`-Schlüssel in derselben `hooks/hooks.json` auf. Ein Plugin mit einer solchen Datei ist ein Mod. Siehe [Einen Mod erstellen](/docs/de/plugins/mods/create).
796 363
797<h4 id="when-plugin-hooks-fire">364#### Wann Plugin-Hooks ausgelöst werden
798 Wenn Plugin-Hooks auslösen
799</h4>
800 365
801Die Hooks eines Plugins warten nicht darauf, dass einer der Skills oder Befehle des Plugins verwendet wird. Claude Code registriert sie, wenn eine Sitzung das Plugin lädt, und sie lösen auf ihren Ereignissen von da an aus. Um einzuschränken, wann ein Hook läuft, verengen Sie seinen `matcher`.366Die Hooks eines Plugins warten nicht darauf, dass einer der Skills oder Befehle des Plugins verwendet wird. Claude Code registriert sie, wenn eine Sitzung das Plugin lädt, und sie werden von da an bei ihren Ereignissen ausgelöst. Um einzuschränken, wann ein Hook ausgeführt wird, grenzen Sie seinen `matcher` ein.
802 367
803Wenn ein Hook nie auslöst, siehe [Hooks, die nicht auslösen](/docs/de/plugins/troubleshooting#failed-to-load-hooks-from-and-hooks-that-dont-fire).368Wenn ein Hook nie ausgelöst wird, siehe [Hooks, die nicht ausgelöst werden](/docs/de/plugins/troubleshooting#failed-to-load-hooks-from-and-hooks-that-dont-fire).
804 369
805<h4 id="environment-quoting-and-matching-mcp-tools">370#### Umgebung, Anführungszeichen und Abgleich von MCP-Tools
806 Umgebung, Anführungszeichen und Matching von MCP-Tools
807</h4>
808 371
809Die Umgebung des Hooks, die Anführungszeichen von `${CLAUDE_PLUGIN_ROOT}` und Matcher für die eigenen MCP-Tools des Plugins funktionieren wie folgt:372Die Umgebung des Hooks, das Setzen von `${CLAUDE_PLUGIN_ROOT}` in Anführungszeichen und Matcher für die eigenen MCP-Tools des Plugins funktionieren wie folgt:
810 373
811* **Umgebung**: Jeder Hook-Prozess erhält `CLAUDE_PLUGIN_ROOT` und `CLAUDE_PLUGIN_DATA` in seiner Umgebung, plus `CLAUDE_PLUGIN_OPTION_<KEY>` für jeden [Benutzerkonfiguration](#user-configuration)-Wert, damit Ihr Script sie von dort lesen kann374* **Umgebung**: Jeder Hook-Prozess erhält `CLAUDE_PLUGIN_ROOT` und `CLAUDE_PLUGIN_DATA` in seiner Umgebung sowie `CLAUDE_PLUGIN_OPTION_<KEY>` für jeden Wert der [Benutzerkonfiguration](#user-configuration), sodass Ihr Skript sie von dort lesen kann
812* **Anführungszeichen**: Wenn `command` keine `args` hat, läuft es durch eine Shell, daher wickeln Sie den `${CLAUDE_PLUGIN_ROOT}`-Pfad in doppelte Anführungszeichen, wie das Beispiel `hooks/hooks.json` unter [Hooks](#hooks) tut, um den erweiterten Pfad ein Shell-Wort zu halten. Wenn Sie stattdessen `args` übergeben, wird jedes Element als ein Argument ohne Shell übergeben und braucht keine Anführungszeichen. Siehe [Exec-Form und Shell-Form](/docs/de/hooks#exec-form-and-shell-form)375* **Anführungszeichen**: Wenn `command` keine `args` hat, wird es über eine Shell ausgeführt. Setzen Sie den Pfad `${CLAUDE_PLUGIN_ROOT}` daher in doppelte Anführungszeichen, wie im `hooks/hooks.json`-Beispiel unter [Hooks](#hooks), damit der expandierte Pfad ein einzelnes Shell-Wort bleibt. Wenn Sie stattdessen `args` übergeben, wird jedes Element ohne Shell als ein Argument übergeben und benötigt keine Anführungszeichen. Siehe [Exec-Form und Shell-Form](/docs/de/hooks#exec-form-and-shell-form)
813* **Matching der eigenen MCP-Tools des Plugins**: Ein Tool von einem [MCP-Server, den dieses Plugin deklariert](#mcp-servers), wird `mcp__plugin_<plugin>_<server>__<tool>` genannt, daher schreiben Sie diesen vollständigen Namen in den Matcher. Ein Matcher nur auf dem Servernamen löst nie aus. Siehe [Match MCP-Tools](/docs/de/hooks#match-mcp-tools)376* **Abgleich der eigenen MCP-Tools des Plugins**: Ein Tool von einem [MCP-Server, den dieses Plugin deklariert](#mcp-servers), heißt `mcp__plugin_<plugin>_<server>__<tool>`. Schreiben Sie daher diesen vollständigen Namen in den Matcher. Ein Matcher allein auf den Servernamen wird nie ausgelöst. Siehe [MCP-Tools abgleichen](/docs/de/hooks#match-mcp-tools)
814 377
815<h3 id="mcp-servers">378### MCP-Server
816 MCP-Server
817</h3>
818 379
819Ein MCP-Server gibt Claude Tools von einem externen System. Deklarieren Sie ihn in `.mcp.json` im Plugin-Root, in der gleichen Form wie ein [Projekt `.mcp.json`](/docs/de/mcp#project-scope). Diese `.mcp.json` deklariert einen Server namens `db`:380Ein MCP-Server stellt Claude Tools aus einem externen System zur Verfügung. Deklarieren Sie ihn in `.mcp.json` im Plugin-Stammverzeichnis, in derselben Form wie eine [Projekt-`.mcp.json`](/docs/de/mcp#project-scope). Diese `.mcp.json` deklariert einen Server namens `db`:
820 381
821```json .mcp.json theme={null}382```json .mcp.json theme={null}
822{383{
829}390}
830```391```
831 392
832Sie können auch den `mcpServers`-Wrapper weglassen und `db` auf der Top-Level der Datei platzieren.393Sie können den `mcpServers`-Wrapper auch weglassen und `db` auf die oberste Ebene der Datei setzen.
833 394
834Laden Sie das Plugin und führen Sie `/mcp` aus, um zu bestätigen, dass der Server als `plugin:my-plugin:db` erscheint.395Laden Sie das Plugin und führen Sie `/mcp` aus, um zu bestätigen, dass der Server als `plugin:my-plugin:db` erscheint.
835 396
836`claude plugin validate` überprüft `.mcp.json` und meldet einen Server-Eintrag, den Claude Code zur Ladezeit als Fehler ablegen würde. Erfordert Claude Code v2.1.281 oder später.397`claude plugin validate` prüft `.mcp.json` und meldet einen Servereintrag, den Claude Code beim Laden verwerfen würde, als Fehler. Erfordert Claude Code v2.1.281 oder neuer.
837 398
838Für wo ein schlechter Eintrag zur Ladezeit angezeigt wird, siehe [MCP-Server, die nicht starten](/docs/de/plugins/troubleshooting#invalid-mcp-server-config-for-and-mcp-servers-that-dont-start).399Wo ein fehlerhafter Eintrag beim Laden angezeigt wird, erfahren Sie unter [MCP-Server, die nicht starten](/docs/de/plugins/troubleshooting#invalid-mcp-server-config-for-and-mcp-servers-that-dont-start).
839 400
840Der `mcpServers`-Manifest-Schlüssel nimmt eine inline Server-Map, einen Pfad zu einer JSON-Datei oder ein Array davon. Wenn ein Manifest-Server den gleichen Namen wie einer in `.mcp.json` hat, ersetzt der Manifest-Server ihn.401Der Manifest-Schlüssel `mcpServers` akzeptiert eine Inline-Server-Map, einen Pfad zu einer JSON-Datei oder ein Array davon. Wenn ein Manifest-Server denselben Namen wie einer in `.mcp.json` hat, ersetzt der Manifest-Server diesen.
841 402
842<h4 id="reach-users-on-claude-ai-and-cowork">403#### Benutzer auf claude.ai und in Cowork erreichen
843 Erreichen Sie Benutzer auf claude.ai und Cowork
844</h4>
845 404
846Ein lokaler Stdio-Server, wie der `db`-Server unter [MCP-Server](#mcp-servers), läuft in Claude Code und in einer Cowork-Sitzung, die auf Ihrem Computer in der Claude Desktop-App läuft, aber nicht auf claude.ai. Um Benutzer dort auch zu erreichen, referenzieren Sie einen Remote-Server durch seine `https://`-URL, die claude.ai und Cowork dem Benutzer als Connector anbieten, wie [Bündeln Sie einen MCP-Connector mit seinem Skill](https://claude.com/docs/plugins/build#bundle-an-mcp-connector-with-its-skill) zeigt.405Ein lokaler stdio-Server, etwa der `db`-Server unter [MCP-Server](#mcp-servers), läuft in Claude Code und in einer Cowork-Sitzung, die in der Claude Desktop-App auf Ihrem Rechner läuft, aber nicht auf claude.ai. Um auch Benutzer dort zu erreichen, verweisen Sie über seine `https://`-URL auf einen Remote-Server, den claude.ai und Cowork dem Benutzer als Konnektor anbieten, wie unter [Einen MCP-Konnektor mit seinem Skill bündeln](https://claude.com/docs/plugins/build#bundle-an-mcp-connector-with-its-skill) gezeigt.
847 406
848<h4 id="server-names-tool-names-and-reloads">407#### Servernamen, Tool-Namen und Neuladen
849 Server-Namen, Tool-Namen und Neuladen
850</h4>
851 408
852Die Namen des Servers, die Variable-Substitution und das Neuladen-Verhalten folgen diesen Regeln:409Die Namen des Servers, die Variablenersetzung und das Verhalten beim Neuladen folgen diesen Regeln:
853 410
854* **Server-Name**: `plugin:<plugin>:<server>`, also der `db`-Server in `my-plugin` ist `plugin:my-plugin:db` in `/mcp`. Verwenden Sie die gleiche Form, um den Server in einem [`mcp_tool`-Hook](/docs/de/hooks#mcp-tool-hook-fields) zu benennen411* **Servername**: `plugin:<plugin>:<server>`, also ist der `db`-Server in `my-plugin` in `/mcp` gleich `plugin:my-plugin:db`. Verwenden Sie dieselbe Form, um den Server in einem [`mcp_tool`-Hook](/docs/de/hooks#mcp-tool-hook-fields) zu benennen
855* **Tool-Namen**: `mcp__plugin_<plugin>_<server>__<tool>`, also ein `query`-Tool auf diesem `db`-Server ist `mcp__plugin_my-plugin_db__query`. Das ist der Name, der in [Berechtigungsregeln](/docs/de/permissions) und [Hook-Matchern](#hooks) verwendet wird412* **Tool-Namen**: `mcp__plugin_<plugin>_<server>__<tool>`, also ist ein `query`-Tool auf diesem `db`-Server gleich `mcp__plugin_my-plugin_db__query`. Diesen Namen verwenden Sie in [Berechtigungsregeln](/docs/de/permissions) und [Hook-Matchern](#hooks)
856* **Substitution**: `${CLAUDE_PLUGIN_ROOT}` und die anderen [Pfad-Variablen](#path-variables-and-persistent-data) werden in `command`, `args` und `env` ersetzt. Keine Anführungszeichen sind in `args` erforderlich, da jedes Element als ein Argument übergeben wird413* **Ersetzung**: `${CLAUDE_PLUGIN_ROOT}` und die anderen [Pfadvariablen](#path-variables-and-persistent-data) werden in `command`, `args` und `env` ersetzt. In `args` sind keine Anführungszeichen nötig, da jedes Element als ein Argument übergeben wird
857* **Neuladen**: Wenn der Benutzer `/reload-plugins` ausführt und [das Neuladen angewendet wird](/docs/de/plugins/cli-reference#reloads-that-change-mcp-tools), behält ein Server, dessen Konfiguration unverändert ist, seine Verbindung. Ein Server, dessen Konfiguration sich geändert hat, verbindet sich neu, und einer, den Sie entfernt haben, trennt sich414* **Neuladen**: Wenn der Benutzer `/reload-plugins` ausführt und [das Neuladen greift](/docs/de/plugins/cli-reference#reloads-that-change-mcp-tools), behält ein Server mit unveränderter Konfiguration seine Verbindung. Ein Server, dessen Konfiguration sich geändert hat, verbindet sich neu, und einer, den Sie entfernt haben, trennt die Verbindung
858 415
859<h4 id="include-a-packaged-mcpb-server">416#### Einen gepackten MCPB-Server einbinden
860 Schließen Sie einen verpackten MCPB-Server ein
861</h4>
862 417
863Der `mcpServers`-Schlüssel akzeptiert auch einen verpackten Server als [MCPB-Datei](https://github.com/modelcontextprotocol/mcpb), deren Erweiterung `.mcpb` oder die ältere `.dxt` ist. Zeigen Sie den Schlüssel auf die Datei, als Pfad im Plugin oder eine `https://`-URL:418Der Schlüssel `mcpServers` akzeptiert auch einen gepackten Server als [MCPB-Datei](https://github.com/modelcontextprotocol/mcpb) mit der Endung `.mcpb` oder der älteren `.dxt`. Lassen Sie den Schlüssel auf die Datei verweisen, als Pfad innerhalb des Plugins oder als `https://`-URL:
864 419
865```json .claude-plugin/plugin.json theme={null}420```json .claude-plugin/plugin.json theme={null}
866{421{
869}424}
870```425```
871 426
872Der Server nimmt seinen Namen aus dem `name` im Manifest des Bundles.427Der Server erhält seinen Namen aus dem `name` im Manifest des Bundles.
873 428
874Ein Manifest eines Bundles kann Einstellungen deklarieren, die der Server vom Benutzer in einem `user_config`-Block benötigt. Ein gebündelter Server mit einer erforderlichen Einstellung, die keinen gespeicherten Wert hat, startet nicht. Die Registerkarte `/plugin` **Errors** zeigt `Bundled MCP server "<name>" was not started: it needs configuration`.429Das eigene Manifest eines Bundles kann in einem `user_config`-Block Einstellungen deklarieren, die der Server vom Benutzer benötigt. Ein gebündelter Server mit einer erforderlichen Einstellung ohne gespeicherten Wert startet nicht. Der Tab **Errors** in `/plugin` zeigt `Bundled MCP server "<name>" was not started: it needs configuration` an.
875 430
876Benutzer liefern die Werte auf eine von zwei Arten:431Benutzer geben die Werte auf eine von zwei Arten an:
877 432
878* **In `/plugin`**: Wählen Sie das Plugin auf der Registerkarte **Installed** und wählen Sie **Configure**433* **In `/plugin`**: Wählen Sie das Plugin auf dem Tab **Installed** aus und wählen Sie **Configure**
879* **Bei der Installation, von der Shell**: Übergeben Sie [`--config <server>.<key>=<value>`](/docs/de/plugins/cli-reference#plugin-install) an `claude plugin install`. Erfordert Claude Code v2.1.285 oder später, und funktioniert nur für ein Bundle, das im Plugin verpackt ist.434* **Bei der Installation, über die Shell**: Übergeben Sie [`--config <server>.<key>=<value>`](/docs/de/plugins/cli-reference#plugin-install) an `claude plugin install`. Erfordert Claude Code v2.1.285 oder neuer und funktioniert nur für ein Bundle, das innerhalb des Plugins gepackt ist.
880 435
881Für Transporte und Authentifizierung siehe [MCP](/docs/de/mcp#plugin-provided-mcp-servers).436Informationen zu Transporten und Authentifizierung finden Sie unter [MCP](/docs/de/mcp#plugin-provided-mcp-servers).
882 437
883<h3 id="lsp-servers">438### LSP-Server
884 LSP-Server
885</h3>
886 439
887Ein LSP-Server gibt Claude Diagnostik und Code-Navigation für eine Sprache. Wenn ein [offizielles Code-Intelligence-Plugin](/docs/de/plugins/code-intelligence) Ihre Sprache bereits abdeckt, installieren Sie das statt einen zu schreiben. Andernfalls deklarieren Sie den Server in `.lsp.json` im Plugin-Root:440Ein LSP-Server stellt Claude Diagnosen und Code-Navigation für eine Sprache zur Verfügung. Wenn ein [offizielles Code-Intelligence-Plugin](/docs/de/plugins/code-intelligence) Ihre Sprache bereits abdeckt, installieren Sie dieses, anstatt selbst eines zu schreiben. Andernfalls deklarieren Sie den Server in `.lsp.json` im Plugin-Stammverzeichnis:
888 441
889```json .lsp.json theme={null}442```json .lsp.json theme={null}
890{443{
898}451}
899```452```
900 453
901Die Datei bildet jeden Server-Namen direkt auf seine Konfiguration ab, ohne ein Wrapper-Objekt um die Map. `command` ist der Name des Binärs, mit seinen Argumenten in `args`. `extensionToLanguage` braucht mindestens eine Erweiterung, jede beginnend mit `.`.454Die Datei ordnet jeden Servernamen direkt seiner Konfiguration zu, ohne Wrapper-Objekt um die Map. `command` ist der Name der Binärdatei, deren Argumente in `args` stehen. `extensionToLanguage` benötigt mindestens eine Dateiendung, die jeweils mit `.` beginnt.
902 455
903`claude plugin validate` liest diese Datei nicht. Wenn ein Eintrag ungültig ist, wird die ganze Datei zur Ladezeit übersprungen und `Invalid LSP server config for ".lsp.json"` erscheint in der `/plugin`-Registerkarte **Errors**.456`claude plugin validate` liest diese Datei nicht. Wenn ein Eintrag ungültig ist, wird die gesamte Datei beim Laden übersprungen, und `Invalid LSP server config for ".lsp.json"` erscheint im Tab **Errors** von `/plugin`.
904 457
905Ihr Plugin konfiguriert die Verbindung, installiert aber nicht das Server-Binär, und jede Dateierweiterung bekommt einen Server:458Ihr Plugin konfiguriert die Verbindung, installiert aber nicht die Binärdatei des Servers, und jede Dateiendung erhält einen Server:
906 459
907* **Fehlendes Binär**: Claude Code startet `command` nach Name aus dem `PATH` des Benutzers. Wenn das Binär nicht da ist, schlägt der Server fehl zu starten und `claude --debug` protokolliert `LSP server <name> failed to start`460* **Fehlende Binärdatei**: Claude Code startet `command` über seinen Namen aus dem `PATH` des Benutzers. Wenn die Binärdatei dort nicht vorhanden ist, startet der Server nicht, und `claude --debug` protokolliert `LSP server <name> failed to start`
908* **Erweiterungs-Konflikte**: Wenn zwei aktivierte Server die gleiche Erweiterung beanspruchen, behandelt der erste registrierte diese Dateien und der andere wird nicht für sie verwendet, ob die Server von einem Plugin oder zwei kommen. Die `/plugin`-Registerkarte **Errors** zeigt die Warnung `LSP server "<name>" is not used for <ext> files`461* **Konflikte bei Dateiendungen**: Wenn zwei aktivierte Server dieselbe Dateiendung beanspruchen, verarbeitet der zuerst registrierte diese Dateien, und der andere wird dafür nicht verwendet, unabhängig davon, ob die Server aus einem oder zwei Plugins stammen. Der Tab **Errors** in `/plugin` zeigt die Warnung `LSP server "<name>" is not used for <ext> files` an
909 462
910Der `lspServers`-Manifest-Schlüssel nimmt die gleiche Map inline, einen Pfad zu einer JSON-Datei oder ein Array davon, und seine Server ergänzen die in `.lsp.json`. Wenn ein Manifest-Server den gleichen Namen wie einer in `.lsp.json` hat, ersetzt der Manifest-Server ihn.463Der Manifest-Schlüssel `lspServers` akzeptiert dieselbe Map inline, einen Pfad zu einer JSON-Datei oder ein Array davon, und seine Server ergänzen die in `.lsp.json`. Wenn ein Manifest-Server denselben Namen wie einer in `.lsp.json` hat, ersetzt der Manifest-Server diesen.
911 464
912Für `transport`, Timeouts, Neustarts und die anderen Felder siehe [`lspServers`](/docs/de/plugins/manifest-reference#lspservers).465Informationen zu `transport`, Timeouts, Neustarts und den anderen Feldern finden Sie unter [`lspServers`](/docs/de/plugins/manifest-reference#lspservers).
913 466
914Senden Sie Log-Ausgabe an stderr, nicht stdout. Claude Code liest den stdout eines Servers nur als Protokoll-Nachrichten und akzeptiert Nachrichten-Header bis zu 64 KiB und einen Nachrichten-Text bis zu 32 MiB.467Senden Sie Log-Ausgaben an stderr, nicht an stdout. Claude Code liest die stdout-Ausgabe eines Servers ausschließlich als Protokollnachrichten und akzeptiert Nachrichten-Header bis 64 KiB und einen Nachrichtentext bis 32 MiB.
915 468
916Claude Code trennt einen Server, der eines der Limits überschreitet oder nicht-Protokoll-Ausgabe an stdout schreibt, und zählt die Trennung als Absturz für `restartOnCrash` und `maxRestarts`. Wenn Sie mit `--debug` laufen, schreibt Claude Code einen Fehler, der die Ursache benennt, in das Debug-Log.469Claude Code trennt die Verbindung zu einem Server, der eines der Limits überschreitet oder Ausgaben außerhalb des Protokolls an stdout schreibt, und zählt die Trennung als Absturz für `restartOnCrash` und `maxRestarts`. Wenn Sie mit `--debug` ausführen, schreibt Claude Code einen Fehler mit der Ursache in das Debug-Log.
917 470
918<h3 id="executables">471### Ausführbare Dateien
919 Ausführbare Dateien
920</h3>
921 472
922Dateien in `bin/` im Plugin-Root sind auf dem `PATH` der Shell des Bash-Tools, während das Plugin aktiviert ist, daher kann Claude sie als bloße Befehle ausführen. Fügen Sie ein ausführbares Script hinzu:473Dateien in `bin/` im Plugin-Stammverzeichnis liegen im `PATH` der Shell des Bash-Tools, solange das Plugin aktiviert ist, sodass Claude sie als einfache Befehle ausführen kann. Ein Befehl, den Claude mit dem [PowerShell-Tool](/docs/de/tools-reference#powershell-tool) außerhalb der [Sandbox](/docs/de/sandboxing) ausführt, findet sie ebenfalls in seinem `PATH`, ein in einer Sandbox ausgeführter PowerShell-Befehl dagegen nicht. Fügen Sie ein ausführbares Skript hinzu:
923 474
924```bash bin/hello-plugin theme={null}475```bash bin/hello-plugin theme={null}
925#!/bin/bash476#!/bin/bash
926echo "hello from my-plugin"477echo "hello from my-plugin"
927```478```
928 479
929Machen Sie es mit `chmod +x bin/hello-plugin` ausführbar und laden Sie das Plugin. Wenn Sie Claude bitten, `hello-plugin` auszuführen, zeigt das Bash-Tool-Ergebnis die Ausgabe des Scripts.480Machen Sie es mit `chmod +x bin/hello-plugin` ausführbar und laden Sie das Plugin. Wenn Sie Claude bitten, `hello-plugin` auszuführen, zeigt das Ergebnis des Bash-Tools die Ausgabe des Skripts.
930 481
931Plugin-`bin/`-Verzeichnisse kommen nach den eigenen `PATH`-Einträgen des Benutzers, daher kann ein Plugin nicht `git`, `ls` oder einen anderen System-Befehl überschatten.482Die `bin/`-Verzeichnisse von Plugins stehen hinter den eigenen `PATH`-Einträgen des Benutzers, sodass ein Plugin `git`, `ls` oder einen anderen Systembefehl nicht überdecken kann.
932 483
933claude.ai und Cowork installieren kein Plugin, das ein Top-Level-`bin/`-Verzeichnis hat, einschließlich eines, das Sie [über claude.ai-Organisationseinstellungen verteilen](https://claude.com/docs/plugins/org-sync#keep-executables-out-of-the-top-level-bin-directory).484claude.ai und Cowork installieren kein Plugin mit einem `bin/`-Verzeichnis auf oberster Ebene, auch keines, das Sie [über die Organisationseinstellungen von claude.ai verteilen](https://claude.com/docs/plugins/org-sync#keep-executables-out-of-the-top-level-bin-directory).
934 485
935<h3 id="default-settings">486### Standardeinstellungen
936 Standard-Einstellungen
937</h3>
938 487
939Um Standard-Einstellungen zu setzen, die gelten, während das Plugin aktiviert ist, fügen Sie eine `settings.json` im Plugin-Root hinzu, oder setzen Sie das gleiche Objekt inline im `settings`-Manifest-Schlüssel. Zwei Schlüssel wirken sich aus, `agent` und `subagentStatusLine`, und jeder andere Schlüssel wird gelöscht.488Um Standardwerte festzulegen, die gelten, solange das Plugin aktiviert ist, fügen Sie eine `settings.json` im Plugin-Stammverzeichnis hinzu oder setzen Sie dasselbe Objekt inline in den Manifest-Schlüssel `settings`. Zwei Schlüssel werden wirksam, `agent` und `subagentStatusLine`, und alle anderen Schlüssel werden verworfen.
940 489
941Setzen Sie `agent`, um einen der eigenen Agents des Plugins als Haupt-Thread auszuführen:490Legen Sie `agent` fest, um einen der eigenen Agenten des Plugins als Hauptthread auszuführen:
942 491
943```json settings.json theme={null}492```json settings.json theme={null}
944{493{
946}495}
947```496```
948 497
949Laden Sie das Plugin und starten Sie eine Sitzung. Claude antwortet dann in der Haupt-Konversation mit dem System-Prompt und Modell des `security-reviewer`-Agenten.498Laden Sie das Plugin und starten Sie eine Sitzung. Claude antwortet dann in der Hauptkonversation mit dem System-Prompt und dem Modell des Agenten `security-reviewer`.
950 499
951Für alles, das der Schlüssel kontrolliert, siehe die [`agent`-Einstellung](/docs/de/settings-reference#agent).500Alles, was der Schlüssel steuert, finden Sie unter der [Einstellung `agent`](/docs/de/settings-reference#agent).
952 501
953Wenn der gleiche Schlüssel an mehr als einem Ort gesetzt ist, entscheiden diese Regeln, welcher Wert angewendet wird:502Wenn derselbe Schlüssel an mehr als einer Stelle festgelegt ist, entscheiden diese Regeln, welcher Wert gilt:
954 503
955* **Datei über Manifest**: Wenn beide existieren und `settings.json` mindestens einen unterstützten Schlüssel setzt, wendet `settings.json` an und das Manifest `settings` wird ignoriert504* **Datei vor Manifest**: Wenn beide vorhanden sind und `settings.json` mindestens einen unterstützten Schlüssel festlegt, gilt `settings.json`, und `settings` im Manifest wird ignoriert
956* **Benutzer-Einstellungen über Plugin-Standard**: Über Einstellungs-Quellen hinweg sind Plugin-Standard die niedrigste Schicht, daher überschreibt Ihr eigenes `agent` eines Benutzers in `~/.claude/settings.json` Ihres505* **Benutzereinstellungen vor Plugin-Standardwerten**: Über alle Einstellungsquellen hinweg bilden Plugin-Standardwerte die unterste Ebene, sodass ein eigenes `agent` des Benutzers in `~/.claude/settings.json` Ihres überschreibt
957* **Zwei Plugins setzen den gleichen Schlüssel**: Der Wert vom zuletzt geladenen Plugin wendet an, und `claude --debug` protokolliert `overrides setting`506* **Zwei Plugins legen denselben Schlüssel fest**: Es gilt der Wert des zuletzt geladenen Plugins, und `claude --debug` protokolliert `overrides setting`
958 507
959Für die `subagentStatusLine`-Form siehe [Subagent-Statuszeilen](/docs/de/statusline#subagent-status-lines).508Die Form von `subagentStatusLine` finden Sie unter [Statuszeilen für Subagenten](/docs/de/statusline#subagent-status-lines).
960 509
961<h3 id="themes-and-output-styles">510### Themes und Ausgabestile
962 Themen und Output-Stile
963</h3>
964 511
965Ein Plugin kann Farbschemas und Output-Stile enthalten. Beide erscheinen in den gleichen Pickern wie die des Benutzers. Für jeden setzt der Manifest-Schlüssel den Ordner-Scan.512Ein Plugin kann Farbthemes und Ausgabestile enthalten. Beide erscheinen in denselben Auswahlmenüs wie die eigenen des Benutzers. Für beide gilt: Wenn Sie den Manifest-Schlüssel festlegen, ersetzt dieser den Ordner-Scan.
966 513
967| Komponente | Speichern unter | Format | Erscheint in | Manifest-Schlüssel |514| Komponente | Speichern als | Format | Erscheint in | Manifest-Schlüssel |
968| :- | :- | :- | :- | :- |515| :- | :- | :- | :- | :- |
969| Thema | `themes/<slug>.json` | Das [benutzerdefinierte Thema-Dateiformat](/docs/de/terminal-config#create-a-custom-theme), das Benutzer in `~/.claude/themes/` schreiben | `/theme`, unter dem `name` der Datei | `experimental.themes` |516| Theme | `themes/<slug>.json` | Das Format der [benutzerdefinierten Theme-Datei](/docs/de/terminal-config#create-a-custom-theme), das Benutzer in `~/.claude/themes/` schreiben | `/theme`, unter dem `name` der Datei | `experimental.themes` |
970| Output-Stil | `output-styles/<name>.md` | Das [benutzerdefinierte Output-Stil-Format](/docs/de/output-styles#create-a-custom-output-style), mit `name` und `description`-Frontmatter | `/output-style`, als `<plugin>:<name>` | `outputStyles` |517| Ausgabestil | `output-styles/<name>.md` | Das Format des [benutzerdefinierten Ausgabestils](/docs/de/output-styles#create-a-custom-output-style), mit `name`- und `description`-Frontmatter | `/output-style`, als `<plugin>:<name>` | `outputStyles` |
971 518
972Plugin-Themen sind schreibgeschützt, daher wenn ein Benutzer eines in `/theme` bearbeitet, wird die Bearbeitung als Kopie in seinem eigenen Themen-Verzeichnis gespeichert.519Plugin-Themes sind schreibgeschützt. Wenn ein Benutzer eines in `/theme` bearbeitet, wird die Bearbeitung daher als Kopie in seinem eigenen Theme-Verzeichnis gespeichert.
973 520
974Dieses Thema färbt den Prompt-Akzent und Fehlertext auf der dunklen Voreinstellung um:521Dieses Theme färbt den Prompt-Akzent und den Fehlertext der dunklen Voreinstellung um:
975 522
976```json themes/dracula.json theme={null}523```json themes/dracula.json theme={null}
977{524{
984}531}
985```532```
986 533
987<h3 id="channels">534### Channels
988 Kanäle
989</h3>
990 535
991Ein [Kanal](/docs/de/channels) ermöglicht es einem externen System wie einer Chat-App, Nachrichten in eine Sitzung zu senden. In einem Plugin ist ein Kanal einer der MCP-Server plus ein `channels`-Eintrag, der sich daran bindet und seine eigene Konfiguration auffordern kann. Dieses Manifest bindet einen Kanal an einen `telegram`-Server und fragt nach einem Bot-Token:536Ein [Channel](/docs/de/channels) ermöglicht es einem externen System wie einer Chat-App, Nachrichten in eine Sitzung zu senden. In einem Plugin ist ein Channel einer der MCP-Server plus ein `channels`-Eintrag, der an ihn gebunden ist und seine eigene Konfiguration abfragen kann. Dieses Manifest bindet einen Channel an einen `telegram`-Server und fragt nach einem Bot-Token:
992 537
993```json .claude-plugin/plugin.json theme={null}538```json .claude-plugin/plugin.json theme={null}
994{539{
1016}561}
1017```562```
1018 563
1019`server` muss einem Schlüssel in `mcpServers` entsprechen. Die pro-Kanal `userConfig` nimmt die gleiche Form wie der [Top-Level-`userConfig`-Schlüssel](#user-configuration).564`server` muss einem Schlüssel in `mcpServers` entsprechen. Das kanalspezifische `userConfig` hat dieselbe Form wie der [`userConfig`-Schlüssel auf oberster Ebene](#user-configuration).
1020 565
1021Für das, was der Server implementieren muss und wie Benutzer einen Kanal-Plugin aktivieren, siehe [Als Plugin verpacken](/docs/de/channels-reference#package-as-a-plugin) in der Kanäle-Referenz. Für die Feldtabelle siehe [`channels`](/docs/de/plugins/manifest-reference#channels).566Was der Server implementieren muss und wie Benutzer ein Channel-Plugin aktivieren, erfahren Sie unter [Als Plugin paketieren](/docs/de/channels-reference#package-as-a-plugin) in der Channels-Referenz. Die Feldtabelle finden Sie unter [`channels`](/docs/de/plugins/manifest-reference#channels).
1022 567
1023<h3 id="monitors">568### Monitore
1024 Monitore
1025</h3>
1026 569
1027Ein Monitor ist ein Shell-Befehl, der im Hintergrund für die ganze Sitzung läuft. Was er ausgibt, erreicht Claude als Benachrichtigungen, daher kann Claude auf ein Protokoll oder eine Statusänderung reagieren, ohne gebeten zu werden, es zu beobachten. Speichern Sie die Einträge in `monitors/monitors.json`:570Ein Monitor ist ein Shell-Befehl, der während der gesamten Sitzung im Hintergrund läuft. Was er ausgibt, erreicht Claude als Benachrichtigungen, sodass Claude auf ein Log oder eine Statusänderung reagieren kann, ohne zur Beobachtung aufgefordert zu werden. Speichern Sie die Einträge in `monitors/monitors.json`:
1028 571
1029```json monitors/monitors.json theme={null}572```json monitors/monitors.json theme={null}
1030[573[
1036]579]
1037```580```
1038 581
1039Der Befehl läuft in einer Shell, im aktuellen Arbeitsverzeichnis der Sitzung. Er läuft mit Ihren vollen Benutzerberechtigungen und außerhalb der [Sandbox](/docs/de/sandboxing).582Der Befehl läuft in einer Shell im aktuellen Arbeitsverzeichnis der Sitzung. Er läuft mit Ihren vollen Benutzerberechtigungen und außerhalb der [Sandbox](/docs/de/sandboxing).
1040 583
1041Der Befehl eines Monitors ist begrenzt, wo er startet und was er referenzieren kann:584Der Befehl eines Monitors ist eingeschränkt, was seinen Start und das betrifft, worauf er verweisen kann:
1042 585
1043* **Nur interaktive Sitzungen**: Plugin-Monitore starten in einer interaktiven Sitzung und nie im nicht interaktiven Modus mit dem `-p`-Flag. Sie starten auch nicht in Sitzungen, in denen die Einstellungen für den API-Anbieter oder die Telemetrie das [Monitor-Tool](/docs/de/tools-reference#monitor-tool) nicht verfügbar machen586* **Nur interaktive Sitzungen**: Plugin-Monitore starten in einer interaktiven Sitzung und nie im nicht interaktiven Modus mit dem Flag `-p`. Sie starten auch nicht in Sitzungen, in denen die Einstellungen für API-Anbieter oder Telemetrie das [Monitor-Tool](/docs/de/tools-reference#monitor-tool) nicht verfügbar machen
1044* **Keine Benutzerkonfiguration**: `command` erhält die [Pfad-Variablen](#path-variables-and-persistent-data) und `${ENV_VAR}` aus der Umgebung, aber nie `${user_config.*}`. Ein Monitor, der einen referenziert, startet nicht, und Monitor-Prozesse erhalten auch nicht `CLAUDE_PLUGIN_OPTION_<KEY>`587* **Keine Benutzerkonfiguration**: `command` erhält die [Pfadvariablen](#path-variables-and-persistent-data) und `${ENV_VAR}` aus der Umgebung, aber nie `${user_config.*}`. Ein Monitor, der auf eine solche verweist, startet nicht, und Monitor-Prozesse erhalten auch kein `CLAUDE_PLUGIN_OPTION_<KEY>`
1045* **Deaktivieren während der Sitzung**: Wenn Sie ein Plugin während der Sitzung deaktivieren, stoppt Claude Code nicht die Monitore, die bereits laufen. Sie stoppen, wenn die Sitzung endet588* **Deaktivieren während der Sitzung**: Wenn Sie ein Plugin während einer Sitzung deaktivieren, stoppt Claude Code bereits laufende Monitore nicht. Sie stoppen, wenn die Sitzung endet
1046 589
1047Der `experimental.monitors`-Manifest-Schlüssel nimmt das gleiche Array inline oder einen Pfad zu einer JSON-Datei und wird statt `monitors/monitors.json` gelesen.590Der Manifest-Schlüssel `experimental.monitors` akzeptiert dasselbe Array inline oder einen Pfad zu einer JSON-Datei und wird anstelle von `monitors/monitors.json` gelesen.
1048 591
1049Für den `when`-Trigger und die anderen Felder siehe [`monitors`](/docs/de/plugins/manifest-reference#monitors).592Informationen zum Trigger `when` und zu den anderen Feldern finden Sie unter [`monitors`](/docs/de/plugins/manifest-reference#monitors).
1050 593
1051<h2 id="user-configuration">594## Fragen Sie den Benutzer nach Konfigurationswerten
1052 Fragen Sie den Benutzer nach Konfigurationswerten
1053</h2>
1054 595
1055Deklarieren Sie die Werte, die Ihr Plugin vom Benutzer benötigt, im `userConfig`-Manifest-Schlüssel, damit Benutzer nicht `settings.json` selbst bearbeiten. Jede Option erscheint in einem Dialog mit seinem `title` als Label und seiner `description` darunter.596Deklarieren Sie die Werte, die Ihr Plugin vom Benutzer benötigt, im `userConfig`-Manifest-Schlüssel, damit Benutzer nicht `settings.json` selbst bearbeiten. Jede Option erscheint in einem Dialog mit seinem `title` als Label und seiner `description` darunter.
1056 597
1077}618}
1078```619```
1079 620
1080<h3 id="when-the-configuration-dialog-appears">621### Wenn der Konfigurationsdialog erscheint
1081 Wenn der Konfigurationsdialog erscheint
1082</h3>
1083 622
1084Der Dialog ist Teil der interaktiven `/plugin`-Schnittstelle. Wenn der Benutzer eines der folgenden tut, öffnet er sich für jede Option, die noch nicht gesetzt ist:623Der Dialog ist Teil der interaktiven `/plugin`-Schnittstelle. Wenn der Benutzer eines der folgenden tut, öffnet er sich für jede Option, die noch nicht gesetzt ist:
1085 624
1097 636
1098Für die Optionsfelder, wo jeder Wert gespeichert wird, wie eine Komponente einen gespeicherten Wert referenziert und welche Felder `${user_config.*}` ablehnen, siehe [Benutzerkonfiguration](/docs/de/plugins/manifest-reference#user-configuration).637Für die Optionsfelder, wo jeder Wert gespeichert wird, wie eine Komponente einen gespeicherten Wert referenziert und welche Felder `${user_config.*}` ablehnen, siehe [Benutzerkonfiguration](/docs/de/plugins/manifest-reference#user-configuration).
1099 638
1100<h2 id="path-variables-and-persistent-data">639## Referenzieren Sie Plugin-Pfade und speichern Sie Daten
1101 Referenzieren Sie Plugin-Pfade und speichern Sie Daten
1102</h2>
1103 640
1104Sie wissen nicht, wo Ihr Plugin installiert wird, daher referenzieren Sie seine Dateien und Daten durch diese Variablen statt fester Pfade. Sie werden in Skill-, Befehls- und Agent-Inhalten, in Hook- und Monitor-Befehlen und in MCP- und LSP-Server-Konfigurationen ersetzt. Sie werden auch an Hook-, MCP- und LSP-Prozesse exportiert:641Sie wissen nicht, wo Ihr Plugin installiert wird, daher referenzieren Sie seine Dateien und Daten durch diese Variablen statt fester Pfade. Sie werden in Skill-, Befehls- und Agent-Inhalten, in Hook- und Monitor-Befehlen und in MCP- und LSP-Server-Konfigurationen ersetzt. Sie werden auch an Hook-, MCP- und LSP-Prozesse exportiert:
1105 642
1111 648
1112Auf Windows verwenden die ersetzten Pfade Schrägstriche, daher liest eine Shell Backslashes nicht als Escapes.649Auf Windows verwenden die ersetzten Pfade Schrägstriche, daher liest eine Shell Backslashes nicht als Escapes.
1113 650
1114<h3 id="install-dependencies-into-the-data-directory">651### Installieren Sie Abhängigkeiten in das Daten-Verzeichnis
1115 Installieren Sie Abhängigkeiten in das Daten-Verzeichnis
1116</h3>
1117 652
1118Für ein Marketplace-installiertes Plugin installiert Claude Code automatisch berechtigte [Node.js-Paket-Abhängigkeiten](/docs/de/plugins/loading#node-js-package-dependencies), wenn es das Plugin zwischenspeichert, daher müssen Sie sie möglicherweise nicht selbst installieren. Wenn Sie es tun, installiert dieser `SessionStart`-Hook `node_modules` in `${CLAUDE_PLUGIN_DATA}` beim ersten Lauf und erneut nach einer Aktualisierung, die `package.json` ändert:653Für ein Marketplace-installiertes Plugin installiert Claude Code automatisch berechtigte [Node.js-Paket-Abhängigkeiten](/docs/de/plugins/loading#node-js-package-dependencies), wenn es das Plugin zwischenspeichert, daher müssen Sie sie möglicherweise nicht selbst installieren. Wenn Sie es tun, installiert dieser `SessionStart`-Hook `node_modules` in `${CLAUDE_PLUGIN_DATA}` beim ersten Lauf und erneut nach einer Aktualisierung, die `package.json` ändert:
1119 654
1136 671
1137Nach der ersten Sitzung existiert `~/.claude/plugins/data/<id>/node_modules`. Ein MCP-Server kann dann `NODE_PATH` auf `${CLAUDE_PLUGIN_DATA}/node_modules` in seinem `env` setzen. Für welche Felder welche Variable ersetzen, siehe [Umgebungsvariablen](/docs/de/plugins/manifest-reference#environment-variables).672Nach der ersten Sitzung existiert `~/.claude/plugins/data/<id>/node_modules`. Ein MCP-Server kann dann `NODE_PATH` auf `${CLAUDE_PLUGIN_DATA}/node_modules` in seinem `env` setzen. Für welche Felder welche Variable ersetzen, siehe [Umgebungsvariablen](/docs/de/plugins/manifest-reference#environment-variables).
1138 673
1139<h2 id="next-steps">674## Nächste Schritte
1140 Nächste Schritte
1141</h2>
1142 675
1143* [Plugin-Manifest-Referenz](/docs/de/plugins/manifest-reference): `plugin.json`-Felder, Pfad-Regeln und das Standard-Layout676* [Plugin-Manifest-Referenz](/docs/de/plugins/manifest-reference): `plugin.json`-Felder, Pfad-Regeln und das Standard-Layout
1144* [Testen Sie Plugins mit Evals](/docs/de/plugin-evals): Überprüfen Sie, dass die Komponenten, die Sie hinzugefügt haben, Claudes Verhalten so ändern, wie Sie beabsichtigen677* [Testen Sie Plugins mit Evals](/docs/de/plugin-evals): Überprüfen Sie, dass die Komponenten, die Sie hinzugefügt haben, Claudes Verhalten so ändern, wie Sie beabsichtigen