diff --git a/.claude/scripts/bump.sh b/.claude/scripts/bump.sh new file mode 100644 index 0000000..8720079 --- /dev/null +++ b/.claude/scripts/bump.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +# bump.sh – Version erhöhen, CHANGELOG aktualisieren, committen und pushen +# +# Verwendung: +# bash .claude/scripts/bump.sh patch "Beschreibung der Änderung" +# bash .claude/scripts/bump.sh minor "Beschreibung der Änderung" +# bash .claude/scripts/bump.sh major "Beschreibung der Änderung" + +set -euo pipefail + +BUMP_TYPE="${1:-patch}" +MESSAGE="${2:-}" + +if [[ -z "$MESSAGE" ]]; then + echo "Fehler: Beschreibung fehlt." + echo "Verwendung: bash .claude/scripts/bump.sh [patch|minor|major] \"Beschreibung\"" + exit 1 +fi + +ROOT="$(git rev-parse --show-toplevel)" +VERSION_FILE="$ROOT/VERSION" +CHANGELOG_FILE="$ROOT/CHANGELOG.md" + +# Aktuelle Version lesen +CURRENT=$(cat "$VERSION_FILE" | tr -d '[:space:]') +IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT" + +# Version erhöhen +case "$BUMP_TYPE" in + major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;; + minor) MINOR=$((MINOR + 1)); PATCH=0 ;; + patch) PATCH=$((PATCH + 1)) ;; + *) + echo "Fehler: Ungültiger Typ '$BUMP_TYPE'. Erlaubt: patch, minor, major" + exit 1 + ;; +esac + +NEW_VERSION="$MAJOR.$MINOR.$PATCH" +DATE=$(date +%Y-%m-%d) + +echo "Bump: $CURRENT → $NEW_VERSION ($BUMP_TYPE)" + +# VERSION aktualisieren +echo "$NEW_VERSION" > "$VERSION_FILE" + +# CHANGELOG-Eintrag einfügen (nach der ersten ---) +ENTRY="## [$NEW_VERSION] - $DATE\n\n### Changed\n- $MESSAGE\n\n---\n" +# Füge nach der ersten '---' Zeile ein +awk -v entry="$ENTRY" '/^---$/ && !inserted { print; printf "%s", entry; inserted=1; next } { print }' \ + "$CHANGELOG_FILE" > "$CHANGELOG_FILE.tmp" && mv "$CHANGELOG_FILE.tmp" "$CHANGELOG_FILE" + +# Commit und Push +git -C "$ROOT" add "$VERSION_FILE" "$CHANGELOG_FILE" +git -C "$ROOT" commit -m "chore: bump version to $NEW_VERSION + +$MESSAGE + +Version: $NEW_VERSION" +git -C "$ROOT" push + +echo "Fertig: Version $NEW_VERSION committed und gepusht." diff --git a/.claude/scripts/new-feature.sh b/.claude/scripts/new-feature.sh new file mode 100644 index 0000000..e82b388 --- /dev/null +++ b/.claude/scripts/new-feature.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# new-feature.sh – Feature- oder Fix-Branch aus develop erstellen und pushen +# +# Verwendung: +# bash .claude/scripts/new-feature.sh feature +# bash .claude/scripts/new-feature.sh fix +# bash .claude/scripts/new-feature.sh debug + +set -euo pipefail + +TYPE="${1:-}" +NAME="${2:-}" + +if [[ -z "$TYPE" || -z "$NAME" ]]; then + echo "Verwendung: bash .claude/scripts/new-feature.sh [feature|fix|debug] " + exit 1 +fi + +case "$TYPE" in + feature|fix|debug) ;; + *) + echo "Fehler: Ungültiger Typ '$TYPE'. Erlaubt: feature, fix, debug" + exit 1 + ;; +esac + +BRANCH="$TYPE/$NAME" +ROOT="$(git rev-parse --show-toplevel)" + +# Sicherstellen dass develop aktuell ist +echo "Wechsle zu develop und aktualisiere..." +git -C "$ROOT" checkout develop +git -C "$ROOT" pull origin develop + +# Branch erstellen und pushen +echo "Erstelle Branch: $BRANCH" +git -C "$ROOT" checkout -b "$BRANCH" +git -C "$ROOT" push -u origin "$BRANCH" + +echo "Fertig: Branch '$BRANCH' erstellt und gepusht." +echo "Aktiver Branch: $(git -C "$ROOT" branch --show-current)" diff --git a/.claude/session-context.md b/.claude/session-context.md new file mode 100644 index 0000000..3b9d684 --- /dev/null +++ b/.claude/session-context.md @@ -0,0 +1,42 @@ +# Session-Kontext + +> Claude liest diese Datei zu Beginn jeder Session. +> Claude aktualisiert sie am Ende jeder Session (Version, Branch, offene Arbeit). + +--- + +## Aktueller Stand + +| Feld | Wert | +|---|---| +| **Version** | 0.2.1 | +| **Aktiver Branch** | feature/grundstruktur | +| **Basis-Branch** | develop | +| **Zuletzt geändert** | 2026-04-05 | + +## Offene Arbeit + +- [ ] Techstack festlegen +- [ ] feature/grundstruktur → develop mergen (wenn Techstack entschieden) + +## Zuletzt abgeschlossen + +- Repo-Infrastruktur aufgebaut (CLAUDE.md, Standards, Branching, README, PR-Template) +- .gitattributes, bump.sh, new-feature.sh, session-context.md eingeführt +- Branch Protection + Squash-Merge serverseitig konfiguriert + +## Schnellreferenz + +```bash +# Version bumpen +bash .claude/scripts/bump.sh patch "Was wurde geändert" + +# Neuen Branch erstellen +bash .claude/scripts/new-feature.sh feature + +# Aktueller Branch +git branch --show-current + +# Status +git status +``` diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..834ff6c --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,14 @@ +{ + "permissions": { + "allow": [ + "Bash(curl -s -o /dev/null -w \"%{http_code}\" https://tea.jr-family.de/api/v1/repos/Admin/gartenmanager)", + "Bash(git -C c:/Projekte/Home/gartenmanager config --get credential.helper)", + "Bash(git credential:*)", + "Bash(python3 -m json.tool)", + "Bash(git -C c:/Projekte/Home/gartenmanager credential fill)", + "Bash(python3 -c \"import sys,json; r=json.load\\(sys.stdin\\); print\\('allow_squash_merge:', r.get\\('allow_squash_merge'\\), '| default_merge_style:', r.get\\('default_merge_style'\\)\\)\")", + "Bash(bash .claude/scripts/bump.sh patch \"Add autonomous branch-switching rule to workflow docs\")", + "Bash(bash .claude/scripts/bump.sh patch \"Update project plan: finalize phases, techstack and architecture decisions\")" + ] + } +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a6c04ab --- /dev/null +++ b/.gitattributes @@ -0,0 +1,35 @@ +# Automatische Zeilenendenormalisierung +* text=auto + +# Explizit Text-Dateien auf LF normieren +*.md text eol=lf +*.txt text eol=lf +*.json text eol=lf +*.yaml text eol=lf +*.yml text eol=lf +*.toml text eol=lf +*.xml text eol=lf +*.html text eol=lf +*.css text eol=lf +*.scss text eol=lf +*.js text eol=lf +*.ts text eol=lf +*.tsx text eol=lf +*.jsx text eol=lf +*.py text eol=lf +*.sh text eol=lf +*.env text eol=lf + +# Binärdateien – kein Zeilenenden-Handling +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.svg binary +*.woff binary +*.woff2 binary +*.ttf binary +*.eot binary +*.pdf binary +*.zip binary diff --git a/.gitea/PULL_REQUEST_TEMPLATE.md b/.gitea/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..90a321e --- /dev/null +++ b/.gitea/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,28 @@ +## Beschreibung + + + +## Typ der Änderung + +- [ ] `feat` – neues Feature +- [ ] `fix` – Bugfix +- [ ] `refactor` – Code-Umbau ohne Verhaltensänderung +- [ ] `chore` – Wartung, Build, Konfiguration +- [ ] `docs` – nur Dokumentation + +## Checkliste + +- [ ] Alle Tests erfolgreich (``) +- [ ] Versionsnummer erhöht (`VERSION` + `CHANGELOG.md`) +- [ ] `docs/project-structure.md` aktualisiert (falls Funktionen/Module geändert) +- [ ] `README.md` aktualisiert (falls nötig) +- [ ] Branch ist aktuell mit `develop` (rebase/merge) +- [ ] Kein direkter Push nach `main` – diese PR geht nach `develop` + +## Getestete Szenarien + + + +## Version + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d9e58ca --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,61 @@ +# Changelog + +Alle wesentlichen Änderungen am Projekt werden hier dokumentiert. +Format: `[MAJOR.MINOR.PATCH] - YYYY-MM-DD` + +--- +## [0.2.3] - 2026-04-05 + +### Changed +- Update project plan: finalize phases, techstack and architecture decisions + +--- +## [0.2.2] - 2026-04-05 + +### Changed +- Add autonomous branch-switching rule to workflow docs + +--- + +## [0.2.1] - 2026-04-05 + +### Changed +- `CLAUDE.md` auf reine Dispatch-Tabelle reduziert (keine Regelwiederholungen) +- `docs/project-structure.md` als dichte Modulreferenz-Vorlage strukturiert + +### Added +- `.claude/scripts/bump.sh` – Version + CHANGELOG + commit + push in einem Befehl +- `.claude/scripts/new-feature.sh` – Feature/Fix/Debug-Branch aus develop erstellen +- `.claude/session-context.md` – Sessionstart-Kontext (Version, Branch, offene Arbeit) + +--- + +## [0.2.0] - 2026-04-05 + +### Added +- `.gitattributes` – automatische LF-Normalisierung, keine CRLF-Warnungen mehr +- `README.md` – Projektbeschreibung, Features-Übersicht, Links zur Dokumentation +- `.gitea/PULL_REQUEST_TEMPLATE.md` – Checkliste für PRs (Tests, Version, Docs) +- Branch Protection für `main` und `develop` (serverseitig konfiguriert) +- Squash-Merge als Standard-Merge-Strategie (serverseitig konfiguriert) + +--- + +## [0.1.1] - 2026-04-05 + +### Changed +- Entwicklungsstandards um Branching-Regeln, Versionierungsschema und Workflow-Regeln erweitert + +### Added +- CHANGELOG.md eingeführt +- VERSION-Datei eingeführt + +--- + +## [0.1.0] - 2026-04-05 + +### Added +- CLAUDE.md – Guidance für Claude Code +- docs/development-standards.md – allgemeine Entwicklungsstandards +- docs/project-structure.md – Projektstruktur und Domänenmodell +- docs/branching-strategy.md – Branching-Strategie diff --git a/CLAUDE.md b/CLAUDE.md index 143e439..cb6cf16 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,14 +4,19 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Projekt -**Gartenmanager** – eine Anwendung zur Verwaltung und Planung von Gartenaktivitäten (Pflanzen, Aussaatkalender, Aufgaben, Bewässerung etc.). +**Gartenmanager** – Anwendung zur Verwaltung von Gartenaktivitäten (Pflanzen, Beete, Aussaatkalender, Aufgaben, Bewässerung). -## Weiterführende Dokumente +## Dokumente – wo was steht | Dokument | Inhalt | |---|---| -| [docs/development-standards.md](docs/development-standards.md) | Allgemeine Entwicklungsstandards (Coding Style, Git, Testing) | -| [docs/project-structure.md](docs/project-structure.md) | Projektstruktur und Architekturübersicht | +| [docs/development-standards.md](docs/development-standards.md) | **Alle Regeln:** Branching, Versionierung, Workflow, Coding, Testing | +| [docs/project-structure.md](docs/project-structure.md) | **Alle Module & Funktionen** – hier zuerst lesen, bevor Quellcode geöffnet wird | +| [docs/branching-strategy.md](docs/branching-strategy.md) | Branch-Diagramm | +| [CHANGELOG.md](CHANGELOG.md) | Versionshistorie | +| [VERSION](VERSION) | Aktuelle Versionsnummer | +| [.claude/session-context.md](.claude/session-context.md) | **Sessionstart hier lesen:** aktiver Branch, Version, offene Arbeit | +| [.claude/scripts/](.claude/scripts/) | Automatisierungsscripts (bump, new-feature) | ## Techstack @@ -39,9 +44,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co # Build für Produktion # + +# Version bumpen + commit + push (patch/minor/major) +bash .claude/scripts/bump.sh patch "Beschreibung der Änderung" + +# Neuen Feature-Branch erstellen +bash .claude/scripts/new-feature.sh ``` - -## Wichtige Konventionen - -- Sprache: Deutsch für Domänenkonzepte (Pflanzen, Beet, Aussaat …), Englisch für Code-Bezeichner und Commit-Messages -- Alle Dateipfade in den `docs/`-Dokumenten aktuell halten, wenn sich die Struktur ändert diff --git a/README.md b/README.md new file mode 100644 index 0000000..e235df5 --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# Gartenmanager + +Persönliche Webanwendung zur Verwaltung und Planung von Gartenaktivitäten. + +## Features (geplant) + +- **Pflanzenverwaltung** – Pflanzenarten mit Eigenschaften (Aussaatzeit, Wasserbedarf, Abstand …) +- **Beetplanung** – Beete anlegen und Pflanzen zuordnen +- **Aussaatkalender** – Jahresbasierter Aussaat- und Pflanzungsplan +- **Aufgabenverwaltung** – Gartenaufgaben mit Fälligkeitsdatum +- **Bewässerungsplan** – Intervalle je Beet oder Pflanze + +## Techstack + +> Noch festzulegen. + +## Entwicklung + +> Build- und Run-Befehle werden hier ergänzt, sobald der Techstack feststeht. + +Weiterführende Dokumentation: + +- [Entwicklungsstandards](docs/development-standards.md) +- [Projektstruktur](docs/project-structure.md) +- [Branching-Strategie](docs/branching-strategy.md) +- [Changelog](CHANGELOG.md) + +## Versionierung + +Aktuelle Version: siehe [VERSION](VERSION) + +Schema: `MAJOR.MINOR.PATCH` – Details in den [Entwicklungsstandards](docs/development-standards.md#versionierung). diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..7179039 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.2.3 diff --git a/docs/development-standards.md b/docs/development-standards.md index 313c44f..36bce45 100644 --- a/docs/development-standards.md +++ b/docs/development-standards.md @@ -13,17 +13,27 @@ Allgemein gültige Standards für die Arbeit in diesem Repository. --- -## Git +## Git & Branching -### Branching +### Struktur ``` -main – stabiler Produktionsstand -feature/ – neue Features -fix/ – Bugfixes -chore/ – Wartung, Abhängigkeiten, Konfiguration +main +└── develop + ├── feature/ – neue Features + ├── fix/ – Bugfixes / kleine Fixes + └── debug/ – Debugging / Fehleranalyse ``` +### Regeln + +0. **Branch-Wechsel erfolgen selbstständig** – Claude wechselt eigenständig in den jeweils passenden Branch, ohne nachzufragen. Dabei gelten alle übrigen Regeln uneingeschränkt. +1. **Nie direkt nach `main` pushen oder mergen.** Änderungen in `main` kommen ausschließlich über eine Pull-Request aus `develop`. +2. Jede Änderung findet in einem eigenen `feature/` oder `fix/` Branch unterhalb von `develop` statt. +3. In `develop` mergen erst, wenn die Arbeit abgeschlossen ist und alle Tests erfolgreich waren. +4. Eine PR nach `main` wird nur auf explizite Anweisung des Nutzers geöffnet. +5. Vor jedem Merge nach `develop` und vor jeder PR nach `main` werden alle wesentlichen Dokumente (README.md, CHANGELOG.md, docs/) geprüft und ggf. aktualisiert. + ### Commit-Messages Format: `: ` (max. 72 Zeichen) @@ -37,7 +47,31 @@ Format: `: ` (max. 72 Zeichen) | `docs` | Nur Dokumentation | | `chore` | Build, Dependencies, Konfiguration | -Beispiel: `feat: add watering schedule to plant detail view` +**Nach jedem Commit wird sofort gepusht.** + +--- + +## Versionierung + +Schema: `MAJOR.MINOR.PATCH` + +| Teil | Bedeutung | Wechsel | +|---|---|---| +| `MAJOR` | Hauptrelease | Nur auf explizite Anweisung des Nutzers | +| `MINOR` | Größere Updates, neue Features | Bei jeder Feature-Erweiterung oder größerem Umbau | +| `PATCH` | Kleine Fixes, Minimalkorrekturen | Bei Bugfixes, kleinen Ergänzungen, Mini-Umbauten | + +- Die aktuelle Version steht in [CHANGELOG.md](../CHANGELOG.md) und in der Datei `VERSION` +- Nach **jeder** Änderung wird die Versionsnummer eigenständig erhöht und in beiden Dateien notiert +- Die Versionsnummer wird im Commit-Message-Footer vermerkt: `Version: x.y.z` + +--- + +## Projektstruktur-Dokumentation + +- Alle Funktionen/Module werden kurz in [docs/project-structure.md](project-structure.md) dokumentiert +- Ziel: Token-Effizienz in zukünftigen Conversations – nicht alles neu einlesen müssen +- Bei jeder Änderung an Funktionen/Modulen wird die Dokumentation synchron aktualisiert --- @@ -56,6 +90,7 @@ Beispiel: `feat: add watering schedule to plant detail view` - Integrationstests an Systemgrenzen (API, Datenbank) - Keine Mocks für die Datenbank in Integrationstests - Testdatei liegt neben der zu testenden Datei oder in einem `__tests__`/`tests`-Verzeichnis auf gleicher Ebene +- **In `develop` wird erst gemergt, wenn alle Tests grün sind** --- diff --git a/docs/project-structure.md b/docs/project-structure.md index 81f27fb..de88c16 100644 --- a/docs/project-structure.md +++ b/docs/project-structure.md @@ -1,47 +1,59 @@ -# Projektstruktur +# Projektstruktur & Modulreferenz -> Dieses Dokument beschreibt die Verzeichnisstruktur und Architektur des Gartenmanagers. -> Bei strukturellen Änderungen bitte hier aktualisieren. +> **Token-Sparmaßnahme:** Dieses Dokument ist die erste Anlaufstelle. +> Vor dem Öffnen von Quellcode hier nachschlagen. +> Bei jeder Änderung an Funktionen, Modulen oder der Verzeichnisstruktur sofort aktualisieren. --- -## Verzeichnisübersicht +## Verzeichnisstruktur ``` gartenmanager/ -├── CLAUDE.md # Guidance für Claude Code +├── .claude/ # Claude-Tooling (kein Projektcode) +│ ├── scripts/ +│ │ ├── bump.sh # Version bumpen + commit + push +│ │ └── new-feature.sh # Feature-Branch erstellen +│ └── session-context.md # Sessionstart-Kontext +├── .gitea/ +│ └── PULL_REQUEST_TEMPLATE.md ├── docs/ -│ ├── development-standards.md # Allgemeine Entwicklungsstandards -│ └── project-structure.md # Dieses Dokument -│ -│ (weitere Verzeichnisse entstehen mit dem Projekt) +│ ├── branching-strategy.md +│ ├── development-standards.md +│ └── project-structure.md # dieses Dokument +├── .gitattributes +├── CHANGELOG.md +├── CLAUDE.md +├── README.md +└── VERSION ``` -> Sobald der Techstack feststeht, wird diese Struktur hier dokumentiert. +> Sobald Quellcode-Verzeichnisse entstehen, hier ergänzen. --- -## Architektur +## Modulübersicht -> Noch festzulegen. Typische Optionen für dieses Projekt: +> Noch kein Anwendungscode vorhanden. Sobald Module/Komponenten entstehen: > -> - **Monolith** (z. B. Full-Stack-Framework wie Laravel, Django, Rails) -> - **Frontend + Backend getrennt** (z. B. Vue/React + REST/GraphQL API) -> - **Mobile App** (z. B. Flutter, React Native) +> ``` +> Modulname | Datei(en) | Zweck | Exportierte Funktionen +> ``` +> +> **Format pro Funktion:** +> `funktionsname(param: Typ): Rückgabetyp` – Ein-Satz-Beschreibung --- -## Domänenmodell (geplant) +## Domänenmodell -Die Kernkonzepte des Gartenmanagers: - -| Konzept | Beschreibung | -|---|---| -| `Plant` / Pflanze | Eine Pflanzenart mit Eigenschaften (Aussaatzeit, Abstand, Wasserbedarf …) | -| `Bed` / Beet | Ein physischer Gartenbereich, dem Pflanzen zugeordnet werden | -| `SowingCalendar` / Aussaatkalender | Zeitplan für Aussaat und Pflanzung je Pflanze und Jahr | -| `Task` / Aufgabe | Eine zu erledigende Gartenarbeit mit Fälligkeitsdatum | -| `WateringSchedule` / Bewässerungsplan | Regelmäßige Bewässerungsintervalle je Beet oder Pflanze | +| Entität | Felder (geplant) | Beziehungen | +|---|---|---| +| `Plant` | name, sowingStart, sowingEnd, waterInterval, spacing | gehört zu Bed | +| `Bed` | name, width, length, location | enthält viele Plants | +| `SowingCalendar` | year, plantId, sowDate, plantDate | referenziert Plant | +| `Task` | title, dueDate, done, bedId? | optional zu Bed | +| `WateringSchedule` | bedId/plantId, intervalDays, lastWatered | referenziert Bed oder Plant | --- @@ -51,6 +63,18 @@ Die Kernkonzepte des Gartenmanagers: --- -## Schnittstellen +## Schnittstellen / API -> Noch festzulegen. +> Noch festzulegen. Hier Endpunkte mit Kurzbeschreibung eintragen: +> +> ``` +> GET /api/plants – alle Pflanzen +> POST /api/plants – neue Pflanze anlegen +> ... +> ``` + +--- + +## Konfiguration + +> Relevante Umgebungsvariablen und Konfigurationsdateien hier auflisten.