SD-2: Build- und Deploy-Infrastruktur für lokale Entwicklung #4

Merged
martin merged 1 commit from issue/2/build-und-deploy-infrastruktur-fuer-lokale into main 2026-08-14 12:29:10 +02:00
Owner

Closes #2

Änderungen

  • Root-package.json mit npm-Workspace plugins/* (nicht profiles/* — deren package.json ist Elgato-Profil-Metadata, keine npm-Manifeste, siehe README-Abschnitt "Why plugins and profiles are packed differently")
  • scripts/pack-plugin.mjs — validiert manifest.json (inkl. leerer Strings), prüft dass CodePath gebaut wurde, zippt *.sdPlugin/ nach plugins/dist/<name>.streamDeckPlugin
  • scripts/pack-profile.mjs — zippt Profiles/ nach profiles/dist/<name>.streamDeckProfile
  • scripts/lib/zip-dir.mjs — geteilte Zip-Logik (inkl. Error-Handler auf dem Write-Stream)
  • plugins/placeholder-plugin/ — minimales Plugin (Rollup + TypeScript) zur Ende-zu-Ende-Verifikation des Build-Pfads
  • .forgejo/workflows/test.yml — npm ci && npm test && npm run build --workspaces auf Push/PR
  • .forgejo/workflows/release.yml — Tag-Trigger plugin-<name>@<version> / profile-<name>@<version>, baut ausschließlich das referenzierte Artefakt und veröffentlicht es als Forgejo-Release-Asset (benötigt Repo-Secret RELEASE_TOKEN, siehe README)
  • Bugfix: .gitignore-Pattern *.sdPlugin/bin/ griff nicht für verschachtelte Pfade (plugins/<name>/<uuid>.sdPlugin/bin/) — auf **/*.sdPlugin/bin/ korrigiert
  • README um Development-/Release-Workflow ergänzt

Getestete Akzeptanzkriterien

  • Plugin lokal bauen und verlinken — npm run build -w plugins/<name> erzeugt ein gültiges *.sdPlugin-Verzeichnis
  • Profil lokal erzeugen und importieren — npm run pack:profile -- profiles/<name> erzeugt ein importierbares .streamDeckProfile im ignorierten profiles/dist/
  • Einzelnes Artefakt releasen — .forgejo/workflows/release.yml baut pro Tag ausschließlich das referenzierte Paket
  • Ungültiges Plugin — pack-plugin.mjs bricht bei fehlenden/leeren Pflichtfeldern oder fehlendem CodePath mit Exit-Code 1 und verständlicher Meldung ab, ohne Artefakt zu erzeugen
  • Kein Gerät angeschlossen — kein CI-Schritt setzt ein Gerät oder die Elgato-App voraus; Build/Validierung laufen vollständig lokal in der CI

Tests

