update
This commit is contained in:
169
start-projekt
169
start-projekt
@@ -1,82 +1,113 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env python3
|
||||
# Steuerpanel: bleibt offen, bis das Fenster geschlossen wird.
|
||||
import os
|
||||
import shlex
|
||||
import subprocess
|
||||
|
||||
import gi
|
||||
gi.require_version("Gtk", "3.0")
|
||||
from gi.repository import Gtk
|
||||
|
||||
DIR = "/home/arbeit/projects/project-starter"
|
||||
ARBEIT="$HOME/arbeit"
|
||||
TICKET_NR=""
|
||||
REF=""
|
||||
ARBEIT = os.path.expanduser("~/arbeit")
|
||||
|
||||
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."
|
||||
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."
|
||||
)
|
||||
|
||||
# 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"
|
||||
}
|
||||
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)
|
||||
|
||||
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 im_terminal(befehl, arbeitsverzeichnis=None):
|
||||
aufruf = ["gnome-terminal"]
|
||||
if arbeitsverzeichnis:
|
||||
aufruf += ["--working-directory", arbeitsverzeichnis]
|
||||
aufruf += ["--", "bash", "-c", befehl + "; exec bash"]
|
||||
subprocess.Popen(aufruf)
|
||||
|
||||
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
|
||||
class Panel(Gtk.Window):
|
||||
def __init__(self):
|
||||
super().__init__(title="Projekt Panel")
|
||||
self.set_border_width(8)
|
||||
self.connect("destroy", Gtk.main_quit)
|
||||
|
||||
IFS="$SEP" read -r TICKET_NR REF _ <<< "$RESULT"
|
||||
raster = Gtk.Grid(row_spacing=6, column_spacing=8)
|
||||
self.add(raster)
|
||||
|
||||
if [ -z "$TICKET_NR" ]; then
|
||||
fehler "Ticket-Nr fehlt."
|
||||
continue
|
||||
fi
|
||||
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)
|
||||
|
||||
REF_PFAD="$ARBEIT/$REF"
|
||||
ZIEL="$ARBEIT/tickets/$TICKET_NR"
|
||||
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)
|
||||
|
||||
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
|
||||
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()
|
||||
|
||||
11
ticket-setup
11
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."
|
||||
# 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" )
|
||||
fi
|
||||
|
||||
# 2. Projekt kopieren (ohne fremde Snapshots und ohne Cache)
|
||||
echo "Kopiere $REF -> $ZIEL"
|
||||
|
||||
Reference in New Issue
Block a user