tillerhand 3.32.1 → 3.33.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.
- package/.claude/agents/code-reviewer.md +1 -1
- package/.claude/agents/security-auditor.md +2 -0
- package/.claude/board/rules.md +1 -1
- package/.claude/commands/build.md +3 -2
- package/.claude/hooks/gate.mjs +12 -3
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/docs/workflow/decision-protocol.md +1 -1
- package/docs/workflow/usage-limits.md +1 -0
- package/kit/CHANGELOG.md +9 -0
- package/kit/VERSION +1 -1
- package/kit/guide.html +3 -3
- package/package.json +1 -1
|
@@ -28,7 +28,7 @@ Emin olmadığın bir şeyi bulgu olarak yazma; şüpheliyse "DOĞRULANMADI" eti
|
|
|
28
28
|
|
|
29
29
|
## Çıktı
|
|
30
30
|
|
|
31
|
-
Övgü ve özet yok. Sadece bulgular, en ciddiden başlayarak:
|
|
31
|
+
Övgü ve özet yok. Sadece bulgular, en ciddiden başlayarak; toplam en fazla ~15 satır, bulgu başına tek satır:
|
|
32
32
|
|
|
33
33
|
```
|
|
34
34
|
[KRİTİK|ÖNEMLİ|KÜÇÜK] dosya:satır — Sorun. Somut senaryo (hangi girdiyle ne olur). Öneri.
|
|
@@ -30,6 +30,8 @@ Sen bir uygulama güvenliği denetçisisin. Varsayılan tutumun şüphecilik: Bi
|
|
|
30
30
|
|
|
31
31
|
## Çıktı
|
|
32
32
|
|
|
33
|
+
En ciddiden başlayarak; toplam en fazla ~15 satır, bulgu başına tek satır:
|
|
34
|
+
|
|
33
35
|
```
|
|
34
36
|
[KRİTİK|YÜKSEK|ORTA|DÜŞÜK] dosya:satır — Açık. Sömürü senaryosu (saldırgan ne yapar, ne elde eder). Düzeltme.
|
|
35
37
|
```
|
package/.claude/board/rules.md
CHANGED
|
@@ -46,7 +46,7 @@ Kurulda olmayan bir üyeyi çağırma; ilgili alan kurulda yoksa durum bloğunda
|
|
|
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
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.
|
|
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
|
+
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. Rapor sözleşmesini istemde yaz: en fazla ~15 satır, bulgu başına tek satır, önem sırasıyla; övgü ve özet yok (raporlar ana oturumun bağlamına girer).
|
|
50
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.
|
|
51
51
|
3. **Sentezle** (ana ajan; konseyde başkanın kararına göre):
|
|
52
52
|
|
|
@@ -10,13 +10,13 @@ Boşsa `docs/workflow/progress.md` → "Sıradaki adım" veya `docs/product/road
|
|
|
10
10
|
0b. **Model ve effort** (`docs/workflow/models.md`): Son seçimi `node .claude/hooks/models.mjs --show` ile oku. İki AskUserQuestion çağrısı yap: önce dört soru, her rolün modeli (Opus / Sonnet / Haiku); sonra dört soru, her rolün effort'u (düşük / orta / yüksek / ekstra yüksek). Her soruda models.md'deki önerilen seçenek ilk sırada ve "(Önerilen)" etiketli; son seçim farklıysa o seçeneğin açıklamasına "son seçim" yaz. Cevabı `node .claude/hooks/models.mjs --set plan=<model>:<effort> code=… review=… docs=…` ile kaydet. Ana oturumun modeli veya effort'u plan rolünden farklıysa tek satırla `/model <ad>` ve `/effort <düzey>` öner. Soru modunda `maliyet` konusu kapalıysa sorma ve `--set` çalıştırma: son seçim geçerli kalır, durum bloğunda "otomatik" yaz.
|
|
11
11
|
1. Görevi ve kabul kriterlerini bana tek cümleyle tekrar et. `docs/workflow/progress.md` → aktif görevi güncelle.
|
|
12
12
|
2. Bu görev için onaylanmış bir plan yoksa ve 2'den fazla dosyaya dokunacaksa önce `/plan-task` adımlarını uygula (karar noktaları dahil), onay bekle.
|
|
13
|
-
2b. **Kod rolüne devret (2b ve 3):** Agent aracıyla alt ajan çalıştır, çağrıda kod rolünün `model` ve `effort`'unu ver. İstemde: görev ve kabul kriterleri, onaylı plan, dokunulacak dosyalar, adım 3'teki kurallar, önce kırmızı testler. Alt ajan kullanıcıya soru soramaz: karar noktasında durup soruyu ve seçenekleri raporlamasını iste; soruyu sen sor, kararı günlüğe yaz, alt ajanı cevapla devam ettir. Alt ajan bitince diff'i ve test çıktısını kendin oku; adım 4'ten sonrası ana oturumda. Kullanıcıya görünen metni (humanizer) son haline sen getir.
|
|
13
|
+
2b. **Kod rolüne devret (2b ve 3):** Agent aracıyla alt ajan çalıştır, çağrıda kod rolünün `model` ve `effort`'unu ver. İstemde: görev ve kabul kriterleri, onaylı plan, dokunulacak dosyalar, adım 3'teki kurallar, önce kırmızı testler. Alt ajan kullanıcıya soru soramaz: karar noktasında durup soruyu ve seçenekleri raporlamasını iste; soruyu sen sor, kararı günlüğe yaz, alt ajanı cevapla devam ettir. Raporu kısa iste (en fazla ~15 satır: değişen dosyalar, test sonucu sayıyla, açık sorular; kod ve tam çıktı yok). Alt ajan bitince diff'i ve test çıktısını kendin oku; adım 4'ten sonrası ana oturumda. Kullanıcıya görünen metni (humanizer) son haline sen getir.
|
|
14
14
|
**Önce kabul testleri:** Görevin kabul kriterleri için testleri (kimlik test adında: `Ö-01.1`) ve gerekiyorsa saldırgan testlerini yaz, çalıştır ve **kırmızı** olduklarını göster (alt ajanın kırmızı çıktısını bana göster). Sonra uygula.
|
|
15
15
|
3. Uygula. Kurallar:
|
|
16
16
|
- **Uygularken yeni bir karar noktası çıkarsa dur ve sor** (`docs/workflow/decision-protocol.md`). Tahmin edip devam etme.
|
|
17
17
|
- Skill'ler (`docs/workflow/skills.md`): Kod için `ponytail:ponytail`, kritik akış için `mattpocock-skills:tdd`. Arayüz için seçilen yön skill'i + `impeccable:impeccable` (`DESIGN.md`'ye bağlı kal; yeni tasarım kararı gerekirse `/design`). Kullanıcıya görünen metin için `humanizer:humanizer`.
|
|
18
18
|
- Sadece bu görevin kapsamı. Görev dışı sorunları düzeltme, `docs/workflow/progress.md` → "Açık sorunlar"a yaz.
|
|
19
|
-
- Kod haritası bağlıysa keşfi onunla yap; dosyaları toptan okuma.
|
|
19
|
+
- Kod haritası bağlıysa keşfi onunla yap; dosyaları toptan okuma. Büyük dosyada önce ara (grep), sonra yalnız gereken satır aralığını oku.
|
|
20
20
|
- Paket kurarken paket kapısı uyarırsa (uydurma / çok yeni / az kullanılan) kullanıcıya bildir; zorlamaya çalışma.
|
|
21
21
|
- Plan bayrak gerektiriyorsa özelliği bayrak arkasına koy ve `docs/operations/feature-flags.md`'ye ekle.
|
|
22
22
|
- Çalışırken limit %90 / %95 / %99'a gelirse `docs/workflow/usage-limits.md` §4'teki uyarıları ver; işi durdurma.
|
|
@@ -43,4 +43,5 @@ Boşsa `docs/workflow/progress.md` → "Sıradaki adım" veya `docs/product/road
|
|
|
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
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
|
+
- Commit atıldıysa: `docs/workflow/progress.md` → "Sıradaki adım" güncel mi bak, sonra tek satırla `/clear` öner (görev = oturum, `docs/workflow/usage-limits.md` §3; bağlam yüzdesinden bağımsız). Yeni oturum progress.md'den devam eder.
|
|
46
47
|
- Durum bloğu
|
package/.claude/hooks/gate.mjs
CHANGED
|
@@ -26,7 +26,16 @@ const CHECKS = ['lint', 'tip kontrol', 'test'];
|
|
|
26
26
|
const APPROVED = [...CHECKS, 'geliştirme', 'önizleme'];
|
|
27
27
|
const TIMEOUT = 10 * 60 * 1000;
|
|
28
28
|
const BUFFER = 64 * 1024 * 1024;
|
|
29
|
-
|
|
29
|
+
// A red check shows its last 30 lines; a longer output is kept whole in a file, read only when the tail is not enough
|
|
30
|
+
function failed(root, name, r) {
|
|
31
|
+
const all = `${r.error ? `${r.error.message}\n` : ''}${r.stdout ?? ''}${r.stderr ?? ''}`.trimEnd();
|
|
32
|
+
const lines = all.split(/\r?\n/);
|
|
33
|
+
if (lines.length <= 30) return { output: all };
|
|
34
|
+
const rel = `.claude/state/gate-log/${name.toLowerCase().replace(/\s+/g, '-')}.log`;
|
|
35
|
+
fs.mkdirSync(path.join(root, path.dirname(rel)), { recursive: true });
|
|
36
|
+
fs.writeFileSync(path.join(root, rel), all);
|
|
37
|
+
return { output: lines.slice(-30).join('\n'), note: `son 30 satır; tamamı ${rel}` };
|
|
38
|
+
}
|
|
30
39
|
|
|
31
40
|
// Only the "## Komutlar" section is read: a "test:" line elsewhere must not count as a command
|
|
32
41
|
export function readCommands(md, names = CHECKS) {
|
|
@@ -70,7 +79,7 @@ function check(root, { name, command }) {
|
|
|
70
79
|
const r = spawnSync(command, { cwd: root, shell: true, encoding: 'utf8', timeout: TIMEOUT, maxBuffer: BUFFER });
|
|
71
80
|
const sec = Math.round((Date.now() - start) / 1000);
|
|
72
81
|
if (r.status === 0) return { name, command, status: 'passed', sec };
|
|
73
|
-
return { name, command, status: 'failed', sec,
|
|
82
|
+
return { name, command, status: 'failed', sec, ...failed(root, name, r) };
|
|
74
83
|
}
|
|
75
84
|
|
|
76
85
|
function semgrep(root, files) {
|
|
@@ -93,7 +102,7 @@ function semgrep(root, files) {
|
|
|
93
102
|
}
|
|
94
103
|
const sec = Math.round((Date.now() - start) / 1000);
|
|
95
104
|
if (r.status === 0) return { name, status: 'passed', sec };
|
|
96
|
-
return { name, status: 'failed', sec,
|
|
105
|
+
return { name, status: 'failed', sec, ...failed(root, name, r) };
|
|
97
106
|
}
|
|
98
107
|
|
|
99
108
|
// A path that only exists on this machine in a changed line breaks the code, tests and docs on every other machine.
|
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.
|
|
9
|
+
<a href="kit/CHANGELOG.md"><img alt="Version" src="https://img.shields.io/badge/version-3.33.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.
|
|
9
|
+
<a href="kit/CHANGELOG.md"><img alt="Sürüm" src="https://img.shields.io/badge/s%C3%BCr%C3%BCm-3.33.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">
|
|
@@ -28,7 +28,7 @@ Emin değilsen karar noktasıdır, sor.
|
|
|
28
28
|
3. **2-4 seçenek.** En uygun gördüğün **ilk sırada** ve etiketinin sonunda **"(Önerilen)"**.
|
|
29
29
|
4. **Her seçeneğin açıklamasında:** Ne olduğu, hangi durumda daha iyi olduğu ve bedeli. Örnek: "Next.js — SEO ve sunucu tarafı gereken ürünlerde en iyisi, AI bu ekosistemi en iyi bilir; öğrenme eğrisi ve barındırma maliyeti Vite SPA'dan yüksek."
|
|
30
30
|
5. **Önerinin gerekçesi bu projeye özel olsun:** PRD'deki kullanıcıya, bütçeye, ölçeğe ve kullanıcının daha önceki kararlarına dayan. Genel geçer "en popüler" gerekçe yetmez.
|
|
31
|
-
6. **Tur başına en fazla 4 soru.** Birbirine bağlı kararları sırayla sor (önce framework, sonra ona bağlı kütüphane).
|
|
31
|
+
6. **Tur başına en fazla 4 soru.** Aynı adımın birbirinden bağımsız sorularını tek AskUserQuestion çağrısında topla: her ayrı çağrı bir tur daha demek ve her tur bütün bağlamı yeniden okur. Birbirine bağlı kararları sırayla sor (önce framework, sonra ona bağlı kütüphane).
|
|
32
32
|
7. Kullanıcı "Other" ile serbest cevap verirse onu da değerlendir. Riskli bulursan bir kez nedenini söyle, ısrar ederse uygula ve kayda geç.
|
|
33
33
|
8. **Güncellik:** Sürüm, fiyat, kullanımdan kaldırma gibi değişebilen bilgiye dayanan seçeneklerde hafızana güvenme. Gerekirse önce araştır (`docs/workflow/skills.md` → araştırma).
|
|
34
34
|
9. **Tasarım kararlarında görsel önizleme zorunlu.** Bkz. bölüm 5.
|
|
@@ -54,6 +54,7 @@ Max planda yüzdeler daha düşüktür. Günlük doldukça tahmin kendini düzel
|
|
|
54
54
|
- **Kurulu hafiflet:** Plan ve görev sonu toplantılarına sadece `security-auditor` + `board-architect` katılır. Commit denetimini sadece kod dosyalarında yap, tek üyeyle.
|
|
55
55
|
3. **Haftalık limit sarı veya kırmızıysa** ayrıca tek satırla uyar: Haftalık limit geç yenilenir.
|
|
56
56
|
4. Kullanıcı bir seçenek seçtiyse kararı `docs/decisions/log.md` günlüğüne `maliyet` konusu olarak yaz.
|
|
57
|
+
5. **Görev = oturum.** Her tur, oturumdaki bütün bağlamı yeniden okur; önceki görevin dosyaları ve çıktıları sonraki görevde boşuna para tutar. Görev bitip commit atılınca `/clear` öner (bağlam yüzdesinden bağımsız). Yeni oturum `docs/workflow/progress.md`'den devam eder.
|
|
57
58
|
|
|
58
59
|
## 4. Çalışırken limit uyarıları
|
|
59
60
|
|
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.33.0] - 2026-10-26
|
|
7
|
+
|
|
8
|
+
### Değişen
|
|
9
|
+
- **Ana oturumun bağlamı küçük kalıyor.** Her tur oturumdaki bütün bağlamı yeniden okur; bağlama giren her satır sonraki turlarda yeniden ödenir.
|
|
10
|
+
- Aynı adımın birbirinden bağımsız soruları tek soru turunda sorulur (en fazla 4).
|
|
11
|
+
- Kapı kırmızıda son 30 satırı gösterir; daha uzun çıktının tamamı `.claude/state/gate-log/<kontrol>.log` dosyasına yazılır ve yalnız gerekirse okunur.
|
|
12
|
+
- Kurul üyeleri, `code-reviewer`, `security-auditor` ve kod alt ajanı en fazla ~15 satırlık rapor verir, bulgu başına tek satır.
|
|
13
|
+
- `/build` görev bitip commit atılınca `/clear` önerir (görev = oturum); yeni oturum `progress.md`'den devam eder. Büyük dosyada önce arama, sonra yalnız gereken satırlar okunur.
|
|
14
|
+
|
|
6
15
|
## [3.32.1] - 2026-10-26
|
|
7
16
|
|
|
8
17
|
### Düzeltilen
|
package/kit/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.
|
|
1
|
+
3.33.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.
|
|
290
|
+
<span class="pill"><b>v3.33.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>
|
|
@@ -882,7 +882,7 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
|
|
|
882
882
|
</tbody>
|
|
883
883
|
</table></div>
|
|
884
884
|
</div>
|
|
885
|
-
<div class="note">Görev maliyetleri <code>docs/workflow/cost-log.md</code>'ye yazılır; tahminler zamanla gerçek verilere oturur. Oturum açılışında sadece özet kurallar ve <code>docs/workflow/progress.md</code> yüklenir (yaklaşık 1.700 token). Kod haritası bağlıysa kod, dosyalar okunmadan sorgulanır.</div>
|
|
885
|
+
<div class="note">Görev maliyetleri <code>docs/workflow/cost-log.md</code>'ye yazılır; tahminler zamanla gerçek verilere oturur. Oturum açılışında sadece özet kurallar ve <code>docs/workflow/progress.md</code> yüklenir (yaklaşık 1.700 token). Kod haritası bağlıysa kod, dosyalar okunmadan sorgulanır. Ana oturumun bağlamı da küçük tutulur: bağımsız sorular tek turda sorulur, kapı ve alt ajan raporları kısa gelir, görev bitip commit atılınca <code>/clear</code> önerilir.</div>
|
|
886
886
|
</section>
|
|
887
887
|
|
|
888
888
|
<section id="yetenekler">
|
|
@@ -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.
|
|
1058
|
+
<span>Sürüm 3.33.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