Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ testdaten/** -text
*.pdf binary
*.ttf binary
*.xlsx binary
*.icns binary

# Linux-Skripte und -Dateien (Chromebook-Pakete) brauchen LF
*.sh text eol=lf
*.desktop text eol=lf

# macOS-Paket: Skript und Info.plist mit LF
*.plist text eol=lf
61 changes: 61 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# Baut die Solution und führt alle Tests aus – bei jedem Push und Pull Request.
# Zusätzlich auf macOS: Tests, App-Paket bauen und einmal starten (ersetzt einen fehlenden Test-Mac), und auf Windows
# mit ARM-Prozessor: Tests (ersetzt einen fehlenden Snapdragon-Laptop).
# Warnungen (auch StyleCop und SonarAnalyzer) gelten als Fehler, siehe Directory.Build.props.
name: Build und Tests

Expand Down Expand Up @@ -40,3 +42,62 @@ jobs:
path: |
TestResults/**/*.trx
TestResults/**/*.cobertura.xml

macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v7

- uses: actions/setup-dotnet@v6
with:
dotnet-version: '10.0.x'

- name: Bauen
run: dotnet build AndiGenerator.slnx -c Release -nologo

- name: Testen
run: dotnet test AndiGenerator.slnx -c Release --no-build -nologo --filter "Kategorie!=Messung" --logger "console;verbosity=minimal"

- name: App-Paket bauen
run: |
dotnet publish src/AndiGenerator.Desktop -c Release -r osx-arm64 --self-contained -nologo -o publish -p:Version=0.0.0-ci
mkdir -p pakete
bash src/AndiGenerator.Desktop/macOS/paket-bauen.sh osx-arm64 0.0.0-ci publish pakete

