Privater Symfony Flex Recipe-Server für smr492/*-Bundles. Stellt Flex-Recipes bereit, damit ein composer require smr492/<bundle> automatisch Bundle-Registrierung, Konfigurationsdateien und Routen in der Host-App ablegt.
In der composer.json der Host-App (z.B. CarClubManager, api-base, Auftrags-Cockpit):
{
"extra": {
"symfony": {
"endpoint": [
"https://raw.githubusercontent.com/SmR492/recipes/main/index.json",
"flex://defaults"
]
}
}
}Flex zieht den index.json direkt vom GitHub-Raw-Endpoint und fällt für alle nicht gelisteten Pakete auf den offiziellen Flex-Endpoint zurück.
Hinweis: Bei Composer path-repositories (lokale
../auth-bundle-Pfade) wendet Flex keine Custom-Recipes an – siehetraces/anti-patterns/flex-local-recipe-assumption.mdimprojects-Wiki. In dem Fall die Dateien aussmr492/<bundle>/<version>/manuell in die Host-App kopieren.Der
https://api.github.com/repos/.../contents/...-Endpoint funktioniert nicht — er liefert JSON mit base64-encoded Inhalt statt der rohen Datei. Immerraw.githubusercontent.comverwenden.
| Paket | Recipe-Version | Host-App-Bundle-Klasse | Status |
|---|---|---|---|
smr492/auth-bundle |
1.0 |
Smr492\AuthBundle\Smr492AuthBundle |
aktiv |
smr492/neuro-symbolic-ai-bundle |
1.0 |
SmR492\NeuroSymbolicAiBundle\NeuroSymbolicAiBundle |
aktiv |
recipes/
├── index.json Manifest-Index (Flex liest das)
├── README.md
└── smr492/
└── <bundle>/
└── <major.minor>/
├── manifest.json Zeigt auf bundles/, copy-from-recipe/, post-install-output/
├── config/
│ ├── packages/<bundle>.yaml
│ └── routes/<bundle>.yaml
└── post-install.txt (optional) Hinweise an den Anwender
Ein Recipe-Tree wird über manifest.json referenziert; die Felder sind mit dem offiziellen Flex-Schema identisch:
{
"bundles": {
"Vendor\\Bundle\\VendorBundle": ["all"]
},
"copy-from-recipe": {
"config/": "%CONFIG_DIR%/"
},
"post-install-output": [
"Next steps:",
" * Review config/packages/<bundle>.yaml"
]
}Empirisch verifiziert (Issue #4): Das alte flache
{"manifests": {…}}-Format wird von Flex bei einem konfiguriertenextra.symfony.endpointignoriert (Flex fällt auf eine auto-generierte Recipe zurück → nur Bundle-Registrierung, keine Config-Dateien). Ein konfigurierter Endpoint verlangt das moderne Format.
Die smr492/<bundle>/<version>/-Ordner sind die Quelle. Der Generator flatten.mjs erzeugt daraus die von Flex konsumierten Dateien:
index.json— Endpoint-Index:recipes(Paket→Versionen) +_links(mitrecipe_template_relative, branch-agnostisch) +branch+is_contrib: false.<paket_dotted>.<version>.json— Per-Recipe-Manifest inkl.files(Dateiinhalte als Zeilen-Array) +ref.
node flatten.mjs main # erzeugt index.json + <paket>.<version>.json aus smr492/*/*/Wichtig für Consumer:
is_contrib: false— eigener vertrauter Server; Flex wendet die Recipes ohneallow-contrib/Prompt an.- Recipes matchen nur getaggte Releases (z.B.
1.0.0), nicht Dev-Branch-Installs (dev-…) — Flex wertet Dev-Versionen kleiner als jede numerische Recipe-Version.
- Ordner
smr492/<bundle>/<major.minor>/anlegen. manifest.jsonschreiben:bundles→ Fully-qualified Bundle-Klasse + Env-Array (["all"]oder["dev","test"]).copy-from-recipe→ lokale Pfade (z.B.config/) auf Flex-Platzhalter (%CONFIG_DIR%/) mappen.- Optional
post-install-outputfür Next-Steps-Hinweise.
- Unter
config/packages/<bundle>.yamlund ggf.config/routes/<bundle>.yamldie Host-App-Defaults ablegen. node flatten.mjs mainausführen → regeneriertindex.json+<paket_dotted>.<version>.json(nicht von Hand pflegen).- Änderungen nach
mainmergen – der GitHub raw-Endpoint ist sofort aktiv. Consumer ziehen die getaggte Release-Version (composer require smr492/<bundle>:^1.0).
- Major-Version des Bundles = eigener Recipe-Ordner (
auth-bundle/1.0, späterauth-bundle/2.0). - Breaking Changes an der Host-Contract-Fläche (z.B. neue Pflichtfelder am
User-Entity) rechtfertigen einen neuen Recipe-Ordner. - Minor-Updates innerhalb der selben Major-Linie überschreiben den bestehenden Ordner.
Die Host-App muss ein User-Entity bereitstellen, das SmR492\AuthBundle\Contract\AuthUserInterface implementiert. Die Entity muss mindestens diese Felder tragen:
id,email(unique),username(unique),password,rolesisVerified,isLocked,lastLoginAt,failedLoginAttemptspreferredLocale,timezone,notifyOnLogin
Siehe projects/wiki/decisions/auth-bundle-architecture.md für das vollständige Interface.
- Projekt-Dokumentation:
projects/wiki/projects/recipes.md - Symfony Flex Docs: https://symfony.com/doc/current/setup/flex.html
- Flex Recipe-Repository (upstream): https://github.com/symfony/recipes