tillerhand 3.39.4 → 3.41.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.
@@ -190,7 +190,10 @@ const fmtDate = (t) => { const z = toDate(t); return Number.isNaN(z.getTime()) ?
190
190
  const limitSeverity = (p, k) => (p == null ? 'info' : p >= THRESHOLDS[k].red ? 'critical' : p >= THRESHOLDS[k].yellow ? 'warn' : 'good');
191
191
  const TOPICS = ['urun', 'teknik', 'tasarim', 'icerik', 'veri', 'guvenlik', 'maliyet'];
192
192
 
193
- const alertRow = (x) => `<li class="${x.sev}"><span class="ic" aria-hidden="true">${SEV[x.sev][0]}</span><span><span class="sr-only">${SEV[x.sev][1]}: </span>${md(x.text)}</span>${x.action ? `<span class="eylem">→ ${md(x.action)}</span>` : ''}</li>`;
193
+ // The command to paste into Claude: "`/build G-013` …" or "/wrap-up ve /clear" → first command, without its <placeholder> or note
194
+ const cmdOf = (s = '') => { const m = String(s).match(/`(\/[^`\n]+)`/) ?? String(s).match(/^(\/.*)$/); return m ? m[1].split(/ ve | ile |\s*\(/)[0].replace(/\s*[[<].*$/, '').trim() : ''; };
195
+ const copyBtn = (s) => { const c = cmdOf(s); return c ? ` <button class="kopyala" type="button" data-cmd="${e(c)}" aria-label="${e(c)} komutunu kopyala">Kopyala</button>` : ''; };
196
+ const alertRow = (x) => `<li class="${x.sev}"><span class="ic" aria-hidden="true">${SEV[x.sev][0]}</span><span><span class="sr-only">${SEV[x.sev][1]}: </span>${md(x.text)}</span>${x.action ? `<span class="eylem">→ ${md(x.action)}${copyBtn(x.action)}</span>` : ''}</li>`;
194
197
  const kpi = (label, value, sub = '', bar = '') => `<div class="kpi"><div class="kpi-l">${e(label)}</div><div class="kpi-v">${value}</div>${bar}<div class="kpi-s">${sub}</div></div>`;
195
198
 
196
199
  // ---------- sections ----------
@@ -370,6 +373,8 @@ code{font:.86em var(--mono);background:var(--sunk);padding:.08em .38em;border-ra
370
373
  .now-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px 16px}
371
374
  .next{margin-top:12px;padding:10px 12px;border-radius:8px;background:var(--accent-soft)}
372
375
  .next .now-l{color:var(--accent)}
376
+ .kopyala{font:600 .72rem/1 var(--sans);padding:4px 8px;margin-left:6px;border-radius:6px;border:1px solid var(--line);background:var(--surface);color:var(--fg);cursor:pointer;vertical-align:1px}
377
+ .kopyala:hover{border-color:var(--accent);color:var(--accent)}
373
378
  .att{list-style:none;padding:0;gap:8px}.att li{display:grid;grid-template-columns:auto 1fr;gap:4px 10px;align-items:start;padding:8px 10px;border-radius:8px;background:var(--sunk)}
374
379
  .att li.critical{background:var(--crit-bg)}.att li.warn{background:var(--warn-bg)}.att .eylem{grid-column:2;font-size:.8rem;color:var(--muted)}
375
380
  .badge{display:inline-flex;gap:4px;align-items:center;font:600 .74rem/1 var(--sans);padding:4px 8px;border-radius:999px;white-space:nowrap}
@@ -447,7 +452,7 @@ footer{color:var(--muted);font-size:.78rem;padding-top:8px}
447
452
  <div><div class="now-l">Son güncelleme</div><div class="num">${e(a['Son güncelleme'] ?? '-')}</div></div>
448
453
  ${/başlangıç/i.test(a['Aktif faz'] ?? '') ? `<div><div class="now-l">Başlangıç adımı</div><div class="num">${e(a['Başlangıç adımı'] ?? '-')}</div></div>` : ''}
449
454
  </div>
450
- <div class="next"><div class="now-l">Sıradaki adım</div><div>${md(next)}</div></div>
455
+ <div class="next"><div class="now-l">Sıradaki adım</div><div>${md(next)}${copyBtn(next)}</div>${cmdOf(next) ? '<div class="muted small">Kopyala, Claude sohbetine yapıştır.</div>' : ''}</div>
451
456
  ${d.state ? `<div class="now-l" style="margin-top:14px">Durum</div><p style="margin-top:4px">${md(d.state)}</p>` : ''}
452
457
  ${d.lastSession.length ? `<div class="now-l" style="margin-top:10px">Son oturumda</div><ul style="margin-top:4px">${d.lastSession.slice(0, 4).map((x) => `<li>${md(x)}</li>`).join('')}</ul>` : ''}
453
458
  </section>
@@ -507,6 +512,16 @@ ${TABS.map(([id, , content], i) => `<div class="panel" role="tabpanel" id="p-${i
507
512
  });
