diff --git a/.env.example b/.env.example index 466eb65..a1f8f78 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -# Copy to .env.local and fill in values. See README for provider setup. +# .env.local'a kopyalayın ve değerleri doldurun. Daha Fazlası için README dosyasını okuyun.. # --- Supabase (optional: response caching is off if these are empty) --- SUPABASE_URL= diff --git a/.gitignore b/.gitignore index 7b8da95..d1cf3ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# Dosyaları yok sayma hakkında daha fazla bilgi için https://help.github.com/articles/ignoring-files/ adresini ziyaret edin. -# dependencies +# dependencies / bağımlılıklar /node_modules /.pnp .pnp.* @@ -10,27 +10,27 @@ !.yarn/releases !.yarn/versions -# testing +# testing / Testler /coverage # next.js /.next/ /out/ -# production +# production / Yayınlama /build -# misc +# misc / diğerleri .DS_Store *.pem -# debug +# debug / hata ayıklama npm-debug.log* yarn-debug.log* yarn-error.log* .pnpm-debug.log* -# env files (can opt-in for committing if needed) +# env files (can opt-in for committing if needed) / env dosyaları (gerekirse commit işlemine dahil edilebilir) .env* !.env.example diff --git a/AGENTS.md b/AGENTS.md index 8bd0e39..bc1d8f4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,5 +1,5 @@ -# This is NOT the Next.js you know +# Bu Next.js DEĞİL, Biliyorsun. -This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. +Bu Sürümde uyumsuz değişiklikler bulunmaktadır — API'ler, kurallar ve dosya yapısı, eğitim verilerinizden farklı olabilir. Herhangi bir kod yazmadan önce `node_modules/next/dist/docs/` ilgili kılavuzu **okuyun.** Kullanımdan kaldırılacak özelliklere ilişkin uyarıları dikkate alın. diff --git a/README.md b/README.md index 64635f1..89b8e7f 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,58 @@ -# GitReverse +# GitReverse Turkish (Translated by mehmetdemir-tr) https://github.com/user-attachments/assets/f0cdb7b2-c6f0-4483-8a01-153170479f2e -Turn a **public GitHub repository** into a **single synthetic user prompt** that someone might paste into Cursor, Claude Code, Codex, etc. to vibe code the project from scratch. +Bir **Geliştirilmeye açık GitHub deposunu** birisinin Cursor, Claude Code, Codex vb. uygulamalara yapıştırarak projeyi sıfırdan kodlayabileceği **tek sentetik yapay zeka istem satırına** dönüştürün. -The app pulls **repo metadata**, a **root file tree** (depth 1), and the **README**, then uses an LLM via [OpenRouter](https://openrouter.ai/) to produce one short, conversational prompt grounded in that context. +Bu uygulama, **repo meta verilerini**, bir **kök dosya ağacını** (derinlik yani depth 1) ve **README** dosyasını alır; ardından [OpenRouter](https://openrouter.ai/) aracılığıyla bir LLM kullanarak bu bağlamda temellendirilmiş kısa ve sohbet tarzında bir istem satırı oluşturur. -Paste a GitHub URL or `owner/repo` on the home page. You can also open **`/owner/repo`** (e.g. `/vercel/next.js`) for a shareable link that runs the same flow. +Ana sayfaya bir Github URL'si veya 'owner/repo' (sahip/depo) yazın. Aynı iş akışını çalıştıran paylaşılabilir bir bağlantı için **'/sahip/depo'** (ör. '/vercel/next.js) adresinide açabilirsiniz. -GitHub-style **`/owner/repo/tree/...`** URLs on this site **redirect to `/owner/repo`** so they do not 404. The reverse flow still uses the whole repo for now; **subfolder-aware** context (scoped to that path) is planned for a later change. +Bu sitedeki GitHub tarzı **'/owner/repo/tree/...'** URL'leri, 404 hatası vermemeleri için **`/owner/repo`** adresine yönlendirilir. Ters akış şimdilik hala tüm depoyu kullanmaktadır; **alt klasörleri algılayan** bağlam (o yolun kapsamına dahil) daha sonraki bir güncellemede eklenecektir. -## Stack +## Yığın (Stack) +Next.js (Uygulama Yönlendiricisi), React, TypeScript, Tailwind CSS, Github API Ve OpenRouter. -Next.js (App Router), React, TypeScript, Tailwind CSS, GitHub API, OpenRouter. +## Yapılandırma +`.env.example` dosyasını `.env.local` dosyasına kopyalayın. **`OPENROUTER_API_KEY`**'e ihtiyacınız var. İsteğe bağlı: `OPENROUTER_MODEL` (varsayılan olarak `google/gemini-2.5-pro`), daha iyi GitHub hız sınırları için `GITHUB_TOKEN` ve sunucu tarafında önbellekleme istiyorsanız örnek dosyadaki Supabase ortam değişkenleri. -## Configuration +### Özel ters yönlendirme (isteğe bağlı) -Copy `.env.example` to `.env.local`. You need **`OPENROUTER_API_KEY`**. Optional: `OPENROUTER_MODEL` (defaults to `google/gemini-2.5-pro`), `GITHUB_TOKEN` for better GitHub rate limits, and Supabase env vars from the example file if you want server-side caching. -### Custom reverse (optional) -For **deep / focus** prompts, run the **custom_reverse** service (separate TypeScript project; see its `README`; `pnpm dev`, default port **3001**) locally or deploy it to your own backend. In `.env.local` set: +**deep / focus** istemleri için, **custom_reverse** hizmetini (ayrı bir TypeScript projesi; `README` dosyasına bakın; `pnpm dev`, varsayılan bağlantı noktası **3001**) yerel olarak çalıştırın veya kendi arka ucunuza dağıtın. `.env.local` dosyasında şunu ayarlayın: + + `CUSTOM_REVERSE_SERVICE_URL=http://localhost:3001` -Successful runs are stored in Supabase (`custom_prompt_cache`) when `SUPABASE_URL` and `SUPABASE_PUBLISHABLE_KEY` are set—they are **not** shown in the public library. -Then enable **Custom reverse** on the home page and describe what to reverse-engineer. -## Development +`SUPABASE_URL` ve `SUPABASE_PUBLISHABLE_KEY` ayarlandığında başarılı çalıştırmalar Supabase'de (`custom_prompt_cache`) saklanır; bunlar genel kütüphanede **görünmez**. + + + +Ardından ana sayfada **Özel tersine çevirme** seçeneğini etkinleştirin ve neyin tersine mühendislik yapılacağını açıklayın. + + + +## Geliştirme + ```bash + pnpm install + pnpm dev + ``` -Open [http://localhost:3000](http://localhost:3000). -```bash -pnpm build -pnpm start -pnpm lint -``` -Shout out to [GitIngest](http://github.com/coderamp-labs/gitingest) for inspiration. +[http://localhost:3000](http://localhost:3000) adresini açın. + + +[GitIngest](http://github.com/coderamp-labs/gitingest)'e fikir ve ilham için teşekkürler! :) + +***Çeviri: mehmetdemir-tr (Mehmet Demir)*** + diff --git a/app/api/increment-views/route.ts b/app/api/increment-views/route.ts index ad6947b..d7a83fd 100644 --- a/app/api/increment-views/route.ts +++ b/app/api/increment-views/route.ts @@ -22,7 +22,7 @@ if ( ) { throw new Error( "[increment-views] VIEWS_IP_SALT is not set. " + - "Set a random secret (openssl rand -hex 32) in your deployment env." + "Deployment ortamında rastgele bir secret ayarlayın (openssl rand -hex 32)." ); } diff --git a/app/history/page.tsx b/app/history/page.tsx index 2a41012..d835a32 100644 --- a/app/history/page.tsx +++ b/app/history/page.tsx @@ -1,8 +1,8 @@ import { HistoryPage } from "@/components/history-page"; export const metadata = { - title: "History — GitReverse", - description: "Repositories you recently viewed on GitReverse.", + title: "Geçmiş — GitReverse", + description: "GitReverse'de görüntülediğin Depoların geçmişini görüntüle.", }; export default function HistoryRoute() { diff --git a/app/layout.tsx b/app/layout.tsx index 7a46845..fef2160 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -16,7 +16,7 @@ const geistMono = Geist_Mono({ export const metadata: Metadata = { title: "GitReverse", description: - "Turn a GitHub repository into a plain-language coding agent prompt.", + "Herhangi bir GitHub deposunu düz metin olarak hazırlanmış bir isteme dönüştürün.", }; export default function RootLayout({ diff --git a/app/library/page.tsx b/app/library/page.tsx index 04f65ec..4e8548b 100644 --- a/app/library/page.tsx +++ b/app/library/page.tsx @@ -5,9 +5,9 @@ import { LibraryPage } from "@/components/library-page"; export const dynamic = "force-dynamic"; export const metadata = { - title: "Prompt Library — GitReverse", + title: "Komut Kütüphanesi — GitReverse", description: - "Browse 1,000+ reverse-engineered prompts from real GitHub repositories.", + "1,000+'den fazla oluşturulmuş komut kütüphanesini gezin.", }; const INITIAL_LIMIT = 24; diff --git a/components/history-page.tsx b/components/history-page.tsx index d61bdd8..5a652ff 100644 --- a/components/history-page.tsx +++ b/components/history-page.tsx @@ -49,9 +49,9 @@ function isHistoryEntry(x: unknown): x is HistoryEntry { const gt = (x as HistoryEntry).lastGenerationType; if ( gt !== undefined && - gt !== "quick" && - gt !== "deep" && - gt !== "manual" + gt !== "hızlı" && + gt !== "derin" && + gt !== "manuel" ) { return false; } @@ -64,15 +64,15 @@ function isHistoryEntry(x: unknown): x is HistoryEntry { function relativeTime(iso: string): string { const diff = Date.now() - new Date(iso).getTime(); const s = Math.floor(diff / 1000); - if (s < 60) return "just now"; + if (s < 60) return "Şimdi"; const m = Math.floor(s / 60); - if (m < 60) return `${m}m ago`; + if (m < 60) return `${m}dk önce`; const h = Math.floor(m / 60); - if (h < 24) return `${h}h ago`; + if (h < 24) return `${h}saat önce`; const d = Math.floor(h / 24); - if (d < 30) return `${d}d ago`; + if (d < 30) return `${d}gün önce`; const mo = Math.floor(d / 30); - return `${mo}mo ago`; + return `${mo}ay önce`; } export function HistoryPage() { @@ -138,7 +138,7 @@ export function HistoryPage() { History

