diff --git a/anforderungen.md b/anforderungen.md new file mode 100644 index 0000000..edc17da --- /dev/null +++ b/anforderungen.md @@ -0,0 +1,5 @@ +Funktionen +- Ticket daten abrufen +- Projekt setup +- Prototyp bauen +- Aufwand schätzen \ No newline at end of file diff --git a/start-projekt b/start-projekt index 13f151a..d43fbcc 100755 --- a/start-projekt +++ b/start-projekt @@ -1,94 +1,82 @@ #!/bin/bash +# Steuerpanel: bleibt offen, bis das Fenster geschlossen wird. +DIR="/home/arbeit/projects/project-starter" +ARBEIT="$HOME/arbeit" +TICKET_NR="" +REF="" -# === Projekte hier pflegen: "Anzeigename" "skriptname" pro Zeile === -PROJEKTE=( - "Filter Müller" "start-filtermueller" - "Beckhuis" "start-beckhuis" - "Goldsilber" "start-goldsilber" - "Kochmesser" "start-kochmesser" - "Milku" "start-milku" - "Project-Starter" "start-project-starter" - "RagSystem" "start-rag-system" - "PriceService" "start-price-service" - "Kasse" "start-kasse" - "Redmine Ki" "start-redmine-ki" - "Management" "start-management" - "Mmo" "start-mmo" - "KI Shop" "start-ki-shop" - "Guide" "start-guides" - "OnePager" "start-one-pager" - "Creator" "start-creator" -) -# =================================================================== +CLAUDE_PROMPT_TPL="Verschaff dir kurz Projekt-Ueberblick (ddev, shopware 6). Lies dann /tmp/redmine-%s/data.json (enthaelt Redmine Issue + Briefing-Wiki) sowie ggf. Bilder unter /tmp/redmine-%s/. Liste die fuer das Ticket noetigen Features als knappe Bullet-Liste auf - vollstaendig, nichts weglassen, aber auch nicht aufgeblaeht. Simpel und kurz." -declare -A PROJEKT_MAP -COMBO_VALUES="" -for ((i=0; i<${#PROJEKTE[@]}; i+=2)); do - PROJEKT_MAP["${PROJEKTE[i]}"]="${PROJEKTE[i+1]}" - COMBO_VALUES="${COMBO_VALUES}${PROJEKTE[i]}!" -done -COMBO_VALUES="${COMBO_VALUES%!}" +# Referenzprojekte = ddev-Projekte direkt unter ~/arbeit +mapfile -t REF_NAMES < <(find "$ARBEIT" -maxdepth 2 -name .ddev -type d -printf '%h\n' \ + | sed "s|^$ARBEIT/||" | sort) + +# Combo-Werte, ausgewaehlter Eintrag zuerst (yad nimmt den ersten als Vorauswahl) +combo_werte() { + local sel="$1" out="" n + [ -n "$sel" ] && out="$sel" + for n in "${REF_NAMES[@]}"; do + [ "$n" = "$sel" ] && continue + out="${out:+$out!}$n" + done + printf '%s' "$out" +} + +im_terminal() { + gnome-terminal -- bash -c "$1"' ; echo; read -rp "Enter zum Schliessen "' +} + +fehler() { + yad --error --title="Projekt Panel" --text="$1" --button="OK:0" --width=300 +} SEP=$'\x1f' -RESULT=$(yad --form \ - --title="Projekt starten" \ - --text="Auswählen, was beendet und was neu gestartet wird." \ - --separator="$SEP" \ - --field="Projekt:CB" "$COMBO_VALUES" \ - --field="Ticket-Nr (optional)" "" \ - --field="Zusatzinfo an Claude:TXT" "" \ - --field="Firefox starten:CHK" TRUE \ - --field="VS Code starten:CHK" TRUE \ - --field="Terminals starten:CHK" TRUE \ - --field="Obsidian starten:CHK" TRUE \ - --field="Firefox beenden:CHK" FALSE \ - --field="VS Code beenden:CHK" FALSE \ - --field="Terminals beenden:CHK" FALSE \ - --field="Obsidian beenden:CHK" FALSE \ - --width=600 --height=620 \ - --button="Abbrechen:1" --button="Starten:0") +while true; do + RESULT=$(yad --form \ + --title="Projekt Panel" \ + --separator="$SEP" \ + --field="Ticket-Nr" "$TICKET_NR" \ + --field="Referenzprojekt:CB" "$(combo_werte "$REF")" \ + --width=520 \ + --button="Ticketdaten abrufen:2" \ + --button="Projekt setup:4" \ + --button="Terminal starten:6") + RC=$? -[ -z "$RESULT" ] && exit 0 + case "$RC" in + 2|4|6) ;; + *) exit 0 ;; + esac -IFS="$SEP" read -r -d '' PROJEKT_NAME TICKET_NR INFO_ESCAPED \ - START_FF START_CODE START_TERM START_OBS \ - CHK_FF CHK_CODE CHK_TERM CHK_OBS _ <<< "$RESULT" -SKRIPT="${PROJEKT_MAP[$PROJEKT_NAME]}" + IFS="$SEP" read -r TICKET_NR REF _ <<< "$RESULT" -[ -z "$SKRIPT" ] && exit 0 + if [ -z "$TICKET_NR" ]; then + fehler "Ticket-Nr fehlt." + continue + fi -if [ -n "$TICKET_NR" ]; then - REDMINE_DATA=$(/home/arbeit/projects/project-starter/redmine-fetch "$TICKET_NR") - echo "$REDMINE_DATA" > "/tmp/redmine-$TICKET_NR/data.json" -fi + REF_PFAD="$ARBEIT/$REF" + ZIEL="$ARBEIT/tickets/$TICKET_NR" -INFO_FILE="/tmp/projekt-info.txt" -rm -f "$INFO_FILE" -if [ -n "$INFO_ESCAPED" ]; then - printf '%b' "$INFO_ESCAPED" > "$INFO_FILE" -fi - -KILL=() -[ "$CHK_FF" = "TRUE" ] && KILL+=("firefox") -[ "$CHK_CODE" = "TRUE" ] && KILL+=("code") -[ "$CHK_TERM" = "TRUE" ] && KILL+=("gnome-terminal-server") -[ "$CHK_OBS" = "TRUE" ] && KILL+=("obsidian") - -/home/arbeit/projects/project-starter/reset-projekt "${KILL[@]}" - -# Nicht gewaehlte Programme per PATH-Stub abschalten, statt in jedem -# start- einzeln abzufragen. -STUB_DIR="/tmp/projekt-stubs" -rm -rf "$STUB_DIR" -mkdir -p "$STUB_DIR" -stub() { - printf '#!/bin/bash\nexit 0\n' > "$STUB_DIR/$1" - chmod +x "$STUB_DIR/$1" -} -[ "$START_FF" = "TRUE" ] || stub firefox -[ "$START_CODE" = "TRUE" ] || stub code -[ "$START_TERM" = "TRUE" ] || stub gnome-terminal -[ "$START_OBS" = "TRUE" ] || stub obsidian -export PATH="$STUB_DIR:$PATH" - -exec "/home/arbeit/projects/project-starter/$SKRIPT" "$TICKET_NR" + case "$RC" in + 2) + im_terminal "'$DIR/ticket-daten' '$TICKET_NR'" + ;; + 4) + if [ ! -d "$REF_PFAD/.ddev" ]; then + fehler "Kein ddev-Projekt: $REF_PFAD" + continue + fi + im_terminal "'$DIR/ticket-setup' '$TICKET_NR' '$REF_PFAD'" + ;; + 6) + if [ ! -d "$ZIEL" ]; then + fehler "$ZIEL gibt es noch nicht. Erst Projekt setup." + continue + fi + PROMPT=$(printf "$CLAUDE_PROMPT_TPL" "$TICKET_NR" "$TICKET_NR") + gnome-terminal --working-directory="$ZIEL" -- \ + bash -c 'claude "$1"; exec bash' _ "$PROMPT" + ;; + esac +done diff --git a/ticket-daten b/ticket-daten new file mode 100755 index 0000000..1eab545 --- /dev/null +++ b/ticket-daten @@ -0,0 +1,11 @@ +#!/bin/bash +# Usage: ticket-daten +# Holt die Redmine-Daten neu und ueberschreibt /tmp/redmine-/data.json +TICKET_NR="$1" +DIR="/home/arbeit/projects/project-starter" + +[ -z "$TICKET_NR" ] && { echo "Ticket-Nr fehlt."; exit 1; } + +DATA=$("$DIR/redmine-fetch" "$TICKET_NR") || exit 1 +printf '%s' "$DATA" > "/tmp/redmine-$TICKET_NR/data.json" +echo "Ticketdaten aktualisiert: /tmp/redmine-$TICKET_NR/data.json" diff --git a/ticket-setup b/ticket-setup new file mode 100755 index 0000000..64c589b --- /dev/null +++ b/ticket-setup @@ -0,0 +1,74 @@ +#!/bin/bash +# Usage: ticket-setup +# Legt ~/arbeit/tickets/ als Kopie des Referenzprojekts an, +# spielt den Referenz-Snapshot ein und stellt alles auf .ddev.site um. +set -euo pipefail + +TICKET_NR="$1" +REF="${2%/}" +ZIEL="$HOME/arbeit/tickets/$TICKET_NR" +SNAP="referenz-$(date +%d-%m-%y)" +URL="https://$TICKET_NR.ddev.site" + +if [ ! -d "$REF/.ddev" ]; then + echo "Kein ddev-Projekt: $REF" + exit 1 +fi +if [ -e "$ZIEL" ]; then + echo "$ZIEL existiert bereits. Vorher loeschen." + exit 1 +fi + +# ddev-Name des Referenzprojekts = dessen bisheriger Host .ddev.site +REF_NAME=$(sed -nE 's/^name:[[:space:]]*"?([^"[:space:]]+)"?.*/\1/p' "$REF/.ddev/config.yaml" | head -1) +if [ -z "$REF_NAME" ]; then + echo "Kein name: in $REF/.ddev/config.yaml gefunden." + exit 1 +fi + +# 1. Referenz-Snapshot mit heutigem Datum sicherstellen +if compgen -G "$REF/.ddev/db_snapshots/$SNAP-*" > /dev/null; then + echo "Snapshot $SNAP vorhanden." +else + echo "Snapshot $SNAP fehlt - wird im Referenzprojekt erzeugt." + ( cd "$REF" && ddev start && ddev snapshot --name="$SNAP" ) +fi + +# 2. Projekt kopieren (ohne fremde Snapshots und ohne Cache) +echo "Kopiere $REF -> $ZIEL" +mkdir -p "$ZIEL" +rsync -a --info=progress2 \ + --exclude='/.ddev/db_snapshots/' \ + --exclude='/var/cache/' \ + "$REF/" "$ZIEL/" + +mkdir -p "$ZIEL/.ddev/db_snapshots" +cp "$REF/.ddev/db_snapshots/$SNAP"-* "$ZIEL/.ddev/db_snapshots/" + +# Vom Referenzprojekt mitkopierte Traefik-Router loeschen. Sonst kollidieren die +# Router-Namen mit dem Referenzprojekt: traefik dedupliziert, der Healthcheck +# zaehlt aber je Datei und laeuft 60 s in den Timeout. ddev legt sie neu an. +for f in "$ZIEL/.ddev/traefik/config"/*.yaml; do + [ -e "$f" ] || continue + if head -1 "$f" | grep -q '^#ddev-generated'; then + rm -f "$f" + fi +done + +# 3. ddev und Shopware auf die Ticket-URL umstellen +sed -i -E "s|^name:.*|name: \"$TICKET_NR\"|" "$ZIEL/.ddev/config.yaml" +if [ -f "$ZIEL/.env.local" ]; then + sed -i -E "s|^APP_URL=.*|APP_URL=\"$URL\"|" "$ZIEL/.env.local" +fi + +cd "$ZIEL" +ddev start +ddev snapshot restore "$SNAP" +# Nur die Domains des Referenz-Hosts umbiegen. Ein pauschales Update wuerde +# mehrere Sales Channels auf dieselbe URL setzen (unique index auf url). +ddev exec bin/console sales-channel:update:domain "$TICKET_NR.ddev.site" \ + --previous-domain "$REF_NAME.ddev.site" +ddev exec bin/console cache:clear + +echo +echo "Fertig: $URL"