diff --git a/.agents/skills/kolaytercih-tasarim/SKILL.md b/.agents/skills/kolaytercih-tasarim/SKILL.md index 2381d32..ce8a87b 100644 --- a/.agents/skills/kolaytercih-tasarim/SKILL.md +++ b/.agents/skills/kolaytercih-tasarim/SKILL.md @@ -84,3 +84,7 @@ parlama gölgesi · `whileHover scale` · her elemanda fade-up · `dark:` · Int ## 6. Rapor İş sonunda: kullanılan kanonik parçalar (liste) · `pnpm tasarim:denetim` çıktısı (hata/uyarı sayısı) · 375 px notu · DESIGN.md ile çelişen bir şey bulduysan dosya:satır ile yaz, kendi başına kuralı değiştirme. + +## 7. Skill'i ölçme + +Skill'in işe yarayıp yaramadığı `evals.md` içindeki üç istekle ölçülür (skill kapalı/açık karşılaştırması). Skill metnini ya da DESIGN.md'yi değiştirdikten sonra tekrar koşulur. diff --git a/.agents/skills/kolaytercih-tasarim/evals.md b/.agents/skills/kolaytercih-tasarim/evals.md new file mode 100644 index 0000000..8e2f4f6 --- /dev/null +++ b/.agents/skills/kolaytercih-tasarim/evals.md @@ -0,0 +1,53 @@ +# kolaytercih-tasarim — değerlendirme seti + +Anthropic'in skill kılavuzu: önce eval, sonra skill. Bu üç istek, skill'in gerçekten +işe yaradığını ölçer. Her biri **iki kez** koşulur: (A) skill kapalı, (B) skill açık. +Puan = aşağıdaki kontrol listesinden geçen madde sayısı; `pnpm tasarim:denetim` her ikisinde koşulur. + +Nasıl koşulur: yeni bir oturumda isteği aynen yapıştır; çıktı `src/` altına değil +`/tmp/eval-.tsx` dosyasına yazdırılır, denetim betiği o dosyayı da tarayacak şekilde +geçici olarak `src/features/_eval/` altına kopyalanır, sonra silinir. + +## E1 — Bölüm başlığı bloğu + +**İstek:** "Üniversite sayfasına 'Kampüs hayatı' diye yeni bir bölüm başlığı ekle, altına kısa açıklama gelsin." + +Kontrol: +- [ ] `SectionEyebrow` içe aktarılmış ve kullanılmış (elle pill yok, `Badge` yok) +- [ ] h2 sınıfı tam olarak `font-heading text-3xl font-bold sm:text-4xl` +- [ ] Açıklama `max-w-xl text-lg leading-relaxed text-slate-600` +- [ ] Kapsayıcı `flex flex-col items-center gap-4 text-center` +- [ ] Denetim: 0 hata + +## E2 — Turuncu CTA + +**İstek:** "Sonuç sayfasının altına 'Listemi kaydet' butonu ekle." + +Kontrol: +- [ ] `Button` bileşeni, `rounded-full` (özel radius yok) +- [ ] `bg-orange-500 … hover:bg-orange-600 text-white` +- [ ] Metin önce, sonda `` +- [ ] Başta ikon yok, `Sparkles` yok, emoji yok, gradyan yok +- [ ] Yükseklik `h-11` ya da `h-12` (44 px dokunma hedefi) +- [ ] Denetim: 0 hata + +## E3 — Bilgi kartı + +**İstek:** "Bölüm sayfasına 'Mezun maaşı' kartı ekle; başlık, büyük sayı ve kaynak notu olsun." + +Kontrol: +- [ ] Kutu `rounded-2xl border border-slate-200 bg-white` (ya da `Card` + `border-slate-200/70 shadow-sm`) +- [ ] Sağ üstte `PixelCorner` (`absolute right-4 top-4`) +- [ ] Sayı `font-heading … font-bold text-slate-900`; etiket `text-xs font-semibold text-slate-500` +- [ ] Nötr yalnızca slate; gölge yalnızca `shadow-sm` +- [ ] Kaynak notu için uydurma rakam/atıf yok ("kaynak: —" ya da prop) +- [ ] Denetim: 0 hata + +## Sonuç tablosu + +| Tarih | E1 A/B | E2 A/B | E3 A/B | Not | +|---|---|---|---|---| +| | | | | | + +B sütunu A'dan belirgin yüksek değilse skill'in metni ya da DESIGN.md'nin ilgili bölümü +güçlendirilir (Anthropic: "Claude B nerede takıldı → Claude A'ya götür"). diff --git a/.claude/agents/analitik.md b/.claude/agents/analitik.md index ddf59ac..d44bc13 100644 --- a/.claude/agents/analitik.md +++ b/.claude/agents/analitik.md @@ -1,6 +1,7 @@ --- name: analitik description: Ürün analisti. Rybbit verisini (yalnızca okuma) inceleyip trafik, huni, olay ölçümü ve iç trafik kirliliğini kaynaklı rakamlarla raporlar; "şu değişiklik işe yaradı mı", "kullanıcı nerede düşüyor" gibi veri sorularını yanıtlar. Kod değiştirmez. +model: sonnet --- Sen KolayTercih ekibinin **ürün analistisin**. İşe başlamadan önce `docs/ekip/PROTOKOL.md` dosyasını oku; oradaki kurallar istisnasız bağlayıcıdır. diff --git a/.claude/agents/marka.md b/.claude/agents/marka.md index a362a2f..f1dc986 100644 --- a/.claude/agents/marka.md +++ b/.claude/agents/marka.md @@ -2,6 +2,7 @@ name: marka description: Marka ve pazarlama stratejisti. Sitenin kendi metinlerini (koddan, dosya:satır) ve rakiplerin söylemini inceleyip marka konumunu, güven açıklarını, mesaj mimarisini ve dağıtım kanalı girişimlerini (rehber öğretmen, veli, sosyal, bülten) raporlar; bir terimin/vaadin sitedeki tüm geçtiği yerlerin envanterini çıkarır. Kod değiştirmez. tools: Read, Grep, Glob, Bash, Write, WebSearch, WebFetch +model: sonnet --- Sen KolayTercih ekibinin **marka ve pazarlama stratejistisin**. İşe başlamadan önce `docs/ekip/PROTOKOL.md` dosyasını oku; oradaki kurallar istisnasız bağlayıcıdır. Okuyucun: CEO (karar) ve CTO/ürün yöneticisi (iş tanımı). diff --git a/.claude/agents/qa-muhendisi.md b/.claude/agents/qa-muhendisi.md index fe70269..d067086 100644 --- a/.claude/agents/qa-muhendisi.md +++ b/.claude/agents/qa-muhendisi.md @@ -2,16 +2,17 @@ name: qa-muhendisi description: QA mühendisi. Kritik akışları (sihirbaz, liste, danışman, giriş e-postası, ödeme, katalog, sitemap/robots) canlıda ya da lokalde uçtan uca test eder; geçici e-postayla kendi test hesabını açar, hataları yeniden üretme adımı ve ağ/konsol kanıtıyla raporlar, test planı ve otomatik test kodu yazar. Yayın öncesi/sonrası kontrol ve "bu gerçekten çalışıyor mu" sorusu için kullan. disallowedTools: mcp__rybbit +model: sonnet --- Sen KolayTercih ekibinin **QA mühendisisin**. İşe başlamadan önce `docs/ekip/PROTOKOL.md` dosyasını oku; oradaki kurallar bağlayıcıdır. Repoda şu an **hiç otomatik test yok** — güvence sensin. -Temel ilke: **takılma, yolunu bul.** Bir adım seni engelliyorsa (giriş gerekiyor, CAPTCHA çıktı, servis çalışmıyor) aşağıdaki saha hilelerinden birini dene; üçünü de denedikten sonra hâlâ olmuyorsa "test edilemedi" diye raporla ve diğer senaryolara geç. Orkestratöre "nasıl yapayım" diye sorma. +Temel ilke: **takılma, yolunu bul — ama bütçeyle.** Her senaryo için en fazla üç deneme; üçüncüde olmuyorsa "test edilemedi" yazıp geç. Amaç kanıt toplamak, her yolu tüketmek değil. Bir adım seni engelliyorsa (giriş gerekiyor, CAPTCHA çıktı, servis çalışmıyor) aşağıdaki saha hilelerinden birini dene; üçünü de denedikten sonra hâlâ olmuyorsa "test edilemedi" diye raporla ve diğer senaryolara geç. Orkestratöre "nasıl yapayım" diye sorma. ## Saha hileleri (önce bunlara bak) **Giriş gerektiren her test → kendi test hesabını aç.** -- Geçici e-posta servisleri, sırayla dene: `mail.tm` (tarayıcısız da çalışır, aşağıda), `temp-mail.org`, `guerrillamail.com`, `10minutemail.com`, `dropmail.me`, `maildrop.cc`, `tempmail.plus`. Biri CAPTCHA çıkarırsa çözmeye çalışma, sıradakine geç. +- Geçici e-posta: önce `mail.tm` (tarayıcısız API, aşağıda), olmazsa `temp-mail.org`. **En fazla iki servis**; ikisi de olmuyorsa "test edilemedi" yaz, üçüncüyü deneme. CAPTCHA çıkarsa çözmeye çalışma. - **Tarayıcısız yol (en sağlamı):** mail.tm API'si anahtarsızdır. ```bash D=$(curl -s https://api.mail.tm/domains | python3 -c 'import sys,json;print(json.load(sys.stdin)["hydra:member"][0]["domain"])') @@ -36,7 +37,7 @@ Temel ilke: **takılma, yolunu bul.** Bir adım seni engelliyorsa (giriş gereki - Tüm araçları tek ToolSearch çağrısıyla yükle. Her zaman **yeni sekme** aç, Bilal'in sekmelerine dokunma, işin bitince kendi sekmelerini kapat. - Her senaryoda ekrana bakmakla kalma: `read_console_messages` (hata var mı) ve `read_network_requests` (hangi istek kaç ms sürdü, 4xx/5xx var mı, hiç dönmeyen var mı). "Yükleniyor"da kalma tipi hatalarda **süreyi ölç** ve bekleyen isteği yaz; 90 sn sonra sayfayı yenile ve farkı raporla. - Mobil: `resize_window` ile 390 px; yatay kayma, görünmeyen buton, üst üste binen metin. -- Aynı hatayı **en az iki kez** yeniden üret; bir kez olan şeyi "ara sıra" diye işaretle. +- Bir hatayı **yalnızca sonucu şüpheliyse** ikinci kez yeniden üret (zaman aşımı, ağ, yarış durumu); net ve deterministik hata tek seferde raporlanır. Bir kez olup tekrarında olmayanı "ara sıra" diye işaretle. - Formlarda uç değerler: boş, çok uzun, Türkçe karakter, 0 ve negatif sıra, 1.000.000 üstü sıra. - Danışman/sohbet testinde soruları listedeki **somut program adları ve sıra numaralarıyla** sor; cevabı listeyle yan yana koyup doğru/yanlış işaretle. diff --git a/.claude/agents/rehber-editoru.md b/.claude/agents/rehber-editoru.md index 2ec7c6d..f24617d 100644 --- a/.claude/agents/rehber-editoru.md +++ b/.claude/agents/rehber-editoru.md @@ -2,6 +2,7 @@ name: rehber-editoru description: Rehber editörü. Rehber yazıları arasında iç link örer, ölü link tarar, kaynakla/kodla çelişen ya da eskimiş ifadeleri resmî kaynaktan teyit ederek düzeltir, yazılar arası sayı/terim tutarlılığını sağlar. Yeni yazılar bittikten sonra ya da dönemsel içerik bakımı için kullan; aynı anda tek kopya çalışmalı. tools: Read, Grep, Glob, Bash, Write, Edit, WebSearch, WebFetch +model: sonnet --- Sen KolayTercih ekibinin **rehber editörüsün**. İşe başlamadan önce `docs/ekip/PROTOKOL.md` dosyasını oku; oradaki kurallar istisnasız bağlayıcıdır. diff --git a/.claude/agents/seo-geo.md b/.claude/agents/seo-geo.md index d67731e..5155487 100644 --- a/.claude/agents/seo-geo.md +++ b/.claude/agents/seo-geo.md @@ -1,6 +1,7 @@ --- name: seo-geo description: SEO/GEO uzmanı. Sezon takvimine, rakip boşluğuna ve Search Console/GEO verisine bakarak rehber yazıları için konu planı çıkarır; katalog ve rehber sayfalarının teknik SEO'sunu (sunucu HTML'i, metadata, canonical, sitemap, yapılandırılmış veri, AI bot erişimi) koddan denetler. Plan ve bulgu üretir; yazı yazmaz, kod değiştirmez. +model: sonnet --- Sen KolayTercih ekibinin **SEO/GEO uzmanısın**. İşe başlamadan önce `docs/ekip/PROTOKOL.md` dosyasını oku; oradaki kurallar istisnasız bağlayıcıdır. Trafiğin büyük çoğunluğu Google organik ve katalog sayfalarına iniyor; yapay zekâ yanıtlarında alıntılanmak (GEO) ikinci kanal. diff --git a/scripts/tasarim-denetim.ts b/scripts/tasarim-denetim.ts index 27a0e25..a898b57 100644 --- a/scripts/tasarim-denetim.ts +++ b/scripts/tasarim-denetim.ts @@ -166,6 +166,9 @@ const KURALLAR: Kural[] = [ ad: "hex-renk", seviye: "uyari", mesaj: "Sınıf içinde hex renk; token ya da Tailwind tonu kullan (DESIGN.md §2)", + // Rehber kapak görseli OG görseliyle aynı sabit paleti paylaşır (satori + // tarafında Tailwind token'ı çözülmez); bilinçli istisna. + muaf: /src\/features\/rehber\/components\/rehber-kapak\.tsx$/, bul: regexKurali(/\[#[0-9a-fA-F]{3,8}\]/), }, { diff --git a/src/features/kullanici/components/giris-form.tsx b/src/features/kullanici/components/giris-form.tsx index 3ec62e1..486c078 100644 --- a/src/features/kullanici/components/giris-form.tsx +++ b/src/features/kullanici/components/giris-form.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useRef, useState } from "react"; -import { Mail } from "lucide-react"; +import { Mail, MailCheck } from "lucide-react"; import { toast } from "sonner"; import { authClient } from "@/lib/auth-client"; import { olay } from "@/lib/analitik"; @@ -112,7 +112,10 @@ export function GirisForm({ callbackURL }: { callbackURL: string }) { return (
-

Bağlantı gönderildi 📬

+

+ + Bağlantı gönderildi +

{email} adresine bir giriş bağlantısı gönderdik. Gelen kutunu (ve spam klasörünü) kontrol et — diff --git a/src/features/odeme/components/odeme-sonuc-karti.tsx b/src/features/odeme/components/odeme-sonuc-karti.tsx index a7911a5..91e438d 100644 --- a/src/features/odeme/components/odeme-sonuc-karti.tsx +++ b/src/features/odeme/components/odeme-sonuc-karti.tsx @@ -83,7 +83,7 @@ export async function OdemeSonucKarti({ siparis }: { siparis?: string }) { aria-hidden />

- Ödeme alındı 🎉 + Ödeme alındı