This skill should be used when the user asks to "create a GitHub issue from a Zammad ticket", "convert ticket to issue", or uses /zammad-to-issue. It creates structured GHE issues from Zammad tickets.
Erstellt aus einem Zammad-Ticket ein strukturiertes GitHub Issue auf der GHE-Instanz.
ZAMMAD_HOST, ZAMMAD_TOKENcurl, jq, ghVoraussetzungen gemäß requirement-checker Skill validieren. Bei Fehlschlag abbrechen.
Alle User-Rückfragen gemäß CLAUDE_COMM_CHANNEL (siehe .shared/communication.md).
Einen Subagent (zammad-expert) starten, der das Zammad-Ticket ausließt und fachlich aufbereitet.
Was wird gebraucht:
Ticket-Daten für Ticketnummer $ARGUMENTS, inklusive AI-aufbereiteter Zusammenfassung und Kategorisierung.
Rückgabeformat:
{
"ticket_id": 123,
"ticket_number": "76200123",
"titel": "...",
"organisation": "Musterfirma GmbH",
"customer": {"name": "Max Mustermann", "email": "[email protected]"},
"kategorie": "Bug",
"zusammenfassung": "Fachlich aufbereitete Zusammenfassung des Ticket-Inhalts in 2-4 Sätzen.",
"schritte_nachstellung": ["Schritt 1", "Schritt 2"],
"erwartetes_verhalten": "Was sollte passieren",
"tatsaechliches_verhalten": "Was passiert stattdessen"
}
Details:
kategorie: AI-bestimmt aus Inhalt — Bug, Feature oder Verbesserungzusammenfassung: Fachlich aufbereitete Zusammenfassung (2-4 Sätze), keine Copy-Paste von Kunden-Mailsschritte_nachstellung: Falls Bug, extrahierte Schritte zur Nachstellung (oder null)erwartetes_verhalten, tatsaechliches_verhalten: Falls Bug (oder null)Nicht benötigt: Rohe Artikel-Bodies, HTML, interne Notizen, Ticket-History.
Prüfe das Feld organisation des Ergebnisses:
"Eifert Systems GmbH" → Ticket stammt von einem eigenen MitarbeiterEinen Subagent (git-expert) starten, der die GitHub-Metadaten beschafft.
Was wird gebraucht:
Repos, Issue-Types und Org-Mitglieder der GitHub-Org edp.
Rückgabeformat:
{
"repos": [{"name": "edpweb", "description": "EDP Web Client"}],
"issue_types": [{"id": "...", "name": "Bug", "description": "..."}],
"members": [{"login": "tim-rudorf"}, {"login": "patrick-vogel"}]
}
Bei internen Tickets den Login anhand des Namens aus dem Zammad-Ticket in der members-Liste zuordnen (z.B. "hendrik.eifert@..." → hendrik-eifert). Falls ein passender Account gefunden wird, diesen für die Referenz im Issue-Body verwenden (siehe Referenz-Varianten).
User-Rückfrage (Kommunikationsweg gemäß CLAUDE_COMM_CHANNEL) mit:
(Empfohlen) — basierend auf Ticket-InhaltAbbruchRepo ist Pflichtfeld → kein "Kein Wert setzen". Weitere Repos via "Other".
Bei "Abbruch": Skill bricht sofort ab mit Meldung "Skill abgebrochen."
Labels für gewähltes Repo fetchen:
gh label list -R edp/<repo> --json name,description --limit 100
→ merge:* Labels herausfiltern.
Labels am : aufteilen → kategorie:wert. Pro Kategorie eine User-Rückfrage (Kommunikationsweg gemäß CLAUDE_COMM_CHANNEL):
(Empfohlen) falls einer sinnvoll, sonst ohneKein Wert setzenBeispiel für priority-Kategorie (3 Labels):
priority:prioritized (Empfohlen)priority:releasepriority:unprioritizedKein Wert setzenLabels ohne : werden einzeln als eigene Frage behandelt (z.B. "Label security setzen?" → Ja/Nein).
Bei "Abbruch" (via "Other"): Skill bricht sofort ab mit Meldung "Skill abgebrochen."
Falls der User einen Type als Argument mitgegeben hat → diesen Schritt überspringen.
User-Rückfrage (Kommunikationsweg gemäß CLAUDE_COMM_CHANNEL) mit verfügbaren Types:
(Empfohlen) basierend auf Ticket-Analyse (Bug/Feature/Verbesserung)Kein Wert setzenBei "Abbruch" (via "Other"): Skill bricht sofort ab mit Meldung "Skill abgebrochen."
User-Rückfrage (Kommunikationsweg gemäß CLAUDE_COMM_CHANNEL):
tim-rudorf (Empfohlen) — immer DefaultKein Wert setzenBei "Abbruch" (via "Other"): Skill bricht sofort ab mit Meldung "Skill abgebrochen."
Projects abfragen:
gh api graphql -f query='
query {
organization(login: "edp") {
projectsV2(first: 20) {
nodes { id number title }
}
}
}
' --jq '.data.organization.projectsV2.nodes[] | "\(.number): \(.title)"'
User-Rückfrage (Kommunikationsweg gemäß CLAUDE_COMM_CHANNEL) mit verfügbaren Projects:
(Empfohlen) basierend auf InhaltKein Wert setzenTypische Zuordnung:
Bei "Abbruch" (via "Other"): Skill bricht sofort ab mit Meldung "Skill abgebrochen."
Vor dem Erstellen eine Übersicht mit User-Rückfrage (Kommunikationsweg gemäß CLAUDE_COMM_CHANNEL) anzeigen. Folgende Infos: Repo, Type, Assignee, Labels, Project, Herkunft (intern/extern), Titel und vollständiger Body. Darstellungsformat frei wählen.
Optionen: "Erstellen", "Ändern", "Abbrechen".
Bei "Ändern": User gibt an welches Feld → nur diese Frage erneut stellen (Schritt 2b-2f je nach Feld).
Nach Bestätigung das Issue erstellen:
Felder mit "Kein Wert setzen" weglassen:
gh issue create -R edp/<repo> --title "<titel>" --body "<body>" --label "l1,l2" --assignee <assignee> --type <type>
Falls ein Project gewählt wurde:
gh issue edit <nr> -R edp/<repo> --add-project "<project>"
Nach dem Erstellen die Issue-URL dem User anzeigen.
Da das Issue aus einem Zammad-Ticket erstellt wurde, ist die Zammad-Ticketnummer aus Schritt 1 bereits bekannt.
Gemäß ~/.claude/skills/zammad-write/SKILL.md einen internen Kommentar in das Zammad-Ticket schreiben:
<ticket_number> aus Schritt 1Ein GitHub Issue wurde zu diesem Thema eröffnet: <issue-url> (Issue #<nummer> in edp/<repo>)trueDie Bestätigung aus dem /zammad-write Skill überspringen — der User hat das Issue bereits in Schritt 3 bestätigt. Stattdessen den Kommentar direkt absenden und das Ergebnis dem User anzeigen (Zammad-Ticketnummer + Hinweis dass kommentiert wurde).
Wenn das Ticket intern ist (Organisation = "Eifert Systems GmbH"), das Zammad-Ticket nach dem Kommentar auf Status "closed" setzen:
BASE="${ZAMMAD_HOST%/}"
AUTH="Authorization: Token token=${ZAMMAD_TOKEN}"
curl -s -X PUT \
-H "$AUTH" \
-H "Content-Type: application/json" \
--data '{"state": "closed"}' \
"$BASE/api/v1/tickets/<ticket_id>" > /tmp/z_close.json \
&& jq '{id, number, title, state}' /tmp/z_close.json
Bei externen Tickets das Ticket nicht schließen — es bleibt offen für weitere Kundenkommunikation.
Fehlertoleranz: Falls das Zammad-Ticket nicht gefunden wird oder die API fehlschlägt, den Fehler dem User anzeigen aber den Skill nicht abbrechen — das GitHub Issue wurde bereits erfolgreich erstellt.
Prägnant, beschreibend, ohne Präfix-Tags. Maximal ~70 Zeichen.
## Beschreibung
<Klare, zusammenfassende Beschreibung des Problems in 2-4 Sätzen.>
## Hintergrund
<Kontext: Wer ist betroffen, in welchem Bereich tritt das auf, warum ist es relevant.>
## Schritte zur Nachstellung
1. ...
2. ...
3. ...
## Erwartetes Verhalten
<Was sollte passieren.>
## Tatsächliches Verhalten
<Was passiert stattdessen.>
## Referenz
<siehe Referenz-Varianten unten>
## Beschreibung
<Klare, zusammenfassende Beschreibung der Anforderung in 2-4 Sätzen.>
## Hintergrund
<Kontext: Wer ist betroffen, in welchem Bereich tritt das auf, warum ist es relevant.>
## Anforderungen
- [ ] ...
- [ ] ...
## Referenz
<siehe Referenz-Varianten unten>
Je nach Herkunft des Tickets unterschiedliche Formulierung:
Externes Ticket (Kundenrückmeldung):
Basierend auf Kundenrückmeldung via Zammad: `EDP#<ticket_number>`
Internes Ticket (eigener Mitarbeiter):
Internes Ticket von @<github_login>: `EDP#<ticket_number>`
Internes Ticket von <mitarbeiter_name>: `EDP#<ticket_number>`
gh CLItim-rudorfedpAbschließend skill-optimize mit zammad-to-issue aufrufen.