
close-ticket
Schliesst Tickets ab mit Status-Update in Ticket-Datei und INDEX.md. Prueft Akzeptanzkriterien und D
Close Ticket
Ein Ticket wird mit diesem Skill vollstaendig abgeschlossen — Code, Doku, Status und Git in einem Rutsch.
Kernprinzip
Ein Ticket ist erst DONE wenn alles drumherum stimmt:
- Alle Aenderungen committed
- CHANGELOG-Eintrag vorhanden
- Ticket-Datei + INDEX.md auf
[x] DONE - Branch nach main gemerged und lokal geloescht
Was dieser Skill NICHT tut:
- Keine inhaltliche Pruefung der Akzeptanzkriterien — das macht
/review-codevor dem Close. - Kein
git pushund kein remote-delete des Branches — der User pusht manuell. - Keine Tests laufen lassen — Annahme: vor dem Close war alles gruen.
Wann dieser Skill aktiviert wird
- "Schliesse Ticket ios-023"
- "Close ticket android-005"
- "Ticket shared-001 ist fertig"
/close-ticket ios-023
Konventionen aus dem Repo
Aus Git-History und CHANGELOG-Struktur:
- Branch-Name:
feature/<ticket-id>oderfeature/<ticket-id>-<platform>(z.B.feature/ios-042,feature/shared-067-ios) - Commit-Message:
<type>(<scope>): #<ticket-id> <kurzbeschreibung>(z.B.feat(ios): #ios-041 Bibliotheks-Suche) - Type:
feat,fix,refactor,docs,test,chore - Scope:
ios,android,shared, oder Sub-Bereich - CHANGELOG.md:
[Unreleased]-Sektion mit Subsektionen### Added|Changed|Fixed|Removed (iOS)bzw.(Android). Jeder Eintrag endet mit(Ticket: <ticket-id>).
Workflow
Schritt 1: Ticket-Nummer ermitteln
Reihenfolge der Quellen:
- Trigger-Text: Pattern
(ios|android|shared)-(\d+)(z.B. "Schliesse Ticket ios-023" →ios-023) - Aktueller Branch-Name als Fallback:
git rev-parse --abbrev-ref HEAD, dann Patternfeature/(ios|android|shared)-(\d+)(-(ios|android))?matchen. Beispiele:feature/ios-042→ios-042feature/shared-067-ios→shared-067, Plattform-Hinweisios(relevant fuer Shared-Tickets-Sonderfall)feature/shared-075→shared-075
- Wenn beides nichts ergibt: "Welches Ticket soll geschlossen werden? (z.B. ios-023)"
Wenn die ID aus dem Branch abgeleitet wird, einmal sichtbar bestaetigen:
"Schliesse Ticket {id} (aus Branch
{branch}abgeleitet)."
Falls die Trigger-ID und die Branch-ID auseinanderlaufen: STOP, fragen welche stimmt — sonst merged man am Ende den falschen Branch.
Schritt 2: Ticket finden und lesen
Ticket-Dateinamen haben Suffixe — nie raten, immer per Glob suchen:
dev-docs/tickets/{platform}/{ticket-id}*.md
Lese die Datei und extrahiere:
- Aktueller Status (
[ ],[~],[x]) - Titel (fuer Commit-Messages und CHANGELOG)
- Ticket-Typ (Feature / Bug Fix / Refactoring / ...)
Wenn Status bereits [x] DONE:
"Ticket {id} ist bereits abgeschlossen. Pruefe nur noch Git-Zustand und Merge?" Bei "ja" weiter ab Schritt 4. Bei "nein" Ende.
Schritt 3: Branch-Zuordnung pruefen
Ermittle aktuellen Branch: git rev-parse --abbrev-ref HEAD
- Wenn Branch
main→ STOP, fragen: "Du bist auf main. Welcher Branch gehoert zu {ticket-id}?" - Wenn Branch-Name die Ticket-ID enthaelt → OK
- Sonst warnen: "Aktueller Branch ist
{branch}— gehoert er zu {ticket-id}? (ja/nein)"
Schritt 4: Offene Aenderungen committen
git status --porcelain
Wenn leer: weiter zu Schritt 5.
Wenn nicht leer:
- Zeige
git status+ kurzengit diff --stat. - Schlage Commit-Message vor, Format:
<type>(<scope>): #<ticket-id> <kurzbeschreibung>typeaus Ticket-Typ ableiten (Feature →feat, Bug Fix →fix, Refactoring →refactor, sonstchore)scopeaus Plattform (ios,android,shared)- Kurzbeschreibung aus Ticket-Titel
- Frage: "Committen mit dieser Message? (ja / andere Message / abbrechen)"
- Bei "ja": stage gezielt (keine
git add -A, lieber konkrete Pfade ausgit status), commit. - Bei "abbrechen": Skill stoppt — User soll selbst committen und Skill erneut starten.
Schritt 5: CHANGELOG.md pruefen
Lies den [Unreleased]-Block aus CHANGELOG.md.
Suche nach einer Zeile mit (Ticket: {ticket-id}).
Wenn vorhanden: OK, weiter zu Schritt 6.
Wenn nicht vorhanden:
- Frage: "Kein CHANGELOG-Eintrag fuer {ticket-id} gefunden. Soll ich einen erstellen?"
- Bei "ja":
- Sektion bestimmen:
Added(neues Feature),Changed(Aenderung an Bestehendem),Fixed(Bug Fix),Removed(Entfernung) - Plattform aus Ticket-ID/Branch ableiten (
(iOS)/(Android)) - Eintragsformat aus bestehenden Eintraegen spiegeln:
- **Titel** - Beschreibung. (Ticket: {ticket-id}) - Beschreibung aus Ticket-Inhalt zusammenfassen (1–3 Saetze, was sich aus User-Sicht aendert)
- User-Bestaetigung des Entwurfs einholen, dann eintragen
- Sektion bestimmen:
- Commit:
docs(<scope>): #<ticket-id> CHANGELOG-Eintrag
Schritt 6: Status auf DONE setzen
- Ticket-Datei:
**Status**: [~] IN PROGRESS(oder[ ] TODO) →**Status**: [x] DONE - INDEX.md in
dev-docs/tickets/INDEX.md: Zeile mit Ticket-ID finden,[~]oder[ ]→[x] - Commit:
docs(<ticket-id>): Ticket abschliessen
Schritt 7: Merge in main und Branch loeschen
git checkout maingit merge --no-ff <branch>— Default-Merge-Message (Merge branch '<branch>') ist ok- Bei Merge-Konflikt: STOP. Zeige Konflikt-Files, frage User wie weiter (Konflikt manuell loesen, dann erneut). Skill selbst loest keine Konflikte.
- Bei erfolgreichem Merge:
git branch -d <branch>(kein-D— falls da noch was nicht gemerged ist, soll's failen und der User entscheidet)
Schritt 8: Zusammenfassung
Ticket geschlossen: {ticket-id}
Status: [x] DONE
Datei: dev-docs/tickets/{platform}/{filename}.md
INDEX.md: Aktualisiert
CHANGELOG: {Eintrag vorhanden / neu erstellt}
Git:
- Commits auf {branch}: {N}
- Merged in main (--no-ff)
- Branch lokal geloescht
Noch zu tun (manuell):
- git push origin main
- git push origin --delete {branch}
Sonderfaelle
WONTFIX
Falls User sagt "als WONTFIX schliessen":
- Frage nach Begruendung
- Fuege Begruendung als Notiz ins Ticket ein
- Status →
[x] WONTFIX(statt[x] DONE) - Kein Merge — Branch je nach User-Wunsch verwerfen oder behalten
Shared-Tickets
Bei shared-*-Tickets:
- Frage: "Welche Plattform wurde abgeschlossen?"
- Nur iOS
- Nur Android
- Beide
- Aktualisiere nur die entsprechende Plattform-Spalte in INDEX.md
- Wenn nur eine Plattform DONE → Ticket bleibt offen (kein Merge zu main fuer die andere Plattform), oder Branch ist plattform-spezifisch (
feature/shared-082-ios) → dann normal mergen, INDEX-Eintrag bleibt teilweise offen
Bereits committet, aber CHANGELOG fehlt
Normaler Pfad — Schritt 5 fuegt CHANGELOG nachtraeglich hinzu (eigener docs:-Commit). Kein Squash, kein Amend.
Referenzen
dev-docs/tickets/INDEX.md— Ticket-UebersichtCHANGELOG.md—[Unreleased]-Sektion ist Pflicht-Quelle fuer Release Notesdev-docs/release/RELEASE_GUIDE.md— was nach dem Close mit[Unreleased]passiert