Generates a daily work report from your git commit history. Triggered by "/report" (interactive) or "/report --direkt" (zero-question, auto-saves to ~/Desktop/rapor.md). Supports Turkish (default, or "-tr") and English ("-en") output. Flags can be combined freely (e.g. "/report -en --direkt"). Also triggers on "rapor oluştur", "günlük rapor", "iş raporu", "daily report", "work report", "generate report".
Installs into .claude/skills of the current project.
Are you the author of report?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/hootbu-report)
---
name: report
description: Generates a daily work report from your git commit history. Triggered by "/report" (interactive) or "/report --direkt" (zero-question, auto-saves to ~/Desktop/rapor.md). Supports Turkish (default, or "-tr") and English ("-en") output. Flags can be combined freely (e.g. "/report -en --direkt"). Also triggers on "rapor oluştur", "günlük rapor", "iş raporu", "daily report", "work report", "generate report".
---
# Daily Report Skill
Reads your git commit history, groups commits thematically, and produces a polished, copy-paste-ready daily work report. Default output language is Turkish; pass `-en` to switch to English.
## Modes and Flags
| Invocation | Language | Behavior |
|---|---|---|
| `/report` | Turkish (default) | Interactive — asks for name, company, project, commit range; ends with a save prompt |
| `/report -tr` | Turkish (explicit) | Same as above |
| `/report -en` | English | Same interactive flow, but the report content is written in English |
| `/report --direkt` | Turkish | No questions except a new repo's project name; uses saved preferences; auto-saves to `~/Desktop/rapor.md` |
| `/report -en --direkt` | English | No questions except a new repo's project name; uses saved preferences; auto-saves to `~/Desktop/rapor.md` |
| `/report --direkt -tr` | Turkish | Same as `/report --direkt` |
**Flag order does not matter.** `-en --direkt` and `--direkt -en` behave identically.
**The output format is identical across all modes and languages.** Header, company line, project line are always written. Only the paragraph content language changes.
## All interactions with the user are in Turkish
Regardless of the report output language, ask questions and show messages **to the user** in Turkish. The `-en` flag only changes the **report content** that gets written into the code block / file.
---
## Preferences File
User preferences are stored at `~/.claude/report-preferences.json`. On startup, read this file:
```bash
cat ~/.claude/report-preferences.json 2>/dev/null || echo "{}"
```
Format:
```json
{
"isim": "John Doe",
"sirket": "Acme Corp",
"projeler": {
"/Users/john/code/demo-app": "Demo Project"
}
}
```
`projeler` maps each repository root to its project name (see **Project Name**). A legacy top-level `projeAdi` is ignored and dropped on the next write.
**Save rule:** Interactive mode writes all fields with the Write tool after the interactive steps are complete (excluding commit range). `--direkt` only adds a `projeler` entry when it had to ask for a name. Always keep the existing `projeler` entries, and create the file if it does not exist. On subsequent runs, the saved values are offered as the first option.
**`--direkt` mode:** If the file is missing or `isim` or `sirket` is empty, abort with: **"Direkt mod için önce `/report` komutuyla en az bir kez interaktif çalıştırma yapılmalı."**
---
## Project Name
Project names are remembered per repository, keyed by the repository root:
```bash
git rev-parse --show-toplevel
```
- **Saved:** `projeler` has the root. Interactive mode offers it as the first option, `--direkt` uses it without asking.
- **Override:** the invocation names a project (e.g. `/report proje adı X olsun`). Use it without asking and save it for this root.
- **New repository:** ask once in either mode, then save the answer to `projeler`:
**Question:** "Bu proje için rapor başlığı ne olsun?"
**Options:**
1. "{suggestion}" (projeden önerilen ad)
2. "Başka ad gir", then free-text: "Proje adını yazın (örn: Demo Project):"
Suggestion, first match wins: iOS display name (`CFBundleDisplayName` in Info.plist or the Xcode project), Android `android:label` (unless it is a `@string/` reference), `name` in `pubspec.yaml` or `package.json`, the root folder name.
---
## Interactive Mode (`/report`)
1. Check git repo
2. Read preferences
3. Ask for name
4. Ask for company
5. Ask for project name
6. Ask for commit range
7. Save preferences
8. Analyze commits and group them
9. Render the report
10. Ask whether to save to file
### Step 0: Git repository check
```bash
git rev-parse --is-inside-work-tree
```
If not a git repo, abort with: **"Bu dizin bir git deposu değil. Lütfen bir git deposunda çalıştırın."**
### Step 1: Name
If `isim` exists in preferences, ask via AskUserQuestion:
**Question:** "İsminizi seçin veya yeni girin:"
**Options:**
1. "{saved name}" — Önceki tercih
2. "Yeni isim gir"
If the user picks "Yeni isim gir" or no saved name exists:
**Question:** "Adınızı ve soyadınızı yazın (örn: John Doe):"
(Free-text input)
### Step 2: Company
If `sirket` exists, ask via AskUserQuestion:
**Question:** "Şirket adını seçin veya yeni girin:"
**Options:**
1. "{saved company}" — Önceki tercih
2. "Yeni şirket adı gir"
Otherwise:
**Question:** "Şirket adını yazın (örn: Acme Corp):"
### Step 3: Project
If this repository has a saved name in `projeler` (see **Project Name**), ask via AskUserQuestion:
**Question:** "Proje adını seçin veya yeni girin:"
**Options:**
1. "{saved project}" — Önceki tercih
2. "Yeni proje adı gir"
If the user picks "Yeni proje adı gir":
**Question:** "Proje adını yazın (örn: Demo Project):"
Otherwise ask the new-repository question from **Project Name**.
### Step 4: Commit range
**Question:** "Hangi commit'ler rapora dahil edilsin?"
**Options:**
1. "Bugün" — Bugünkü commit'ler
2. "Son N commit" — Belirli sayıda son commit
**If "Bugün":** get today's date in `YYYY-MM-DD`, then run:
```bash
git log --after="YYYY-MM-DD 00:00" --before="YYYY-MM-DD 23:59" --oneline --no-merges
```
**If "Son N commit":** ask the count via free-text input, then run:
```bash
git log -N --oneline --no-merges
```
### Step 5: Save preferences
Update `~/.claude/report-preferences.json`: set `isim`, `sirket`, and `projeler["{repo root}"]` to the chosen values, keeping the other `projeler` entries.
### Step 6: Git analysis
If no commits found: **"Seçilen aralıkta hiçbir commit bulunamadı. Tarih veya commit sayısını kontrol edin."**
For each commit, get details:
```bash
git show <hash> --stat --format="%H%n%s%n%b"
```
For many commits, batch:
```bash
git log -N --stat --no-merges --format="%H %s"
```
#### Thematic grouping
Group commits by:
1. **Directory/module proximity** — commits touching the same area
2. **Feature surface** — commits whose messages share keywords
3. **Related changes** — a feature implementation plus its follow-up fixes
4. **Independent changes** — config, dependencies, etc., go in their own group
**CRITICAL — No grouping cap:** There is no upper limit on paragraph count. As commits grow, paragraphs grow. 10, 15, 20+ paragraphs are fine. **Never artificially compress unrelated work into a single paragraph.** If two changes are not thematically related, they get separate paragraphs.
**CRITICAL — Completeness:** No commit may be skipped or lost in summarization. After grouping, verify every commit is represented in at least one paragraph. Cross-check the final report against the commit list. Tiny commits (one-line fixes, bumps) can be folded into a related paragraph but must still be mentioned.
#### Paragraph writing — Turkish (default or `-tr`)
For each group, write a concise, professional Turkish paragraph:
- **Edilgen çatı:** "eklendi", "giderildi", "yeniden tasarlandı", "güçlendirildi"
- **Anlat ne yapıldığını,** nasıl yapıldığını değil
- **Teknik jargon serbest:** cache invalidation, server-side pagination, constraint, migration, Edge Function, rollover, audit log
- **Yasak:** fonksiyon adı, dosya adı, değişken adı, dosya yolu
- **Her paragraf 2-4 cümle**
- **Yasak:** uzun tire `—`, noktalı virgül `;`, paragraf sonunda isim
**Good Turkish examples:**
- "PDF oluşturma altyapısı güçlendirildi. Edge Function'a dinamik veri üretimi ve cache invalidation stratejisi eklendi. Büyük veri setlerinde oluşan timeout problemleri giderildi."
- "Paket yönetimi arayüzü yeniden tasarlandı. Hizmet kalemi formları kart tabanlı layout ile modernize edildi, aylık saat ve rollover desteği eklendi."
**Bad Turkish examples (DO NOT DO):**
- "pdfGenerator.ts dosyasındaki generatePdf fonksiyonu refactor edildi." → file/function name
- "useReservationStore hook'u güncellendi." → hook name
- "src/components/wizard altında değişiklikler yapıldı." → file path
#### Paragraph writing — English (`-en`)
For each group, write a concise, professional **and warm** English paragraph. Tone goal: a thoughtful senior engineer summarizing their day for a kind manager — clear, confident, never robotic, never marketing-y.
- **Passive voice preferred:** "was rebuilt", "was added", "was resolved", "was tightened"
- **Tell what was done,** not how
- **Technical jargon is welcome:** cache invalidation, server-side pagination, constraint, migration, edge function, rollover, audit log, idempotency
- **Forbidden:** function names, file names, variable names, file paths, framework internals (e.g. "the Redux slice", "the useFoo hook", "the FooButton component")
- **2-4 sentences per paragraph**
- **Forbidden punctuation/style:** em dashes `—`, semicolons `;`, name suffixes at the end of paragraphs, hype words ("seamlessly", "robust", "cutting-edge", "leverage")
- **Tone:** professional and kind. Avoid passive-aggressive ("finally"), avoid bragging ("dramatically improved"), avoid corporate filler ("synergize"). Just clear, calm reporting.
**Good English examples:**
- "The reporting module was rebuilt. The PDF generation service now supports parametric data flow and a cache invalidation strategy, and timeout issues on large datasets were resolved."
- "The subscription and credit management layer was extended. The plan editor was redesigned around card-based forms with monthly hours, extra credits, and rollover support, and the pricing engine now computes line-item totals."
- "Two reservation bugs were fixed. Time slots outside business hours are now disabled, and creating reservations in the past is blocked at the database level via a backend constraint."
**Bad English examples (DO NOT DO):**
- "The generatePdf function in pdfGenerator.ts was refactored." → file/function name
- "We seamlessly leveraged a robust caching layer to dramatically boost performance." → hype, marketing
- "The useReservationStore hook was updated." → framework internal
- "Finally fixed the timeout bug after weeks of pain." → tone
### Step 7: Render the report
Always render in this exact shape, inside a code block:
```
{Name} ({DD.MM.YY})
{Company}:
{Project}:
{paragraph 1}
{paragraph 2}
{paragraph 3}
```
**Format rules (STRICT, identical across all flags):**
- Line 1: `{Name} ({Date})` — date format `DD.MM.YY` (two-digit year, e.g. `30.04.26`)
- Line 2: `{Company}:` — no blank line above
- Line 3: blank
- Line 4: `{Project}:`
- Line 5: paragraph 1 — **NO blank line between project line and paragraph 1**
- Subsequent paragraphs separated by exactly one blank line
- No closing marker (no `--`, no horizontal rule)
- No bullets, no numbered lists
- Entire output wrapped in a single code block
### Step 8: Save prompt
After rendering, ask via AskUserQuestion:
**Question:** "Raporu ~/Desktop/rapor.md dosyasına kaydetmemi ister misin?"
**Options:**
1. "Evet, kaydet"
2. "Hayır, sadece göster yeterli"
If "Evet, kaydet" → apply the **File Save Logic** below.
If "Hayır" → done, the user can copy from the rendered code block.
---
## Direct Mode (`/report --direkt`)
When the user invokes `/report --direkt` (with or without a language flag), run this flow. Ask nothing and save no preferences, except a new repository's project name (see **Project Name**).
### Direct mode steps
1. Git repo check (abort message in Turkish if not a git repo).
2. Read preferences. If missing or incomplete, abort: **"Direkt mod için önce `/report` komutuyla en az bir kez interaktif çalıştırma yapılmalı."**
3. Pull today's commits:
```bash
git log --after="YYYY-MM-DD 00:00" --before="YYYY-MM-DD 23:59" --oneline --no-merges
```
4. If no commits: **"Bugün henüz commit yapılmamış."** Abort.
5. Resolve the project name (see **Project Name**).
6. Analyze and group (same rules as Step 6, **no grouping cap**).
7. Render the report (same format as Step 7, in the language indicated by `-en` / `-tr` / default Turkish).
8. **Auto-save** to `~/Desktop/rapor.md` using the **File Save Logic** below. Do not ask.
9. Show: **"Rapor ~/Desktop/rapor.md dosyasına kaydedildi."**
---
## File Save Logic
Both interactive ("Evet, kaydet") and `--direkt` modes use this logic. Each day gets one block: reports from different projects on the same day share one header.
1. Read `~/Desktop/rapor.md` if it exists, otherwise treat as empty.
2. **If file is missing or empty:** create it and write the full report (header + company + project + paragraphs).
3. **If the last block is today's** (the text after the last `--------` line, or the whole file if there is none, starts with `{Name} ({today's DD.MM.YY})`):
- **The project is already in it** (a line exactly `{Project}:`): replace that section, from its `{Project}:` line up to the next project line or the end of the block, with the new one.
- **Otherwise:** append a blank line + `{Project}:` + paragraphs to the end of the block.
4. **Otherwise:** append a blank line + `--------` + a blank line, then the full new report.
5. Create a new file with the Write tool. Change an existing file with the Edit tool, so earlier reports are never rewritten.
### Separator format
Exactly **8 dashes**:
```
--------
```
### Example file with multiple reports
```
John Doe (29.04.26)
Acme Corp:
Demo Project:
The reporting module was rebuilt. The PDF generation service now supports parametric data flow and a cache invalidation strategy.
Two reservation bugs were fixed. Time slots outside business hours are now disabled, and creating past-dated reservations is blocked via a backend constraint.
--------
John Doe (30.04.26)
Acme Corp:
Demo Project:
Bugün yapılan iş paragrafı.
İkinci paragraf.
Mobile App:
Aynı gün başka bir projede yapılan iş paragrafı.
```
(Mixing languages in the same file is fine, even within a day. Each run honors its own flag.)
---
## Example Outputs
### Turkish (default)
```
John Doe (30.04.26)
Acme Corp:
Demo Project:
Raporlama modülü yeniden yapılandırıldı. PDF üretim servisine parametrik veri akışı, cache invalidation stratejisi ve hata toleranslı işleme mekanizması eklendi. Büyük veri setlerinde oluşan timeout problemleri optimize edildi.
Abonelik ve kredi yönetimi altyapısı geliştirildi. Plan tanımlama ekranı yeniden tasarlanarak esnek hak tanımlama (aylık saat, ek kredi, rollover) desteği eklendi. Fiyatlandırma motoru kalem bazlı hesaplama yapacak şekilde revize edildi.
Talep listesi gelişmiş filtreleme, durum bazlı segmentasyon ve server-side pagination desteği ile yeniden kurgulandı. Detay ekranında oluşan tip uyuşmazlıkları ve veri senkronizasyon hataları giderildi.
```
### English (`-en`)
```
John Doe (30.04.26)
Acme Corp:
Demo Project:
The reporting module was rebuilt. The PDF generation service now supports parametric data flow, cache invalidation, and fault-tolerant processing, and timeout issues on large datasets were resolved.
The subscription and credit management layer was extended. The plan editor was redesigned around card-based forms, with monthly hours, extra credits, and rollover support added, and the pricing engine was revised to compute line-item totals.
The ticket list was reworked with advanced filtering, status-based segmentation, and server-side pagination. Type mismatches and data synchronization issues on the detail view were resolved.
```
---
## Edge Cases
| Case | Action |
|---|---|
| Not a git repo | "Bu dizin bir git deposu değil." — abort |
| No commits in range | "Seçilen aralıkta hiçbir commit bulunamadı." — abort |
| `--direkt` with no/incomplete preferences | "Direkt mod için önce `/report` komutuyla en az bir kez interaktif çalıştırma yapılmalı." — abort |
| Repository without a saved project name | Ask once with a suggestion, save to `projeler` |
| Single commit | One paragraph |
| Many commits | Many paragraphs — **no upper limit** |
| Merge commits | Skipped via `--no-merges` |
| Binary-only commits | Summarize as "Medya ve statik dosya güncellemeleri yapıldı" (TR) / "Media and static asset updates were applied" (EN) |
| `~/Desktop/rapor.md` missing | Create it |
| `~/Desktop/rapor.md` has content | Last block is today's: add or replace the project section. Otherwise append after `--------` |
| Unknown flag | Ignore silently and proceed with defaults |