Die owlat-plugins-CLI
Bundled-Plugin-Komposition mit owlat-plugins scaffolden, hinzufügen, entfernen und neu generieren.
@owlat/plugin-cli (Binary owlat-plugins) ist das Lifecycle-Werkzeug für den gebündelten Plugin-Satz. Es arbeitet auf dem eingecheckten Kompositionspunkt plugins.config.ts und delegiert jede Kompositionsentscheidung an @owlat/plugin-codegen — es implementiert Komposition niemals selbst nach.
Führen Sie es von einer beliebigen Stelle innerhalb des Owlat-Workspace aus. Aus einem Source-Checkout:
bun run plugins:prepare # build the plugin-kit contracts once
bun packages/plugin-cli/src/index.ts --help
owlat plugins — manage bundled Owlat plugins
Usage: owlat plugins <command> [options]
Commands:
create <plugin-id> [--name <package>] [--dir <path>] [--template <name>]
[--dry-run]
Scaffold a new plugin package (never installs or executes code).
--template minimal (default) emits an empty manifest; --template
send-provider emits a complete send-transport bundle: send module,
feedback webhook, sending-domain identity, capabilities and test stubs.
add <package> [--dry-run]
Add a bundled plugin package to plugins.config.ts and preview its
capability diff. --dry-run previews without writing.
remove <package> [--dry-run]
Remove a bundled plugin package from plugins.config.ts.
codegen [--check] [--boundaries-only]
Regenerate (or check) the bundled composition via @owlat/plugin-codegen.
dev
Regenerate the composition and re-run on every plugins.config.ts change.
Run from anywhere inside the Owlat workspace.
Sicherheitseigenschaften
Diese gelten für jeden Befehl, und sie sind der Grund, warum die CLI gefahrlos gegen einen Produktions-Checkout laufen kann:
- Sie wertet
plugins.config.tsniemals als Code aus. Die Konfiguration wird als statische Daten geparst. - Sie importiert niemals einen beliebigen Pfad. Das einzige Laden von Modulen, das sie durchführt, wird an den verifizierten Loader der Codegen delegiert, der ausschließlich den lockfile-gepinnten, provenance-geprüften Manifest-Eintrag jedes gebündelten Packages importiert — niemals ein Contribution- oder Komponentenmodul.
- Validierung geht der Mutation voraus. Der vorgeschlagene Package-Satz wird vollständig geladen und validiert, bevor irgendeine Datei geschrieben wird; ein fehlendes, falsch gepinntes oder ungültiges Package schlägt mit einem umsetzbaren Fehler und unveränderter Konfiguration fehl.
- Änderungen sind deterministisch und idempotent. Ein erneuter Lauf erzeugt byte-identische Ausgabe; ein bereits gelistetes
add(oder ein nicht vorhandenesremove) ist eine gemeldete No-op, die nichts schreibt. - Fehlschläge werden zurückgerollt.
createentfernt jede angelegte Datei und jedes angelegte Verzeichnis, wenn ein Schreibvorgang fehlschlägt; ein fehlgeschlagenes Schreiben der Konfiguration lässt die Konfiguration unverändert.
create
owlat-plugins create hello-owlat [--name @acme/owlat-hello] [--dir plugins/hello] [--dry-run]
Scaffoldet ein Plugin-Package: package.json, tsconfig.json, vitest.config.ts, README.md, src/manifest.ts, src/index.ts sowie einen Manifest-Test. Der Inhalt ist eine reine Funktion aus Id, Package-Name und der Position des Verzeichnisses im Workspace — keine Zeitstempel, keine Zufälligkeit.
Defaults: --name @owlat/plugin-<id>, --dir examples/plugins/<id>. Ein erneuter Lauf auf einem unveränderten Scaffold ist eine No-op; eine Datei, die mit anderem Inhalt existiert, bricht den Lauf ab, statt sie zu überschreiben.
add / remove
owlat-plugins add @vendor/owlat-plugin-example --dry-run
owlat-plugins add @vendor/owlat-plugin-example
owlat-plugins remove @vendor/owlat-plugin-example
Beide geben vor dem Schreiben ein Capability-Diff aus: die hinzugefügten oder entfernten Plugins sowie die Capabilities, die die Komposition als Vereinigung über den gebündelten Satz hinweg gewinnt oder verliert. Lesen Sie dieses Diff — für ein gebündeltes Plugin ist es die vollständige Liste der Host-Operationen, die das Package jemals anfordern kann.
--dry-run gibt das Diff sowie die exakte vorgeschlagene plugins.config.ts aus und schreibt nichts.
Wenn der aktuelle Satz nicht geladen werden kann — zum Beispiel weil das Package, das Sie entfernen, selbst defekt ist —, wird der vorgeschlagene Satz dennoch validiert und die Mutation dennoch ausgeführt; das Diff meldet den Vorher-Zustand als nicht verfügbar, statt stillschweigend irreführende Arithmetik anzuzeigen.
add bearbeitet ausschließlich die Kompositionsliste. Das Package muss bereits ein direkter Root-Eintrag unter dependencies / optionalDependencies sein und aus der Registry installiert worden sein, sonst weist der verifizierte Loader es zurück: "Bundled plugin <name> must be installed as a root dependency or optionalDependency".
codegen
owlat-plugins codegen # regenerate the composition files
owlat-plugins codegen --check # fail if output is missing or stale (CI)
owlat-plugins codegen --boundaries-only # only enforce the import boundary
Generiert die eingecheckten Convex- und Nuxt-Kompositionsmodule, den Convex-Component-Installer sowie jedes Contribution-Katalog/Registry-Paar neu. --boundaries-only erzwingt die Regel, dass Core-Quellcode ein konfiguriertes Plugin-Package außerhalb dieser generierten Dateien nicht importieren darf — auch nicht über Node-/Bun-Loader oder Repository-Aliase —, und zwar ohne selbst Plugin-Code zu importieren.
Äquivalente Workspace-Skripte, die CI und der Build-Graph ausführen:
bun run plugins:codegen # regenerate
bun run plugins:check # --check
bun run lint:plugin-imports # --boundaries-only
bun run plugins:check ist Teil von ci:lint, ci:verify sowie der Turbo-Tasks build und deploy, sodass eine veraltete oder ungültige Komposition den Build fail-closed abbrechen lässt.
dev
owlat-plugins dev
Generiert die Komposition neu und führt sie bei jeder Änderung an plugins.config.ts erneut aus. Nützlich beim Iterieren am gebündelten Satz; es ersetzt nicht das Committen der generierten Ausgabe.
Commit-Disziplin
Generierte Kompositionsdateien sind eingecheckt. Committen Sie die Konfigurationsänderung und die neu generierte Ausgabe immer zusammen — ein generiertes Artefakt gehört in denselben Commit wie die Eingabe, die es erzeugt hat, und andernfalls lässt plugins:check die CI fehlschlagen.