node --test tests/*.mjs (Node-Built-in-Test-Runner): 4 Tests für pack-profile.mjs/pack-plugin.mjs (Happy Path + Fehlerfälle), TDD-Zyklus RED→GREEN durchlaufen. Zusätzlich manuell Ende-zu-Ende gegen profiles/default-profile und das Platzhalter-Plugin verifiziert (frischer npm ci-Lauf, Artefakte sind valide ZIPs).

Version

Entfällt — Monorepo mit unabhängiger Pro-Paket-Versionierung über Git-Tags (plugin-<name>@<version> / profile-<name>@<version>); ein repo-weites Root-Versionsfeld hätte keine Konsumenten und keine Bedeutung.

Code-Review

Durchgeführt: Architektur-Review (Timo), Security-Review (Nils, keine Findings), Code-Review in drei Dimensionen (Korrektheit/Vereinfachung/Effizienz). Alle validen Befunde behoben: fehlende Existenzprüfung des Plugin-Verzeichnisses, unbehandelter Write-Stream-Error, leere Pflichtfelder wurden akzeptiert, fehlende CodePath-Prüfung vor dem Packen, duplizierte Zip-/Test-Helper-Logik extrahiert, process-Shadowing im Test-Helper behoben, CI-Workflows um actions/setup-node (gepinnt) ergänzt, Tag-Werte in Shell-Kommandos über env: statt direkter ${{ }}-Interpolation gehärtet.

Bekannte, bewusst nicht behobene Punkte (Begründung im PR-Review dokumentiert): plugins/dist/ liegt formal innerhalb der Workspace-Glob plugins/* (unproblematisch, da kein package.json darin); geteilte Rollup-/tsconfig-Presets für künftige weitere Plugins wären bei aktuell nur einem Plugin verfrühte Abstraktion.

Closes #2 ## Änderungen - Root-`package.json` mit npm-Workspace `plugins/*` (nicht `profiles/*` — deren `package.json` ist Elgato-Profil-Metadata, keine npm-Manifeste, siehe README-Abschnitt "Why plugins and profiles are packed differently") - `scripts/pack-plugin.mjs` — validiert `manifest.json` (inkl. leerer Strings), prüft dass `CodePath` gebaut wurde, zippt `*.sdPlugin/` nach `plugins/dist/<name>.streamDeckPlugin` - `scripts/pack-profile.mjs` — zippt `Profiles/` nach `profiles/dist/<name>.streamDeckProfile` - `scripts/lib/zip-dir.mjs` — geteilte Zip-Logik (inkl. Error-Handler auf dem Write-Stream) - `plugins/placeholder-plugin/` — minimales Plugin (Rollup + TypeScript) zur Ende-zu-Ende-Verifikation des Build-Pfads - `.forgejo/workflows/test.yml` — `npm ci && npm test && npm run build --workspaces` auf Push/PR - `.forgejo/workflows/release.yml` — Tag-Trigger `plugin-<name>@<version>` / `profile-<name>@<version>`, baut ausschließlich das referenzierte Artefakt und veröffentlicht es als Forgejo-Release-Asset (benötigt Repo-Secret `RELEASE_TOKEN`, siehe README) - Bugfix: `.gitignore`-Pattern `*.sdPlugin/bin/` griff nicht für verschachtelte Pfade (`plugins/<name>/<uuid>.sdPlugin/bin/`) — auf `**/*.sdPlugin/bin/` korrigiert - README um Development-/Release-Workflow ergänzt ## Getestete Akzeptanzkriterien - [x] Plugin lokal bauen und verlinken — `npm run build -w plugins/<name>` erzeugt ein gültiges `*.sdPlugin`-Verzeichnis - [x] Profil lokal erzeugen und importieren — `npm run pack:profile -- profiles/<name>` erzeugt ein importierbares `.streamDeckProfile` im ignorierten `profiles/dist/` - [x] Einzelnes Artefakt releasen — `.forgejo/workflows/release.yml` baut pro Tag ausschließlich das referenzierte Paket - [x] Ungültiges Plugin — `pack-plugin.mjs` bricht bei fehlenden/leeren Pflichtfeldern oder fehlendem `CodePath` mit Exit-Code 1 und verständlicher Meldung ab, ohne Artefakt zu erzeugen - [x] Kein Gerät angeschlossen — kein CI-Schritt setzt ein Gerät oder die Elgato-App voraus; Build/Validierung laufen vollständig lokal in der CI ## Tests `node --test tests/*.mjs` (Node-Built-in-Test-Runner): 4 Tests für `pack-profile.mjs`/`pack-plugin.mjs` (Happy Path + Fehlerfälle), TDD-Zyklus RED→GREEN durchlaufen. Zusätzlich manuell Ende-zu-Ende gegen `profiles/default-profile` und das Platzhalter-Plugin verifiziert (frischer `npm ci`-Lauf, Artefakte sind valide ZIPs). ## Version Entfällt — Monorepo mit unabhängiger Pro-Paket-Versionierung über Git-Tags (`plugin-<name>@<version>` / `profile-<name>@<version>`); ein repo-weites Root-Versionsfeld hätte keine Konsumenten und keine Bedeutung. ## Code-Review Durchgeführt: Architektur-Review (Timo), Security-Review (Nils, keine Findings), Code-Review in drei Dimensionen (Korrektheit/Vereinfachung/Effizienz). Alle validen Befunde behoben: fehlende Existenzprüfung des Plugin-Verzeichnisses, unbehandelter Write-Stream-Error, leere Pflichtfelder wurden akzeptiert, fehlende CodePath-Prüfung vor dem Packen, duplizierte Zip-/Test-Helper-Logik extrahiert, `process`-Shadowing im Test-Helper behoben, CI-Workflows um `actions/setup-node` (gepinnt) ergänzt, Tag-Werte in Shell-Kommandos über `env:` statt direkter `${{ }}`-Interpolation gehärtet. Bekannte, bewusst nicht behobene Punkte (Begründung im PR-Review dokumentiert): `plugins/dist/` liegt formal innerhalb der Workspace-Glob `plugins/*` (unproblematisch, da kein `package.json` darin); geteilte Rollup-/tsconfig-Presets für künftige weitere Plugins wären bei aktuell nur einem Plugin verfrühte Abstraktion.
SD-2: Build- und Deploy-Infrastruktur für lokale Entwicklung
All checks were successful
Test / test (pull_request) Successful in 9m27s
ec56d92a6b
npm-Workspace für Plugins, generische Pack-Skripte für Plugins/Profile,
Platzhalter-Plugin zur Verifikation des Build-Pfads, sowie Forgejo-Actions-
Workflows für PR-Tests und tag-basierte selektive Releases.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
martin merged commit 3e361c0c33 into main 2026-08-14 12:29:10 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
keineantwort.de/streamdeck-plugins!4
No description provided.