508
513
  });
509
514
 
515
+ // file:// may refuse the clipboard API: fall back to a selected textarea
516
+ document.querySelectorAll('.kopyala').forEach(function (b) {
517
+ b.addEventListener('click', function () {
518
+ var c = b.dataset.cmd;
519
+ function done(ok) { b.textContent = ok ? 'Kopyalandı' : 'Kopyalanamadı'; setTimeout(function () { b.textContent = 'Kopyala'; }, 1500); }
520
+ function fallback() { var t = document.createElement('textarea'); t.value = c; document.body.appendChild(t); t.select(); var ok = false; try { ok = document.execCommand('copy'); } catch (er) {} t.remove(); done(ok); }
521
+ if (navigator.clipboard) navigator.clipboard.writeText(c).then(function () { done(true); }, fallback); else fallback();
522
+ });
523
+ });
524
+
510
525
  var tip = document.getElementById('tip');
511
526
  document.querySelectorAll('[data-tip]').forEach(function (el) {
512
527
  el.addEventListener('mousemove', function (ev) { tip.textContent = el.dataset.tip; tip.style.opacity = 1; tip.style.left = ev.clientX + 12 + 'px'; tip.style.top = ev.clientY - 30 + 'px'; });
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.39.4-2a78d6?style=flat-square"></a>
9
+ <a href="kit/CHANGELOG.md"><img alt="Version" src="https://img.shields.io/badge/version-3.41.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.39.4-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.41.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,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.41.0] - 2026-10-27
7
+
8
+ ### Eklenen
9
+ - **Panoda Kopyala düğmeleri.** `dashboard.html` sıradaki adımın ve komut öneren uyarıların yanına bir düğme koyar; komut panoya kopyalanır, Claude sohbetine yapıştırılır. Ne yazacağını bilmeyen kullanıcı için.
10
+
11
+ ## [3.40.0] - 2026-10-27
12
+
13
+ ### Eklenen
14
+ - **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.
15
+
6
16
  ## [3.39.4] - 2026-10-27
7
17
 
8
18
  ### Düzeltilen
package/kit/VERSION CHANGED
@@ -1 +1 @@
1
- 3.39.4
1
+ 3.41.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.39.4</b> Claude Code için başlangıç kiti · MIT</span>
290
+ <span class="pill"><b>v3.41.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 &amp;&amp; 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
@@ -848,6 +852,7 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
848
852
  <li><b>10 sekme:</b> Genel · Yol haritası · Kararlar · Kurul · Bulgular · Kalite · Aktivite · Ürün ve teknik · Operasyon · Limit ve maliyet</li>
849
853
  <li><b>Ürün ve teknik:</b> PRD, MVP ve kabul testleri, birim ekonomisi, geri bildirim, stack, tasarım, marka paketi, tanıtım videoları, araştırma notları</li>
850
854
  <li><b>Limit ve maliyet:</b> 5 saatlik ve haftalık limit, bağlam, son 30 günün token ve API karşılığı maliyeti (ccusage), görev başı limit maliyeti</li>
855
+ <li>Sıradaki adımın ve uyarılardaki komutların yanında <b>Kopyala</b> düğmesi: komutu Claude sohbetine yapıştırırsın</li>
851
856
  <li>Her Claude cevabından sonra güncellenir, açıkken 30 saniyede bir yenilenir; ek token harcamaz</li>
852
857
  </ul>
853
858
  <h3>Masaüstü bildirimi</h3>
@@ -1055,7 +1060,7 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
1055
1060
  <footer>
1056
1061
  <div class="container">
1057
1062
  <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.39.4 · <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>
1063
+ <span>Sürüm 3.41.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
1064
  </div>
1060
1065
  </footer>
1061
1066
 
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tillerhand",
3
- "version": "3.39.4",
3
+ "version": "3.41.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",