# Startet das Programm aus dem Disk-Image und prüft, dass es nach 20 Sekunden noch läuft (Laufzeit, Signatur,
# native Bibliotheken, Hauptfenster); ein Bildschirmfoto davon wird mit aufgehoben.
- name: Starten (Rauchtest)
run: |
hdiutil attach pakete/*.dmg -mountpoint /tmp/andigen -nobrowse
/tmp/andigen/AndiGenerator.NET.app/Contents/MacOS/AndiGenerator.NET > start.log 2>&1 &
pid=$!
sleep 20
screencapture -x start.png || true
if ! kill -0 "$pid" 2>/dev/null; then cat start.log; echo "Programm ist beim Start beendet worden" >&2; exit 1; fi
kill "$pid"
hdiutil detach /tmp/andigen

- name: Paket und Startbild aufheben
if: always()
uses: actions/upload-artifact@v7
with:
name: macos
path: |
pakete/*.dmg
start.png
start.log

windows-arm:
runs-on: windows-11-arm
steps:
- uses: actions/checkout@v7

- uses: actions/setup-dotnet@v6
with:
dotnet-version: '10.0.x'

- name: Bauen
run: dotnet build AndiGenerator.slnx -c Release -nologo

- name: Testen
run: dotnet test AndiGenerator.slnx -c Release --no-build -nologo --filter "Kategorie!=Messung" --logger "console;verbosity=minimal"
68 changes: 65 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Erzeugt eine neue Version auf GitHub Releases, sobald ein Tag wie v1.0.0 gepusht wird:
# bauen und testen, veröffentlichen (win-x64, eigenständig), mit Velopack Setup, portable ZIP und Update-Pakete
# bauen und testen, veröffentlichen (win-x64 und win-arm64, eigenständig), mit Velopack Setup, portable ZIP und Update-Pakete
# erzeugen und alles als Release hochladen. Das installierte Programm findet die neue Version dort selbst.
# Danach kommen Linux-Pakete für Chromebooks dazu (x64 und arm64, je .deb und portables tar.gz; ohne Selbst-Update).
# Danach kommen Linux-Pakete für Chromebooks dazu (x64 und arm64, je .deb und portables tar.gz; ohne Selbst-Update)
# und macOS-Pakete (Apple-Chip und Intel, je .dmg mit ad hoc signiertem App-Paket; ohne Selbst-Update).
name: Release

on:
Expand Down Expand Up @@ -43,19 +44,35 @@ jobs:
- name: Veröffentlichen
run: dotnet publish src/AndiGenerator.Desktop -c Release -r win-x64 --self-contained -nologo -o publish -p:Version=${{ steps.version.outputs.version }}

# Windows-Laptops mit ARM-Prozessor (Snapdragon): eigener Velopack-Kanal win-arm64 mit eigenem Setup; ein so
# installiertes Programm sucht Updates nur in diesem Kanal.
- name: Veröffentlichen (ARM64)
run: dotnet publish src/AndiGenerator.Desktop -c Release -r win-arm64 --self-contained -nologo -o publish-arm64 -p:Version=${{ steps.version.outputs.version }}

- name: Velopack installieren
run: dotnet tool install -g vpk --version ${{ env.VPK_VERSION }}

- name: Vorige Version für Delta-Updates holen
continue-on-error: true
run: vpk download github --repoUrl ${{ github.server_url }}/${{ github.repository }} --token ${{ secrets.GITHUB_TOKEN }}

- name: Vorige ARM64-Version für Delta-Updates holen
continue-on-error: true
run: vpk download github --channel win-arm64 --repoUrl ${{ github.server_url }}/${{ github.repository }} --token ${{ secrets.GITHUB_TOKEN }}

- name: Pakete erzeugen
run: >
vpk pack --packId AndiGeneratorNET --packVersion ${{ steps.version.outputs.version }}
--packDir publish --mainExe AndiGenerator.NET.exe --packTitle "AndiGenerator.NET"
--packAuthors "Peter Buchmann" --icon src/AndiGenerator.UI/Assets/AndiGenerator.NET.ico

- name: Pakete erzeugen (ARM64)
run: >
vpk pack --packId AndiGeneratorNET --packVersion ${{ steps.version.outputs.version }}
--packDir publish-arm64 --mainExe AndiGenerator.NET.exe --packTitle "AndiGenerator.NET"
--packAuthors "Peter Buchmann" --icon src/AndiGenerator.UI/Assets/AndiGenerator.NET.ico
--channel win-arm64 --runtime win-arm64

# Stückliste und Nachweise sind Zugaben: Scheitern sie, wird das Release trotzdem veröffentlicht.
- name: Stückliste (SBOM) der ausgelieferten Dateien
continue-on-error: true
Expand All @@ -80,7 +97,7 @@ jobs:
continue-on-error: true
uses: actions/attest-sbom@v4
with:
subject-path: Releases/*-Setup.exe
subject-path: Releases/AndiGeneratorNET-win-Setup.exe
sbom-path: AndiGeneratorNET-${{ steps.version.outputs.version }}-sbom.spdx.json

- name: Auf GitHub Releases hochladen
Expand All @@ -89,6 +106,12 @@ jobs:
--token ${{ secrets.GITHUB_TOKEN }} --publish
--releaseName "AndiGenerator.NET ${{ steps.version.outputs.version }}" --tag ${{ github.ref_name }}

- name: ARM64-Pakete zum Release hinzufügen
run: >
vpk upload github --channel win-arm64 --repoUrl ${{ github.server_url }}/${{ github.repository }}
--token ${{ secrets.GITHUB_TOKEN }} --publish --merge
--releaseName "AndiGenerator.NET ${{ steps.version.outputs.version }}" --tag ${{ github.ref_name }}

- name: Stückliste an das Release hängen
continue-on-error: true
env:
Expand Down Expand Up @@ -133,3 +156,42 @@ jobs:
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release upload ${{ github.ref_name }} pakete/* --clobber --repo ${{ github.repository }}

# macOS (MacBook, iMac, Mac mini …): eigenständig veröffentlichen, zum App-Paket bündeln, ad hoc signieren und als
# Disk-Image an das Release hängen. Ohne Apple-Entwicklerkonto keine Beglaubigung (Notarisierung); siehe Anleitung.
macos:
needs: release
runs-on: macos-latest
strategy:
matrix:
rid: [ osx-arm64, osx-x64 ]
steps:
- uses: actions/checkout@v7

- uses: actions/setup-dotnet@v6
with:
dotnet-version: 10.0.x

- name: Version aus dem Tag
id: version
run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"

- name: Veröffentlichen
run: dotnet publish src/AndiGenerator.Desktop -c Release -r ${{ matrix.rid }} --self-contained -nologo -o publish -p:Version=${{ steps.version.outputs.version }}

- name: Paket erzeugen
run: |
mkdir -p pakete
bash src/AndiGenerator.Desktop/macOS/paket-bauen.sh ${{ matrix.rid }} ${{ steps.version.outputs.version }} publish pakete
ls -l pakete

- name: Herkunftsnachweis
continue-on-error: true
uses: actions/attest-build-provenance@v4
with:
subject-path: pakete/*

- name: An das Release hängen
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release upload ${{ github.ref_name }} pakete/* --clobber --repo ${{ github.repository }}
23 changes: 17 additions & 6 deletions Doku/ANLEITUNG.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,16 @@ Wenn Sie vorher mit dem Original-AndiGenerator gearbeitet haben, übernimmt Andi

## 2. Installation

AndiGenerator.NET läuft unter Windows 10 und 11 (64 Bit), auf Chromebooks und unter Linux (siehe unten). Administratorrechte sind nicht nötig, und .NET muss nicht installiert sein – alles Nötige ist dabei.
AndiGenerator.NET läuft unter Windows 10 und 11 (64 Bit), auf dem Mac (macOS 14 oder neuer), auf Chromebooks und unter Linux (siehe unten). Administratorrechte sind nicht nötig, und .NET muss nicht installiert sein – alles Nötige ist dabei.

**Mit Setup (empfohlen)**

1. Auf der Seite [Releases](https://github.com/PBuchmann/AndiGenerator.NET/releases) bei der neuesten Version die Datei `AndiGeneratorNET-win-Setup.exe` herunterladen.
1. Auf der Seite [Releases](https://github.com/PBuchmann/AndiGenerator.NET/releases) bei der neuesten Version die Datei `AndiGeneratorNET-win-Setup.exe` herunterladen. Für Windows-Laptops mit ARM-Prozessor (z. B. Snapdragon) gibt es `AndiGeneratorNET-win-arm64-Setup.exe`; sie rechnet dort deutlich schneller. Welcher Prozessor eingebaut ist, steht unter *Einstellungen → System → Info → Systemtyp* („ARM-basierter Prozessor“).
2. Die Datei starten. Das Programm wird für Ihr Benutzerkonto installiert (im Ordner `%LOCALAPPDATA%\AndiGeneratorNET`), erscheint im Startmenü und auf dem Desktop und startet gleich.

**Ohne Installation**

Stattdessen `AndiGeneratorNET-win-Portable.zip` herunterladen, in einen beliebigen Ordner entpacken und dort `AndiGenerator.NET.exe` starten. Diese Variante eignet sich z. B. für einen USB-Stick.
Stattdessen `AndiGeneratorNET-win-Portable.zip` (bzw. `AndiGeneratorNET-win-arm64-Portable.zip`) herunterladen, in einen beliebigen Ordner entpacken und dort `AndiGenerator.NET.exe` starten. Diese Variante eignet sich z. B. für einen USB-Stick.

**Warnung von Windows beim ersten Start**

Expand All @@ -61,14 +61,25 @@ Das installierte Programm sucht nach dem Start selbst nach einer neuen Version u

Über *Einstellungen → Apps → Installierte Apps → AndiGenerator.NET → Deinstallieren*. Ihre Daten im Ordner `%LOCALAPPDATA%\AndiGenerator.NET` und Ihre click-TT-Dateien bleiben erhalten.

**Auf dem Mac**

1. Auf der Seite [Releases](https://github.com/PBuchmann/AndiGenerator.NET/releases) das passende Disk-Image herunterladen: `AndiGeneratorNET-<Version>-macos-arm64.dmg` für Macs mit Apple-Chip (M1 und neuer), `…-macos-x64.dmg` für ältere Macs mit Intel-Prozessor. Welcher Chip eingebaut ist, steht unter * → Über diesen Mac*.
2. Das Disk-Image öffnen und **AndiGenerator.NET** auf den Ordner **Programme** ziehen.
3. Beim ersten Start meldet macOS, dass Apple das Programm nicht überprüfen konnte, und öffnet es nicht – das Programm ist noch nicht von Apple beglaubigt. Die Meldung mit **Fertig** schließen, dann *Systemeinstellungen → Datenschutz & Sicherheit* öffnen, nach unten blättern und bei AndiGenerator.NET **Dennoch öffnen** wählen und mit dem Passwort bestätigen. Danach startet das Programm normal.

Statt **Strg** gilt auf dem Mac die Befehlstaste **⌘** (z. B. ⌘ + Plus zum Vergrößern). Die eigenen Daten liegen im Ordner `~/Library/Application Support/AndiGenerator.NET`. Neue Versionen werden auf dem Mac nicht selbst gesucht – zum Aktualisieren das neue Disk-Image herunterladen und das Programm genauso in *Programme* ziehen (ersetzen).

**Auf einem Chromebook (und unter Linux)**

Auf Chromebooks läuft das Programm in der Linux-Entwicklungsumgebung, die ChromeOS mitbringt.

1. Einmalig Linux einschalten: *Einstellungen → Info zu ChromeOS → Entwickler → Linux-Entwicklungsumgebung → Aktivieren* (bei älteren Versionen *Einstellungen → Erweitert → Entwickler*).
2. Auf der Seite [Releases](https://github.com/PBuchmann/AndiGenerator.NET/releases) das passende Paket herunterladen: `andigenerator-net_<Version>_amd64.deb` für Chromebooks mit Intel- oder AMD-Prozessor, `…_arm64.deb` für Chromebooks mit ARM-Prozessor (z. B. MediaTek oder Qualcomm). Welcher Prozessor eingebaut ist, steht unter *Einstellungen → Info zu ChromeOS → Weitere Details*, oder im Linux-Terminal mit `dpkg --print-architecture`.
3. In der App *Dateien* doppelt auf die heruntergeladene Datei klicken und **Installieren** wählen. Das Programm erscheint danach im Launcher im Ordner *Linux-Apps*.
4. Die click-TT-Dateien müssen für Linux sichtbar sein: entweder in den Ordner *Linux-Dateien* legen oder einen Ordner in *Dateien* mit der rechten Maustaste **Mit Linux teilen**.
3. Die Datei in der App *Dateien* in den Ordner *Linux-Dateien* ziehen.
4. Das *Terminal* öffnen (im Launcher unter *Linux-Apps*) und eingeben – mit dem Dateinamen der heruntergeladenen Datei:
`sudo apt install ./andigenerator-net_<Version>_amd64.deb`
ChromeOS bietet die Installation per Doppelklick nicht mehr an. Das Programm erscheint danach im Launcher im Ordner *Linux-Apps*.
5. Die click-TT-Dateien müssen für Linux sichtbar sein: entweder in den Ordner *Linux-Dateien* legen oder einen Ordner in *Dateien* mit der rechten Maustaste **Mit Linux teilen**.

Ohne Installation geht es mit `AndiGeneratorNET-<Version>-linux-x64.tar.gz` bzw. `…-linux-arm64.tar.gz`: entpacken und `./AndiGenerator.NET` starten. Unter Linux liegen die eigenen Daten im Ordner `~/.local/share/AndiGenerator.NET`. Neue Versionen werden hier nicht selbst gesucht – zum Aktualisieren das neue Paket genauso installieren.

Expand Down Expand Up @@ -169,7 +180,7 @@ Im Automodus entfällt die Kachel *Pflichtregeln*; die Ergebniskachel nimmt ihre

![Ergebniskachel im Automodus](Anleitung/Bilder/18-automodus.png)

Den **Hauptbereich** füllen die Ansichten. Jede Ansicht öffnet sich als Reiter; Sie können mehrere öffnen, zwischen ihnen wechseln, sie per Maus nebeneinander anordnen und mit dem **×** am Reiter schließen. In vielen Ansichten vergrößert oder verkleinert **Strg + Mausrad** (oder der Zoomregler) die Darstellung.
Den **Hauptbereich** füllen die Ansichten. Jede Ansicht öffnet sich als Reiter; Sie können mehrere öffnen, zwischen ihnen wechseln, sie per Maus nebeneinander anordnen und mit dem **×** am Reiter schließen. In vielen Ansichten vergrößert oder verkleinert **Strg + Mausrad** (auf dem Mac auch **⌘ + Mausrad**, oder der Zoomregler) die Darstellung.

Ganz unten zeigt die **Statuszeile** den Stand in einer Zeile.

Expand Down
Binary file modified Doku/Anleitung.pdf
Binary file not shown.
2 changes: 2 additions & 0 deletions Doku/MIGRATIONSPLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -735,3 +735,5 @@ Befund: Billigere Pläne nach der Kostenfunktion des Originals sind nicht automa
| 05.10.2026 | Release: zusätzlich Linux-Pakete für Chromebooks (Linux-Entwicklungsumgebung) – eigenständig veröffentlicht für linux-x64 und linux-arm64, je Debian-Paket (`/opt/andigenerator-net`, Eintrag im Launcher) und portables tar.gz (`src/AndiGenerator.Desktop/Linux/paket-bauen.sh`, Job `linux` im Release-Workflow); ohne Selbst-Update |
| 05.10.2026 | Bildschirmfotos der Anleitung automatisch: `bildschirmfotos.cmd` startet den UI-Test `Bildschirmfotos` (Avalonia.Headless mit Skia, 1400 × 860, 150 %), der mit der anonymisierten Staffel R2_4 Startseite, Einrichtung, Kostenoptimierung mit allen Ansichten, Automodus (neues Bild 18-automodus: Ergebniskachel) und die Dialoge aufnimmt; ohne Umgebungsvariable `ANDIGEN_BILDER` tut der Test nichts. |
| 05.10.2026 | Anleitung: eigener Abschnitt 5.1 „Der Automodus“ (Phasen, Wertung des besten Plans, Eingreifen, Wahl des Verfahrens); Abschnitt 3.5 verweist darauf. Nach dem Start zeigen Ansichten, die „Start mit“ auf den Ausgangsplan gestellt hatte, wieder die laufende Generierung (vorher blieb dort der unveränderte Ausgangsplan stehen). Bildschirmfotos von Teilen des Fensters: ganzes Fenster zeichnen und zuschneiden (beim Zeichnen nur eines Teils zerfiel die Schrift). |
| 10.10.2026 | macOS (Weg zu 1.0, Vorgabe Peter): Release-Job `macos` baut für osx-arm64 und osx-x64 ein App-Paket (`src/AndiGenerator.Desktop/macOS`: Info.plist, Symbol .icns, `paket-bauen.sh`), signiert es ad hoc (ohne Apple-Entwicklerkonto keine Notarisierung, erster Start über „Dennoch öffnen“) und hängt je ein .dmg an das Release; ohne Selbst-Update wie unter Linux. CI baut, testet und startet die App zusätzlich auf macOS (Rauchtest mit Bildschirmfoto), da kein Test-Mac vorhanden ist. Oberfläche: Zoom auch mit ⌘ (Tasten und Mausrad), Programmmenü des Macs mit „Über“ und „Anleitung“. Anleitung: Abschnitt Mac; Chromebook-Installation per Terminal (`sudo apt install`), da ChromeOS .deb-Dateien nicht mehr per Doppelklick installiert. |
| 10.10.2026 | Windows auf ARM (Snapdragon-Laptops): Release veröffentlicht zusätzlich win-arm64 und packt es als eigenen Velopack-Kanal `win-arm64` (eigenes Setup und Portable-ZIP, Updates nur in diesem Kanal), hochgeladen mit `--merge` ins selbe Release. CI testet zusätzlich auf `windows-11-arm`. Anleitung und README nennen die ARM-Dateien. |
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ AndiGenerator.NET ist die C#/.NET-Portierung des **AndiGenerators** von **Andrea

## Installation

Die neueste Version gibt es unter [Releases](https://github.com/PBuchmann/AndiGenerator.NET/releases): `AndiGeneratorNET-win-Setup.exe` installiert das Programm für den eigenen Benutzer (ohne Administratorrechte) und hält es danach selbst aktuell; `AndiGeneratorNET-win-Portable.zip` läuft ohne Installation. Windows 10/11, 64 Bit. Für Chromebooks (Linux-Entwicklungsumgebung) und Linux gibt es Debian-Pakete `andigenerator-net_<Version>_amd64.deb` bzw. `_arm64.deb` und portable `tar.gz`. Bis zur digitalen Signierung warnt Windows beim ersten Start – Einzelheiten in der [Anleitung](Doku/ANLEITUNG.md#2-installation).
Die neueste Version gibt es unter [Releases](https://github.com/PBuchmann/AndiGenerator.NET/releases): `AndiGeneratorNET-win-Setup.exe` installiert das Programm für den eigenen Benutzer (ohne Administratorrechte) und hält es danach selbst aktuell; `AndiGeneratorNET-win-Portable.zip` läuft ohne Installation. Windows 10/11, 64 Bit; für Windows-Laptops mit ARM-Prozessor (Snapdragon) `AndiGeneratorNET-win-arm64-Setup.exe` bzw. `-win-arm64-Portable.zip`. Für Macs (macOS 14 oder neuer) gibt es Disk-Images `AndiGeneratorNET-<Version>-macos-arm64.dmg` (Apple-Chip) bzw. `-macos-x64.dmg` (Intel). Für Chromebooks (Linux-Entwicklungsumgebung) und Linux gibt es Debian-Pakete `andigenerator-net_<Version>_amd64.deb` bzw. `_arm64.deb` und portable `tar.gz`. Bis zur digitalen Signierung warnt Windows beim ersten Start – Einzelheiten in der [Anleitung](Doku/ANLEITUNG.md#2-installation).

## Selbst bauen

Expand Down
Binary file not shown.
35 changes: 35 additions & 0 deletions src/AndiGenerator.Desktop/macOS/Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!-- Beschreibung des App-Pakets für macOS; @VERSION@ und @KURZVERSION@ setzt paket-bauen.sh ein. -->
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>AndiGenerator.NET</string>
<key>CFBundleDisplayName</key>
<string>AndiGenerator.NET</string>
<key>CFBundleIdentifier</key>
<string>io.github.pbuchmann.andigenerator-net</string>
<key>CFBundleExecutable</key>
<string>AndiGenerator.NET</string>
<key>CFBundleIconFile</key>
<string>AndiGenerator.NET.icns</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleDevelopmentRegion</key>
<string>de</string>
<key>CFBundleShortVersionString</key>
<string>@KURZVERSION@</string>
<key>CFBundleVersion</key>
<string>@VERSION@</string>
<key>LSMinimumSystemVersion</key>
<string>14.0</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.sports</string>
<key>NSHighResolutionCapable</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>© 2017 Andreas Hofmann, © 2026 Peter Buchmann · GPL-3.0</string>
</dict>
</plist>
Loading
Loading