tillerhand 3.31.2 → 3.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45,6 +45,7 @@ Kurulda olmayan bir üyeyi çağırma; ilgili alan kurulda yoksa durum bloğunda
45
45
 
46
46
  1. **Limit kontrolü** (`docs/workflow/usage-limits.md`): Seviye sarıysa üye sayısını yarıya indir; kırmızıysa kullanıcıya sor (kurulu hafiflet seçeneği dahil).
47
47
  1b. **Deterministik kapı** (commit, görev sonu, faz sonu; plan toplantısında yok): `node .claude/hooks/gate.mjs --run`. AGENTS.md → Komutlar'daki lint, tip kontrolü ve test ile Semgrep çalışır; sonuç değişiklik imzasıyla saklanır. Kırmızıysa veya boşsa (hiçbir kontrol çalışmadı) commit kapısı açılmaz: önce düzelt ya da Komutlar'ı doldur. Kullanıcı ara commit için açıkça isterse `node .claude/hooks/commit-gate.mjs --skip "kullanıcı isteği"` (her zaman onaya sorulur). Kapı "komut onayı gerekli" derse komutları kullanıcıya göster; onaylarsa `node .claude/hooks/gate.mjs --approve` (yeni veya değişen komut onaysız çalışmaz).
48
+ 1c. **Commit toplantısında önce** `node .claude/hooks/commit-gate.mjs --status`: "Onay geçerli" ise toplantı yok (görev sonu toplantısı aynı değişiklikleri denetledi). "Son onaydan sonra değişen: …" ise üyelere yalnız o dosyaların farkını ver.
48
49
  2. **Üyeleri paralel çalıştır** (Agent aracı, her üye ayrı alt ajan). Her üyeye şunları ver: toplantı türü, kapsam (plan metni / diff aralığı / faz), görev kodu, kabul kriterleri ve kapı çıktısı (varsa). Çağrıda inceleme rolünün `model` ve `effort`'unu ver (`node .claude/hooks/models.mjs --show`); commit toplantısında `model: "haiku"`, `effort: "low"` ver.
49
50
  2b. **Konsey toplantısıysa** (§2) `.claude/board/council.md` aşama 1-4'ü uygula. Sentezi başkanın kararından kur; görüş ayrılığı satırına azınlık görüşünü yaz.
50
51
  3. **Sentezle** (ana ajan; konseyde başkanın kararına göre):
@@ -31,7 +31,7 @@ Boşsa `docs/workflow/progress.md` → "Sıradaki adım" veya `docs/product/road
31
31
  - API/iş mantığı → gerçek istek at veya testi çalıştır; isteği ve yanıtı göster.
32
32
  - Kanıt üretemiyorsan (cihaz, panel, ödeme gibi) bunu açıkça söyle ve benim yapmam gereken adımları yaz.
33
33
  6. Arayüz değiştiyse `impeccable:impeccable` → `critique` çalıştır; önemli bulguları düzeltip düzeltmeyeceğimi sor.
34
- 6b. **Görev sonu kurul toplantısı** (`.claude/board/rules.md`; kurul kurulduysa): Değişikliğe ilgili en fazla 3 üye, inceleme rolünün `model` ve `effort`'uyla. RET varsa görev bitmez; bulguyu ve seçenekleri sor. Toplantıyı `docs/workflow/board.md` günlüğüne yaz.
34
+ 6b. **Görev sonu kurul toplantısı** (`.claude/board/rules.md`; kurul kurulduysa). Bu, değişikliğin tek tam denetimidir: değişikliğe ilgili en fazla 3 üye + `code-reviewer` (değişiklik auth, ödeme, kişisel veri gibi hassas bir yola dokunuyorsa `security-auditor` da), inceleme rolünün `model` ve `effort`'uyla. RET varsa görev bitmez; bulguyu ve seçenekleri sor. ONAY veya KOŞULLU ONAY ise ve kapı (adım 4) yeşilse `node .claude/hooks/commit-gate.mjs --approve "görev sonu: <katılanlar>"`: commit aynı değişiklikler için kurulu yeniden toplamaz, sonradan değişen dosyalar varsa yalnız onlar incelenir. Toplantıyı `docs/workflow/board.md` günlüğüne yaz. Kurul kurulmadıysa adım 9'da `/review-changes` öner.
35
35
  7. `AGENTS.md` → "Bitti tanımı" listesini tek tek kontrol et.
36
36
  8. Kapsam kalkanını kapat (komut kullanıcıya sorulur): `node .claude/hooks/freeze-guard.mjs --plan-end`. `docs/product/roadmap.md`'de görevi işaretle; PRD'de sadece testi yeşil olan kriterleri işaretle. Testleri JUnit raporuyla çalıştır (`docs/architecture/stack.md` → Kabul testleri) ki pano güncellensin. Limiti tekrar oku ve `docs/workflow/cost-log.md`'ye satır ekle (başlangıç/bitiş 5 saatlik %, süre dk). Roadmap, cost-log ve progress yazımını tek alt ajan çağrısıyla doküman rolüne ver (`model`, `effort`); sonucu kontrol et (progress.md'nin kalın etiketli satırları durum çubuğu ve pano için aynı biçimde kalmalı).
37
37
  9. Rapor ver:
@@ -42,5 +42,5 @@ Boşsa `docs/workflow/progress.md` → "Sıradaki adım" veya `docs/product/road
42
42
  - Önerilen commit mesajı
