diff --git a/.gitea/workflows/build-and-publish.yaml b/.gitea/workflows/build-and-publish.yaml index abee376..d62768a 100644 --- a/.gitea/workflows/build-and-publish.yaml +++ b/.gitea/workflows/build-and-publish.yaml @@ -4,6 +4,7 @@ name: MindSift CI & Docker Release # push to dev -> :dev # push/merge main -> :latest # git tag v1.2.0 -> :v1.2.0 and :stable +# git tag v1.2.0-rc.1 (pre-release) -> :v1.2.0-rc.1 only, :stable stays on: push: branches: @@ -39,6 +40,7 @@ jobs: # All tags of this run (space separated) case "${GITHUB_REF:-}" in + refs/tags/*-*) TAGS="${DOCKER_TAG}" ;; refs/tags/*) TAGS="${DOCKER_TAG} stable" ;; refs/heads/main) TAGS="latest" ;; *) TAGS="${DOCKER_TAG}" ;; diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..eb8d8c1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,15 @@ +# Changelog + +Alle nennenswerten Änderungen an MindSift stehen in dieser Datei. + +Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die Versionsnummern folgen ab v0.6.0 [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Solange die Hauptversion 0 ist, können sich API und Datenformate mit jeder Minor-Version ändern; solche Änderungen stehen unter „Changed“ bzw. „Removed“ und sind mit **Achtung** markiert. + +## [Unreleased] + +### Changed +- Versionsnummern folgen jetzt Semantic Versioning mit dreiteiligen Tags (`v0.6.0`); die Kopfzeile zeigt die volle Version (`v0.6.0-dev` für Entwicklungsstände). Vorabversionen wie `v1.0.0-rc.1` verschieben das Image `:stable` nicht. +- Das Mengenfeld in Listen öffnet auf dem Handy die Zahlentastatur. + + + +[Unreleased]: https://git.dsit.me/sandrodach/MindSift/compare/v0.5.2...dev diff --git a/Doku/architecture.md b/Doku/architecture.md index 56daeb0..ec66e2d 100644 --- a/Doku/architecture.md +++ b/Doku/architecture.md @@ -100,9 +100,11 @@ Stage 2 golang:1.23 go vet, go test, go build → /app/mindsift ( Stage 3 alpine:3.21 nur Binary, ca-certificates, tzdata ``` -**Image-Tags (CI):** Push auf `dev` → `:dev`; Push/Merge auf `main` → `:latest`; Git-Tag `v*` (z. B. `v1.2.0`) → `:v1.2.0` und `:stable`. Andere Branches bauen nicht. +**Image-Tags (CI):** Push auf `dev` → `:dev`; Push/Merge auf `main` → `:latest`; Git-Tag `v*` (z. B. `v1.2.0`) → `:v1.2.0` und `:stable`; Vorabversionen (`v1.2.0-rc.1`) nur `:v1.2.0-rc.1`, `:stable` bleibt. Andere Branches bauen nicht. -Die angezeigte Version (Kopf der App) setzt der Build-Parameter `APP_VERSION`: Die CI übergibt bei Git-Tags den Tag-Namen (`v0.2`), sonst zeigt die App die Version aus `frontend/package.json` mit `-dev` (`v0.2-dev`). Umgesetzt in `frontend/vite.config.ts` und `frontend/src/version.ts`. +**Versionierung:** Ab v0.6.0 nach [Semantic Versioning](https://semver.org/spec/v2.0.0.html): `MAJOR.MINOR.PATCH`, Tags dreiteilig mit `v` (`v0.6.0`, `v1.0.0-rc.1`). Solange die Hauptversion 0 ist, erhöhen inkompatible Änderungen (API, Datenformate, Konfiguration) die mittlere Stelle, Fehlerbehebungen die letzte. Jede Änderung, die Benutzer oder Betreiber betrifft, kommt in [CHANGELOG.md](../CHANGELOG.md) unter „Unreleased“ (Format [Keep a Changelog](https://keepachangelog.com/de/1.1.0/)); beim Release wird der Abschnitt zur Version mit Datum, `frontend/package.json` bekommt die Versionsnummer. + +Die angezeigte Version (Kopf der App) setzt der Build-Parameter `APP_VERSION`: Die CI übergibt bei Git-Tags den Tag-Namen (`v0.6.0`), sonst zeigt die App die Version aus `frontend/package.json` mit `-dev` (`v0.6.0-dev`). Umgesetzt in `frontend/vite.config.ts` und `frontend/src/version.ts`. Die Tests laufen beim Image-Build (Frontend: `npm run test:run`, Backend: `go test -v ./...`); ein Fehler bricht den Build ab. Frontend-Tests liegen unter `frontend/src/**/__tests__/` (Vitest + jsdom + Testing Library, Setup in `frontend/src/test/setup.ts`). diff --git a/README.md b/README.md index 7d913b2..b9007b8 100644 --- a/README.md +++ b/README.md @@ -168,7 +168,8 @@ Rufe `http://localhost:8080` auf. Beim ersten Start führt ein Assistent durch d * **Reverse-Proxy:** Am besten WebSocket-Upgrade und ungepufferte SSE-Streams durchreichen. Blockiert ein Proxy beides, funktioniert MindSift trotzdem über Long-Polling bzw. regelmäßige Abfragen, nur etwas träger. Beispiele für Nginx, Traefik, Caddy und Cloudflare: [Doku/reverse-proxy.md](Doku/reverse-proxy.md). * **Datensicherung:** In den Admin-Einstellungen lassen sich automatische tägliche Backups einschalten (ganze Datenbank plus ein Backup je Benutzer unter `data/backups/`, Standard 3 Tage aufbewahrt). Benutzer laden ihre Server-Backups herunter oder spielen sie ganz oder für einzelne Bereiche wieder ein. Der Ordner liegt neben der Datenbank: zusätzlich woanders sichern. Manuell geht weiterhin `sqlite3 mindsift.db ".backup 'backup.db'"`. * **Updates:** Neues Image ziehen und Container neu starten (`docker compose pull && docker compose up -d`). Das Schema wird beim Start automatisch angepasst. Die laufende Version steht im Kopf der App unter dem Namen. -* **Image-Tags:** `:dev` = Stand des Branches `dev`, `:latest` = Stand von `main`, `:stable` = zuletzt veröffentlichte Version. Ein Git-Tag wie `v1.2.0` erzeugt `:v1.2.0` und verschiebt `:stable` darauf. +* **Image-Tags:** `:dev` = Stand des Branches `dev`, `:latest` = Stand von `main`, `:stable` = zuletzt veröffentlichte Version. Ein Git-Tag wie `v1.2.0` erzeugt `:v1.2.0` und verschiebt `:stable` darauf; Vorabversionen wie `v1.0.0-rc.1` verschieben `:stable` nicht. +* **Versionen & Änderungen:** [Semantic Versioning](https://semver.org/spec/v2.0.0.html), was sich geändert hat, steht in der [CHANGELOG.md](CHANGELOG.md). --- diff --git a/frontend/src/features/lists/SharedListsView.tsx b/frontend/src/features/lists/SharedListsView.tsx index a9bc9cf..f9793a0 100644 --- a/frontend/src/features/lists/SharedListsView.tsx +++ b/frontend/src/features/lists/SharedListsView.tsx @@ -1123,6 +1123,7 @@ export const SharedListsView: React.FC = ({ onRefreshGloba
setNewItemQty(e.target.value.replace(/[^0-9.,xX]/g, ''))} placeholder="Menge (z.B. 2)" diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 294a2a2..aafa380 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -2,10 +2,10 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import { readFileSync } from 'node:fs'; -// Shown in the header. Release builds get the git tag (APP_VERSION build argument, e.g. "v0.2"); -// other builds show the package version with a "-dev" suffix. +// Shown in the header. Release builds get the git tag (APP_VERSION build argument, e.g. "v0.6.0"); +// other builds show the package version with a "-dev" suffix (Semantic Versioning, see CHANGELOG.md). const pkg = JSON.parse(readFileSync(new URL('./package.json', import.meta.url), 'utf8')); -const appVersion = process.env.APP_VERSION || `v${pkg.version.replace(/\.0$/, '')}-dev`; +const appVersion = process.env.APP_VERSION || `v${pkg.version}-dev`; export default defineConfig({ plugins: [react()],