Commit Graph

264 Commits

Author SHA1 Message Date
bilalgursen
97952f6e06 chore(metin): danışman fiyat kıyası Armut ortalamasına göre (1.000–3.000 TL)
52520ac temel alındı; rakam Armut'un 'YKS Tercih Danışmanı Fiyatları'
sayfasındaki ortalama fiyatla (1.000–3.000 TL, 21.09.2026'da açılıp
okundu) eşitlendi, kaynak satırı tarihlendi. 'Onda bir' söylemi kalktı.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 15:27:51 +03:00
bilalgursen
899d29af04 chore(guven): hero'da YÖK logosu yerine tarihli veri satırı [Bilal onayı gerekir]
Footer "ÖSYM veya YÖK ile bağlantılı değildir" derken hero'daki kamu kurumu
logosu resmî onay iması taşıyordu. Aynı bilgi kutusu (sınıflar aynen) artık
logo + ayraç yerine metin satırı gösteriyor:
"Veri: YÖK Atlas · son güncelleme <time>9 Ağustos 2026</time>".
- veri-kaynagi.tsx: TARIH_METNI → export KATALOG_TARIH_METNI (tarih
  biçiminin tek kaynağı; katalog altı satırıyla birebir aynı biçim)
- page.tsx: next/image import'u kalktı, KATALOG_VERI_TARIHI seo import'una
  eklendi
- public/yok-logo.svg silinmedi (karar geri alınabilsin)

Yeni badge tasarlanmadı (mevcut kutu, pill değil). Bu commit diğer P3
commit'lerinden bağımsızdır (tek başına cherry-pick edilebilir).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 15:27:27 +03:00
bilalgursen
9a446df572 merge: origin/gece/p3b-tadimlik-dili~1 (gece vardiyası 2026-09-21)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 15:27:27 +03:00
bilalgursen
343fcf610a merge: origin/gece/p6-arti-aninda-ekle (gece vardiyası 2026-09-21)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 15:27:27 +03:00
bilalgursen
a834f5ff01 merge: origin/gece/p5-kapi-olcum (gece vardiyası 2026-09-21)
All checks were successful
Deploy / deploy (push) Successful in 8m3s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 15:07:25 +03:00
bilalgursen
dedf3561b3 merge: origin/gece/p2-olcum~1 (gece vardiyası 2026-09-21)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 15:07:25 +03:00
bilalgursen
1a87d89b5a feat(liste): ilk + profilsiz ziyaretçide anında eklesin [Bilal onayı gerekir]
PROTOTİP — Bilal telefonda bakıp karar verecek (CEO tur 2, karar #12).
Katalogdan +'ya basan 82 profilsiz oturumun 77'si 5 ekranlık kapıdan
dönüyordu (09-analitik-tur2, S6). Sıra tersine çevrildi: önce ver, sonra
iste.

- programEkleIste: profil yokken programı hemen ekler (sıra bilinmiyorsa
  risk null), kapıyı açmaz; dönüşe `profilsiz` eklendi.
- Buton: program_eklendi {kaynak, yol: "dogrudan", profilli: evet|hayir}.
  Profilsiz eklemede sonner toast (sabit id, 8 sn): "Seçtiklerine eklendi"
  + "Sıralamamı gir →" aksiyonu → profilToplamaAc(null, true,
  "arti_toast") (tanıtım ekranı atlanır). KapiTetik'e "arti_toast".
- Profil kapıdan girilince mevcut profilTamamlandi → riskleriYenile null
  riskleri doldurur (yeni kod yok).

Kapı bileşeni, sihirbaz adımları, SEMA ve meraklisina-icerik değişmedi
(+ kapısı şemada yok → senkron kuralı tetiklenmez). Geri almak için bu
commit'i revert etmek yeterli; K1 ölçümü (gece/p5-kapi-olcum) bağımsız.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 09:24:51 +03:00
bilalgursen
f1abedccee feat(katalog): CTA kartında vaatsiz başlık + köprü cümlesi, /bolum sayfasına CTA
CtaSiraForm'a isteğe bağlı `aciklama` prop'u (yalnız profilsiz karttaki
paragrafın yerine geçer; varsayılan paragraflar aynen kaldı). "Sıralamanla
nereye yerleşirsin?" / "…programlarına yerleşir misin?" başlıkları kalktı:
varsayılan "Sıralamana yakın programlar hangileri?", katalogda
"Sıralaman {ad} tabanlarının neresinde?".

Üniversite ve bölüm sayfaları aynı köprü cümlesini tek sabitten
(KATALOG_CTA_ACIKLAMA) alır; kart /bolum/[slug] sayfasına üniversite
sayfasıyla aynı konumda (liste + sayfalama altı, mt-10) eklendi.
cta_form_goruntulendi ölçümü ve buton deseni değişmedi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 09:24:32 +03:00
bilalgursen
4dfb24bb13 feat(seo): derin katalog sayfalarında başlık/açıklama/H1'i sayfanın içeriğiyle ayrıştır
/bolum/*/sayfa/N: title + description + H1 o sayfanın taban sırası aralığını
taşır (dilimdeki min–max efektif sıra; veri yoksa "taban verisi olmayan
programlar"). Görünür breadcrumb üniversite sayfasındaki desenle eşitlendi
(üst bölüm linki + "Sayfa N").

/universite/*/sayfa/N: description + giriş paragrafı o sayfadaki birim adlarını
sayar (ilk 2 + "ve N birim daha"); dilim tek birimden ibaretse birim içi taban
sırası aralığı eklenir. <title> uzunluk nedeniyle değişmedi.

Dilim hesabı tek yardımcıda (sayfaDilimi); metadata ve gövde aynı hesabı
kullanır. Canonical, robots, sitemap, rota dosyaları ve 1. sayfaların
başlık/açıklaması değişmedi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 09:22:59 +03:00
bilalgursen
79bc7fa8be fix(ai): tadımlık trendi deterministik + gerekçe dil filtresi
cae2aaa yalnız riskNotu'yu deterministik yapmıştı; aynı satırın gerekce ve
trendOzeti alanları DB'deki eski LLM metni olarak servis ediliyordu (lokal
havuzda 89 satır "Son 4 yıl…", 13+ satır "yerleşme olasılığı/ihtimali").
Oradaki "olasılık dili sızamaz" yorumu yanlıştı; düzeltildi.
- yeni src/lib/trend.ts: trendOzetiMetni() saf fonksiyonu — rapor.ts'teki
  trendOzetiUret gövdesi buraya taşındı, rapor ve tadımlık aynı kaynaktan
  okur. Yıl aralığı serideki dolu yıllardan gelir ("2021-2025 arasında…")
