diff --git a/.claude/command-index.md b/.claude/command-index.md index 8c86d4f..fd2c9b8 100644 --- a/.claude/command-index.md +++ b/.claude/command-index.md @@ -9,6 +9,7 @@ Tüm sistem komutları, tetikleyicileri, gerekli araçları ve çalıştırma mo | `/start` | İş gününün başlangıcı | Read, Write, Edit, Bash(date) | Doğrudan çalıştır | Hafızayı yükle, günlük not oluştur, görevleri gözden geçir | | `/sync` | Gün ortası (3-4 saat sonra) | Read, Write, Edit, Bash(date), Agent | Doğrudan çalıştır | Hafızayı tazele, not defterini işle, görevleri gözden geçir | | `/wrap-up` | İş gününün sonu | Read, Write, Edit, Bash(date), Agent | Doğrudan çalıştır | Günlük denetim, bilgiyi dışsallaştır, yarını hazırla | +| `/status` | Oturum sırasında hızlı kontrol gerektiğinde | Read, Bash(git) | Doğrudan çalıştır | Aktif alanı, workspace değişikliklerini ve kritik git sinyallerini kısa göster | | `/standup` | Gün başlangıcı (hızlı mod) | Read, Edit, Glob, Bash(git,date) | Doğrudan çalıştır | Git + görevlerden dün/bugün/engeller otomatik oluştur | | `/clear` | Bağlam baskısı veya görev tamamlanması | Read, Write, Edit, Bash(date) | Doğrudan çalıştır | Durumu damıt, bağlamı temizle, otomatik devam et | diff --git a/.claude/commands/status.md b/.claude/commands/status.md new file mode 100644 index 0000000..6751368 --- /dev/null +++ b/.claude/commands/status.md @@ -0,0 +1,215 @@ +--- +description: Hızlı git durumu özeti - aktif alan, çalışma alanı, kritik sinyaller, sonraki adım +argument-hint: "" +allowed-tools: + - Read + - Bash(git status:*, git branch:*, git rev-parse:*, git rev-list:*, git diff:*, git ls-files:*) +--- + +Kısa, read-only durum özeti üret. Yalnızca git tabanlı veri kullan. Hiçbir dosyaya yazma. + +Bu komut git sinyallerinden deterministik bir snapshot üretir. Bu yüzden git repo içinde tam çalışır; git repo dışında çağrıldığında kurulum veya diğer komutlar bozulmaz, yalnızca sınırlı fallback çıktısı döner. + +## Adımlar + +### Adım 1: Git repo kontrolü + +Önce şunu çalıştır: + +```bash +git rev-parse --is-inside-work-tree +``` + +Başarısız olursa şu fallback bloğunu yazdır ve dur: + +```text +Durum: git repo değil +Focus: unavailable +Workspace: unavailable +Git: unavailable +Risk: none +Sonraki: bu komutu bir git reposu içinde çalıştır +``` + +Bu fallback bir hata yönetimi davranışıdır, kullanım engeli değildir: + +- `/status` için git verisi yoktur +- `kalfa init` ve diğer komutlar yine kullanılabilir +- kullanıcıya yalnızca bu komutun neden sınırlı çıktıya düştüğünü açıkça göster + +### Adım 2: Git durumunu topla (paralel) + +Şunları topla: + +**Branch adı:** + +```bash +git branch --show-current +``` + +Boşsa `detached HEAD` kullan. + +**Ana durum çıktısı:** + +```bash +git status --short --branch +``` + +**Merge conflict sinyali:** + +```bash +git diff --name-only --diff-filter=U +``` + +**Untracked dosyalar:** + +```bash +git ls-files --others --exclude-standard +``` + +**Tracking branch kontrolü:** + +```bash +git rev-parse --abbrev-ref --symbolic-full-name @{upstream} +``` + +Başarılıysa ahead/behind sayısını al: + +```bash +git rev-list --left-right --count HEAD...@{upstream} +``` + +Başarısızsa tracking yok kabul et. + +### Adım 3: Alanları türet + +#### Durum + +- Branch adı varsa kullan +- Yoksa `detached HEAD` + +#### Focus + +Sadece `Workspace` için hesaplanan benzersiz path listesinden türet. Anlamsal etiket üretme; yalnızca path prefix kullan. + +Kurallar: + +1. Path listesi boşsa `clean workspace` +2. Tek path varsa: + - parent directory varsa onu kullan + - yoksa dosya yolunun kendisini kullan +3. Hem `.claude/commands/*` path'leri hem de `.claude/command-index.md` varsa focus olarak `.claude/commands` kullan +4. Bir directory prefix benzersiz path'lerin yarısından fazlasını kapsıyorsa en derin geçerli prefix'i kullan +5. Ortak baskın prefix yoksa `mixed changes` + +#### Workspace + +- Hiç değişiklik yoksa tam olarak `Workspace: clean` +- Değişiklik varsa benzersiz path sayısını hesapla ve en fazla 2-3 örnek path göster: + +```text +Workspace: (<örnek path 1>, <örnek path 2>, <örnek path 3>) +``` + +Staged, unstaged, untracked ve unmerged path'leri tek listede düşün; aynı path'i iki kez sayma. + +Deterministik kurallar: + +- Örnek path'leri leksikografik sırayla seç +- En fazla ilk 3 örneği göster +- Hiçbir durumda ikinci bir `Workspace` satırı ekleme + +#### Git + +Tek satırda özetle: + +- Çalışma alanı temizse `clean`, aksi halde `dirty` +- Tracking varsa: + - tam biçim `clean/dirty • ahead X / behind Y` +- Tracking yoksa: + - tam biçim `clean/dirty • tracking unavailable` + +Örnekler: + +```text +Git: clean • ahead 0 / behind 0 +Git: dirty • ahead 1 / behind 0 +Git: dirty • tracking unavailable +``` + +#### Risk + +Tek satır yaz. En fazla 2-3 kritik sinyal göster. Hiçbiri yoksa tam olarak `Risk: none` yaz. + +Sadece şu sinyaller geçerli: + +- `merge conflict` +- `branch diverged` +- `dirty workspace` +- ` untracked files` + +Kurallar: + +- Merge conflict varsa en yüksek öncelik +- `branch diverged` yalnızca hem ahead hem behind > 0 ise +- Dirty workspace sinyali yalnızca tracked veya staged değişiklik varsa +- Untracked dosyalar ayrı sinyal olabilir +- En fazla ilk 3 sinyali göster, fazlasını ekleme + +Örnek: + +```text +Risk: merge conflict; dirty workspace +Risk: branch diverged; 3 untracked files +Risk: none +``` + +#### Sonraki + +Tek ve net aksiyon ver: + +Mapping sırası sabit olsun: + +1. Unmerged path varsa: `çatışmaları çöz ve tekrar durum kontrol et` +2. Tracking var ve ahead > 0 ve behind > 0 ise: `branch'i sync et ve sonra değişikliklere dön` +3. Tracking var ve behind > 0 ise: `upstream değişikliklerini al ve tekrar kontrol et` +4. Tracked veya staged değişiklik varsa: `değişiklikleri gözden geçir ve commit'e hazırla` +5. Yalnızca untracked dosyalar varsa: `untracked dosyaları ekle ya da yok say` +6. Tracking yoksa: `branch tracking ayarla veya local değişiklikle devam et` +7. Workspace temiz ve tracking var ve ahead > 0 ise: `yerel commit'leri push et` +8. Workspace temiz ve tracking var ve ahead 0 / behind 0 ise: `yeni iş için branch aç veya bir sonraki göreve başla` + +### Adım 4: Çıktıyı yazdır + +Çıktı kısa, sabit ve deterministik olmalı. Hedef 6-8 satır; hiçbir durumda 15 satırı geçme. + +Sert kural: + +- Normal durumda yalnızca bu 6 satırı yaz +- Fallback durumda da yalnızca bu 6 satırı yaz +- Ek açıklama, ikinci blok, dipnot veya uzun liste ekleme +- Satır sınırına yaklaşılırsa örnek path ve risk sinyallerini kısalt; yeni satır ekleme + +Tam biçim: + +```text +Durum: ... +Focus: ... +Workspace: ... +Git: ... +Risk: ... +Sonraki: ... +``` + +Clean workspace örneği: + +```text +Durum: main +Focus: clean workspace +Workspace: clean +Git: clean • ahead 0 / behind 0 +Risk: none +Sonraki: yeni iş için branch aç veya bir sonraki göreve başla +``` + +Uzun açıklama, ek paragraf veya ikinci rapor bloğu üretme. diff --git a/CLAUDE.md b/CLAUDE.md index c063f87..ca393c1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,6 +6,7 @@ Herhangi bir işlem yapmadan önce daima `.claude/memory.md` dosyasını oku. ## Hızlı Başlangıç * `/start` ile güne başla +* `/status` ile anlık git tabanlı durum özeti al (git repo dışında sınırlı fallback döner) * `/sync` ile gün ortasında hafızayı tazele * `/wrap-up` ile günü kapat * `/audit` ile son yapılan işin kalitesini doğrula diff --git a/README.md b/README.md index d7976cb..16fb8ea 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Proje durumu: aktif olarak geliştiriliyor |---------|------|----------| | **Skill'ler** | 994 | 16 kategoride yapılandırılmış operasyonel prosedürler | | **Agent'lar** | 10 | Kalıcı hafızaya sahip uzman alt-agent'lar | -| **Komutlar** | 22 | İş akışı ritüelleri ve araçlar | +| **Komutlar** | 23 | İş akışı ritüelleri ve araçlar | | **Hook'lar** | 9 | Deterministik güvenlik kontrolleri | | **Hafıza** | 6 katman | Oturumlar arası bağlam koruma | @@ -108,12 +108,16 @@ kalfa --help ### Gün içinde bağlamı sağlıklı tut -1. Oturum ortasında `/sync` çalıştırın. -2. Bağlam ağırlaştığında `/clear` kullanın. +1. Hızlı durum kontrolü gerektiğinde `/status` çalıştırın. + 1. `/status` yalnızca git verisini okur; `memory.md`, görev panosu veya günlük not kullanmaz. + 2. Bu yüzden en anlamlı çıktıyı bir git repo içinde verir. + 3. Git repo dışında da çalıştırılabilir; bu durumda kısa fallback çıktısı verip komutu git repo içinde kullanmanızı söyler. +2. Oturum ortasında `/sync` çalıştırın. +3. Bağlam ağırlaştığında `/clear` kullanın. 1. Oturum özeti günlük nota yazılır. 2. Hafıza dosyası güncellenir. 3. Çalışma kaldığı yerden devam eder. -3. Gün sonunda `/wrap-up` ile kapanış yapın. +4. Gün sonunda `/wrap-up` ile kapanış yapın. ### Kalite kontrollerini işlet @@ -196,7 +200,7 @@ Yerelde çalıştırma: 1. Bu repo bir uygulama build çıktısı üretmez; operasyon dosyası sağlar. 1. Hedef projenizde `claude` başlatın. - 2. `/start`, `/sync`, `/wrap-up` akışlarını çalıştırın. + 2. `/start`, `/status`, `/sync`, `/wrap-up` akışlarını çalıştırın. Testleri çalıştırma: diff --git a/bin/kalfa.js b/bin/kalfa.js index aee8775..4fb9e8f 100755 --- a/bin/kalfa.js +++ b/bin/kalfa.js @@ -5,8 +5,9 @@ const path = require("node:path"); const figlet = require("figlet"); const TEMPLATE_ITEMS = [ - ".claude", - "CLAUDE.md", + { source: ".claude", destination: ".claude" }, + { source: "CLAUDE.md", destination: "CLAUDE.md" }, + { source: "templates/gitignore", destination: ".gitignore" }, ]; function printBanner() { @@ -125,8 +126,8 @@ function runInit(options) { } for (const item of TEMPLATE_ITEMS) { - const sourcePath = path.join(packageRoot, item); - const destinationPath = path.join(targetRoot, item); + const sourcePath = path.join(packageRoot, item.source); + const destinationPath = path.join(targetRoot, item.destination); copyRecursive(sourcePath, destinationPath, options, results); } diff --git a/komunite-kalfa-1.0.0.tgz b/komunite-kalfa-1.0.0.tgz new file mode 100644 index 0000000..8ab4104 Binary files /dev/null and b/komunite-kalfa-1.0.0.tgz differ diff --git a/templates/gitignore b/templates/gitignore new file mode 100644 index 0000000..ce9ca7b --- /dev/null +++ b/templates/gitignore @@ -0,0 +1,6 @@ +# Kalfa runtime artifacts +.claude/logs/ +.claude/agent-memory/ +.claude/backups/ +.claude/hooks/__counter +__NEEDS_ONBOARD diff --git a/tests/cli.integration.test.js b/tests/cli.integration.test.js index 936f5e5..9aa95b8 100644 --- a/tests/cli.integration.test.js +++ b/tests/cli.integration.test.js @@ -69,6 +69,7 @@ test("init copies starter files to target directory", async () => { const expected = [ ".claude", "CLAUDE.md", + ".gitignore", ".claude/workspace/Scratchpad.md", ".claude/workspace/TaskBoard.md", ".claude/workspace/DailyNotes", @@ -78,4 +79,8 @@ test("init copies starter files to target directory", async () => { const absolute = path.join(targetDir, item); assert.equal(fs.existsSync(absolute), true, `missing ${absolute}`); } + + const gitignore = fs.readFileSync(path.join(targetDir, ".gitignore"), "utf8"); + assert.match(gitignore, /^\.claude\/logs\/$/m); + assert.match(gitignore, /^\.claude\/agent-memory\/$/m); });