diff --git a/skills/zammad-cli/SKILL.md b/skills/zammad-cli/SKILL.md index 0dad331..2ce55ca 100644 --- a/skills/zammad-cli/SKILL.md +++ b/skills/zammad-cli/SKILL.md @@ -1,7 +1,7 @@ --- name: zammad-cli -description: Zammad helpdesk için CLI wrapper skill. Kullanıcı "ticket ara", "ticket aç", "ticket kapat", "müşteri tickets", "destek talepleri", "support ticket oluştur", "zammad'da güncelle", "/zammad-cli" dediğinde tetiklenir. zammad-cli Rust binary'sini doğru komutlarla çağırır - ticket search/list/get/create/update/articles/article add/overview, org list/search, user search, system groups/states/priorities. Her zaman --json kullanıp parse eder. -when_to_use: Zammad ticket yönetimi, destek talebi yaratma/güncelleme, organizasyon/kullanıcı arama, ticket overview. Tetikleme cümleleri - "açık tickets", "yüksek priority destek", "X organizasyonun ticketları", "ticket #61234", "ticket'a not ekle", "support'a yanıt yaz". +description: Zammad helpdesk ticket/org/user/tag yönetimini zammad-cli binary'siyle yürütür. +when_to_use: Trigger — "ticket ara", "ticket aç", "ticket kapat", "müşteri tickets", "destek talepleri", "support ticket oluştur", "zammad'da güncelle", "açık tickets", "yüksek priority destek", "X organizasyonun ticketları", "ticket #61234", "ticket'a not ekle", "support'a yanıt yaz", "ticket'a tag ekle", "ekleri indir", "/zammad-cli". Komutlar — ticket search/list/get/articles/create/update/article add/attachment list/attachment download/overview, org list/search, user search, system groups/states/priorities, tags list/add/remove. Her zaman --json ile çağır. allowed-tools: Bash(zammad-cli *) Read --- @@ -52,17 +52,29 @@ zammad-cli --json ticket create \ --title "..." --body "..." \ --group "Destek Ekibi" \ --customer info@example.com \ - --priority "3 high" --state new + --priority "3 high" --state new \ + --tags "billing,urgent" \ # opsiyonel — create sonrası eklenir + --attachments "/path/a.pdf,/path/b.png" # opsiyonel — ilk article'a iliştirilir # Update (DESTRUCTIVE — onay al) zammad-cli --json ticket update #61234 --state closed zammad-cli --json ticket update #61234 --priority "3 high" --owner agent@example.com +zammad-cli --json ticket update #61234 --tags-add "vip" --tags-remove "spam" # tag ekle/çıkar # Pending state → --pending-time (ISO 8601) ZORUNLU zammad-cli --json ticket update #61234 --state "pending close" --pending-time 2026-06-18T17:00:00Z +# Reschedule: zaten pending ticket'ın zamanını değiştir (state tekrar verilmesi gerekmez) +zammad-cli --json ticket update #61234 --pending-time 2026-06-20T09:00:00Z # Article add (DESTRUCTIVE — onay al, public yorum müşteriye gider) -zammad-cli --json ticket article add #61234 --body "..." # internal default -zammad-cli --json ticket article add #61234 --body "..." --public # müşteriye e-posta! +zammad-cli --json ticket article add #61234 --body "..." # internal default +zammad-cli --json ticket article add #61234 --body "..." --subject "Re: ..." # subject opsiyonel +zammad-cli --json ticket article add #61234 --body "..." --public # müşteriye e-posta! +zammad-cli --json ticket article add #61234 --body "..." --attachments "/path/log.txt" + +# Attachment (list / download) +zammad-cli --json ticket attachment list #61234 # tüm ekleri + ID'leri +zammad-cli --json ticket attachment download #61234 --article 999 --attachment 5 --out ./dl +zammad-cli --json ticket attachment download #61234 --all --out ./dl # ticket'taki tüm ekler # Overview (5 state için paralel sayım) zammad-cli --json ticket overview @@ -81,6 +93,18 @@ zammad-cli --json system states zammad-cli --json system priorities ``` +### Tags (herhangi bir nesneye) + +`--object` default `Ticket`; `--id` internal ID (ticket number değil). Ticket tag'leri için +`ticket update --tags-add/--tags-remove` daha pratik — `tags` komutu diğer nesneler veya +listeleme için. + +```bash +zammad-cli --json tags list --object Ticket --id 42 +zammad-cli --json tags add --object Ticket --id 42 --name "vip" +zammad-cli --json tags remove --object Ticket --id 42 --name "spam" +``` + ## Search Syntax (ticket list / ticket search) Zammad search syntax — string olduğu gibi geçer: @@ -114,11 +138,13 @@ Zammad search syntax — string olduğu gibi geçer: "customer": "info@example.com", "organization": "Acme Corp", "created_at": "...", - "updated_at": "..." + "updated_at": "...", + "article_count": 3 }] ``` -`--json ticket articles` → `Article[]` (id, created_at, sender, from, subject, body, internal). +`--json ticket articles` → `Article[]` (id, created_at, sender, from, subject, body, internal, attachments[]). +`--json ticket attachment list` → `[{ticket_id, article_id, attachment_id, filename, size}]` (download için article_id + attachment_id buradan). `--json ticket overview` → `{state: count, ...}`. @@ -163,16 +189,19 @@ PUBLIC yanıt **müşteriye e-posta gider** — destructive! - `Unauthorized (401)` → ZAMMAD_TOKEN geçersiz, profile'dan yenisini al - `Permission denied (403)` → Token'ın `ticket.agent` veya `admin` izni yok - `Bad request (400)` → Parametre formatı (özellikle state/priority adları) -- `Unprocessable (422)` → Geçersiz alan değeri (örn. owner email yok) +- `Unprocessable (422)` → Geçersiz/eksik alan değeri (örn. owner email yok, pending_time eksik). Not: `--pending-time` eksikliği artık CLI tarafında erken yakalanır, 422'ye düşmez. - Boş `Error: ZAMMAD_URL...` → env eksik ## İpuçları - **State doğru yaz**: `new`, `open`, `closed`, `pending reminder`, `pending close` (boşluklu olanlar quote'lu) - **Priority doğru yaz**: `1 low`, `2 normal`, `3 high` (sayı + boşluk + isim) +- **Pending state → `--pending-time` zorunlu**: `pending close`/`pending reminder` için ISO 8601 timestamp (`2026-06-18T17:00:00Z`) ver; eksikse CLI HTTP'ye gitmeden net hata verir. Zaten pending bir ticket'ı yeniden zamanlamak için sadece `--pending-time` yeterli (state tekrar verilmesi gerekmez). State karşılaştırması case-insensitive. - **Group default**: `ticket create` default `"Destek Ekibi"` (Diji-spesifik, başka instance'larda override gerekli) - **Article internal default true**: `--public` flag olmadan dahili not olarak eklenir, müşteri görmez -- **Overview 100 cap**: `ticket overview` her state için `per_page=100` ile sayar — 100+ ticket varsa undercount, raporlarken belirt +- **Tag iki yol**: ticket için `ticket update --tags-add/--tags-remove` pratik; diğer nesneler veya listeleme için `tags` komutu (`--object`/`--id`, id internal ID). +- **Attachment ID akışı**: indirmeden önce `ticket attachment list #X` ile `article_id` + `attachment_id` al; veya tek seferde `--all` ile hepsini indir. +- **Overview 100 cap**: `ticket overview` her state için `per_page=100` ile sayar — 100+ ticket varsa undercount, raporlarken belirt (JSON çıktısında `_warning` alanı da gelir) ## İlgili Kaynaklar