- trend cümlesinden tahmin yargısı çıktı: "bölüm zorlaşıyor" → "taban
  sıkılaştı", "yerleşmek görece kolaylaşıyor" → "taban gevşedi". ±%10
  eşiği, ilk–son yıl mantığı, 5/13/6 ve LLM şeması/prompt'u aynı
- tadimlikSec(): DB'deki trendOzeti servis edilmez; program.siraGecmisi'nden
  okuma anında üretilir (alan yoksa "yeterli geçmiş yıl verisi yok")
- tadimlikSec(): gerekce olasılık/ihtimal/şans/garanti/kesin/yüzde/
  "yerleşirsin"/"son 4 yıl" içeriyorsa satır yok sayılır → "genel"
  kategoriye düşer, o da takılırsa null (tadımlık gizlenir). Eşleşme
  Türkçe küçük harfle yapılır (İ/ı)
DB satırları, şema ve script'ler değişmedi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 09:22:40 +03:00
bilalgursen
643e41cc98 fix(analitik): kullaniciTanit script'ten önce sessiz no-op olmasın
Erken olay kuyruğu yalnız olay() içindi; sert yüklemede (OAuth / e-posta
linki dönüşü) RybbitIdentify effect'i de script'ten önce koşuyor, identify
kayboluyor ve kuyruktan boşalan olaylar anonim profile yazılıyordu
(08-kod-denetimi #6).

- Tek "son değer" slotu (bekleyenKimlik): kuyruk değil, yalnız en son
  kimlik anlamlı. Yoklama zamanlayıcısı olay kuyruğuyla ortak
  (zamanlayiciyiBaslat); script 10 sn'de gelmezse slot da atılır.
- kuyruguBosalt kimliği olaylardan ÖNCE uygular.
- kullaniciTemizle slotu siler.

rybbit-identify.tsx'e dokunulmadı.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 09:22:10 +03:00
bilalgursen
67be93c394 feat(analitik): kapi_acildi + kapi_kapatildi olayları
Profil kapısının açılışı ve tamamlanmadan kapanışı doğrudan ölçülmüyordu;
"82 oturum kapıyı gördü" kod davranışından çıkarımdı (09-analitik-tur2).
İki yeni olay (adlar kalıcı sözleşme):

- kapi_acildi {tetik: arti|sonuc|sihirbaz|duzenle|diger}: depoda tek
  açılış noktası (kapiyiAc). Her açıcı kendi tetik'ini yazar:
  programEkleIste → arti, profilDuzenlemeyiAc → duzenle, profilToplamaAc →
  isteğe bağlı 3. parametre, verilmezse hedeften (sonuc/sihirbaz), o da
  yoksa diger. Depoya `tetik` alanı eklendi.
- kapi_kapatildi {adim: giris|sira|sihirbaz, tetik}: yalnız TAMAMLANMADAN
  kapanışta; kapı bileşeninde tek noktadan (vazgec) — X, dışarı tıklama,
  Esc ve "Vazgeç" butonları. Tamamlanan kapı profilTamamlandi ile depodan
  kapanır, bu noktaya uğramaz.

Ham sıra/e-posta olaylara girmez. Davranış değişmez.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 05:25:23 +03:00
bilalgursen
4b87a3e71e fix(analitik): program_eklendi yalnız gerçek eklemede atılsın
Olay, profilsiz ziyaretçide program listeye girmeyip profil kapısı
açıldığında da atılıyordu (kapiAcildi dalı else'e düşüyordu); seri
"ekleme"yi değil "+ tıklaması"nı ölçüyordu (09-analitik-tur2, S6).

- Buton: yalnız sonuc.eklendi iken {kaynak, yol: "dogrudan"}.
- profilTamamlandi: bekleyen program listeye girdiyse (ekle() true)
  {kaynak, yol: "kapi"}.
- OlayAdi yorumuna seri kırılması notu.

Davranış değişmez: profilsiz + hâlâ kapıyı açar.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 05:23:40 +03:00
bilalgursen
17046c830f feat(analitik): giris_basarili sunucu olayı
Oturum oluşturulduğunda (databaseHooks.session.create.after) Rybbit'e
sunucudan giris_basarili düşer; yontem = eposta | google | diger
(better-auth uç yolundan türetilir). Huninin "link istendi → giriş yapıldı"
adımı bugüne dek ölçülemiyordu.

- await yok: Rybbit'in 3 sn'lik timeout'u girişi geciktirmez; sunucuOlayi
  hata fırlatmaz. E-posta adresi olaya girmez, yalnızca kullanıcı ID.
- RYBBIT_HOST/SITE_ID/API_KEY yoksa no-op — prod .env.production'da bu
  üçü bugün yok (bkz. ayrı ci.yaml commit'i), eklenene dek olay düşmez.

Giriş akışının davranışını değiştirmez (yalnızca yan etki ekler).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:55:10 +03:00
bilalgursen
2af4a9f781 feat(giris): adres başına 60 sn soğuma
Aynı e-posta adresine 60 sn içinde ikinci giriş linki gönderilmez: istek
yine 200 döner (form "gönderildi" gösterir), mail çıkmaz. Üçüncü kişiye
mail bombardımanını ve Resend kotasının yakılmasını engeller; bugüne dek
tek sınır better-auth'un IP limitiydi (5 istek/60 sn).

- Kaynak süreç içi Map (globalThis.__girisEpostaSon), anahtar
  trim+lowercase adres. verification tablosundan türetilmez: orada
  identifier token'dır ve satır sendMagicLink'ten önce yazılır.
- Pencere kaymaz (düşen istek süreyi uzatmaz); her çağrıda eski kayıtlar
  budanır. Gönderim hata verirse kayıt silinir, kullanıcı hemen yeniden
  deneyebilir.
- Yalnızca NODE_ENV=production: dev paneli "anında giriş" art arda istek
  atıyor. Konsol modunda da işler (lokal docker testi).

Canlı giriş yolunu değiştirir; merge öncesi lokal docker testi şart.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:55:10 +03:00
bilalgursen
c055e8272c chore(gizlilik): rybbit identify yalnız kullanıcı ID
[Bilal onayı gerekir] Girişli kullanıcının e-postası ve ismi Rybbit'e
trait olarak gönderiliyordu. Artık yalnızca opak kullanıcı ID'si gider;
anonim → girişli oturum birleştirmesi aynen çalışır. Rybbit'te zaten
kayıtlı trait'ler bu commit'le silinmez (panelden ayrıca temizlenmeli).

Bu commit dalın en sonunda ve bağımsızdır: istenmezse
`git merge gece/p2-olcum~1` ile dışarıda bırakılır.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:50:04 +03:00
bilalgursen
e1bb4829fd fix(giris): 429 mesajı + 60 sn geri sayım
Hız sınırına takılan kullanıcı "Tekrar dener misin?" görüp sınırı
uzatıyordu; 429'da "Çok sık denedin, bir dakika sonra tekrar dene" denir.
"Yeniden gönder" geri sayımı 30 → 60 sn: sunucu tarafındaki adres başına
60 sn soğumayla hizalı (o değişiklik gelmese de zararsız).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:49:31 +03:00
bilalgursen
cf19903e19 feat(analitik): huni olayları
Huninin kör noktalarına altı olay (adlar kalıcı sözleşme):
- cta_form_goruntulendi: programatik sayfalardaki CTA kartı, yalnız
  profilsiz dalda (görünüm hook'u; sayfa ayrımı Rybbit pathname'inden)
- sira_form_hata {kaynak: hero|cta|kapi|duzenle}: facet isteği hatası;
  geçersiz sayı doğrulaması sayılmaz
- sonuc_goruntulendi {girisli, sira_kovasi}: /sonuc pathname'i maskeli,
  huni adımı bu olayla kurulur; oturum başına girişli/anonim birer kez
- paket_goruntulendi {kaynak: kilit|kredi_bitti|nav|diger}: sayfaya
  dokunmadan yeni paket/layout.tsx + client bileşenle; /paket linklerine
  ?kaynak= eklendi (listem kilit kartları, kredi-yetersiz, nav kredi pill'i)
- liste_uretim_hata {kod: HATA|ISTISNA}: AUTH/KREDI/PAKET dalları atmaz
- giris_hata {yontem: eposta|google, status}

Ham sıra ve e-posta hiçbir olaya girmez; sıra yalnız siraKovasi() ile.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:49:09 +03:00
bilalgursen
5992cf3637 fix(eposta): Reply-To + prod'da sessiz fallback yok
- Resend gönderimine replyTo eklendi (EMAIL_REPLY_TO, yoksa
  destek@kolaytercih.com) — mail.kolaytercih.com'un MX'i olmadığı için
  yanıtlar bounce oluyordu.
- epostaKonsolModu(): konsola yazma yalnızca anahtar yokken VE (dev'de ya
  da EPOSTA_KONSOL_FALLBACK=1 ile) geçerli. Production'da anahtar yoksa
  artık "gönderildi" dönmüyor, token'lı link loga yazılmıyor; gönderim
  anında net hata fırlatılıyor (better-auth 500 → formda hata toast'ı).
- Production'da EMAIL_FROM yoksa sessizce onboarding@resend.dev'e düşmek
  yerine hata. Env okumaları çağrı anında — next build etkilenmez.

Canlı giriş yolunu değiştirir; merge öncesi lokal docker testi şart.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:49:08 +03:00
bilalgursen
cae2aaab4d fix(ai): tadımlık risk notu deterministik + prompt dili
Girişsiz /sonuc tadımlığının riskNotu'su LLM üretimiydi ve DB'den olduğu
gibi servis ediliyordu; prompt'u da açıkça "yüksek/orta/düşük ihtimal dili
kullan" diyordu. Rozet ise aynı satırda canlı hesaplanıyor → metinle rozet
çelişebiliyordu.
- tadimlikSec(): riskNotu okuma anında riskNotuMetni(riskHesapla(...) ??
  dilimdenRisk(...)) ile üretilir (rozetle aynı formül). DB satırları ve
  şema değişmez; prod'da havuzu yeniden üretmek gerekmez, /api/tadimlik de
  kapsanır
- tadimlik-uret prompt'u + mock metinleri: ihtimal dili yasaklandı,
  "son 4 yıl" → "son 5 yıl" (çıktı şeması aynı; script koşulmadı)
- danışman sohbeti sistem prompt'u: "ihtimal dili kullan" → olasılık/yüzde/
  ihtimal yasak, risk etiketleri + taban sıralarıyla konuş

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:48:42 +03:00
bilalgursen
1a75f42f29 fix(rehber): şema metni SSR'da + mermaid hata toparlama
Şemanın metin karşılığı yalnızca SVG çizilince `aria-label` olarak
basılıyordu; JS çalıştırmayan botlar iskeletten başka bir şey görmüyordu.
Artık aynı `ariaLabel` metni figure içinde bir `<details>` olarak sunucu
HTML'ine girer. mermaid import/render hatası yakalanır: iskelet kalkar,
metin açık gelir, mermaid'in body'de bıraktığı geçici div temizlenir.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:48:10 +03:00
bilalgursen
16c450827b fix(metin): olasılık dili + 5 yıl
Ürün yerleşme olasılığı üretmiyor; tek yılın tabanına göre risk dilimi
etiketi veriyor (src/lib/risk.ts). Metinler buna eşitlendi:
- "yerleşme olasılığı ve risk analizi" → "yerleşme riski ve trend analizi"
  (ana sayfa fiyat kutusu + /paket özellik listesi)
- riskNotuUret'in dört "ihtimal" cümlesi yeni riskNotuMetni()'ne taşındı;
  cümleler geçmiş taban verisine bağlanıyor, "yerleşirsin/ihtimalle" yok.
  Risk eşikleri, 5/13/6 şeması ve prompt değişmedi (yalnız cümle)
- "son 4 yıl" → VERI_YIL_SAYISI (= 5; DB sira2021–sira2025) — yeni
  src/lib/veri-kapsami.ts tek kaynağından
- arama funnel kartı: "Yerleşme ihtimalini" → "Yerleşme riskini"

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:47:47 +03:00
bilalgursen
aac33e7533 chore(eposta): şablondan harici font + footer iletişim
- <head>'deki Google Fonts preconnect/stylesheet <link>'leri kaldırıldı
  (çoğu istemci yok sayıyor, bazı spam filtrelerinde eksi puan).
- HTML footer'a ve düz metin gövdelerin sonuna kolaytercih.com +
  destek@kolaytercih.com satırı eklendi. Satış dili yok.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:47:30 +03:00
bilalgursen
d9e125c5de feat(rehber): guncelleme alanı → sitemap/JSON-LD/OG/görünür tarih
Frontmatter'a isteğe bağlı `guncelleme` alanı geldi ve uçtan uca akıyor:
sitemap lastmod (yazı + /rehber dizini), Article JSON-LD dateModified,
og:article modified_time ve makale başlığının altındaki görünür tarih
satırı. `tarih`/`guncelleme` YYYY-AA-GG değilse ya da güncelleme yayından
önceyse build kırılır. Tarih metni saat diliminden bağımsız `trTarih` ile
üretilir.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:47:29 +03:00
bilalgursen
fa43392077 fix(analitik): görünüm hook'u callback ref + erken olay kuyruğu
useGorunumOlayi useRef + [ad, anahtarEki] deps'li effect kullanıyordu:
eleman ilk commit'te yoksa (kaydet-banner: mount sonrası açılır, portal
içinde) ya da sökülüp yeni düğümle geri geliyorsa (tadımlık satırı) gözlem
hiç kurulmuyordu → kaydet_banner_goruntulendi / tadimlik_goruntulendi = 0.
Hook artık callback ref döner; gözlem düğüm bağlanınca kurulur, sökülünce
React 19 ref temizliğiyle bırakılır. Çağıranlar yalnız ref={…} verdiği
için kullanım yerleri değişmedi.

olay(): Rybbit script'i afterInteractive; sert yüklemede mount anında
atılan olaylar window.rybbit henüz yokken sessizce düşüyordu. Artık en çok
20 olay, 500 ms aralıkla en çok 20 deneme (10 sn) kuyrukta bekler; script
gelmezse (reklam engelleyici, dev) kuyruk atılır.

olayBirKez(): hook'taki sessionStorage tekilleştirmesinin effect'ten
çağrılabilir hâli (anahtar biçimi aynı: kolaytercih.olay.<ad>[.<ek>]).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:47:24 +03:00
bilalgursen
a9ea0bf49b fix(rehber): frontmatter tırnak + tablo sarmalayıcı
Frontmatter değerinin iki ucundaki tırnak bağımsız siliniyordu; "Alıntı"
diye başlayan açıklamalar baştaki tırnağını kaybediyordu. Artık yalnızca
tamamı aynı tırnakla sarılı değer soyulur. Makale tabloları yatay kayan,
klavyeyle odaklanabilir bir bölgeye sarılır (mobilde sayfa taşması).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:46:19 +03:00
bilalgursen
53eb07bb34 feat(seo): GEO paketi — yapılandırılmış metadata, AI bot erişimi, veri tazelik sinyali
- sayfaMetadata(): indekslenebilir sayfalar için tek kaynaklı canonical +
  eksiksiz openGraph üretimi; sayfalar buna geçirildi
- robots.ts: yalnızca /api/ engellenir; noindex'li sayfalar robots engeli
  yerine meta ile yönetilir, AI botları niyeti belgeleyen açık grupla izinli
- next.config: htmlLimitedBots'a AI botları eklendi (JS çalıştırmayan
  botlara metadata head içinde bloklanarak verilir)
- sitemap lastmod + katalogda görünür 'Kaynak/son güncelleme' satırı
  (VeriKaynagi) KATALOG_VERI_TARIHI tek kaynağından
- docs/geo/geo-raporu.md: çalışmanın raporu

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-21 00:51:16 +03:00
bilalgursen
d2651eadb9 fix(odeme): postman-request zincirini standalone trace'ine sok
Some checks failed
Deploy / deploy (push) Has been cancelled
outputFileTracingIncludes yalnızca eşleşen dosyaları kopyalar, trace etmez:
resources/*.js imaja girdi ama IyzipayResource'un require ettiği
postman-request ve bağımlılıkları girmedi — initialize prod'da
"Cannot find module 'postman-request'" ile düşüyordu. IyzipayResource'u
statik import etmek nft trace'inin tüm zinciri doğru pnpm yerleşimiyle
kopyalamasını sağlar.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-21 00:42:44 +03:00
bilalgursen
30b9b41a22 refactor: update site header and chat components for improved user experience
All checks were successful
Deploy / deploy (push) Successful in 12m16s
Replaced the static logo in the SiteHeader with an animated component for enhanced visual feedback. Updated the PaketSatinAl component to include a dynamic link based on user context. Enhanced the ListeUretici and ListemGovde components with improved layout and messaging features, including the addition of a new initial preference comment display in the SohbetClient. Adjusted styling for consistency across components and improved loading states with skeleton screens.
2026-08-11 12:54:46 +03:00
bilalgursen
951caa3c93 refactor(odeme): update environment variable usage and documentation
All checks were successful
Deploy / deploy (push) Successful in 8m39s
Replaced `NEXT_PUBLIC_APP_URL` with `APP_URL` in the payment processing logic to ensure proper runtime access. Updated related documentation to clarify the distinction between build-time and runtime environment variables, emphasizing the importance of using `APP_URL` for callback and webhook URLs. Adjusted references in the codebase to reflect this change, enhancing clarity and functionality in the payment flow.
2026-08-11 11:42:47 +03:00
bilalgursen
f3c4ce4e76 fix(odeme): satın al butonunda pending metin takasını kaldır
Tıklamada buton içeriği "Ödeme sayfasına yönlendiriliyorsun…" ile
değişiyordu; dar top-up kartında metin taşıyordu. Çift gönderim zaten
`disabled` ile engelleniyor.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 07:18:17 +03:00
bilalgursen
88eefb3062 fix(odeme): iyziInit'i silmek yerine güvenli sıfırla
iyzico bundle'ı `iyziInit`i global `var` ile tanımlıyor; property
non-configurable olduğu için `delete window.iyziInit` strict mode'da
TypeError fırlatıyordu. Önce delete denenir, olmazsa undefined atanır —
script'in aradığı `typeof ... == 'undefined'` koşulu iki yolla da sağlanır.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 07:18:08 +03:00
bilalgursen
a71740767d feat(odeme): checkout ekranında site kromunu daralt
Ödeme adımında ekranda ~20 kaçış yolu vardı (SEO footer kolonları, katalog
arama, user nav) ve geri sayım banner'ı kart formunun üstünde duruyordu.
Ayrıca layout'un alt progressive blur katmanı iyzico iframe'inin son
satırlarını bulanıklaştırıyordu.

- kromGizliMi: /odeme kroma kapatıldı, /odeme/sonuc istisna tutuldu
  (orada kullanıcıyı ürüne döndürmek istiyoruz)
- OdemeUstSerit: SiteHeader'ın tasarım dilinde daraltılmış şerit — logo
  bilerek link değil, tek çıkış "Paket sayfasına dön"
- Sipariş özeti kartı kaldırıldı: ürün ve tutar /paket'te seçiliyor,
  iyzico da ödeme butonunda tutarı gösteriyor
- Yasal linkler + iyzico logo bandı ayrı footer yerine doğrudan formun
  altında; bant sayfada artık tek kez görünüyor

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 07:03:32 +03:00
bilalgursen
5ccc9c1ffa chore: update iyzico payment processing and database schema
All checks were successful
Deploy / deploy (push) Successful in 9m3s
Enhanced the iyzico payment processing logic by updating the handling of checkout form content. Modified the order schema to include a new field for storing the checkout form content, ensuring it persists across page refreshes. Updated related functions to reflect these changes, improving the overall payment experience. Additionally, updated the app database to incorporate the latest changes.
2026-08-11 00:51:58 +03:00
bilalgursen
08419e6d1c chore: update iyzico integration and enhance payment processing logic
All checks were successful
Deploy / deploy (push) Successful in 7m0s
Refactored the iyzico payment integration to improve the handling of payment callbacks and order status updates. Added signature validation for responses to ensure data integrity. Enhanced the `initializeCheckoutForm` function to include buyer's name and surname, and updated the order schema to enforce unique constraints on iyzico tokens. Improved error handling and logging for payment processing, ensuring better tracking of payment states and issues. Updated the app database to reflect these changes.
2026-08-11 00:30:53 +03:00
bilalgursen
70b254c3b2 fix: update badge styles and animations for consistency
All checks were successful
Deploy / deploy (push) Successful in 7m13s
Refined the styling of badge and eyebrow elements to ensure uniformity across the site, aligning them with the main section headers. Updated the `PixelMark` component to enhance its animation behavior, introducing new keyframes for smoother transitions. Adjusted CSS properties for better visual consistency and removed unnecessary uppercase text styling. Improved the `SectionEyebrow` component to reflect these changes.
2026-08-09 22:17:48 +03:00
bilalgursen
30b55f887f chore: update binary assets and database file
All checks were successful
Deploy / deploy (push) Successful in 8m27s
Updated the app database and several binary assets including the apple icon, favicon, and additional icons. These changes ensure that the latest versions of the assets are in use, improving the overall appearance and functionality of the application.
2026-08-09 06:44:41 +03:00
bilalgursen
15e2c4c961 feat: implement chat history deletion functionality
All checks were successful
Deploy / deploy (push) Successful in 8m4s
Added a new DELETE endpoint to allow users to clear their chat history. This functionality ensures that while the chat messages are removed, any credits spent remain intact. Additionally, updated the ListemGovde component to reflect changes in user preferences and integrated a modal for notifying users about preference changes. Enhanced the SohbetClient component to include a button for clearing chat history, improving user experience and interface clarity.
2026-08-09 04:44:19 +03:00
bilalgursen
8870845fa1 refactor: remove TercihDegistiUyarisi component
Deleted the TercihDegistiUyarisi component from the project. This component was responsible for notifying users about changes in their preferences and suggesting a list update. The removal is part of a broader effort to streamline the codebase and improve maintainability.
2026-08-09 04:44:13 +03:00
bilalgursen
437e2bc96a fix: update callback handling and user profile management in list components
All checks were successful
Deploy / deploy (push) Successful in 7m23s
Enhanced the handling of user profiles and callback URLs in various components. Updated the `GirisKarti` to support multiple callback scenarios, ensuring seamless user experience. Improved the `ListeUretici` and `ListemIcerik` components to manage profile data more effectively, including handling cases where the profile is stored in cookies. Additionally, refined the logic for redirecting users based on their profile status, ensuring they are directed to the appropriate pages without losing context. Updated the database file to reflect these changes.
2026-08-09 04:15:53 +03:00
bilalgursen
696dc69763 refactor: optimize AramaFunnelKarti styles and enhance city data structure
All checks were successful
Deploy / deploy (push) Successful in 7m30s
Removed unnecessary elements and optimized styles in the AramaFunnelKarti component for improved layout. Updated the city data structure in harita-ulkeler.ts to include coordinates, enhancing geographical data handling. Additionally, refactored risk color definitions in risk.ts for better clarity and maintainability.
2026-08-09 03:55:56 +03:00
bilalgursen
f752d27101 feat: add pill variant to Tabs component and enhance ProgramTablosu with motion effects
All checks were successful
Deploy / deploy (push) Successful in 7m49s
Introduced a new "pill" variant for the Tabs component, allowing for a rounded, active tab style that aligns with the design of the "Giriş yap" button. Enhanced the ProgramTablosu component by integrating motion effects for active tab indicators, improving user experience with smooth transitions. Updated color handling for active states to ensure better visibility and consistency across the UI.
2026-08-09 03:39:10 +03:00
bilalgursen
ce6871d623 refactor: güncellenmiş profil çerezi ile sonuç sayfası yönlendirmeleri
Some checks failed
Deploy / deploy (push) Has been cancelled
Profil çerezinin SSR'da kullanılmasını sağlayarak, sonuç sayfasındaki yönlendirmeleri güncelledik. Artık profil bilgileri URL parametreleri yerine çerezden alınarak işleniyor. Ayrıca, profil çerezi olmayan kullanıcılar için yönlendirme mantığı iyileştirildi. Çeşitli bileşenlerdeki URL oluşturma fonksiyonları güncellenerek, profil bilgileri çerezden okunacak şekilde düzenlendi. Bu değişiklikler, kullanıcı deneyimini artırmayı ve daha tutarlı bir veri akışı sağlamayı hedefliyor.
2026-08-09 03:31:42 +03:00
bilalgursen
24f53ddbce chore: update memory limits in Dockerfile and next.config.ts
All checks were successful
Deploy / deploy (push) Successful in 7m21s
- Reduced NODE_OPTIONS max-old-space-size from 1536 to 1024 MB in Dockerfile.
- Adjusted turbopackMemoryLimit in next.config.ts from 1.5 GB to 1 GB to prevent OOM-kills during build on VPS with limited memory.
- Added a search input for filtering Turkish provinces in the SihirbazAdimlar component, improving user experience with real-time search functionality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:33:13 +03:00
bilalgursen
e0ff9dec0a refactor: /sonuc tablosundaki "Filtreler:" çip alanını kaldır
Filtreleme davranışı (URL'deki il+tip paramlarının tabloya ve
sayfalamaya uygulanması) aynen korunur; yalnızca tablo üstündeki
kaldırılabilir çip satırı gösterilmez.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:26:10 +03:00
bilalgursen
14f9b622b0 feat: tadımlık havuzuna üniversite tipi boyutu
Tadımlık satırı batch üretildiği için sihirbazdaki devlet/vakıf seçimini
bilmiyor, vakıf seçen kullanıcıya devlet örneği gösteriyordu. Havuz
anahtarı kova×tür×kategori×tip'e genişledi (migration 0001; mevcut
satırlar tip='genel'). Üretim scripti tip varyantlarını uniturGrubu
filtresiyle seçer; tadimlikSec tip verildiğinde kategori→genel fallback'i
korur ama tip fallback'i YAPMAZ — uygun satır yoksa bileşen gizlenir,
yanlış tipte örnek asla gösterilmez. Client profildeki tipi de gönderir ve
SSR "genel" satırı tipe uymuyorsa fetch bitene kadar gizler.

Not: prod app.db volume'de — `pnpm tadimlik` prod DB'ye karşı ayrıca
koşulmalı.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:12:25 +03:00
bilalgursen
0c6c9da56c feat: /sonuc ham tablosuna sihirbaz il + devlet/vakıf filtresi
Vakıf seçen kullanıcı sonuç tablosunda devlet üniversiteleri görüyordu:
tablo sihirbaz seçimlerini hiç kullanmıyordu. sonucHref artık profildeki
seçimlerden il (tekrarlı) ve tip paramlarını URL'e yazar; tablo SSR'da bu
paramlarla filtrelenir, "daha fazla göster" sayfalaması aynı filtreleri
taşır. Sekmelerin üstünde kaldırılabilir filtre çipleri görünür — çip
kaldırmak yalnızca URL'i günceller, localStorage profiline dokunmaz.

Kategori tabloya bilinçli uygulanmaz (DB'de kategori kolonu yok, JS
filtresi offset/toplam semantiğini bozar); kategori AI listesi ve
tadımlıkta uygulanır.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:12:08 +03:00
bilalgursen
34c8f90e26 feat: alan eşlemesine fakülte sinyali + il adımında tüm iller
Sihirbazın alan çipleri artık YÖK Atlas'ın kendi verisiyle süzülüyor:
kategoriBul program adı kurallarını fakülte kurallarıyla kesiştiriyor
(Siber Güvenlik Müh. artık Hukuk değil, Siyaset Bilimi artık Fen değil).
Aşırı geniş isim regexleri sıkılaştırıldı (bilim/güvenlik/programcı/çevre
+ gastronomi'nin içindeki "astronomi" tuzağı) — sayısalda Hukuk & Siyasal,
sözelde Mühendislik çipi tamamen kalktı.

İl adımındaki .slice(0,15) kırpması kaldırıldı: penceresinde programı olan
TÜM iller listelenir; KKTC/yurtdışı kampüsler ayrı çip grubunda. Haritanın
15-limit yüzünden yanlış "program yok" grilemesi kendiliğinden düzeldi.

Öncelik çiplerine şeffaflık notu eklendi (listeyi daraltmaz, AI'ya yön
verir). /meraklisina şeması ve anlatımı aynı davranışla senkronlandı.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:11:36 +03:00
bilalgursen
ea85a053c5 feat: add new skills to skills-lock.json and update use-pixel-heat component
All checks were successful
Deploy / deploy (push) Successful in 7m30s
- Added new skills: find-skills, frontend-ui-engineering, and vercel-react-best-practices to skills-lock.json.
- Updated use-pixel-heat.ts to import both animate and AnimationPlaybackControls from motion for improved animation handling.
2026-08-08 16:08:54 +03:00
bilalgursen
78d7c51a7a perf: deterministik dekor memo'ları ve küçük render süpürmeleri (Faz 7)
Some checks failed
Deploy / deploy (push) Has been cancelled
- pixel-decor: PixelField/PixelDivider piksel üretimi useMemo([seed]) —
  504 iterasyon + ~150 element çekmece reorder'ının her karesinde
  yeniden üretiliyordu
- rapor-listesi: acikSira effect'i önceki-prop desenine döndü (çift render
  ve eslint-disable kalktı), Set lazy init, tekIl useMemo
- program-tablosu: 3 dilimin spread'i useMemo
- typing-animation: displayedText state yerine türetme; kaynak reset'i
  render sırasında — tick başına state yazımı ve effect bağımlılığı azaldı
- site-top-banner: saniyelik geri sayım tiki startTransition'da
- program-liste-verileri: sparkline 6 dizi geçişi tek döngüde
- secimlerim-paneli: SecimSatiri profili prop'tan alır + memo (24 ayrı
  store aboneliği kalktı)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 14:29:14 +03:00