43
43
  - Kontrol edemediğin veya şüpheli olduğun yerler
44
44
  - Görevde bir davranışını düzelttiysem ya da tercih söylediysem: aynı AskUserQuestion çağrısında ayrı bir çoklu seçim sorusu olarak "Tercih olarak kaydedeyim mi?" (AGENTS.md → kural 9, varsa; seçilenler `prefs.mjs --add`). Not yoksa sorma.
45
- - Sonra ne yapalım? AskUserQuestion ile sor: `/review-changes` ve commit (Önerilen) / sıradaki göreve geç / bu görevde değişiklik iste. Commit'te hafif kurul denetimi otomatik istenir (commit kapısı hook'u). Commit atıldıktan ve testler yeşilken çalışan nokta kaydet: `node .claude/hooks/checkpoint.mjs --save "<görev kodu> bitti, testler yeşil"` (`/rollback` buraya döner).
45
+ - Sonra ne yapalım? AskUserQuestion ile sor: commit (Önerilen; görev sonu denetimi geçerli, kurul kurulmadıysa önce `/review-changes`) / sıradaki göreve geç / bu görevde değişiklik iste. Commit'te hafif kurul denetimi otomatik istenir (commit kapısı hook'u). Commit atıldıktan ve testler yeşilken çalışan nokta kaydet: `node .claude/hooks/checkpoint.mjs --save "<görev kodu> bitti, testler yeşil"` (`/rollback` buraya döner).
46
46
  - Durum bloğu
