tillerhand 3.34.0 → 3.35.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/build.md +3 -1
- package/.claude/hooks/flow.mjs +1 -1
- package/.claude/hooks/progress.mjs +94 -0
- package/.claude/settings.json +2 -1
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/docs/workflow/models.md +1 -1
- package/docs/workflow/usage-limits.md +1 -1
- package/kit/CHANGELOG.md +10 -0
- package/kit/VERSION +1 -1
- package/kit/guide.html +3 -3
- package/package.json +1 -1
|
@@ -34,7 +34,9 @@ Boşsa `docs/workflow/progress.md` → "Sıradaki adım" veya `docs/product/road
|
|
|
34
34
|
6. Arayüz değiştiyse `impeccable:impeccable` → `critique` çalıştır; önemli bulguları düzeltip düzeltmeyeceğimi sor.
|
|
35
35
|
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, akışın (2a) söylediği sayıda üye (en fazla 3) + `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.
|
|
36
36
|
7. `AGENTS.md` → "Bitti tanımı" listesini tek tek kontrol et.
|
|
37
|
-
8. Kapsam kalkanını kapat (komut kullanıcıya sorulur): `node .claude/hooks/freeze-guard.mjs --plan-end`.
|
|
37
|
+
8. Kapsam kalkanını kapat (komut kullanıcıya sorulur): `node .claude/hooks/freeze-guard.mjs --plan-end`. 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. Roadmap, maliyet günlüğü ve progress yazımı mekaniktir, model çağrısı harcama; tek komutla yaz:
|
|
38
|
+
`node .claude/hooks/progress.mjs --done <görev kodu> --cost "<görev kodu> <kısa ad>" <K|O|B> <başlangıç 5s %> <bitiş 5s %> <süre dk> --task "-" --did "<görev kodu>: <tek satır ne yapıldı>" --next "<sıradaki görev>" --check`
|
|
39
|
+
`--check` progress.md'nin kalın etiketli satırlarını (durum çubuğu ve pano okur) denetler; bozuksa düzelt. Açık sorunlar ve bekleyen kararlar gibi düz metin bölümlerini gerekirse elle yaz.
|
|
38
40
|
9. Rapor ver:
|
|
39
41
|
- Ne yapıldı (2-3 satır)
|
|
40
42
|
- Bu görevde alınan kararlar (kullanıcı / otomatik)
|
package/.claude/hooks/flow.mjs
CHANGED
|
@@ -27,7 +27,7 @@ export function flowText(f) {
|
|
|
27
27
|
return [
|
|
28
28
|
`Akış: ${f.files} dosya · ${f.size} · bağlam ${f.context == null ? 'bilinmiyor' : `%${f.context}`} · limit ${LEVEL_LABEL[f.level]}`,
|
|
29
29
|
`Kod: ${where(f.code)}${f.code === 'ana' ? '' : ' (kod rolü)'}`,
|
|
30
|
-
`Doküman (roadmap, progress,
|
|
30
|
+
`Doküman işi (roadmap, progress, maliyet günlüğü progress.mjs ile; bu satır diğerleri için): ${where(f.docs)}${f.docs === 'ana' ? '' : ' (doküman rolü)'}`,
|
|
31
31
|
`Kurul: ${f.members} üye + code-reviewer, ${f.parallel ? 'paralel' : 'sırayla'} (hassas yolda + security-auditor)`,
|
|
32
32
|
...(f.clear ? [`Önce /clear öner: bağlam %${f.context}, her tur bunu yeniden okur.`] : []),
|
|
33
33
|
].join('\n');
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Mechanical doc writes at task end, by script instead of a model call (0 tokens, the format cannot drift).
|
|
3
|
+
// node .claude/hooks/progress.mjs --done G-012 roadmap: [ ] → [x]
|
|
4
|
+
// node .claude/hooks/progress.mjs --cost "<iş>" <K|O|B|BOARD|DESIGN|FINDINGS> <başlangıç %> <bitiş %> <dk> ["<not>"]
|
|
5
|
+
// node .claude/hooks/progress.mjs --task "<aktif görev>" --did "<yapılan>" --next "<sıradaki adım>"
|
|
6
|
+
// node .claude/hooks/progress.mjs --check progress.md labels the status line and dashboard read
|
|
7
|
+
// Every progress write also sets **Son güncelleme:** to today. Flags can be combined in one call.
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import { findRoot, isMain } from './shared.mjs';
|
|
11
|
+
import { clean, labels } from './status-read.mjs';
|
|
12
|
+
|
|
13
|
+
const LABELS = ['Son güncelleme', 'Aktif faz', 'Aktif görev', 'Başlangıç adımı', 'Soru modu', 'Profil'];
|
|
14
|
+
const SIZES = ['K', 'O', 'B', 'BOARD', 'DESIGN', 'FINDINGS'];
|
|
15
|
+
const USAGE = 'Kullanım: node .claude/hooks/progress.mjs [--done G-NNN] [--cost "<iş>" <K|O|B|BOARD|DESIGN|FINDINGS> <başlangıç %> <bitiş %> <dk> ["<not>"]] [--task "<metin>"] [--did "<metin>"] [--next "<metin>"] [--check]';
|
|
16
|
+
// One line per value: a newline would break a label, a list item or a table row
|
|
17
|
+
const line = (s) => clean(String(s).replace(/\s*\r?\n\s*/g, ' ')).trim();
|
|
18
|
+
const today = () => new Date().toLocaleDateString('sv-SE');
|
|
19
|
+
const setLabel = (text, k, v) => text.replace(new RegExp(`^(\\*\\*${k}:\\*\\*).*$`, 'm'), `$1 ${v}`);
|
|
20
|
+
const setSection = (text, title, body) => text.replace(new RegExp(`^(## ${title}[^\\n]*\\n)[\\s\\S]*?(?=^## |(?![\\s\\S]))`, 'm'), `$1\n${body}\n\n`);
|
|
21
|
+
const section = (text, title) => text.match(new RegExp(`^## ${title}[^\\n]*\\n([\\s\\S]*?)(?=^## |(?![\\s\\S]))`, 'm'))?.[1] ?? '';
|
|
22
|
+
|
|
23
|
+
export function markDone(text, id) {
|
|
24
|
+
const re = new RegExp(`^(\\s*- )\\[( |x)\\](\\s*${id}:)`, 'mi');
|
|
25
|
+
const m = text.match(re);
|
|
26
|
+
if (!m) return { error: `${id} yol haritasında yok.` };
|
|
27
|
+
if (m[2].toLowerCase() === 'x') return { text, note: `${id} zaten işaretli.` };
|
|
28
|
+
return { text: text.replace(re, '$1[x]$3'), note: `${id} işaretlendi.` };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function costRow(args, date = today()) {
|
|
32
|
+
const [job, size, start, end, min, note = ''] = args;
|
|
33
|
+
const nums = [start, end, min].map(Number);
|
|
34
|
+
if (!job || !SIZES.includes(size) || nums.some((n) => !Number.isFinite(n) || n < 0) || args.length > 6) return null;
|
|
35
|
+
// The end below the start means the 5-hour window renewed in between: the difference is unknown
|
|
36
|
+
const diff = nums[1] >= nums[0] ? nums[1] - nums[0] : '?';
|
|
37
|
+
const cell = (s) => line(s).replace(/\|/g, '\\|');
|
|
38
|
+
return `| ${date} | ${cell(job)} | ${size} | ${nums[0]} | ${nums[1]} | ${diff} | ${nums[2]} | ${cell(note)} |`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function updateProgress(text, { task, did, next }) {
|
|
42
|
+
let t = setLabel(text, 'Son güncelleme', today());
|
|
43
|
+
if (task != null) t = setLabel(t, 'Aktif görev', line(task));
|
|
44
|
+
if (did != null) {
|
|
45
|
+
const items = section(t, 'Son oturumda yapılanlar').split('\n').map((s) => s.trim()).filter((s) => /^- \S/.test(s));
|
|
46
|
+
t = setSection(t, 'Son oturumda yapılanlar', [...items, `- ${line(did)}`].join('\n'));
|
|
47
|
+
}
|
|
48
|
+
if (next != null) t = setSection(t, 'Sıradaki adım', `1. ${line(next)}`);
|
|
49
|
+
return t;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const missingLabels = (text) => LABELS.filter((k) => !(k in labels(text)));
|
|
53
|
+
|
|
54
|
+
if (isMain(import.meta.url)) {
|
|
55
|
+
const root = findRoot();
|
|
56
|
+
const file = (rel) => path.join(root, rel);
|
|
57
|
+
const argv = process.argv.slice(2);
|
|
58
|
+
const fail = (msg) => { console.error(msg); process.exit(1); };
|
|
59
|
+
const value = (flag) => { const i = argv.indexOf(flag); return i < 0 ? undefined : argv[i + 1] ?? fail(USAGE); };
|
|
60
|
+
if (!argv.length) fail(USAGE);
|
|
61
|
+
let code = 0;
|
|
62
|
+
|
|
63
|
+
const done = value('--done');
|
|
64
|
+
if (done != null) {
|
|
65
|
+
if (!/^G-\d+$/i.test(done)) fail(USAGE);
|
|
66
|
+
const r = markDone(fs.readFileSync(file('docs/product/roadmap.md'), 'utf8'), done.toUpperCase());
|
|
67
|
+
if (r.error) fail(r.error);
|
|
68
|
+
fs.writeFileSync(file('docs/product/roadmap.md'), r.text);
|
|
69
|
+
console.log(r.note);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const c = argv.indexOf('--cost');
|
|
73
|
+
if (c > -1) {
|
|
74
|
+
const args = [];
|
|
75
|
+
for (let i = c + 1; i < argv.length && !argv[i].startsWith('--'); i++) args.push(argv[i]);
|
|
76
|
+
const row = costRow(args) ?? fail(USAGE);
|
|
77
|
+
const log = file('docs/workflow/cost-log.md');
|
|
78
|
+
fs.writeFileSync(log, `${fs.readFileSync(log, 'utf8').trimEnd()}\n${row}\n`);
|
|
79
|
+
console.log(`Maliyet satırı eklendi: ${row}`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const [task, did, next] = ['--task', '--did', '--next'].map(value);
|
|
83
|
+
if ([task, did, next].some((v) => v != null)) {
|
|
84
|
+
fs.writeFileSync(file('docs/workflow/progress.md'), updateProgress(fs.readFileSync(file('docs/workflow/progress.md'), 'utf8'), { task, did, next }));
|
|
85
|
+
console.log('progress.md güncellendi.');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (argv.includes('--check')) {
|
|
89
|
+
const missing = missingLabels(fs.readFileSync(file('docs/workflow/progress.md'), 'utf8'));
|
|
90
|
+
console.log(missing.length ? `progress.md'de eksik ya da bozuk kalın etiket: ${missing.join(', ')}. Biçim: **Etiket:** değer` : 'progress.md etiketleri sağlam.');
|
|
91
|
+
if (missing.length) code = 1;
|
|
92
|
+
}
|
|
93
|
+
process.exit(code);
|
|
94
|
+
}
|
package/.claude/settings.json
CHANGED
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
"Bash(node .claude/hooks/models.mjs --show)",
|
|
28
28
|
"Bash(node .claude/hooks/models.mjs --set:*)",
|
|
29
29
|
"Bash(node .claude/hooks/commit-gate.mjs --status)",
|
|
30
|
-
"Bash(node .claude/hooks/flow.mjs:*)"
|
|
30
|
+
"Bash(node .claude/hooks/flow.mjs:*)",
|
|
31
|
+
"Bash(node .claude/hooks/progress.mjs:*)"
|
|
31
32
|
],
|
|
32
33
|
"ask": [
|
|
33
34
|
"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.
|
|
9
|
+
<a href="kit/CHANGELOG.md"><img alt="Version" src="https://img.shields.io/badge/version-3.35.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.35.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/docs/workflow/models.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
| Planlama ve mimari | `plan` | Plan, mimari ve veri modeli kararları; PRD, README ve kullanıcıya görünen metin. Ana oturumda yürür. | Opus · yüksek |
|
|
12
12
|
| Kod yazma | `code` | Kabul testleri ve uygulama kodu. Alt ajana devredilir. | Sonnet · yüksek |
|
|
13
13
|
| İnceleme ve denetim | `review` | Kurul üyeleri, `code-reviewer`, `security-auditor`, bulgu raporları (`/findings-all`). | Sonnet · yüksek |
|
|
14
|
-
| Doküman ve araştırma | `docs` |
|
|
14
|
+
| Doküman ve araştırma | `docs` | CHANGELOG, rapor özeti; kod tarama, web araştırması (`/research` derin). Karar günlüğü karar anında ana oturumda yazılır. | Haiku · yüksek |
|
|
15
15
|
|
|
16
16
|
Effort ölçeği: düşük = `low`, orta = `medium`, yüksek = `high`, ekstra yüksek = `xhigh`. Effort arttıkça cevap yavaşlar ve limitten daha çok yer.
|
|
17
17
|
|
|
@@ -76,4 +76,4 @@ Max planda yüzdeler daha düşüktür. Günlük doldukça tahmin kendini düzel
|
|
|
76
76
|
|
|
77
77
|
## 5. Maliyet günlüğü (tahmini kalibre etmek için)
|
|
78
78
|
|
|
79
|
-
`/build` ve tam kurul toplantıları başlangıçta ve sonda 5 saatlik yüzdeyi okur ve `docs/workflow/cost-log.md`'ye bir satır ekler. Limit okunamıyorsa satır eklenmez.
|
|
79
|
+
`/build` ve tam kurul toplantıları başlangıçta ve sonda 5 saatlik yüzdeyi okur ve `docs/workflow/cost-log.md`'ye bir satır ekler: `node .claude/hooks/progress.mjs --cost "<iş>" <boyut> <başlangıç %> <bitiş %> <dk>` (fark hesaplanır; pencere arada yenilendiyse `?`). Limit okunamıyorsa satır eklenmez.
|
package/kit/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
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.35.0] - 2026-10-26
|
|
7
|
+
|
|
8
|
+
### Değişen
|
|
9
|
+
- **Görev sonu belge yazımı betikle.** Roadmap işareti, maliyet günlüğü satırı ve progress etiketleri mekanik iş; artık alt ajana verilmiyor. Yeni `node .claude/hooks/progress.mjs` bunları tek komutta yazar, token harcamaz:
|
|
10
|
+
- `--done G-012` roadmap'te görevi işaretler.
|
|
11
|
+
- `--cost "<iş>" <K|O|B> <başlangıç %> <bitiş %> <dk>` maliyet günlüğüne satır ekler, farkı hesaplar. Pencere arada yenilendiyse fark `?` yazılır.
|
|
12
|
+
- `--task`, `--did`, `--next` progress.md'yi günceller, son güncelleme tarihini kendisi koyar.
|
|
13
|
+
- `--check` durum çubuğunun ve panonun okuduğu kalın etiketlerin sağlam olduğunu denetler.
|
|
14
|
+
- `/build` adım 8 bunu kullanır. İzin satırı `/kit-update` ile eklenir.
|
|
15
|
+
|
|
6
16
|
## [3.34.0] - 2026-10-26
|
|
7
17
|
|
|
8
18
|
### Eklenen
|
package/kit/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.
|
|
1
|
+
3.35.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.35.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>
|
|
@@ -894,7 +894,7 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
|
|
|
894
894
|
<article class="tile"><h3>Dağıtım kurulumu</h3><p class="stack">/release first · deploy-setup.md</p><ul><li>Hosting, ortam değişkenleri, alan adı ve DNS, yedek, geri alma provası</li><li>Vercel, Supabase, Railway, EAS; adımlar kaynaklı ve tarihli</li><li>Sırrı sen panelde girersin; sohbete ve dosyaya yazılmaz</li></ul></article>
|
|
895
895
|
<article class="tile"><h3>Öğrenen kurallar</h3><p class="stack">/fix-bug · /retro · hookify · AGENTS.md</p><ul><li>Aynı hata sınıfı ikinci kez gelince /fix-bug kural önerir; panoda da uyarı çıkar</li><li>Mekanik kural hookify'a, gerisi AGENTS.md'ye; sen onaylamadan yazılmaz</li><li>Her kuralda kaynak ve tarih; /maintain 90 günden eskileri sorar</li><li>Auto memory /start'ta sorulur, önerilen kapalı</li></ul></article>
|
|
896
896
|
<article class="tile"><h3>Kişisel tercihler</h3><p class="stack">~/.vibe-kit/tercihler.md · prefs.mjs</p><ul><li>Bir davranışı düzelttiğinde ya da nasıl çalışmak istediğini söylediğinde AI not alır</li><li>Görev ve oturum sonunda "tercih olarak kaydedeyim mi?" diye sorar; onaylamadığın yazılmaz</li><li>Tercihler tüm projelerinde geçerli, her oturumda yüklenir; git'e girmez</li><li>Listele: <code>node .claude/hooks/prefs.mjs --list</code>, sil: <code>--remove <no></code></li></ul></article>
|
|
897
|
-
<article class="tile"><h3>Rol bazlı model</h3><p class="stack">docs/workflow/models.md · models.mjs</p><ul><li>Dört rol: planlama, kod yazma, inceleme, doküman ve araştırma</li><li>Her görevin başında iki ekran: önce rollerin modeli, sonra effort'u</li><li>Önerilen: Opus yüksek, Sonnet yüksek, Sonnet yüksek, Haiku yüksek</li><li>Kod, inceleme ve doküman işleri seçilen modelle alt ajanda; plan ana oturumda</li><li>Alt ajan yalnız karlıysa: <code>flow.mjs</code> görev büyüklüğüne, bağlama ve limite bakar; küçük görev ana oturumda kalır, kurul üye sayısı limite göre azalır</li></ul></article>
|
|
897
|
+
<article class="tile"><h3>Rol bazlı model</h3><p class="stack">docs/workflow/models.md · models.mjs</p><ul><li>Dört rol: planlama, kod yazma, inceleme, doküman ve araştırma</li><li>Her görevin başında iki ekran: önce rollerin modeli, sonra effort'u</li><li>Önerilen: Opus yüksek, Sonnet yüksek, Sonnet yüksek, Haiku yüksek</li><li>Kod, inceleme ve doküman işleri seçilen modelle alt ajanda; plan ana oturumda</li><li>Roadmap işareti, maliyet satırı ve progress etiketleri <code>progress.mjs</code> ile yazılır; model çağrısı harcanmaz, biçim bozulmaz</li><li>Alt ajan yalnız karlıysa: <code>flow.mjs</code> görev büyüklüğüne, bağlama ve limite bakar; küçük görev ana oturumda kalır, kurul üye sayısı limite göre azalır</li></ul></article>
|
|
898
898
|
<article class="tile"><h3>Türkiye eki</h3><p class="stack">--addons tr · docs/legal/turkiye.md</p><ul><li>KVKK yurt dışı aktarım: standart sözleşme, 5 iş günü bildirim</li><li>e-Fatura ve e-Arşiv eşikleri (GİB)</li><li>iyzico ve PayTR bildirim imzası kodu ve saldırgan testi</li><li>İ/ı ve Türkçe sıralama testleri; hukuki görüş değildir</li></ul></article>
|
|
899
899
|
<article class="tile"><h3>Tarayıcıda QA ve önizleme</h3><p class="stack">/qa · preview.mjs · Playwright CLI</p><ul><li>Arayüz kriterleri gerçek tarayıcıda test olarak koşar</li><li>Rapor test sonucundan yazılır, panoda kart</li><li>/build arayüz görevinde masaüstü ve mobil ekran görüntüsü</li></ul></article>
|
|
900
900
|
<article class="tile"><h3>Spec ve sapma kontrolü</h3><p class="stack">docs/product/specs/ · gate.mjs</p><ul><li>Mevcut, beklenen ve değişmemesi gereken davranış</li><li>"Değişmemesi gereken" satırların testi kapıda denetlenir</li><li>3+ dosyalık işte /plan-task, her hatada /fix-bug yazar</li></ul></article>
|
|
@@ -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.35.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