Einführung
Wenn Sie schon seit einiger Zeit eigene Claude Code Plugins erstellen, kennen Sie das sicher: Sie möchten dieselbe Fähigkeit in zwei verschiedenen Plugins verfügbar haben, also kopieren Sie sie einfach. Das funktioniert so lange, bis Sie die Fähigkeit aktualisieren müssen und plötzlich feststellen, dass Sie jede Kopie der Fähigkeit, die in Ihren Plugin-Verzeichnissen verstreut ist, aufspüren müssen.
Kommt Ihnen das bekannt vor? Das habe ich auch schon erlebt. In diesem Beitrag möchte ich Ihnen zeigen, wie Sie das DRY-Prinzip - Don't Repeat Yourself - auf Ihre Claude Code Plugin-Skills anwenden können, indem Sie ein gemeinsames Skills-Verzeichnis auf oberster Ebene einführen und symbolische Links verwenden, um die Dinge miteinander zu verbinden.
Das Problem mit dem Kopieren von Fähigkeiten
Ein Claude Code Plugin befindet sich in einem Verzeichnis und kann Skills bereitstellen - kleine Markdown-Dateien, die einen Befehl oder eine Fähigkeit beschreiben, die Claude verwenden kann. Wenn Sie mehr als ein Plugin haben, ist es verlockend, die Dinge wie folgt zu strukturieren:
claude-plugin-project-root/
└── plugins/
├── devops-plugin/
│ └── skills/
│ ├── deploy.md
│ └── commit-message.md # 👈 copy
└── review-plugin/
└── skills/
├── review-pr.md
└── commit-message.md # 👈 another copy
Die Fertigkeit commit-message.md ist in beiden Plugins nützlich, also landet sie in beiden. Am Anfang ist das kein Problem. Dann verbessern Sie die Fertigkeit und müssen daran denken, sie an jedem Ort zu aktualisieren. Wenn Sie das versäumen, haben Sie zwei Plugins, die sich für denselben Vorgang unterschiedlich verhalten - die Art von subtiler Inkonsistenz, die bei der Fehlersuche lästig und bei der Auslieferung einfach ist.
Extrahieren Sie Fertigkeiten in ein gemeinsames Verzeichnis der obersten Ebene
Die Lösung ist ganz einfach: Geben Sie den gemeinsam genutzten Fähigkeiten ein einziges Zuhause und lassen Sie die Plugins, die sie benötigen, auf dieses Zuhause verweisen. Erstellen Sie ein Verzeichnis skills auf der obersten Ebene Ihres Plugin-Projekts - eine Ebene über den Plugins:
claude-plugin-project-root/
├── skills/ # shared skills live here
│ └── commit-message.md
└── plugins/
├── devops-plugin/
│ └── skills/
│ └── deploy.md
└── review-plugin/
└── skills/
└── review-pr.md
Ich gebe zu, es ist nichts Aufregendes daran, eine Datei um ein Verzeichnis nach oben zu verschieben. Der interessante Teil ist das, was danach kommt.
Verbinden Sie Plugins mit gemeinsamen Skills über symbolische Links
Anstatt commit-message.md in das Verzeichnis skills des jeweiligen Plugins zu kopieren, erstellen Sie einen symbolischen Link vom Plugin zurück zur gemeinsamen Datei:
# from the claude-plugin-project-root
ln -s ./skills/commit-message.md \
./plugins/devops-plugin/skills/commit-message.md
ln -s ./skills/commit-message.md \
./plugins/review-plugin/skills/commit-message.md
Das Ergebnis sieht auf der Festplatte wie folgt aus:
claude-plugin-project-root/
├── skills/
│ └── commit-message.md # the one source of truth
└── plugins/
├── devops-plugin/
│ └── skills/
│ ├── deploy.md
│ └── commit-message.md -> ../../../skills/commit-message.md
└── review-plugin/
└── skills/
├── review-pr.md
└── commit-message.md -> ../../../skills/commit-message.md
Sie können die korrekte Einstellung des symbolischen Links mit dem Befehl ls -la plugins/devops-plugin/skills/ überprüfen.
Beide Plugins sehen nun commit-message.md genauso wie zuvor, aber es gibt nur eine Datei, die Sie pflegen müssen. Aktualisieren Sie sie einmal und alle Plugins profitieren sofort davon. Denken Sie daran, einen relativen Pfad als Ziel für den Symlink zu verwenden, keinen absoluten Pfad, damit der Link auch nach dem Klonen funktioniert.
Funktionieren von Symlinks in einem Git-Repository
Symbolische Links werden von Git verfolgt, so dass Ihr Team die gleiche Struktur erhält, wenn es das Repository klont - keine manuelle Einrichtung erforderlich. Sie können die korrekte Verfolgung der Symlinks mit überprüfen:
git ls-files --stage claude-plugin-project-root/plugins/devops-plugin/skills/commit-message.md
Sie sollten den Modus 120000 sehen, mit dem Git angibt, dass die Datei ein Symlink ist:
120000 a3f5b2c1... 0 claude-plugin-project-root/plugins/devops-plugin/skills/commit-message.md
Auf MacOs und Linux funktioniert dies einfach. Eines sollten Sie bedenken: Unter Windows muss für die Erstellung von Symlinks entweder der Entwicklermodus aktiviert sein oder der Prozess muss mit erhöhten Rechten ausgeführt werden. Wenn Ihr Team plattformübergreifend arbeitet, lohnt es sich, dies in der README Ihres Repositorys zu dokumentieren.
Fazit
Das ist alles, was Sie brauchen. Durch die Extraktion gemeinsam genutzter Fähigkeiten in ein einziges Top-Level-Verzeichnis und die Verwendung symbolischer Links, um sie mit den Plugins zu verbinden, die sie benötigen, erhalten Sie die gleichen Vorteile, die Sie von jeder DRY-Refaktorisierung erwarten: ein Ort zum Aktualisieren, kein Risiko, dass Kopien aus der Synchronisation geraten, und eine Struktur, die sauber skaliert, wenn Sie mehr Plugins hinzufügen.
Prost 🙏
Verfasst von
Kris Geusebroek
Contact