@@ -7,6 +7,7 @@ argument-hint: [boş = commit edilmemiş değişiklikler | main..HEAD | commit h
7
7
 
8
8
  Kendi yazdığın kodu kendin inceleme; bağımsız ajanlara ver.
9
9
 
10
+ 0. **Zaten denetlendi mi?** Aralık boşsa (commit edilmemiş değişiklikler) `node .claude/hooks/commit-gate.mjs --status` çalıştır. "Onay geçerli" diyorsa bu değişiklikler görev sonu toplantısında denetlendi: yeniden inceleme yapma, onayı ve kapı durumunu bildir; kullanıcı açıkça isterse yine incele. "Son onaydan sonra değişen: …" diyorsa aşağıdaki adımları yalnız o dosyalarla yap.
10
11
  1. `git diff --stat` ile değişen dosyaları gör.
11
12
  2. **`code-reviewer`** alt ajanını inceleme rolünün `model` ve `effort`'uyla çalıştır (`docs/workflow/models.md`; adım 3 de öyle). Ona aralığı ve (biliniyorsa) görev kodunu ver. Görevin `docs/product/specs/` altında spec'i varsa onu da ver: beklenen davranış karşılandı mı, değişmemesi gereken davranış bozuldu mu?
12
13
  3. Değişiklik şunlardan birine dokunuyorsa **`security-auditor`** alt ajanını da paralel çalıştır: auth, yetki, ödeme, webhook, dosya yükleme, kişisel veri, DB erişim kuralları, ortam değişkenleri, AI/LLM çağrıları.
@@ -33,14 +33,25 @@ export function changes() {
33
33
  const partial = [...new Set([...files.filter((f) => staged.has(f) && unstaged.has(f)), ...hidden])].sort();
34
34
  const blobs = new Map(partial.length ? list('ls-files -s -z').map((l) => [l.slice(l.indexOf('\t') + 1), l.split(' ')[1]]) : []);
35
35
  const h = crypto.createHash('sha256');
36
+ // Per-file digest too: after an approval, only the files whose digest changed need review again
37
+ const hashes = new Map();
36
38
  for (const f of files) {
37
39
  h.update(`\0${f}\0`);
38
- try { h.update(fs.readFileSync(path.join(root, f))); } catch { h.update('\0silindi'); }
40
+ let body = null;
41
+ try { body = fs.readFileSync(path.join(root, f)); } catch { /* deleted */ }
42
+ h.update(body ?? '\0silindi');
43
+ hashes.set(f, body ? crypto.createHash('sha256').update(body).digest('hex').slice(0, 16) : 'silindi');
39
44
  }
40
- for (const f of partial) h.update(`\0index:${f}:${blobs.get(f)}`);
41
- return { files, signature: h.digest('hex') };
45
+ for (const f of partial) {
46
+ h.update(`\0index:${f}:${blobs.get(f)}`);
47
+ hashes.set(f, `${hashes.get(f)}:${blobs.get(f)}`);
48
+ }
49
+ return { files, signature: h.digest('hex'), hashes: Object.fromEntries(hashes) };
42
50
  }
43
51
 
52
+ // Files changed since the approval (all of them for an approval written before 3.32.0, which has no digests)
53
+ export const sinceApproval = (approval, d) => d.files.filter((f) => !approval?.hashes || !Object.hasOwn(approval.hashes, f) || approval.hashes[f] !== d.hashes[f]);
54
+
44
55
  // git's global options may come before commit: git --no-pager commit, git -C x commit, git --git-dir=x commit; git.exe on Windows
45
56
  const commitRe = (verbs) => new RegExp(`\\bgit(?:\\.exe)?["']?(?:\\s+(?:-[cC]\\s+\\S+|--?[\\w-]+(?:=\\S+)?))*\\s+(?:${verbs.join('|')})(?=\\s|$|["';&|)])`);
46
57
  const COMMIT = commitRe(['commit']);
@@ -109,9 +120,9 @@ function approve(note) {
109
120
  }
110
121
 
111
122
  function save(note) {
112
- const { signature, files } = changes();
123
+ const { signature, files, hashes } = changes();
113
124
  fs.mkdirSync(path.dirname(approvalFile), { recursive: true });
114
- fs.writeFileSync(approvalFile, JSON.stringify({ signature, note, files, date: new Date().toISOString() }));
125
+ fs.writeFileSync(approvalFile, JSON.stringify({ signature, note, files, hashes, date: new Date().toISOString() }));
115
126
  console.log(`Commit kapısı açıldı (${files.length} dosya). Not: ${note}`);
116
127
  }
117
128
 
@@ -125,7 +136,20 @@ function readGate() {
125
136
  }
126
137
  function readApproval() {
127
138
  const a = readJson(approvalFile);
128
- return a && { signature: a.signature, note: a.note };
139
+ return a && { signature: a.signature, note: a.note, date: a.date,
140
+ hashes: a.hashes && typeof a.hashes === 'object' && !Array.isArray(a.hashes) ? a.hashes : null };
141
+ }
142
+
143
+ // --status: has this change already been reviewed? /review-changes and the commit board read this before convening
144
+ function status() {
145
+ let d;
146
+ try { d = changes(); } catch { console.log('Git deposu değil.'); return; }
147
+ if (!d.files.length) { console.log('Değişiklik yok.'); return; }
148
+ const approval = readApproval(), gate = readGate();
149
+ const gateText = gate?.signature !== d.signature ? 'kapı bu değişiklikler için çalışmadı' : gate.passed ? 'kapı yeşil' : 'kapı kırmızı';
150
+ if (!approval) console.log(`Onay yok: bu değişiklikler için kurul denetimi yapılmadı (${d.files.length} dosya) · ${gateText}.`);
151
+ else if (approval.signature === d.signature) console.log(`Onay geçerli (${approval.note}, ${approval.date ?? '-'}): bu değişiklikler denetlendi, yeniden inceleme gerekmez · ${gateText}.`);
152
+ else console.log(`Onay eski (${approval.note}). Son onaydan sonra değişen: ${sinceApproval(approval, d).join(', ')}. Yalnız bunları incele · ${gateText}.`);
129
153
  }
130
154
 
131
155
  // This project's own commit-gate.mjs, resolved from the shell's folder ($CLAUDE_PROJECT_DIR, absolute, relative or ./ spelling),
@@ -215,8 +239,12 @@ async function hook() {
215
239
  process.exit(2);
216
240
  }
217
241
 
242
+ const delta = approval ? sinceApproval(approval, d) : [];
218
243
  process.stderr.write(
219
- `Commit durduruldu: Bu değişiklikler için kurul denetimi yapılmadı (${d.files.length} dosya).\n` +
244
+ (delta.length && delta.length < d.files.length
245
+ ? `Commit durduruldu: son onaydan (${approval.note}) sonra değişen dosyalar denetlenmedi: ${delta.join(', ')}.\n` +
246
+ 'Kurul yalnız bu dosyaların farkına bakar; önceki onaylı dosyalar yeniden incelenmez.\n'
247
+ : `Commit durduruldu: Bu değişiklikler için kurul denetimi yapılmadı (${d.files.length} dosya).\n`) +
220
248
  '0. node .claude/hooks/gate.mjs --run ile deterministik kapıyı (lint, tip, test, Semgrep) çalıştır; çıktısını üyelere ver.\n' +
221
249
  '1. .claude/board/rules.md §3\'e göre değişen dosyalara ilgili en fazla 2 kurul üyesini model "haiku" ile, sadece diff üzerinde çalıştır.\n' +
222
250
  '2. RET yoksa: node .claude/hooks/commit-gate.mjs --approve "<katılan üyeler>" ve commit\'i tekrar dene.\n' +
@@ -230,5 +258,6 @@ if (isMain(import.meta.url)) {
230
258
  const i = process.argv.indexOf('--approve'), j = process.argv.indexOf('--skip');
231
259
  if (i > -1) approve(process.argv[i + 1] || 'belirtilmedi');
232
260
  else if (j > -1) save(`atlandı: ${process.argv[j + 1] || 'kullanıcı isteği'}`);
261
+ else if (process.argv.includes('--status')) status();
233
262
  else hook();
234
263
  }
@@ -25,7 +25,8 @@
25
25
  "Bash(node .claude/hooks/tools.mjs --disable:*)",
26
26
  "Bash(node .claude/hooks/prefs.mjs --list)",
27
27
  "Bash(node .claude/hooks/models.mjs --show)",
28
- "Bash(node .claude/hooks/models.mjs --set:*)"
28
+ "Bash(node .claude/hooks/models.mjs --set:*)",
29
+ "Bash(node .claude/hooks/commit-gate.mjs --status)"
29
30
  ],
30
31
  "ask": [
31
32
  "Bash(git push:*)",
package/README.en.md CHANGED
@@ -6,7 +6,7 @@
6
6
  </p>
7
7
 
8
8
  <p align="center">
9
- <a href="kit/CHANGELOG.md"><img alt="Version" src="https://img.shields.io/badge/version-3.31.2-2a78d6?style=flat-square"></a>
9
+ <a href="kit/CHANGELOG.md"><img alt="Version" src="https://img.shields.io/badge/version-3.32.0-2a78d6?style=flat-square"></a>
10
10
  <a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-2a78d6?style=flat-square"></a>
11
11
  <img alt="Claude Code" src="https://img.shields.io/badge/Claude%20Code-ready-d97757?style=flat-square">
12
12
  <img alt="Also Codex and Antigravity" src="https://img.shields.io/badge/also-Codex%20%C2%B7%20Antigravity-5b6577?style=flat-square">
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  </p>
7
7
 
8
8
  <p align="center">
9
- <a href="kit/CHANGELOG.md"><img alt="Sürüm" src="https://img.shields.io/badge/s%C3%BCr%C3%BCm-3.31.2-2a78d6?style=flat-square"></a>
9
+ <a href="kit/CHANGELOG.md"><img alt="Sürüm" src="https://img.shields.io/badge/s%C3%BCr%C3%BCm-3.32.0-2a78d6?style=flat-square"></a>
10
10
  <a href="LICENSE"><img alt="Lisans: MIT" src="https://img.shields.io/badge/lisans-MIT-2a78d6?style=flat-square"></a>
11
11
  <img alt="Claude Code" src="https://img.shields.io/badge/Claude%20Code-haz%C4%B1r-d97757?style=flat-square">
12
12
  <img alt="Codex ve Antigravity" src="https://img.shields.io/badge/ayr%C4%B1ca-Codex%20%C2%B7%20Antigravity-5b6577?style=flat-square">
package/kit/CHANGELOG.md CHANGED
@@ -3,6 +3,15 @@
3
3
  Kit sürümü `kit/VERSION` dosyasında. Bir projeyi güncellemek: projede `/kit-update`.
4
4
  "Elle uyarla" notu olan maddeler projeye ait dosyalardadır; güncelleme bunlara dokunmaz.
5
5
 
6
+ ## [3.32.0] - 2026-10-26
7
+
8
+ ### Değişen
9
+ - **Aynı değişiklik iki kez denetlenmez.** Görev sonu kurul toplantısı artık değişikliğin tek tam denetimi: ilgili üyeler ve `code-reviewer` (hassas yolda `security-auditor` da) birlikte bakar. Toplantı onay verirse ve kapı yeşilse commit kapısı aynı değişiklikler için açılır; commit'te kurul yeniden toplanmaz, `/review-changes` ayrıca önerilmez.
10
+ - Onaydan sonra bir dosya değişirse yalnız o dosyalar incelenir. Commit kapısı hangi dosyaların son onaydan sonra değiştiğini söyler.
11
+ - Yeni: `node .claude/hooks/commit-gate.mjs --status` bu değişikliklerin denetlenip denetlenmediğini, kapının durumunu ve son onaydan beri değişen dosyaları gösterir. `/review-changes` ve commit toplantısı önce buna bakar.
12
+ - Kurul kurulmamışsa akış aynı: görev sonunda `/review-changes` önerilir.
13
+ - İzin satırı `/kit-update` ile eklenir.
14
+
6
15
  ## [3.31.2] - 2026-10-26
7
16
 
8
17
  ### Düzeltilen
package/kit/VERSION CHANGED
@@ -1 +1 @@
1
- 3.31.2
1
+ 3.32.0
package/kit/guide.html CHANGED
@@ -287,7 +287,7 @@ footer .container { display: flex; flex-wrap: wrap; gap: 16px; justify-content:
287
287
  <section class="hero">
288
288
  <div class="container">
289
289
  <div>
290
- <span class="pill"><b>v3.31.2</b> Claude Code için başlangıç kiti · MIT</span>
290
+ <span class="pill"><b>v3.32.0</b> Claude Code için başlangıç kiti · MIT</span>
291
291
  <h1>Kodu AI yazar.<br><em>Dümen sende.</em></h1>
292
292
  <p class="sub">TillerHand, Claude Code ile bir ürünü fikirden canlıya ve bakıma kadar götürür. Her önemli kararda AI sana seçenekleri, önerisini ve her seçeneğin bedelini sunar. Bir uzman kurulu işi denetler, korumalar hatayı daha olmadan durdurur.</p>
293
293
  <div class="install"><span id="cmd">npx tillerhand init</span><button class="copy" type="button" data-copy="cmd">Kopyala</button></div>
@@ -723,7 +723,7 @@ node vibe-kit/kit/kit.mjs init
723
723
  <tbody>
724
724
  <tr><td>Plan · konsey</td><td>/plan-task sonunda, onaydan önce</td><td>Ürün + Mimar + ilgili üyeler (en fazla 4) + başkan</td><td>inceleme rolü · başkan opus</td></tr>
725
725
  <tr><td>Görev sonu</td><td>/build sonunda</td><td>İlgili üyeler (en fazla 3)</td><td>inceleme rolü</td></tr>
726
- <tr><td>Commit (hafif)</td><td>Her commit öncesi; hook zorunlu kılar</td><td>İlgili en fazla 2 üye, sadece diff ve kapı çıktısı</td><td>haiku</td></tr>
726
+ <tr><td>Commit (hafif)</td><td>Her commit öncesi; hook zorunlu kılar. Görev sonu toplantısı aynı değişiklikleri onayladıysa yapılmaz</td><td>İlgili en fazla 2 üye, yalnız son onaydan sonra değişen dosyalar</td><td>haiku</td></tr>
727
727
  <tr><td>Faz sonu · canlıya alma</td><td>/board convene, /release first</td><td>Tüm kurul + başkan</td><td>inceleme rolü · başkan opus</td></tr>
728
728
  <tr><td>Karar konseyi</td><td>Tek yönlü kapı kararı, /board council</td><td>3 danışman aynı soruyu cevaplar + başkan</td><td>haiku · sonnet · opus · başkan opus</td></tr>
729
729
  </tbody>
@@ -765,7 +765,7 @@ node vibe-kit/kit/kit.mjs init
765
765
  <tr><td>Yapılandırma onayı</td><td><code>CLAUDE.md</code>, <code>AGENTS.md</code>, <code>.claude/</code>, <code>.codex/</code>, <code>.mcp.json</code> ve iş akışı dosyaları onayın olmadan değişmez</td></tr>
766
766
  <tr><td>Test koruması</td><td>Beklenti silmek veya yoruma almak, <code>.skip</code>/<code>.only</code>, gevşek beklenti, test dosyasını silmek veya taşımak ve test ayarında kapsamı daraltmak sorulur; kabukla test dosyasına yazmak da</td></tr>
767
767
  <tr><td>Deterministik kapı</td><td><code>gate.mjs --run</code>: lint, tip kontrolü, test ve Semgrep çalışır; çıktı kurula girdi olur, kırmızı kontrol RET sayılır. Spec'teki "değişmemesi gereken" davranışların testi yoksa veya kırmızıysa kapı kırmızıdır. Eklenen bir satırda bu makineye özel bir yol (proje klasörünün ya da ev klasörünün tam yolu) varsa da kırmızıdır. Yeni veya değişen komut önce sana gösterilip onaylatılır</td></tr>
768
- <tr><td>Commit kapısı</td><td>Kurul denetimi ve aynı değişiklikler için yeşil kapı olmadan commit atılmaz; denetimi atlamak (<code>--skip</code>) her seferinde sorulur</td></tr>
768
+ <tr><td>Commit kapısı</td><td>Kurul denetimi ve aynı değişiklikler için yeşil kapı olmadan commit atılmaz; görev sonu onayı commit için de geçerli, aynı değişiklik iki kez denetlenmez; denetimi atlamak (<code>--skip</code>) her seferinde sorulur</td></tr>
769
769
  <tr><td>Düzenleme kilidi</td><td><code>/freeze &lt;klasör&gt;</code> açıkken AI sadece o klasöre yazar; kabukla dışarı yazmak sorulur, sembolik bağdan kaçılamaz</td></tr>
770
770
  <tr><td>Kapsam kalkanı</td><td><code>/plan-task</code> onayından sonra planın dosya listesi kaydedilir; listede olmayan mevcut dosyaya yazım sorulur. Kalkanı açmak ve kapatmak da sorulur</td></tr>
771
771
  <tr><td>Düzenleme turu sayacı</td><td>Aynı kod dosyası bir oturumda 5., 10. kez düzenlenince Semgrep ve güvenlik incelemesi hatırlatılır</td></tr>
@@ -1055,7 +1055,7 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
1055
1055
  <footer>
1056
1056
  <div class="container">
1057
1057
  <a class="brand" href="#top" style="font-size:16px"><svg class="mark" style="width:22px;height:22px"><use href="#mark"/></svg>TillerHand</a>
1058
- <span>Sürüm 3.31.2 · <a href="https://github.com/burakdogrul/TillerHand">GitHub</a> · <a href="https://github.com/burakdogrul/TillerHand/blob/main/LICENSE">MIT lisansı</a> · KVKK bölümü kontrol listesidir, hukuki görüş değildir.</span>
1058
+ <span>Sürüm 3.32.0 · <a href="https://github.com/burakdogrul/TillerHand">GitHub</a> · <a href="https://github.com/burakdogrul/TillerHand/blob/main/LICENSE">MIT lisansı</a> · KVKK bölümü kontrol listesidir, hukuki görüş değildir.</span>
1059
1059
  </div>
1060
1060
  </footer>
1061
1061
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tillerhand",
3
- "version": "3.31.2",
3
+ "version": "3.32.0",
4
4
  "description": "Claude Code, Codex ve Antigravity için Türkçe vibe coding kiti: kurallar, komutlar, korumalar ve proje şablonları.",
5
5
  "license": "MIT",
6
6
  "type": "module",