- Your previously generated prompts. + Önceki oluşturduğunuz istemler.

@@ -146,12 +146,12 @@ export function HistoryPage() {

Loading…

) : entries.length === 0 ? (

- No history yet. Check out the{" "} + Geçmiş yok (şimdilik) şuraya bir bak:{" "} - Prompt Library + istem Kütüphanesi .

@@ -172,19 +172,19 @@ export function HistoryPage() { function generationBadge(entry: HistoryEntry): { label: string; title?: string } | null { const t = entry.lastGenerationType; if (t === "deep") { - return { label: "Deep", title: "Deep Reverse" }; + return { label: "Derin", title: "Derin Tersine Mühendislik" }; } if (t === "manual") { const f = entry.lastManualFocus?.trim(); const short = f && f.length > 48 ? `${f.slice(0, 48).trimEnd()}…` : f; return { - label: short ? `Manual: ${short}` : "Manual", - title: f ?? "Manual control", + label: short ? `Manuel: ${short}` : "Manuel", + title: f ?? "Manuel Kontrol", }; } if (t === "quick") { - return { label: "Quick", title: "Quick reverse prompt" }; + return { label: "Hızlı", title: "Hızlı tersine komut" }; } return null; } diff --git a/components/library-page.tsx b/components/library-page.tsx index 760b470..67d408b 100644 --- a/components/library-page.tsx +++ b/components/library-page.tsx @@ -18,9 +18,9 @@ type SortOption = "trending" | "newest" | "oldest"; const SORT_OPTIONS: SortOption[] = ["newest", "trending", "oldest"]; const SORT_LABELS: Record = { - trending: "Trending", - newest: "Newest first", - oldest: "Oldest first", + trending: "Popüler", + newest: "En yenisi", + oldest: "En eskisi", }; const PAGE_SIZE = 24; @@ -28,15 +28,15 @@ const PAGE_SIZE = 24; function relativeTime(iso: string): string { const diff = Date.now() - new Date(iso).getTime(); const s = Math.floor(diff / 1000); - if (s < 60) return "just now"; + if (s < 60) return "şimdi"; const m = Math.floor(s / 60); - if (m < 60) return `${m}m ago`; + if (m < 60) return `${m}dk önce`; const h = Math.floor(m / 60); - if (h < 24) return `${h}h ago`; + if (h < 24) return `${h}saat önce`; const d = Math.floor(h / 24); - if (d < 30) return `${d}d ago`; + if (d < 30) return `${d}gün önce`; const mo = Math.floor(d / 30); - return `${mo}mo ago`; + return `${mo}ay önce`; } type LibraryPageProps = { @@ -132,7 +132,7 @@ export function LibraryPage({ initialData, initialTotal }: LibraryPageProps) { href="/history" className="font-semibold text-zinc-900 transition-transform hover:-translate-y-0.5" > - History + Geçmiş

- Prompt Library + İstem Kütüphanesi

- Reverse-engineered prompts from real GitHub repositories. + Tersine Mühendislikle oluşturan orijinal GitHub depolarının istemleri.

@@ -275,8 +275,8 @@ export function LibraryPage({ initialData, initialTotal }: LibraryPageProps) { {entries.length === 0 ? (
-

No prompts found

-

Try a different search term.

+

Karaya vurdun! (404)

{/* a little joke :D*/} +

Aradığın istem bulunamadı, farklı bir şey arat.

) : (
@@ -286,7 +286,7 @@ export function LibraryPage({ initialData, initialTotal }: LibraryPageProps) {
)} - {/* Load more */} + {/* Az daha yükle */} {hasMore && (
@@ -345,7 +345,7 @@ export function LibraryPage({ initialData, initialTotal }: LibraryPageProps) { > - Discord + Discord Sunucumuz
diff --git a/components/reverse-prompt-home.tsx b/components/reverse-prompt-home.tsx index 9bf30ef..e111abe 100644 --- a/components/reverse-prompt-home.tsx +++ b/components/reverse-prompt-home.tsx @@ -137,7 +137,7 @@ export function ReversePromptHome({ setRateLimited(true); return; } - setError(data.error ?? `Request failed (${res.status})`); + setError(data.error ?? `İstek Başarısız: (${res.status})`); return; } if (typeof data.prompt === "string") { @@ -157,7 +157,7 @@ export function ReversePromptHome({ setError("No prompt in response."); } } catch (err) { - setError(err instanceof Error ? err.message : "Request failed"); + setError(err instanceof Error ? err.message : "İstek Başarısız"); } finally { setLoading(false); setLoadKind("none"); @@ -170,7 +170,7 @@ export function ReversePromptHome({ setRateLimited(false); setPrompt(""); setCopied(false); - setManualStatusLine("Checking if it's cached…"); + setManualStatusLine("Bellektemi diye kontrol ediliyor…"); setLoadKind("custom"); setLoading(true); try { @@ -203,12 +203,12 @@ export function ReversePromptHome({ setRateLimited(true); return; } - setError(data.error ?? `Request failed (${res.status})`); + setError(data.error ?? `İstek başarısız: (${res.status})`); return; } if (typeof data.prompt === "string") { if (data.fromCache) { - setManualStatusLine("Loaded from cache"); + setManualStatusLine("Bellekten yüklendi."); await new Promise((r) => setTimeout(r, 450)); } setPrompt(data.prompt); @@ -229,7 +229,7 @@ export function ReversePromptHome({ ); } } else { - setError("No prompt in response."); + setError("Cevapta İstem Metni yok."); } return; } @@ -237,15 +237,15 @@ export function ReversePromptHome({ if (!res.ok) { try { const errData = (await res.json()) as { error?: string }; - setError(errData.error ?? `Request failed (${res.status})`); + setError(errData.error ?? `İstek başarısız: (${res.status})`); } catch { - setError(`Request failed (${res.status})`); + setError(`İstek başarısız: (${res.status})`); } return; } if (!res.body) { - setError("No response body from manual control."); + setError("Manuel Kontrolden gelen cevap gövdesi yok."); return; } @@ -299,7 +299,7 @@ export function ReversePromptHome({ ); } } else { - setError("No prompt in response."); + setError("Cevapta istem metni yok."); } } else if (event === "error") { const j = JSON.parse(dataStr) as { error?: string }; @@ -311,7 +311,7 @@ export function ReversePromptHome({ } } } catch (err) { - setError(err instanceof Error ? err.message : "Request failed"); + setError(err instanceof Error ? err.message : "İstek Başarısız"); } finally { setLoading(false); setLoadKind("none"); @@ -488,7 +488,7 @@ export function ReversePromptHome({ setCopied(true); setTimeout(() => setCopied(false), 2000); } catch { - setError("Could not copy to clipboard."); + setError("Panoya kopyalanamadı."); } } @@ -505,13 +505,13 @@ export function ReversePromptHome({ href="/library" className="font-semibold text-zinc-900 transition-transform hover:-translate-y-0.5" > - Library + Kütüphane - History + Geçmiş - GitHub + GitHub Sayfası @@ -571,14 +571,14 @@ export function ReversePromptHome({

- Repository to + Depodan ->
- Prompt + İsteme

- Reverse engineer a codebase{" "} - into a prompt - that likely created it. + Bir kod tabanını{" "} + Komut İstemine + dönüştürün.

@@ -636,10 +636,10 @@ export function ReversePromptHome({ d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" /> - Processing… + Oluşturuluyor... ) : ( - "Get Prompt" + "Komut istemini al" )} @@ -661,7 +661,7 @@ export function ReversePromptHome({ onCustomReverseCheckboxChange(e.target.checked) } /> - Manual control + Manuel Kontrol {customReverse ? (
@@ -698,7 +698,7 @@ export function ReversePromptHome({ ) : (
- Try example repos: + Örnek depoları deneyin {HOME_EXAMPLES.map(({ label, url }) => (
@@ -717,14 +717,14 @@ export function ReversePromptHome({ {rateLimited ? (
-

Sorry, we're a bit overwhelmed right now.

+

Üzgünüz, biz' şuanda baya hararetli durumdayız, sonra gel olurmu?

-

Come back in a couple of hours, or check out what others have already generated:

+

Bir kaç saat içinde geri gelin, yada zaten oluşturduğumuz komut istemlerine bakın.

- Browse the library + Kütüphaneyi gez @@ -762,7 +762,7 @@ export function ReversePromptHome({

- Reverse engineered prompt + Tersine mühendislikle oluşturulan komut

{reverseEngineeredRepo ? ( @@ -799,7 +799,7 @@ export function ReversePromptHome({ onClick={copyPrompt} className="relative z-10 rounded border-[3px] border-zinc-900 bg-[#ffc480] px-3 py-1.5 text-xs font-medium text-zinc-900 transition-transform group-hover:-translate-x-px group-hover:-translate-y-px" > - {copied ? "Copied!" : "Copy"} + {copied ? "Kopyalandı!" : "Copy"}
@@ -809,7 +809,7 @@ export function ReversePromptHome({ {!lastResultWasCustom && !loading ? (

- Want more depth?{" "} + Biraz daha derinlikmi?{" "} - Deep Reverse + Derin Tersine Mühendislik

) : null} @@ -849,7 +849,7 @@ export function ReversePromptHome({ > - Discord + Discord Sunucumuz
diff --git a/lib/file-tree-formatter.ts b/lib/file-tree-formatter.ts index 91c4f69..784e2b2 100644 --- a/lib/file-tree-formatter.ts +++ b/lib/file-tree-formatter.ts @@ -1,5 +1,5 @@ /** - * Formats GitHub file tree data into a readable directory structure. + * GitHub dosya ağacı verisini okunabilir formata dönüştürür. */ interface FileTreeItem { diff --git a/lib/focus-fingerprint.ts b/lib/focus-fingerprint.ts index f71e6e8..d57f09d 100644 --- a/lib/focus-fingerprint.ts +++ b/lib/focus-fingerprint.ts @@ -1,9 +1,9 @@ import { createHash } from "node:crypto"; -/** MD5 hex of UTF-8 focus — must match `md5(focus::text)` in Postgres (`focus_fingerprint`). */ +/** UTF-8 formatındaki focus öğesinin MD5 onaltılık değeri — Postgres’teki `md5(focus::text)` ile eşleşmelidir (`focus_fingerprint`). */ export function focusFingerprint(focus: string): string { return createHash("md5").update(focus, "utf8").digest("hex"); } -/** Upstream / cache key for Deep Reverse. */ +/** Deep Reverse için akış / önbellek anahtarı. */ export const DEEP_REVERSE_FOCUS = "[deep] whole codebase"; diff --git a/lib/github-client.ts b/lib/github-client.ts index 0571e09..21d9cb4 100644 --- a/lib/github-client.ts +++ b/lib/github-client.ts @@ -1,5 +1,5 @@ /** - * GitHub API Client — native fetch. + * GitHub API İstemcisi - Native Fetch */ const GITHUB_API = "https://api.github.com"; diff --git a/lib/home-example-repos.ts b/lib/home-example-repos.ts index 65b14f8..98f19ef 100644 --- a/lib/home-example-repos.ts +++ b/lib/home-example-repos.ts @@ -1,6 +1,6 @@ import { normalizeRepoSegment, parseGitHubRepoInput } from "@/lib/parse-github-repo"; -/** Hero “Try example repos” — excluded from view-count tracking so usage stats stay representative. */ +/** Hero “Örnek Depoları deneyin” — görüntüleme sayımı izlemesinden hariç tutulmuştur; böylece kullanım istatistikleri temsil edici kalır.*/ export const HOME_EXAMPLES = [ { label: "Next.js", url: "https://github.com/vercel/next.js" }, { label: "Openclaw", url: "https://github.com/openclaw/openclaw" }, diff --git a/lib/parse-github-repo.ts b/lib/parse-github-repo.ts index 2654b03..9e40804 100644 --- a/lib/parse-github-repo.ts +++ b/lib/parse-github-repo.ts @@ -20,7 +20,7 @@ export function parseGitHubRepoInput( return { owner: parts[0], repo: withoutGit(parts[1]) }; } } catch { - // fall through to owner/repo form + // Sahip/Depo formuna doğru düş } const parts = s.split("/").filter(Boolean); @@ -31,12 +31,12 @@ export function parseGitHubRepoInput( return null; } -/** Strip trailing `.git` for path validation (URL segment may include it). */ +/** Yol Doğrulaması (.git) (URL parçası bunu dahil edebilir). */ export function normalizeRepoSegment(repo: string): string { return repo.trim().replace(/\.git$/i, ""); } -/** Validates dynamic route segments for `/[owner]/[repo]`. */ +/** `/[owner]/[repo]` için dinamik yol parçalarını doğrular. */ export function isValidGitHubRepoPath(owner: string, repo: string): boolean { const o = owner.trim(); const r = normalizeRepoSegment(repo); diff --git a/lib/supabase.ts b/lib/supabase.ts index 6816278..0e93d6d 100644 --- a/lib/supabase.ts +++ b/lib/supabase.ts @@ -2,7 +2,7 @@ import { createClient, type SupabaseClient } from "@supabase/supabase-js"; let cached: SupabaseClient | null = null; -/** Server-side Supabase client; returns null if env is not configured (cache disabled). */ +/** Sunucu Tarafı Supabase istemcisi; ortam ayarlanmamışsa "null" döner. (cache disabled). */ export function getSupabase(): SupabaseClient | null { const url = process.env.SUPABASE_URL?.trim(); const key = process.env.SUPABASE_PUBLISHABLE_KEY?.trim(); diff --git a/lib/system-prompt.ts b/lib/system-prompt.ts index d8b2a81..ee7d852 100644 --- a/lib/system-prompt.ts +++ b/lib/system-prompt.ts @@ -1,32 +1,32 @@ /** - * System prompt: synthesize one user-facing prompt from repo context (README, tree, metadata). + * Sistem Promptu: depo içeriğinden kullanıcıya yönelik komut istemi oluşturma. (README, tree, metadata). */ -export const SYSTEM_PROMPT = `You are an expert at inferring how people actually prompt modern coding agents. +export const SYSTEM_PROMPT = `Sen modern kodlama ajanlarının insanların gerçekte nasıl prompt yazdığını çıkarsamada uzmansın. -## Task +## Görev -You are given **repository metadata**, a **root file tree** (depth 1), and the **README** for a public GitHub project. Output **one synthetic user message**: the kind of prompt a **non-technical or lightly technical** person might paste into Cursor, Claude Code, Codex, ChatGPT code mode, or v0 to get this project built in one "vibe coding" pass. +Sana bir public GitHub projesinin repository metadatası, kök dosya ağacı (1. derinlik) ve README dosyası verilecek. Bir sentetik kullanıcı mesajı yaz: Cursor, Claude Code, Codex, ChatGPT kod modu veya v0 gibi araçlara tek bir "vibe coding" geçişinde bu projeyi yaptırmak için teknik olmayan ya da hafif teknik bir kişinin yapıştırabileceği türden bir prompt. -## What the output must be +## Çıktının özellikleri -- **Plain language.** Sounds like a real request ("Build me…", "I want…"), not an architecture doc. -- **Outcome focused.** Describe what the app or library should *do* for a user using words a normal person would use. -- **Honest scope.** Only claim features or stacks you infer from the README and tree you received. If the README was missing, empty, or uninformative, say so implicitly by keeping claims vague or limited to what the metadata suggests. -- **Length:** about **120 to 200 words**, usually one short paragraph or a few tight sentences. Not a bullet list of file paths or dependencies. -- **Tone:** natural and conversational. Use contractions when they fit. No preamble ("Sure, here is…"), no meta ("As an AI…"), no filler. +- Sade dil. Gerçek bir istek gibi ses çıkarsın ("Bana şunu yap…", "İstiyorum ki…"), mimari belge gibi değil. +- Sonuç odaklı. Uygulamanın ya da kütüphanenin kullanıcı için ne yapacağını sıradan bir insanın kullanacağı kelimelerle anlat. +- Dürüst kapsam. Sadece README'den ve ağaçtan çıkarsadığın özellikleri ya da teknoloji yığınlarını öne sür. README eksikse, boşsa ya da bilgi vermiyorsa bunu dolaylı olarak yansıt; iddiaları muğlak bırak ya da yalnızca metadatanın ima ettikleriyle sınırla. +- Uzunluk: yaklaşık 120 ile 200 kelime, genellikle kısa bir paragraf ya da birkaç sıkı cümle. Dosya yolları veya bağımlılıkların madde listesi olmasın. +- Ton: doğal ve sohbet havasında. Uygun düştüğünde kısaltma kullan. Giriş cümlesi yok ("Tabii, işte…"), meta yorum yok ("Bir yapay zeka olarak…"), dolgu yok. -## What to avoid +## Kaçınılacaklar -- Dumping framework jargon, exact package names, or folder structure unless the README clearly shows the user cared about that. -- Writing agent *system* instructions, markdown specs, or pseudo-code blocks. -- Inventing features that are not supported by the evidence in the context. +- README'de kullanıcının önemsediği açıkça gösterilmiyorsa framework jargonu, tam paket adları veya klasör yapısı dökme. +- Ajan sistem talimatları, markdown spesifikasyonları veya sözde kod blokları yazma. +- Bağlamdan desteklenmeyen özellikler icat etme. -## Context you can assume about tools +## Araçlar hakkında varsayılabilecek bağlam -Many agents today can **search the web**, **read docs**, and iterate in the IDE. It is fine for the synthetic prompt to include **one short line** like "look up current docs online if you need to" when that matches how people actually work. Do not turn the whole prompt into a product tutorial. +Günümüzdeki pek çok ajan web'de arama yapabilir, dokümantasyon okuyabilir ve IDE içinde iterasyon yapabilir. İnsanların gerçekten böyle çalıştığıyla örtüşüyorsa, sentetik prompta "gerekirse güncel dokümanlara internetten bakabilirsin" gibi kısa bir satır eklemek uygundur. Promptun tamamını ürün anlatısına dönüştürme. -## Output format +## Çıktı formatı -Reply with **only** the synthetic user message. No title, no quotes around it, no explanation before or after. +Yalnızca sentetik kullanıcı mesajını yaz. Başlık yok, etrafında tırnak yok, önce ya da sonra açıklama yok. `; diff --git a/next.config.ts b/next.config.ts index e9ffa30..9fc09aa 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,7 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - /* config options here */ + /* Yapılandırma ayarları buraya! */ }; export default nextConfig;