diff --git a/start-projekt b/start-projekt index d43fbcc..cfeb26f 100755 --- a/start-projekt +++ b/start-projekt @@ -1,82 +1,113 @@ -#!/bin/bash +#!/usr/bin/env python3 # Steuerpanel: bleibt offen, bis das Fenster geschlossen wird. -DIR="/home/arbeit/projects/project-starter" -ARBEIT="$HOME/arbeit" -TICKET_NR="" -REF="" +import os +import shlex +import subprocess -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." +import gi +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk -# 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) +DIR = "/home/arbeit/projects/project-starter" +ARBEIT = os.path.expanduser("~/arbeit") -# 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" -} +CLAUDE_PROMPT = ( + "Verschaff dir kurz Projekt-Ueberblick (ddev, shopware 6). " + "Lies dann /tmp/redmine-{nr}/data.json (enthaelt Redmine Issue + Briefing-Wiki) " + "sowie ggf. Bilder unter /tmp/redmine-{nr}/. " + "Liste die fuer das Ticket noetigen Features als knappe Bullet-Liste auf - " + "vollstaendig, nichts weglassen, aber auch nicht aufgeblaeht. Simpel und kurz." +) -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 -} +def referenzprojekte(): + namen = [e for e in os.listdir(ARBEIT) + if os.path.isdir(os.path.join(ARBEIT, e, ".ddev"))] + return sorted(namen, key=str.lower) -SEP=$'\x1f' -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=$? - case "$RC" in - 2|4|6) ;; - *) exit 0 ;; - esac +def im_terminal(befehl, arbeitsverzeichnis=None): + aufruf = ["gnome-terminal"] + if arbeitsverzeichnis: + aufruf += ["--working-directory", arbeitsverzeichnis] + aufruf += ["--", "bash", "-c", befehl + "; exec bash"] + subprocess.Popen(aufruf) - IFS="$SEP" read -r TICKET_NR REF _ <<< "$RESULT" - if [ -z "$TICKET_NR" ]; then - fehler "Ticket-Nr fehlt." - continue - fi +class Panel(Gtk.Window): + def __init__(self): + super().__init__(title="Projekt Panel") + self.set_border_width(8) + self.connect("destroy", Gtk.main_quit) - REF_PFAD="$ARBEIT/$REF" - ZIEL="$ARBEIT/tickets/$TICKET_NR" + raster = Gtk.Grid(row_spacing=6, column_spacing=8) + self.add(raster) - 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 + raster.attach(Gtk.Label(label="Ticket-Nr", xalign=0), 0, 0, 1, 1) + self.ticket = Gtk.Entry(hexpand=True, width_chars=30) + raster.attach(self.ticket, 1, 0, 1, 1) + + raster.attach(Gtk.Label(label="Referenzprojekt", xalign=0), 0, 1, 1, 1) + self.referenz = Gtk.ComboBoxText() + for name in referenzprojekte(): + self.referenz.append_text(name) + self.referenz.set_active(0) + raster.attach(self.referenz, 1, 1, 1, 1) + + knopfreihe = Gtk.Box(spacing=6, homogeneous=True) + raster.attach(knopfreihe, 0, 2, 2, 1) + for beschriftung, aktion in ( + ("Ticketdaten abrufen", self.ticketdaten), + ("Projekt setup", self.projekt_setup), + ("Terminal starten", self.terminal_starten), + ): + knopf = Gtk.Button(label=beschriftung) + knopf.connect("clicked", aktion) + knopfreihe.pack_start(knopf, True, True, 0) + + def fehler(self, text): + dialog = Gtk.MessageDialog(transient_for=self, modal=True, + message_type=Gtk.MessageType.ERROR, + buttons=Gtk.ButtonsType.OK, text=text) + dialog.run() + dialog.destroy() + + def ticket_nr(self): + nr = self.ticket.get_text().strip() + if not nr: + self.fehler("Ticket-Nr fehlt.") + return None + return nr + + def ticketdaten(self, _knopf): + nr = self.ticket_nr() + if nr: + im_terminal(f"{shlex.quote(DIR + '/ticket-daten')} {shlex.quote(nr)}") + + def projekt_setup(self, _knopf): + nr = self.ticket_nr() + if not nr: + return + referenz = self.referenz.get_active_text() or "" + pfad = os.path.join(ARBEIT, referenz) + if not os.path.isdir(os.path.join(pfad, ".ddev")): + self.fehler(f"Kein ddev-Projekt: {pfad}") + return + im_terminal(f"{shlex.quote(DIR + '/ticket-setup')} " + f"{shlex.quote(nr)} {shlex.quote(pfad)}") + + def terminal_starten(self, _knopf): + nr = self.ticket_nr() + if not nr: + return + ziel = os.path.join(ARBEIT, "tickets", nr) + if not os.path.isdir(ziel): + self.fehler(f"{ziel} gibt es noch nicht. Erst Projekt setup.") + return + prompt = CLAUDE_PROMPT.format(nr=nr) + im_terminal(f"claude {shlex.quote(prompt)}", arbeitsverzeichnis=ziel) + + +panel = Panel() +panel.show_all() +Gtk.main() diff --git a/ticket-setup b/ticket-setup index 64c589b..f423969 100755 --- a/ticket-setup +++ b/ticket-setup @@ -7,7 +7,7 @@ set -euo pipefail TICKET_NR="$1" REF="${2%/}" ZIEL="$HOME/arbeit/tickets/$TICKET_NR" -SNAP="referenz-$(date +%d-%m-%y)" +SNAP="referenz" URL="https://$TICKET_NR.ddev.site" if [ ! -d "$REF/.ddev" ]; then @@ -26,13 +26,10 @@ if [ -z "$REF_NAME" ]; then 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 +# 1. Referenz-Snapshot neu ziehen, alten wegwerfen +echo "Snapshot $SNAP wird im Referenzprojekt neu erzeugt." +rm -f "$REF/.ddev/db_snapshots/$SNAP"-* +( cd "$REF" && ddev start && ddev snapshot --name="$SNAP" ) # 2. Projekt kopieren (ohne fremde Snapshots und ohne Cache) echo "Kopiere $REF -> $ZIEL"