tillerhand 3.39.3 → 3.40.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/commands/wrap-up.md +4 -8
- package/README.en.md +9 -1
- package/README.md +9 -1
- package/kit/CHANGELOG.md +13 -0
- package/kit/VERSION +1 -1
- package/kit/guide.html +6 -2
- package/kit/kit.mjs +1 -1
- package/kit/templates/addons/tr/types/backend/app/shared/payments.py +2 -1
- package/kit/templates/addons/tr/types/web-saas/src/lib/payments/webhook-signature.ts +4 -2
- package/kit/templates/addons/tr/types/web-saas/tests/security/payment-webhook.mjs +9 -0
- package/package.json +2 -1
|
@@ -6,14 +6,10 @@ Bu oturumu kapatıyoruz. Bir sonraki oturum (veya `/clear` sonrası) sıfır ba
|
|
|
6
6
|
|
|
7
7
|
1. `git status` ve `git diff --stat` ile bu oturumdaki değişiklikleri gör.
|
|
8
8
|
2. `docs/workflow/progress.md`'yi güncelle (40 satırı geçmesin):
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
- Bekleyen kararlar (sorulup cevap alınamayanlar)
|
|
14
|
-
- Açık sorunlar ve "AI için notlar"
|
|
15
|
-
- Kalın etiketli satırların biçimini bozma (durum çubuğu ve pano okur)
|
|
16
|
-
3. `docs/product/roadmap.md`: biten görevler işaretli mi? Görev bittiyse ve kapsam kalkanı açık kaldıysa (`node .claude/hooks/freeze-guard.mjs --status`) kapat: `--plan-end`. Görev sürüyorsa açık kalsın.
|
|
9
|
+
- Tarih, aktif görev, sıradaki adım betikle yazılır (biçim bozulmaz): `node .claude/hooks/progress.mjs --task "<aktif görev veya ->" --next "<tek, net, hemen başlanabilir adım>"`. `/build` dışında yapılan bir iş varsa aynı çağrıya `--did "<tek satır>"` ekle (`/build` kendi satırını zaten yazdı).
|
|
10
|
+
- Elle: "Son oturumda yapılanlar"dan önceki oturumların satırlarını sil; aktif faz, şu anki durum (ne çalışıyor, ne yarım), bekleyen kararlar (sorulup cevap alınamayanlar), açık sorunlar ve "AI için notlar"
|
|
11
|
+
- En sonda `node .claude/hooks/progress.mjs --check`: kalın etiketli satırlar bozulduysa söyler (durum çubuğu ve pano okur)
|
|
12
|
+
3. `docs/product/roadmap.md`: biten görevler işaretli mi? İşaretsizse `node .claude/hooks/progress.mjs --done G-NNN`. Görev bittiyse ve kapsam kalkanı açık kaldıysa (`node .claude/hooks/freeze-guard.mjs --status`) kapat: `--plan-end`. Görev sürüyorsa açık kalsın.
|
|
17
13
|
4. `CHANGELOG.md` → "Yayınlanmamış" bölümüne kullanıcıya görünen değişiklikleri ekle.
|
|
18
14
|
5. Bu oturumdaki tüm kararlar `docs/decisions/log.md` günlüğünde mi? Eksik olanları ekle.
|
|
19
15
|
6. Yapı değiştiyse (yeni tablo, servis, klasör) `docs/architecture/overview.md`'yi güncelle.
|
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.40.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">
|
|
@@ -93,6 +93,14 @@ npx tillerhand init
|
|
|
93
93
|
claude
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
+
As a Claude Code plugin (an install skill; the kit is still copied into the project as files):
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
/plugin marketplace add burakdogrul/TillerHand
|
|
100
|
+
/plugin install tillerhand@tillerhand
|
|
101
|
+
/tillerhand:init
|
|
102
|
+
```
|
|
103
|
+
|
|
96
104
|
With git instead of npm (the kit stays in a `vibe-kit/` folder inside the project and goes into `.gitignore`):
|
|
97
105
|
|
|
98
106
|
```bash
|
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.40.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">
|
|
@@ -91,6 +91,14 @@ npx tillerhand init
|
|
|
91
91
|
claude
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
+
Claude Code plugin olarak (kurulum skill'i; kit yine projeye dosya olarak kopyalanır):
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
/plugin marketplace add burakdogrul/TillerHand
|
|
98
|
+
/plugin install tillerhand@tillerhand
|
|
99
|
+
/tillerhand:init
|
|
100
|
+
```
|
|
101
|
+
|
|
94
102
|
npm yerine git ile (kit, proje içinde `vibe-kit/` klasöründe durur ve `.gitignore`'a girer):
|
|
95
103
|
|
|
96
104
|
```bash
|
package/kit/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,19 @@
|
|
|
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.40.0] - 2026-10-27
|
|
7
|
+
|
|
8
|
+
### Eklenen
|
|
9
|
+
- **Claude Code plugin olarak kurulum.** Depo artık bir plugin marketplace'i: `/plugin marketplace add burakdogrul/TillerHand`, `/plugin install tillerhand@tillerhand`, sonra `/tillerhand:init`. Plugin yalnız kurulum skill'i taşır; kit yine projeye dosya olarak kopyalanır, korumalar ve izin listesi projede kalır. Kurulumdan sonra plugin kapatılabilir.
|
|
10
|
+
|
|
11
|
+
## [3.39.4] - 2026-10-27
|
|
12
|
+
|
|
13
|
+
### Düzeltilen
|
|
14
|
+
- **Türkiye eki: iyzico ödeme kimliği 2^53 üstünde reddedilir.** `iyziPaymentId` JSON sayısı olarak gelir; JavaScript bu büyüklükte sayıyı yuvarlar ve yanlış kimlikle sipariş sorgulanabilirdi. Web SaaS imza doğrulaması artık yalnız güvenli tamsayıları kabul eder; saldırgan testine iki kontrol eklendi. Elle uyarla: projedeki `src/lib/payments/webhook-signature.ts` ve `tests/security/payment-webhook.mjs`.
|
|
15
|
+
|
|
16
|
+
### Değişen
|
|
17
|
+
- **`/wrap-up` ilerleme dosyasını betikle yazar.** Tarih, aktif görev, sıradaki adım ve yol haritası işareti `progress.mjs` ile; sonda `--check` etiket biçimini doğrular.
|
|
18
|
+
|
|
6
19
|
## [3.39.3] - 2026-10-26
|
|
7
20
|
|
|
8
21
|
### Düzeltilen
|
package/kit/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.
|
|
1
|
+
3.40.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.40.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>
|
|
@@ -528,6 +528,10 @@ Bekleyen karar: e-posta servisi</pre>
|
|
|
528
528
|
mkdir yeni-proje && cd yeni-proje
|
|
529
529
|
npx tillerhand init
|
|
530
530
|
claude
|
|
531
|
+
<span class="c"># ya da Claude Code plugin olarak (Claude Code içinde)</span>
|
|
532
|
+
/plugin marketplace add burakdogrul/TillerHand
|
|
533
|
+
/plugin install tillerhand@tillerhand
|
|
534
|
+
/tillerhand:init
|
|
531
535
|
<span class="c"># ya da git ile: kit proje içinde vibe-kit/ klasöründe durur (.gitignore'a girer)</span>
|
|
532
536
|
git clone https://github.com/burakdogrul/TillerHand.git vibe-kit
|
|
533
537
|
node vibe-kit/kit/kit.mjs init
|
|
@@ -1055,7 +1059,7 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
|
|
|
1055
1059
|
<footer>
|
|
1056
1060
|
<div class="container">
|
|
1057
1061
|
<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.
|
|
1062
|
+
<span>Sürüm 3.40.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
1063
|
</div>
|
|
1060
1064
|
</footer>
|
|
1061
1065
|
|
package/kit/kit.mjs
CHANGED
|
@@ -31,7 +31,7 @@ const ADDONS = fs.readdirSync(path.join(TEMPLATES, 'addons'));
|
|
|
31
31
|
const TOOLS = ['claude', 'codex', 'antigravity'];
|
|
32
32
|
// Root entries that are not part of the common layer (the kit itself, generated and temporary files)
|
|
33
33
|
// CLAUDE.local.md is personal (in .gitignore); it must not be carried into a project installed from a local folder
|
|
34
|
-
const COMMON_EXCLUDE = new Set(['.git', 'kit', 'node_modules', '.kit.json', '.kit.local.json', 'README.md', 'dashboard.html', '.previews', 'sandbox', '.calisma', '.impeccable', 'CLAUDE.local.md', 'LICENSE', 'README.en.md', 'package.json']);
|
|
34
|
+
const COMMON_EXCLUDE = new Set(['.git', 'kit', 'node_modules', '.kit.json', '.kit.local.json', 'README.md', 'dashboard.html', '.previews', 'sandbox', '.calisma', '.impeccable', 'CLAUDE.local.md', 'LICENSE', 'README.en.md', 'package.json', '.claude-plugin']);
|
|
35
35
|
// Files that only make sense in the kit repo and are not carried into projects
|
|
36
36
|
const KIT_ONLY = ['.github/workflows/kit-tests.yml', '.github/workflows/npm-publish.yml'];
|
|
37
37
|
// Run from the npm package (npx tillerhand): the kit lives in the npx cache, which can be cleared, so the record names
|
|
@@ -21,7 +21,8 @@ IYZICO_CHECKOUT = (
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
def _text(value: object) -> str | None:
|
|
24
|
-
# Only non-empty strings and integers are signed values; anything else fails the check
|
|
24
|
+
# Only non-empty strings and integers are signed values; anything else fails the check.
|
|
25
|
+
# json.loads keeps big integers exact, so unlike the TypeScript copy there is no 2^53 limit here.
|
|
25
26
|
if isinstance(value, bool) or not isinstance(value, (str, int)):
|
|
26
27
|
return None
|
|
27
28
|
return str(value) or None
|
|
@@ -9,8 +9,10 @@ const same = (a: string, b: string): boolean => {
|
|
|
9
9
|
return x.length === y.length && timingSafeEqual(x, y);
|
|
10
10
|
};
|
|
11
11
|
const hmac = (key: string, text: string, encoding: 'hex' | 'base64'): string => createHmac('sha256', key).update(text).digest(encoding);
|
|
12
|
-
// Only non-empty strings and
|
|
13
|
-
|
|
12
|
+
// Only non-empty strings and safe integers are signed values; anything else (missing, object, boolean) fails the check.
|
|
13
|
+
// iyziPaymentId is a JSON number (long): above 2^53 JSON.parse has already rounded it, so the id is wrong and is rejected.
|
|
14
|
+
// shortcut: such a notification is refused (ids are ~8 digits today); if ids near 2^53, read it with a JSON.parse reviver's context.source.
|
|
15
|
+
const text = (v: unknown): string | null => (typeof v === 'string' ? v || null : Number.isSafeInteger(v) ? String(v) : null);
|
|
14
16
|
|
|
15
17
|
const IYZICO_DIRECT = ['iyziEventType', 'paymentId', 'paymentConversationId', 'status'];
|
|
16
18
|
const IYZICO_CHECKOUT = ['iyziEventType', 'iyziPaymentId', 'token', 'paymentConversationId', 'status'];
|
|
@@ -25,6 +25,15 @@ test('iyzico: a correctly signed notification is accepted (direct and checkout f
|
|
|
25
25
|
assert.equal(verifyIyzico(direct, iyzicoSign(direct), SECRET), true);
|
|
26
26
|
assert.equal(verifyIyzico(checkout, iyzicoSign(checkout), SECRET), true);
|
|
27
27
|
assert.equal(verifyIyzico(direct, iyzicoSign(direct).toUpperCase(), SECRET), true, 'hex case does not matter');
|
|
28
|
+
const numeric = { ...checkout, iyziPaymentId: 22416751 };
|
|
29
|
+
assert.equal(verifyIyzico(numeric, iyzicoSign(numeric), SECRET), true, 'iyziPaymentId as a JSON number (long)');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('iyzico: a payment id rounded by JSON.parse (above 2^53) is rejected', () => {
|
|
33
|
+
const body = JSON.parse('{"iyziEventType":"CHECKOUT_FORM_AUTH","iyziPaymentId":9007199254740993,"token":"tok-abc","paymentConversationId":"siparis-43","status":"SUCCESS"}');
|
|
34
|
+
const sent = { ...body, iyziPaymentId: '9007199254740993' };
|
|
35
|
+
assert.equal(verifyIyzico(body, iyzicoSign(sent), SECRET), false);
|
|
36
|
+
assert.equal(verifyIyzico(body, iyzicoSign(body), SECRET), false, 'even when signed over the rounded value');
|
|
28
37
|
});
|
|
29
38
|
|
|
30
39
|
test('iyzico: forged, altered or unsigned notifications are rejected', () => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tillerhand",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.40.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",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"kit/",
|
|
17
17
|
"!kit/eval/",
|
|
18
18
|
"!kit/tests/",
|
|
19
|
+
"!kit/plugin/",
|
|
19
20
|
".gitattributes",
|
|
20
21
|
"AGENTS.md",
|
|
21
22
|
"CHANGELOG.md",
|