update
This commit is contained in:
5
anforderungen.md
Normal file
5
anforderungen.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
Funktionen
|
||||||
|
- Ticket daten abrufen
|
||||||
|
- Projekt setup
|
||||||
|
- Prototyp bauen
|
||||||
|
- Aufwand schätzen
|
||||||
156
start-projekt
156
start-projekt
@@ -1,94 +1,82 @@
|
|||||||
#!/bin/bash
|
#!/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 ===
|
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."
|
||||||
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"
|
|
||||||
)
|
|
||||||
# ===================================================================
|
|
||||||
|
|
||||||
declare -A PROJEKT_MAP
|
# Referenzprojekte = ddev-Projekte direkt unter ~/arbeit
|
||||||
COMBO_VALUES=""
|
mapfile -t REF_NAMES < <(find "$ARBEIT" -maxdepth 2 -name .ddev -type d -printf '%h\n' \
|
||||||
for ((i=0; i<${#PROJEKTE[@]}; i+=2)); do
|
| sed "s|^$ARBEIT/||" | sort)
|
||||||
PROJEKT_MAP["${PROJEKTE[i]}"]="${PROJEKTE[i+1]}"
|
|
||||||
COMBO_VALUES="${COMBO_VALUES}${PROJEKTE[i]}!"
|
# Combo-Werte, ausgewaehlter Eintrag zuerst (yad nimmt den ersten als Vorauswahl)
|
||||||
done
|
combo_werte() {
|
||||||
COMBO_VALUES="${COMBO_VALUES%!}"
|
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'
|
SEP=$'\x1f'
|
||||||
RESULT=$(yad --form \
|
while true; do
|
||||||
--title="Projekt starten" \
|
RESULT=$(yad --form \
|
||||||
--text="Auswählen, was beendet und was neu gestartet wird." \
|
--title="Projekt Panel" \
|
||||||
--separator="$SEP" \
|
--separator="$SEP" \
|
||||||
--field="Projekt:CB" "$COMBO_VALUES" \
|
--field="Ticket-Nr" "$TICKET_NR" \
|
||||||
--field="Ticket-Nr (optional)" "" \
|
--field="Referenzprojekt:CB" "$(combo_werte "$REF")" \
|
||||||
--field="Zusatzinfo an Claude:TXT" "" \
|
--width=520 \
|
||||||
--field="Firefox starten:CHK" TRUE \
|
--button="Ticketdaten abrufen:2" \
|
||||||
--field="VS Code starten:CHK" TRUE \
|
--button="Projekt setup:4" \
|
||||||
--field="Terminals starten:CHK" TRUE \
|
--button="Terminal starten:6")
|
||||||
--field="Obsidian starten:CHK" TRUE \
|
RC=$?
|
||||||
--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")
|
|
||||||
|
|
||||||
[ -z "$RESULT" ] && exit 0
|
case "$RC" in
|
||||||
|
2|4|6) ;;
|
||||||
|
*) exit 0 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
IFS="$SEP" read -r -d '' PROJEKT_NAME TICKET_NR INFO_ESCAPED \
|
IFS="$SEP" read -r TICKET_NR REF _ <<< "$RESULT"
|
||||||
START_FF START_CODE START_TERM START_OBS \
|
|
||||||
CHK_FF CHK_CODE CHK_TERM CHK_OBS _ <<< "$RESULT"
|
|
||||||
SKRIPT="${PROJEKT_MAP[$PROJEKT_NAME]}"
|
|
||||||
|
|
||||||
[ -z "$SKRIPT" ] && exit 0
|
if [ -z "$TICKET_NR" ]; then
|
||||||
|
fehler "Ticket-Nr fehlt."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -n "$TICKET_NR" ]; then
|
REF_PFAD="$ARBEIT/$REF"
|
||||||
REDMINE_DATA=$(/home/arbeit/projects/project-starter/redmine-fetch "$TICKET_NR")
|
ZIEL="$ARBEIT/tickets/$TICKET_NR"
|
||||||
echo "$REDMINE_DATA" > "/tmp/redmine-$TICKET_NR/data.json"
|
|
||||||
fi
|
|
||||||
|
|
||||||
INFO_FILE="/tmp/projekt-info.txt"
|
case "$RC" in
|
||||||
rm -f "$INFO_FILE"
|
2)
|
||||||
if [ -n "$INFO_ESCAPED" ]; then
|
im_terminal "'$DIR/ticket-daten' '$TICKET_NR'"
|
||||||
printf '%b' "$INFO_ESCAPED" > "$INFO_FILE"
|
;;
|
||||||
fi
|
4)
|
||||||
|
if [ ! -d "$REF_PFAD/.ddev" ]; then
|
||||||
KILL=()
|
fehler "Kein ddev-Projekt: $REF_PFAD"
|
||||||
[ "$CHK_FF" = "TRUE" ] && KILL+=("firefox")
|
continue
|
||||||
[ "$CHK_CODE" = "TRUE" ] && KILL+=("code")
|
fi
|
||||||
[ "$CHK_TERM" = "TRUE" ] && KILL+=("gnome-terminal-server")
|
im_terminal "'$DIR/ticket-setup' '$TICKET_NR' '$REF_PFAD'"
|
||||||
[ "$CHK_OBS" = "TRUE" ] && KILL+=("obsidian")
|
;;
|
||||||
|
6)
|
||||||
/home/arbeit/projects/project-starter/reset-projekt "${KILL[@]}"
|
if [ ! -d "$ZIEL" ]; then
|
||||||
|
fehler "$ZIEL gibt es noch nicht. Erst Projekt setup."
|
||||||
# Nicht gewaehlte Programme per PATH-Stub abschalten, statt in jedem
|
continue
|
||||||
# start-<projekt> einzeln abzufragen.
|
fi
|
||||||
STUB_DIR="/tmp/projekt-stubs"
|
PROMPT=$(printf "$CLAUDE_PROMPT_TPL" "$TICKET_NR" "$TICKET_NR")
|
||||||
rm -rf "$STUB_DIR"
|
gnome-terminal --working-directory="$ZIEL" -- \
|
||||||
mkdir -p "$STUB_DIR"
|
bash -c 'claude "$1"; exec bash' _ "$PROMPT"
|
||||||
stub() {
|
;;
|
||||||
printf '#!/bin/bash\nexit 0\n' > "$STUB_DIR/$1"
|
esac
|
||||||
chmod +x "$STUB_DIR/$1"
|
done
|
||||||
}
|
|
||||||
[ "$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"
|
|
||||||
|
|||||||
11
ticket-daten
Executable file
11
ticket-daten
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Usage: ticket-daten <ticket-nr>
|
||||||
|
# Holt die Redmine-Daten neu und ueberschreibt /tmp/redmine-<nr>/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"
|
||||||
74
ticket-setup
Executable file
74
ticket-setup
Executable file
@@ -0,0 +1,74 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Usage: ticket-setup <ticket-nr> <referenz-projekt>
|
||||||
|
# Legt ~/arbeit/tickets/<nr> als Kopie des Referenzprojekts an,
|
||||||
|
# spielt den Referenz-Snapshot ein und stellt alles auf <nr>.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 <name>.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"
|
||||||
Reference in New Issue
Block a user