tillerhand 3.43.0 → 3.47.1

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.
Files changed (185) hide show
  1. package/.claude/agents/board-chair.md +20 -20
  2. package/.claude/agents/code-reviewer.md +20 -20
  3. package/.claude/agents/council-advisor.md +14 -14
  4. package/.claude/agents/security-auditor.md +30 -30
  5. package/.claude/agents/test-writer.md +22 -22
  6. package/.claude/board/board-ai.md +25 -25
  7. package/.claude/board/board-api.md +25 -25
  8. package/.claude/board/board-architect.md +28 -28
  9. package/.claude/board/board-devops.md +25 -25
  10. package/.claude/board/board-mobile.md +25 -25
  11. package/.claude/board/board-performance.md +24 -24
  12. package/.claude/board/board-privacy.md +25 -25
  13. package/.claude/board/board-product.md +26 -26
  14. package/.claude/board/board-qa.md +28 -28
  15. package/.claude/board/board-ux.md +26 -26
  16. package/.claude/board/council.md +76 -76
  17. package/.claude/board/rules.md +61 -61
  18. package/.claude/claude-security-guidance.md +10 -10
  19. package/.claude/commands/adopt.md +70 -69
  20. package/.claude/commands/ask-mode.md +9 -9
  21. package/.claude/commands/board.md +15 -15
  22. package/.claude/commands/build.md +47 -47
  23. package/.claude/commands/dashboard.md +17 -17
  24. package/.claude/commands/design.md +31 -31
  25. package/.claude/commands/findings-all.md +14 -14
  26. package/.claude/commands/findings-business.md +7 -7
  27. package/.claude/commands/findings-legal.md +7 -7
  28. package/.claude/commands/findings-perf.md +7 -7
  29. package/.claude/commands/findings-security.md +9 -9
  30. package/.claude/commands/findings-tech.md +7 -7
  31. package/.claude/commands/findings-ux.md +7 -7
  32. package/.claude/commands/fix-bug.md +15 -15
  33. package/.claude/commands/freeze.md +8 -8
  34. package/.claude/commands/handoff.md +38 -38
  35. package/.claude/commands/kit-update.md +17 -14
  36. package/.claude/commands/language.md +13 -0
  37. package/.claude/commands/maintain.md +19 -19
  38. package/.claude/commands/plan-task.md +32 -32
  39. package/.claude/commands/qa.md +17 -17
  40. package/.claude/commands/release.md +40 -40
  41. package/.claude/commands/research.md +31 -31
  42. package/.claude/commands/retro.md +32 -32
  43. package/.claude/commands/review-changes.md +15 -15
  44. package/.claude/commands/rollback.md +24 -24
  45. package/.claude/commands/start.md +116 -113
  46. package/.claude/commands/tools.md +11 -11
  47. package/.claude/commands/user-feedback.md +11 -11
  48. package/.claude/commands/wrap-up.md +18 -18
  49. package/.claude/findings/lenses/business.md +24 -24
  50. package/.claude/findings/lenses/legal.md +29 -29
  51. package/.claude/findings/lenses/perf.md +19 -19
  52. package/.claude/findings/lenses/security.md +30 -30
  53. package/.claude/findings/lenses/tech.md +23 -23
  54. package/.claude/findings/lenses/ux.md +19 -19
  55. package/.claude/findings/protocol.md +54 -54
  56. package/.claude/findings/report-template.md +30 -30
  57. package/.claude/hooks/budget.mjs +7 -7
  58. package/.claude/hooks/checkpoint.mjs +12 -12
  59. package/.claude/hooks/commit-gate.mjs +38 -37
  60. package/.claude/hooks/cost.mjs +2 -2
  61. package/.claude/hooks/council.mjs +3 -3
  62. package/.claude/hooks/dashboard-data.mjs +4 -3
  63. package/.claude/hooks/dashboard.mjs +164 -149
  64. package/.claude/hooks/destructive-guard.mjs +74 -64
  65. package/.claude/hooks/edit-rounds.mjs +3 -3
  66. package/.claude/hooks/flow.mjs +10 -10
  67. package/.claude/hooks/freeze-guard.mjs +27 -23
  68. package/.claude/hooks/gate.mjs +25 -25
  69. package/.claude/hooks/guard-secrets.mjs +11 -11
  70. package/.claude/hooks/lang.mjs +114 -0
  71. package/.claude/hooks/messages.mjs +495 -0
  72. package/.claude/hooks/models.mjs +14 -11
  73. package/.claude/hooks/notify.mjs +3 -2
  74. package/.claude/hooks/package-gate.mjs +17 -15
  75. package/.claude/hooks/plugins-sync.mjs +9 -9
  76. package/.claude/hooks/prefs.mjs +19 -19
  77. package/.claude/hooks/preview.mjs +11 -11
  78. package/.claude/hooks/progress.mjs +14 -14
  79. package/.claude/hooks/qa-report.mjs +11 -10
  80. package/.claude/hooks/reminder.mjs +6 -3
  81. package/.claude/hooks/session-start.mjs +23 -17
  82. package/.claude/hooks/shared.mjs +1 -1
  83. package/.claude/hooks/status-read.mjs +5 -4
  84. package/.claude/hooks/statusline.mjs +14 -11
  85. package/.claude/hooks/structure-guard.mjs +9 -9
  86. package/.claude/hooks/test-guard.mjs +12 -12
  87. package/.claude/hooks/tools.mjs +28 -29
  88. package/.claude/hooks/usage.mjs +18 -15
  89. package/.claude/output-styles/anlatici.md +28 -28
  90. package/.claude/security-patterns.json +3 -3
  91. package/.claude/settings.json +2 -0
  92. package/.claude/skills/logo-design/SKILL.md +42 -42
  93. package/.claude/skills/motion-video/SKILL.md +52 -52
  94. package/.claude/skills/source-research/SKILL.md +35 -35
  95. package/.claude/skills/ui-motion/SKILL.md +38 -38
  96. package/.github/workflows/kit-tests.yml +7 -7
  97. package/.github/workflows/npm-publish.yml +16 -16
  98. package/AGENTS.md +56 -56
  99. package/CHANGELOG.md +7 -7
  100. package/CLAUDE.md +5 -5
  101. package/README.md +199 -172
  102. package/README.tr.md +292 -0
  103. package/docs/architecture/overview.md +31 -31
  104. package/docs/architecture/stack.md +2 -2
  105. package/docs/archive/README.md +4 -4
  106. package/docs/decisions/adr-template.md +14 -14
  107. package/docs/decisions/log.md +10 -10
  108. package/docs/findings/README.md +13 -13
  109. package/docs/findings/config.md +13 -13
  110. package/docs/legal/privacy-kvkk.md +1 -1
  111. package/docs/operations/accounts.md +25 -25
  112. package/docs/operations/deploy-setup.md +64 -64
  113. package/docs/operations/feature-flags.md +17 -17
  114. package/docs/operations/maintenance.md +48 -48
  115. package/docs/operations/release-checklist.md +61 -61
  116. package/docs/operations/spend-alarms.md +28 -28
  117. package/docs/product/feedback.md +9 -8
  118. package/docs/product/glossary.md +16 -16
  119. package/docs/product/launch.md +28 -28
  120. package/docs/product/prd.md +43 -42
  121. package/docs/product/roadmap.md +31 -30
  122. package/docs/product/specs/_template.md +13 -12
  123. package/docs/product/unit-economics.md +23 -22
  124. package/docs/quality/metrics.md +14 -14
  125. package/docs/quality/retros.md +11 -11
  126. package/docs/quality/test-plan.md +48 -48
  127. package/docs/security/checklist.md +57 -57
  128. package/docs/workflow/board.md +7 -7
  129. package/docs/workflow/cost-log.md +4 -4
  130. package/docs/workflow/decision-protocol.md +70 -70
  131. package/docs/workflow/learning.md +4 -4
  132. package/docs/workflow/mcp-catalog.md +31 -31
  133. package/docs/workflow/models.md +35 -35
  134. package/docs/workflow/progress.md +7 -7
  135. package/docs/workflow/skills.md +108 -108
  136. package/docs/workflow/usage-limits.md +62 -62
  137. package/kit/CHANGELOG.md +882 -841
  138. package/kit/VERSION +1 -1
  139. package/kit/guide.html +713 -477
  140. package/kit/guide.tr.html +1328 -0
  141. package/kit/kit.mjs +56 -54
  142. package/kit/project/README.md +29 -29
  143. package/kit/project/gitignore +12 -12
  144. package/kit/templates/addons/ai/.env.example.append +5 -5
  145. package/kit/templates/addons/ai/ai/evals/README.md +11 -11
  146. package/kit/templates/addons/ai/ai/evals/cases.jsonl +2 -2
  147. package/kit/templates/addons/ai/ai/prompts/README.md +8 -8
  148. package/kit/templates/addons/ai/docs/ai/guide.md +56 -56
  149. package/kit/templates/backend/.claude/hooks/format.mjs +1 -1
  150. package/kit/templates/backend/.claude/structure.json +1 -1
  151. package/kit/templates/backend/.env.example +6 -6
  152. package/kit/templates/backend/.github/dependabot.yml +1 -1
  153. package/kit/templates/backend/.github/workflows/ci.yml +13 -13
  154. package/kit/templates/backend/.github/workflows/claude-ci-fix.yml +19 -19
  155. package/kit/templates/backend/.github/workflows/claude-maintenance.yml +18 -18
  156. package/kit/templates/backend/.github/workflows/live-monitoring.yml +14 -14
  157. package/kit/templates/backend/.pre-commit-config.yaml +3 -3
  158. package/kit/templates/backend/docs/architecture/stack.md +98 -98
  159. package/kit/templates/backend/docs/architecture/structure.md +34 -34
  160. package/kit/templates/mobile/.claude/structure.json +1 -1
  161. package/kit/templates/mobile/.env.example +6 -6
  162. package/kit/templates/mobile/.github/dependabot.yml +2 -2
  163. package/kit/templates/mobile/.github/workflows/ci.yml +18 -18
  164. package/kit/templates/mobile/.github/workflows/claude-ci-fix.yml +19 -19
  165. package/kit/templates/mobile/.github/workflows/claude-maintenance.yml +18 -18
  166. package/kit/templates/mobile/.gitignore.append +2 -2
  167. package/kit/templates/mobile/docs/architecture/stack.md +113 -113
  168. package/kit/templates/mobile/docs/architecture/structure.md +33 -33
  169. package/kit/templates/mobile/docs/design/design-guide.md +37 -37
  170. package/kit/templates/mobile/tests/security/rls.mjs +22 -22
  171. package/kit/templates/web-saas/.claude/structure.json +1 -1
  172. package/kit/templates/web-saas/.env.example +11 -11
  173. package/kit/templates/web-saas/.github/dependabot.yml +3 -3
  174. package/kit/templates/web-saas/.github/workflows/ci.yml +20 -20
  175. package/kit/templates/web-saas/.github/workflows/claude-ci-fix.yml +19 -19
  176. package/kit/templates/web-saas/.github/workflows/claude-maintenance.yml +18 -18
  177. package/kit/templates/web-saas/.github/workflows/live-monitoring.yml +12 -12
  178. package/kit/templates/web-saas/docs/architecture/stack.md +116 -116
  179. package/kit/templates/web-saas/docs/architecture/structure.md +44 -44
  180. package/kit/templates/web-saas/docs/design/design-guide.md +38 -38
  181. package/kit/templates/web-saas/tests/live/smoke.spec.ts +4 -4
  182. package/kit/templates/web-saas/tests/security/rls.mjs +22 -22
  183. package/kit/tools/codex/.codex/hooks.json +1 -1
  184. package/package.json +2 -2
  185. package/README.en.md +0 -267
@@ -0,0 +1,495 @@
1
+ // Text hooks show the user directly, in Turkish and English. Other languages: .claude/i18n/<lang>.json, written once by the AI
2
+ // (node .claude/hooks/lang.mjs --export → translate → --write). Words in braces ({command}, {step}) are placeholders; keep them in every translation.
3
+ export const MESSAGES = {
4
+ 'session.begin': { tr: 'Başlamak için: /start [proje fikrin] · var olan projede: /adopt', en: 'To begin: /start [your project idea] · existing project: /adopt' },
5
+ 'session.resume': { tr: 'Devam: {command} (adım {step})', en: 'Continue: {command} (step {step})' },
6
+ 'session.next': { tr: 'Sıradaki: /build {code} · {title}', en: 'Next: /build {code} · {title}' },
7
+ 'session.handoff': { tr: 'Devir notu var: /handoff devral', en: 'Handoff note waiting: /handoff devral' },
8
+ 'session.handoffThen': { tr: 'Devir notu var: /handoff devral · sonra {next}', en: 'Handoff note waiting: /handoff devral · then {next}' },
9
+ 'dashboard.title': { tr: 'Kontrol paneli', en: 'Dashboard' },
10
+ 'dashboard.sevCritical': { tr: 'Kritik', en: 'Critical' },
11
+ 'dashboard.sevWarn': { tr: 'Dikkat', en: 'Attention' },
12
+ 'dashboard.sevInfo': { tr: 'Bilgi', en: 'Info' },
13
+ 'dashboard.sevGood': { tr: 'Yolunda', en: 'On track' },
14
+ 'dashboard.healthWarn': { tr: 'Dikkat gerekiyor', en: 'Needs attention' },
15
+ 'dashboard.healthCritical': { tr: 'Engel var', en: 'Blocked' },
16
+ 'dashboard.kitNotInstalled': { tr: 'kit kurulmadı', en: 'kit not set up' },
17
+ 'dashboard.kitVersion': { tr: 'kit {version}', en: 'kit {version}' },
18
+ 'dashboard.autoRefresh': { tr: '30 sn\'de yenile', en: 'Refresh every 30 s' },
19
+ 'dashboard.now': { tr: 'Şimdi', en: 'Now' },
20
+ 'dashboard.questionMode': { tr: 'Soru modu', en: 'Question mode' },
21
+ 'dashboard.profile': { tr: 'Profil', en: 'Profile' },
22
+ 'dashboard.lastUpdate': { tr: 'Son güncelleme', en: 'Last updated' },
23
+ 'dashboard.startStep': { tr: 'Başlangıç adımı', en: 'Start step' },
24
+ 'dashboard.nextStep': { tr: 'Sıradaki adım', en: 'Next step' },
25
+ 'dashboard.pasteHint': { tr: 'Kopyala, Claude sohbetine yapıştır.', en: 'Copy it and paste it into the Claude chat.' },
26
+ 'dashboard.status': { tr: 'Durum', en: 'Status' },
27
+ 'dashboard.attention': { tr: 'Dikkat gerektirenler', en: 'Needs attention' },
28
+ 'dashboard.moreItems': { tr: '{count} madde daha', en: '{count} more' },
29
+ 'dashboard.allGood': { tr: 'Her şey yolunda', en: 'All good' },
30
+ 'dashboard.allGoodText': { tr: 'Bekleyen karar, kritik bulgu veya açık sorun yok.', en: 'No pending decision, critical finding or open issue.' },
31
+ 'dashboard.copy': { tr: 'Kopyala', en: 'Copy' },
32
+ 'dashboard.copied': { tr: 'Kopyalandı', en: 'Copied' },
33
+ 'dashboard.copyFailed': { tr: 'Kopyalanamadı', en: 'Copy failed' },
34
+ 'dashboard.copyAria': { tr: '{command} komutunu kopyala', en: 'Copy the {command} command' },
35
+ 'dashboard.startIdeaCode': { tr: '`/start [fikrin]`', en: '`/start [your idea]`' },
36
+ 'dashboard.kpiTasks': { tr: 'Görevler', en: 'Tasks' },
37
+ 'dashboard.donePct': { tr: '%{percent} tamam', en: '{percent}% done' },
38
+ 'dashboard.acceptanceTests': { tr: 'Kabul testleri', en: 'Acceptance tests' },
39
+ 'dashboard.criteriaTested': { tr: '{count} kriterin testi var', en: '{count} criteria have a test' },
40
+ 'dashboard.kpiMvp': { tr: 'MVP kriterleri', en: 'MVP criteria' },
41
+ 'dashboard.featuresCount': { tr: '{count} özellik', en: '{count} features' },
42
+ 'dashboard.kpiDecisions': { tr: 'Kararlar', en: 'Decisions' },
43
+ 'dashboard.usersAuto': { tr: '{user} kullanıcı · {auto} otomatik', en: '{user} user · {auto} auto' },
44
+ 'dashboard.board': { tr: 'Kurul', en: 'Board' },
45
+ 'dashboard.rejects': { tr: '{count} RET', en: '{count} RET' },
46
+ 'dashboard.membersCount': { tr: '{count} üye', en: '{count} members' },
47
+ 'dashboard.kpiCommits7': { tr: 'Commit · 7 gün', en: 'Commits · 7 days' },
48
+ 'dashboard.filesWaiting': { tr: '{count} dosya bekliyor', en: '{count} files waiting' },
49
+ 'dashboard.noGit': { tr: 'git yok', en: 'no git' },
50
+ 'dashboard.kpiLimit': { tr: 'Limit', en: 'Limit' },
51
+ 'dashboard.weeklyLevel': { tr: 'haftalık %{percent} · {level}', en: 'weekly {percent}% · {level}' },
52
+ 'dashboard.unknown': { tr: 'bilinmiyor', en: 'unknown' },
53
+ 'dashboard.tabsLabel': { tr: 'Bölümler', en: 'Sections' },
54
+ 'dashboard.tabOverview': { tr: 'Genel', en: 'Overview' },
55
+ 'dashboard.tabRoadmap': { tr: 'Yol haritası', en: 'Roadmap' },
56
+ 'dashboard.tabDecisions': { tr: 'Kararlar', en: 'Decisions' },
57
+ 'dashboard.tabFindings': { tr: 'Bulgular', en: 'Findings' },
58
+ 'dashboard.tabQuality': { tr: 'Kalite', en: 'Quality' },
59
+ 'dashboard.tabActivity': { tr: 'Aktivite', en: 'Activity' },
60
+ 'dashboard.tabProduct': { tr: 'Ürün ve teknik', en: 'Product and tech' },
61
+ 'dashboard.tabOperations': { tr: 'Operasyon', en: 'Operations' },
62
+ 'dashboard.tabLimit': { tr: 'Limit ve maliyet', en: 'Limit and cost' },
63
+ 'dashboard.footer': { tr: 'Üretildi: {when} · Kaynak: docs/*.md, git, .claude/state/usage.json · Her Claude cevabından sonra otomatik güncellenir (<code>node .claude/hooks/dashboard.mjs</code>)', en: 'Generated: {when} · Source: docs/*.md, git, .claude/state/usage.json · Updated automatically after every Claude answer (<code>node .claude/hooks/dashboard.mjs</code>)' },
64
+ 'dashboard.statusSummary': { tr: 'Durum özeti', en: 'Status summary' },
65
+ 'dashboard.noSummary': { tr: 'Henüz özet yok.', en: 'No summary yet.' },
66
+ 'dashboard.lastSession': { tr: 'Son oturumda', en: 'In the last session' },
67
+ 'dashboard.noRecords': { tr: 'Kayıt yok.', en: 'No records.' },
68
+ 'dashboard.recentActivity': { tr: 'Son hareketler', en: 'Recent activity' },
69
+ 'dashboard.noActivity': { tr: 'Henüz hareket yok.', en: 'No activity yet.' },
70
+ 'dashboard.stages': { tr: 'Aşamalar', en: 'Stages' },
71
+ 'dashboard.stageStart': { tr: 'Başlangıç', en: 'Start' },
72
+ 'dashboard.stageStartLetter': { tr: 'B', en: 'S' },
73
+ 'dashboard.feedCommit': { tr: 'commit', en: 'commit' },
74
+ 'dashboard.feedDecision': { tr: 'karar', en: 'decision' },
75
+ 'dashboard.feedBoard': { tr: 'kurul', en: 'board' },
76
+ 'dashboard.feedMaintenance': { tr: 'bakım', en: 'maintenance' },
77
+ 'dashboard.commitKindOther': { tr: 'diğer', en: 'other' },
78
+ 'dashboard.noRoadmap': { tr: 'Yol haritası henüz yok. `/start` Adım 8\'de oluşur.', en: 'The roadmap does not exist yet. It is created in `/start` step 8.' },
79
+ 'dashboard.topicFilter': { tr: 'Konu filtresi', en: 'Topic filter' },
80
+ 'dashboard.all': { tr: 'Hepsi', en: 'All' },
81
+ 'dashboard.auto': { tr: 'otomatik', en: 'auto' },
82
+ 'dashboard.oneWay': { tr: 'tek yönlü', en: 'one-way' },
83
+ 'dashboard.user': { tr: 'kullanıcı', en: 'user' },
84
+ 'dashboard.noDecisions': { tr: 'Henüz karar verilmedi. Kararlar `/start` ile başlar.', en: 'No decision made yet. Decisions start with `/start`.' },
85
+ 'dashboard.members': { tr: 'Üyeler', en: 'Members' },
86
+ 'dashboard.boardSetUp': { tr: 'kuruldu', en: 'set up' },
87
+ 'dashboard.notSetUp': { tr: 'kurulmadı', en: 'not set up' },
88
+ 'dashboard.boardNotSetUp': { tr: 'Kurul kurulmadı.', en: 'The board is not set up.' },
89
+ 'dashboard.commitReview': { tr: 'Commit denetimi: {value}', en: 'Commit review: {value}' },
90
+ 'dashboard.on': { tr: 'açık', en: 'on' },
91
+ 'dashboard.off': { tr: 'kapalı', en: 'off' },
92
+ 'dashboard.summary': { tr: 'Özet', en: 'Summary' },
93
+ 'dashboard.kpiMeetings': { tr: 'Toplantı', en: 'Meetings' },
94
+ 'dashboard.kpiApproval': { tr: 'Onay oranı', en: 'Approval rate' },
95
+ 'dashboard.criticalFinding': { tr: 'kritik bulgu', en: 'critical finding' },
96
+ 'dashboard.councilHeading': { tr: 'Konsey · ilk görüş → anonim çapraz oy → başkan', en: 'Council · first opinion → anonymous cross vote → chair' },
97
+ 'dashboard.noDecision': { tr: 'karar yok', en: 'no decision' },
98
+ 'dashboard.latestCouncil': { tr: 'Son: {topic}', en: 'Latest: {topic}' },
99
+ 'dashboard.low': { tr: 'düşük', en: 'low' },
100
+ 'dashboard.kpiDisputed': { tr: 'Tartışmalı', en: 'Disputed' },
101
+ 'dashboard.kpiEliminated': { tr: 'Elenen', en: 'Eliminated' },
102
+ 'dashboard.byCrossVote': { tr: 'çapraz oyla', en: 'by cross vote' },
103
+ 'dashboard.overallRanking': { tr: 'Toplu sıralama', en: 'Overall ranking' },
104
+ 'dashboard.opinion': { tr: 'Görüş {letter}', en: 'Opinion {letter}' },
105
+ 'dashboard.avg': { tr: 'ort. {average}', en: 'avg. {average}' },
106
+ 'dashboard.open': { tr: 'aç', en: 'open' },
107
+ 'dashboard.noCouncil': { tr: 'Henüz konsey toplanmadı. Plan, faz sonu, canlıya alma ve tek yönlü kararlarda otomatik toplanır.', en: 'No council has met yet. It meets automatically for plans, end of phase, going live and one-way decisions.' },
108
+ 'dashboard.meetingLog': { tr: 'Toplantı günlüğü', en: 'Meeting log' },
109
+ 'dashboard.noMeetings': { tr: 'Henüz toplantı yapılmadı.', en: 'No meeting held yet.' },
110
+ 'dashboard.checklists': { tr: 'Kontrol listeleri', en: 'Checklists' },
111
+ 'dashboard.codeHealth': { tr: 'Kod sağlığı · son 30 gün', en: 'Code health · last 30 days' },
112
+ 'dashboard.fixRate': { tr: 'Düzeltme oranı', en: 'Fix rate' },
113
+ 'dashboard.uncommitted': { tr: 'Commit edilmemiş', en: 'Uncommitted' },
114
+ 'dashboard.fixRateNote': { tr: 'Yüksek düzeltme oranı, yeni özelliklerin sık bozulduğunu gösterebilir; retroda konuşulmalı.', en: 'A high fix rate can mean new features break often; discuss it in the retro.' },
115
+ 'dashboard.lastQa': { tr: 'Son QA · {name}', en: 'Last QA · {name}' },
116
+ 'dashboard.passed': { tr: 'Geçti', en: 'Passed' },
117
+ 'dashboard.failed': { tr: 'Kaldı', en: 'Failed' },
118
+ 'dashboard.notRun': { tr: 'Koşulmadı', en: 'Not run' },
119
+ 'dashboard.withEvidence': { tr: 'kanıtıyla', en: 'with evidence' },
120
+ 'dashboard.openReport': { tr: 'raporu aç', en: 'open report' },
121
+ 'dashboard.kpiTested': { tr: 'Testi olan', en: 'With a test' },
122
+ 'dashboard.kpiPassing': { tr: 'Geçen', en: 'Passing' },
123
+ 'dashboard.reportTime': { tr: 'rapor: {when}', en: 'report: {when}' },
124
+ 'dashboard.noJunit': { tr: 'JUnit raporu yok', en: 'No JUnit report' },
125
+ 'dashboard.noAcceptanceIds': { tr: 'PRD\'de kimlikli kabul kriteri yok (`Ö-01.1` biçimi).', en: 'The PRD has no acceptance criteria with an id (`Ö-01.1` format).' },
126
+ 'dashboard.metricsMonthly': { tr: 'Metrikler · aylık', en: 'Metrics · monthly' },
127
+ 'dashboard.noMetrics': { tr: 'Henüz metrik kaydı yok. `/maintain monthly` ve `/retro` ekler.', en: 'No metrics recorded yet. `/maintain monthly` and `/retro` add them.' },
128
+ 'dashboard.criticalFlowTests': { tr: 'Kritik akış testleri', en: 'Critical flow tests' },
129
+ 'dashboard.present': { tr: 'var', en: 'present' },
130
+ 'dashboard.missing': { tr: 'yok', en: 'missing' },
131
+ 'dashboard.noTestPlan': { tr: 'Test planı yok.', en: 'No test plan.' },
132
+ 'dashboard.maintenanceLog': { tr: 'Bakım kaydı', en: 'Maintenance log' },
133
+ 'dashboard.noMaintenance': { tr: 'Henüz bakım yapılmadı.', en: 'No maintenance done yet.' },
134
+ 'dashboard.lastRetro': { tr: 'Son retro: {value}', en: 'Last retro: {value}' },
135
+ 'dashboard.commitsLast14': { tr: 'Commit · son 14 gün', en: 'Commits · last 14 days' },
136
+ 'dashboard.totalParen': { tr: '(toplam {total})', en: '(total {total})' },
137
+ 'dashboard.sparkAria': { tr: 'Son 14 günde günlük commit sayısı', en: 'Daily commit count over the last 14 days' },
138
+ 'dashboard.commitTip': { tr: '{date}: {count} commit', en: '{date}: {count} commits' },
139
+ 'dashboard.today': { tr: 'bugün', en: 'today' },
140
+ 'dashboard.showTable': { tr: 'Tablo olarak göster', en: 'Show as table' },
141
+ 'dashboard.feed': { tr: 'Akış', en: 'Feed' },
142
+ 'dashboard.product': { tr: 'Ürün', en: 'Product' },
143
+ 'dashboard.problem': { tr: 'Problem', en: 'Problem' },
144
+ 'dashboard.noPrd': { tr: 'PRD henüz yazılmadı.', en: 'The PRD has not been written yet.' },
145
+ 'dashboard.valueProp': { tr: 'Değer önerisi', en: 'Value proposition' },
146
+ 'dashboard.outOfScope': { tr: 'Kapsam dışı', en: 'Out of scope' },
147
+ 'dashboard.mvpFeatures': { tr: 'MVP özellikleri', en: 'MVP features' },
148
+ 'dashboard.noMvp': { tr: 'MVP henüz tanımlanmadı.', en: 'The MVP is not defined yet.' },
149
+ 'dashboard.criteriaResults': { tr: 'Kabul kriterleri · test sonucu', en: 'Acceptance criteria · test result' },
150
+ 'dashboard.passedBadge': { tr: 'geçti', en: 'passed' },
151
+ 'dashboard.failedBadge': { tr: 'kaldı', en: 'failed' },
152
+ 'dashboard.noResult': { tr: 'sonuç yok', en: 'no result' },
153
+ 'dashboard.noTest': { tr: 'test yok', en: 'no test' },
154
+ 'dashboard.technology': { tr: 'Teknoloji', en: 'Technology' },
155
+ 'dashboard.noStack': { tr: 'Stack seçilmedi.', en: 'No stack chosen.' },
156
+ 'dashboard.design': { tr: 'Tasarım', en: 'Design' },
157
+ 'dashboard.noDesign': { tr: 'Tasarım yönü seçilmedi.', en: 'No design direction chosen.' },
158
+ 'dashboard.previews': { tr: 'Önizlemeler', en: 'Previews' },
159
+ 'dashboard.unitEconomics': { tr: 'Birim ekonomisi', en: 'Unit economics' },
160
+ 'dashboard.kpiMargin': { tr: 'Katkı payı', en: 'Contribution margin' },
161
+ 'dashboard.perPayingUserMonth': { tr: 'ödeyen kullanıcı başı / ay', en: 'per paying user / month' },
162
+ 'dashboard.kpiBreakEven': { tr: 'Başa baş', en: 'Break-even' },
163
+ 'dashboard.payingUsers': { tr: 'ödeyen kullanıcı', en: 'paying users' },
164
+ 'dashboard.negativeMargin': { tr: 'katkı negatif', en: 'negative margin' },
165
+ 'dashboard.atTarget': { tr: 'Hedefte ({target} kullanıcı)', en: 'At target ({target} users)' },
166
+ 'dashboard.monthlyProfitLoss': { tr: 'aylık kâr / zarar', en: 'monthly profit / loss' },
167
+ 'dashboard.variableOverPrice': { tr: 'Değişken / fiyat', en: 'Variable / price' },
168
+ 'dashboard.over30': { tr: '%30 üstü', en: 'over 30%' },
169
+ 'dashboard.noInputs': { tr: 'Girdiler boş.', en: 'Inputs are empty.' },
170
+ 'dashboard.userFeedback': { tr: 'Kullanıcı geri bildirimi', en: 'User feedback' },
171
+ 'dashboard.kpiTotal': { tr: 'Toplam', en: 'Total' },
172
+ 'dashboard.kpiNew': { tr: 'Yeni', en: 'New' },
173
+ 'dashboard.kpiPlanned': { tr: 'Planlandı', en: 'Planned' },
174
+ 'dashboard.topThemes': { tr: 'Öne çıkan temalar', en: 'Top themes' },
175
+ 'dashboard.noFeedback': { tr: 'Henüz geri bildirim yok.', en: 'No feedback yet.' },
176
+ 'dashboard.learning': { tr: 'Öğrenme · anlama kontrolü', en: 'Learning · comprehension check' },
177
+ 'dashboard.kpiRight': { tr: 'Doğru', en: 'Right' },
178
+ 'dashboard.kpiWrong': { tr: 'Yanlış', en: 'Wrong' },
179
+ 'dashboard.kpiSuccess': { tr: 'Başarı', en: 'Success rate' },
180
+ 'dashboard.oftenMissed': { tr: 'Sık yanılan kavramlar', en: 'Often missed concepts' },
181
+ 'dashboard.brandPack': { tr: 'Marka paketi', en: 'Brand pack' },
182
+ 'dashboard.filesCount': { tr: '{count} dosya', en: '{count} files' },
183
+ 'dashboard.usageRules': { tr: 'kullanım kuralları', en: 'usage rules' },
184
+ 'dashboard.noLogo': { tr: 'Logo henüz yok.', en: 'No logo yet.' },
185
+ 'dashboard.promoResearch': { tr: 'Tanıtım ve araştırma', en: 'Promo and research' },
186
+ 'dashboard.videos': { tr: 'Videolar', en: 'Videos' },
187
+ 'dashboard.noRender': { tr: 'render yok', en: 'no render' },
188
+ 'dashboard.noVideos': { tr: 'Video yok.', en: 'No videos.' },
189
+ 'dashboard.researchNotes': { tr: 'Araştırma notları', en: 'Research notes' },
190
+ 'dashboard.noNotes': { tr: 'Not yok.', en: 'No notes.' },
191
+ 'dashboard.unreleased': { tr: 'Yayınlanmamış değişiklikler (CHANGELOG)', en: 'Unreleased changes (CHANGELOG)' },
192
+ 'dashboard.noUnreleased': { tr: 'Yayınlanmamış değişiklik yok.', en: 'No unreleased changes.' },
193
+ 'dashboard.limit5h': { tr: '5 saatlik', en: '5-hour' },
194
+ 'dashboard.limitWeeklyLower': { tr: 'haftalık', en: 'weekly' },
195
+ 'dashboard.limitWeekly': { tr: 'Haftalık', en: 'Weekly' },
196
+ 'dashboard.yellowThreshold': { tr: 'sarı eşik', en: 'yellow threshold' },
197
+ 'dashboard.redThreshold': { tr: 'kırmızı eşik', en: 'red threshold' },
198
+ 'dashboard.resetsLabel': { tr: 'Sıfırlanma: {when}', en: 'Resets: {when}' },
199
+ 'dashboard.resetsParen': { tr: '(yenilenme {when})', en: '(resets {when})' },
200
+ 'dashboard.renewed': { tr: 'Yenilendi', en: 'Renewed' },
201
+ 'dashboard.thresholdsNote': { tr: 'eşikler %{yellow} / %{red}', en: 'thresholds {yellow}% / {red}%' },
202
+ 'dashboard.usageLimit': { tr: 'Kullanım limiti', en: 'Usage limit' },
203
+ 'dashboard.contextWindow': { tr: 'Bağlam penceresi', en: 'Context window' },
204
+ 'dashboard.lastSessionShort': { tr: 'Son oturum', en: 'Last session' },
205
+ 'dashboard.contextHint': { tr: '%50\'de /wrap-up + /clear önerilir · {time} itibarıyla', en: '/wrap-up + /clear is suggested at 50% · as of {time}' },
206
+ 'dashboard.noContext': { tr: 'Bağlam bilgisi yok (durum çubuğu yazar).', en: 'No context data (the status line writes it).' },
207
+ 'dashboard.modelEffort': { tr: 'Model ve effort · rol bazında', en: 'Model and effort · per role' },
208
+ 'dashboard.modelsHint': { tr: '/build her görevin başında sorar (docs/workflow/models.md).', en: '/build asks at the start of every task (docs/workflow/models.md).' },
209
+ 'dashboard.tokenCost': { tr: 'Token ve maliyet · son 30 gün', en: 'Tokens and cost · last 30 days' },
210
+ 'dashboard.totalTokens': { tr: 'Toplam token', en: 'Total tokens' },
211
+ 'dashboard.apiEquivalent': { tr: 'API karşılığı', en: 'API equivalent' },
212
+ 'dashboard.notBilled': { tr: 'abonelikte fatura değildir', en: 'not a bill on a subscription' },
213
+ 'dashboard.dailyAvg': { tr: 'Günlük ortalama', en: 'Daily average' },
214
+ 'dashboard.activeDays': { tr: '{count} aktif gün', en: '{count} active days' },
215
+ 'dashboard.ccusageNote': { tr: 'ccusage · {when} itibarıyla · ayrıntı için <code>/session-report</code>', en: 'ccusage · as of {when} · for details see <code>/session-report</code>' },
216
+ 'dashboard.noData': { tr: 'Veri yok.', en: 'No data.' },
217
+ 'dashboard.costLog': { tr: 'Maliyet günlüğü', en: 'Cost log' },
218
+ 'dashboard.avgSize': { tr: 'Ortalama · {size}', en: 'Average · {size}' },
219
+ 'dashboard.recordsCount': { tr: '{count} kayıt', en: '{count} records' },
220
+ 'dashboard.noCostRecords': { tr: 'Henüz kayıt yok. `/build` her görevin limit maliyetini buraya yazar.', en: 'No records yet. `/build` writes each task\'s limit cost here.' },
221
+ 'dashboard.accountsDeadlines': { tr: 'Hesaplar ve son tarihler', en: 'Accounts and deadlines' },
222
+ 'dashboard.noAccounts': { tr: 'Hesap envanteri boş.', en: 'The account inventory is empty.' },
223
+ 'dashboard.none': { tr: 'yok', en: 'none' },
224
+ 'dashboard.daysOverdue': { tr: '{days} gün geçti', en: '{days} days overdue' },
225
+ 'dashboard.daysLeft': { tr: '{days} gün', en: '{days} days' },
226
+ 'dashboard.dateExpiry': { tr: 'bitiş', en: 'expiry' },
227
+ 'dashboard.dateKeyRotation': { tr: 'anahtar yenileme', en: 'key rotation' },
228
+ 'dashboard.spendAlarms': { tr: 'Harcama alarmları', en: 'Spend alarms' },
229
+ 'dashboard.noSpendAlarms': { tr: 'Ücretli servis için alarm kaydı yok.', en: 'No alarm recorded for a paid service.' },
230
+ 'dashboard.notSet': { tr: 'ayarlanmadı', en: 'not set' },
231
+ 'dashboard.checkIt': { tr: 'kontrol et', en: 'check' },
232
+ 'dashboard.flagsHeading': { tr: 'Özellik bayrakları', en: 'Feature flags' },
233
+ 'dashboard.overdue': { tr: 'gecikti', en: 'overdue' },
234
+ 'dashboard.untested': { tr: 'denenmedi', en: 'not tested' },
235
+ 'dashboard.tested': { tr: 'denendi', en: 'tested' },
236
+ 'dashboard.noFlags': { tr: 'Bayrak yok.', en: 'No flags.' },
237
+ 'dashboard.liveMonitoring': { tr: 'Canlı izleme', en: 'Live monitoring' },
238
+ 'dashboard.liveLastRun': { tr: 'son çalışma', en: 'last run' },
239
+ 'dashboard.liveUrlHint': { tr: 'GitHub → Settings → Variables\'a LIVE_URL ekle', en: 'Add LIVE_URL under GitHub → Settings → Variables' },
240
+ 'dashboard.succeeded': { tr: 'başarılı', en: 'succeeded' },
241
+ 'dashboard.failedRun': { tr: 'başarısız', en: 'failed' },
242
+ 'dashboard.logLink': { tr: 'kayıt', en: 'log' },
243
+ 'dashboard.liveBroken': { tr: 'Canlı izleme bozuk', en: 'Live monitoring is broken' },
244
+ 'dashboard.recentWorkflows': { tr: 'Son iş akışları', en: 'Recent workflows' },
245
+ 'dashboard.noRuns': { tr: 'Henüz çalışma yok.', en: 'No runs yet.' },
246
+ 'dashboard.openPrs': { tr: 'Açık PR\'lar', en: 'Open PRs' },
247
+ 'dashboard.draft': { tr: 'taslak', en: 'draft' },
248
+ 'dashboard.noPrs': { tr: 'Açık PR yok.', en: 'No open PRs.' },
249
+ 'dashboard.ghNote': { tr: 'gh CLI ile okunur, 5 dakikada bir yenilenir.', en: 'Read with the gh CLI, refreshed every 5 minutes.' },
250
+ 'dashboard.noGithub': { tr: 'GitHub bilgisi yok: gh CLI kurulu ve giriş yapılmış olmalı, depo GitHub\'a bağlı olmalı.', en: 'No GitHub data: the gh CLI must be installed and logged in, and the repo must be linked to GitHub.' },
251
+ 'dashboard.healthHealthy': { tr: 'Sağlıklı', en: 'Healthy' },
252
+ 'dashboard.healthGood': { tr: 'İyi', en: 'Good' },
253
+ 'dashboard.healthRisky': { tr: 'Riskli', en: 'At risk' },
254
+ 'dashboard.areaScores': { tr: 'Alan sağlık puanları', en: 'Health score by area' },
255
+ 'dashboard.findingsLine': { tr: '{date} · {findings} bulgu', en: '{date} · {findings} findings' },
256
+ 'dashboard.findingsCritical': { tr: ' · {critical} kritik', en: ' · {critical} critical' },
257
+ 'dashboard.noReportYet': { tr: 'Henüz raporu olmayanlar:', en: 'Without a report yet:' },
258
+ 'dashboard.noFindingReports': { tr: 'Henüz bulgu raporu yok. Başlamak için:', en: 'No finding report yet. To start:' },
259
+ 'dashboard.reportHistory': { tr: 'Rapor geçmişi', en: 'Report history' },
260
+ 'dashboard.noReports': { tr: 'Rapor yok.', en: 'No reports.' },
261
+ 'dashboard.scoringNote': { tr: 'Puanlama: bulgu önemi = etki (40) + olasılık (25) + yayılım (20) + aciliyet (15); sağlık = 100 − ceza (kritik 15, yüksek 8, orta 4, düşük 1). Yöntem: <code>.claude/findings/protocol.md</code>', en: 'Scoring: finding severity = impact (40) + likelihood (25) + spread (20) + urgency (15); health = 100 − penalty (critical 15, high 8, medium 4, low 1). Method: <code>.claude/findings/protocol.md</code>' },
262
+ 'dashboard.findingKind.tech': { tr: 'Teknik', en: 'Technical' },
263
+ 'dashboard.findingKind.business': { tr: 'İş', en: 'Business' },
264
+ 'dashboard.findingKind.security': { tr: 'Güvenlik', en: 'Security' },
265
+ 'dashboard.findingKind.ux': { tr: 'UX', en: 'UX' },
266
+ 'dashboard.findingKind.perf': { tr: 'Performans', en: 'Performance' },
267
+ 'dashboard.findingKind.legal': { tr: 'Hukuk', en: 'Legal' },
268
+ 'dashboard.th.date': { tr: 'Tarih', en: 'Date' },
269
+ 'dashboard.th.stage': { tr: 'Aşama', en: 'Stage' },
270
+ 'dashboard.th.topic': { tr: 'Konu', en: 'Topic' },
271
+ 'dashboard.th.question': { tr: 'Soru', en: 'Question' },
272
+ 'dashboard.th.chosen': { tr: 'Seçilen', en: 'Chosen' },
273
+ 'dashboard.th.door': { tr: 'Kapı', en: 'Door' },
274
+ 'dashboard.th.decidedBy': { tr: 'Veren', en: 'Decided by' },
275
+ 'dashboard.th.kind': { tr: 'Tür', en: 'Type' },
276
+ 'dashboard.th.decision': { tr: 'Karar', en: 'Decision' },
277
+ 'dashboard.th.consensus': { tr: 'Uzlaşma', en: 'Consensus' },
278
+ 'dashboard.th.minutes': { tr: 'Tutanak', en: 'Minutes' },
279
+ 'dashboard.th.scope': { tr: 'Kapsam', en: 'Scope' },
280
+ 'dashboard.th.attendees': { tr: 'Katılan', en: 'Attendees' },
281
+ 'dashboard.th.result': { tr: 'Sonuç', en: 'Result' },
282
+ 'dashboard.th.critical': { tr: 'Kritik', en: 'Critical' },
283
+ 'dashboard.th.userDecision': { tr: 'Kullanıcı kararı', en: 'User decision' },
284
+ 'dashboard.th.period': { tr: 'Dönem', en: 'Period' },
285
+ 'dashboard.th.task': { tr: 'Görev', en: 'Task' },
286
+ 'dashboard.th.avgMinutes': { tr: 'Ort. süre (dk)', en: 'Avg. time (min)' },
287
+ 'dashboard.th.avgLimit': { tr: 'Ort. limit', en: 'Avg. limit' },
288
+ 'dashboard.th.fixes': { tr: 'Düzeltme', en: 'Fixes' },
289
+ 'dashboard.th.reverts': { tr: 'Geri alma', en: 'Reverts' },
290
+ 'dashboard.th.duplicateCode': { tr: 'Kopya kod', en: 'Duplicate code' },
291
+ 'dashboard.th.openCritical': { tr: 'Açık kritik', en: 'Open critical' },
292
+ 'dashboard.th.acceptance': { tr: 'Kabul', en: 'Acceptance' },
293
+ 'dashboard.th.flow': { tr: 'Akış', en: 'Flow' },
294
+ 'dashboard.th.testKind': { tr: 'Test türü', en: 'Test type' },
295
+ 'dashboard.th.file': { tr: 'Dosya', en: 'File' },
296
+ 'dashboard.th.day': { tr: 'Gün', en: 'Day' },
297
+ 'dashboard.th.commit': { tr: 'Commit', en: 'Commits' },
298
+ 'dashboard.th.criterion': { tr: 'Kriter', en: 'Criterion' },
299
+ 'dashboard.th.test': { tr: 'Test', en: 'Test' },
300
+ 'dashboard.th.job': { tr: 'İş', en: 'Job' },
301
+ 'dashboard.th.size': { tr: 'Boyut', en: 'Size' },
302
+ 'dashboard.th.usage5h': { tr: '5s kullanım', en: '5h usage' },
303
+ 'dashboard.th.service': { tr: 'Servis', en: 'Service' },
304
+ 'dashboard.th.purpose': { tr: 'Amaç', en: 'Purpose' },
305
+ 'dashboard.th.owner': { tr: 'Sahip', en: 'Owner' },
306
+ 'dashboard.th.dates': { tr: 'Tarihler', en: 'Dates' },
307
+ 'dashboard.th.amount': { tr: 'Tutar', en: 'Amount' },
308
+ 'dashboard.th.alertThresholds': { tr: 'Uyarı eşikleri', en: 'Alert thresholds' },
309
+ 'dashboard.th.lastCheck': { tr: 'Son kontrol', en: 'Last check' },
310
+ 'dashboard.th.flag': { tr: 'Bayrak', en: 'Flag' },
311
+ 'dashboard.th.removal': { tr: 'Kaldırma', en: 'Removal' },
312
+ 'dashboard.th.killSwitch': { tr: 'Acil kapatma', en: 'Kill switch' },
313
+ 'dashboard.th.workflow': { tr: 'İş akışı', en: 'Workflow' },
314
+ 'dashboard.th.branch': { tr: 'Dal', en: 'Branch' },
315
+ 'dashboard.th.time': { tr: 'Zaman', en: 'Time' },
316
+ 'dashboard.th.health': { tr: 'Sağlık', en: 'Health' },
317
+ 'dashboard.th.change': { tr: 'Değişim', en: 'Change' },
318
+ 'dashboard.th.finding': { tr: 'Bulgu', en: 'Finding' },
319
+ 'dashboard.th.report': { tr: 'Rapor', en: 'Report' },
320
+ 'dashboard.alert.kitPending': { tr: 'Proje henüz kurulmadı. Var olan kodu kite almak için /adopt.', en: 'Project is not set up yet. To bring existing code into the kit, run /adopt.' },
321
+ 'dashboard.act.startIdea': { tr: '/start [fikrin]', en: '/start [your idea]' },
322
+ 'dashboard.alert.handoffPending': { tr: 'Devir notu bekliyor: proje başka kişiden veya hesaptan devralınıyor (docs/workflow/handoff.md).', en: 'Handoff note waiting: the project is being taken over from another person or account (docs/workflow/handoff.md).' },
323
+ 'dashboard.alert.boardReject': { tr: 'Kurul RET verdi ({kind}, {scope}): {critical}', en: 'The board rejected ({kind}, {scope}): {critical}' },
324
+ 'dashboard.act.askClaudeFix': { tr: 'Claude\'a sor: düzelt / riski kabul et', en: 'Ask Claude: fix / accept the risk' },
325
+ 'dashboard.alert.limitRed': { tr: 'Kullanım limiti kırmızı: {short}', en: 'Usage limit is red: {short}' },
326
+ 'dashboard.act.limitRed': { tr: 'Yeni işten önce seçenekleri değerlendir (Limit sekmesi)', en: 'Weigh the options before new work (Limit tab)' },
327
+ 'dashboard.alert.limitYellow': { tr: 'Kullanım limiti sarı: {short}', en: 'Usage limit is yellow: {short}' },
328
+ 'dashboard.act.limitYellow': { tr: 'Büyük işleri limite göre planla', en: 'Plan big tasks around the limit' },
329
+ 'dashboard.alert.pendingDecision': { tr: 'Bekleyen karar: {text}', en: 'Pending decision: {text}' },
330
+ 'dashboard.act.claudeWaiting': { tr: 'Claude seni bekliyor', en: 'Claude is waiting for you' },
331
+ 'dashboard.alert.leftOff': { tr: 'Yarıda kalan iş: {text}', en: 'Unfinished work: {text}' },
332
+ 'dashboard.act.buildContinue': { tr: '/build ile devam', en: '/build to continue' },
333
+ 'dashboard.alert.openIssue': { tr: 'Açık sorun: {text}', en: 'Open issue: {text}' },
334
+ 'dashboard.alert.repeatedBug': { tr: 'Aynı hata sınıfı {count} kez: {cls} ({specs}). Tekrarı önleyen bir kural eklenebilir.', en: 'Same bug class {count} times: {cls} ({specs}). A rule that prevents the repeat could be added.' },
335
+ 'dashboard.alert.uncommitted': { tr: '{count} dosya commit edilmemiş.', en: '{count} files are not committed.' },
336
+ 'dashboard.act.commitOrWrapUp': { tr: 'Commit veya /wrap-up', en: 'Commit or /wrap-up' },
337
+ 'dashboard.alert.progressStale': { tr: 'docs/workflow/progress.md {count} commit\'tir güncellenmedi.', en: 'docs/workflow/progress.md has not been updated for {count} commits.' },
338
+ 'dashboard.alert.closedTopics': { tr: 'Soru modu kapalı konular: {topics}. Bu konulardaki kararlar otomatik veriliyor.', en: 'Question mode closed topics: {topics}. Decisions on these topics are made automatically.' },
339
+ 'dashboard.act.askModeOpen': { tr: '/ask-mode ac <konu>', en: '/ask-mode ac <topic>' },
340
+ 'dashboard.alert.boardNotSetUp': { tr: 'Uzman kurulu kurulmadı.', en: 'The expert board is not set up.' },
341
+ 'dashboard.alert.liveMonitoring': { tr: 'Canlı izleme: {title}', en: 'Live monitoring: {title}' },
342
+ 'dashboard.act.fixLive': { tr: '/fix-bug canlı izleme #{number}', en: '/fix-bug live monitoring #{number}' },
343
+ 'dashboard.alert.liveRunFailed': { tr: 'Canlı izlemenin son çalışması başarısız.', en: 'The last live monitoring run failed.' },
344
+ 'dashboard.act.fixLiveShort': { tr: '/fix-bug canlı izleme', en: '/fix-bug live monitoring' },
345
+ 'dashboard.alert.ciFailed': { tr: 'main dalında son CI çalışması başarısız.', en: 'The last CI run on the main branch failed.' },
346
+ 'dashboard.act.operationsTab': { tr: 'Operasyon sekmesi', en: 'Operations tab' },
347
+ 'dashboard.alert.dateOverdue': { tr: '{service}: {kind} tarihi geçti ({date}).', en: '{service}: {kind} date has passed ({date}).' },
348
+ 'dashboard.alert.dateSoon': { tr: '{service}: {kind} {left} gün sonra ({date}).', en: '{service}: {kind} in {left} days ({date}).' },
349
+ 'dashboard.act.renew': { tr: 'Yenile veya otomatik yenilemeyi aç', en: 'Renew or turn on auto-renewal' },
350
+ 'dashboard.alert.noTwoFactor': { tr: '{service} hesabında 2FA yok.', en: 'The {service} account has no 2FA.' },
351
+ 'dashboard.alert.spendUnset': { tr: '{service}: harcama tavanı veya uyarısı ayarlanmadı.', en: '{service}: spend cap or alert is not set.' },
352
+ 'dashboard.alert.negativeEconomics': { tr: 'Birim ekonomisi negatif: her ödeyen kullanıcı {amount} {currency} zarar ettiriyor.', en: 'Unit economics are negative: every paying user costs you {amount} {currency}.' },
353
+ 'dashboard.act.priceDecision': { tr: 'Fiyat veya maliyet kararı (/plan-task)', en: 'Price or cost decision (/plan-task)' },
354
+ 'dashboard.alert.acceptRed': { tr: '{id} PRD\'de tamam işaretli ama kabul testi kırmızı.', en: '{id} is marked done in the PRD but its acceptance test is red.' },
355
+ 'dashboard.alert.acceptNoResult': { tr: '{id} PRD\'de tamam işaretli ama kabul testi sonuçsuz.', en: '{id} is marked done in the PRD but its acceptance test has no result.' },
356
+ 'dashboard.alert.acceptMissing': { tr: '{id} PRD\'de tamam işaretli ama kabul testi yok.', en: '{id} is marked done in the PRD but it has no acceptance test.' },
357
+ 'dashboard.act.acceptFix': { tr: 'Testi çalıştır veya işareti kaldır', en: 'Run the test or remove the mark' },
358
+ 'dashboard.alert.flagsOverdue': { tr: 'Kaldırma tarihi geçen {count} bayrak: {names}.', en: '{count} flags past their removal date: {names}.' },
359
+ 'dashboard.act.removeFlag': { tr: 'Bayrağı ve eski kod yolunu kaldır', en: 'Remove the flag and the old code path' },
360
+ 'dashboard.alert.newFeedback': { tr: '{count} işlenmemiş kullanıcı geri bildirimi var.', en: '{count} user feedback items have not been processed.' },
361
+ 'dashboard.alert.packagesOn': { tr: 'Açık bağlam paketleri: {names}. Her oturumda skill listesine yük ekler.', en: 'Context packages that are on: {names}. They add load to the skill list in every session.' },
362
+ 'dashboard.act.packagesOff': { tr: 'Kullanmıyorsan /tools kapat <paket>', en: 'If you do not use them: /tools kapat <package>' },
363
+ 'dashboard.alert.cmdListLight': { tr: 'Profil Tam ama komut listesi hafif: seyrek komutların açıklaması bağlamda yok.', en: 'The profile is Full but the command list is light: descriptions of rarely used commands are not in the context.' },
364
+ 'dashboard.act.cmdFull': { tr: '/tools komutlar tam', en: '/tools komutlar tam' },
365
+ 'dashboard.alert.cmdListHeavy': { tr: 'Komut listesi {mode}: seyrek komutların açıklaması her oturumda bağlama giriyor (~1.100 token).', en: 'The command list is {mode}: descriptions of rarely used commands enter the context in every session (~1,100 tokens).' },
366
+ 'dashboard.cmdModeFull': { tr: 'tam', en: 'full' },
367
+ 'dashboard.cmdModeMixed': { tr: 'karışık', en: 'mixed' },
368
+ 'dashboard.act.cmdLight': { tr: 'Profil Tam değilse /tools komutlar hafif', en: 'If the profile is not Full: /tools komutlar hafif' },
369
+ 'dashboard.alert.codeMapStale': { tr: 'İnsan için kod haritası (Understand-Anything) {days} gündür güncellenmedi.', en: 'The code map for humans (Understand-Anything) has not been updated for {days} days.' },
370
+ 'dashboard.act.understand': { tr: '/understand (sadece değişenleri okur; yayin paketi)', en: '/understand (reads only what changed; yayin package)' },
371
+ 'dashboard.alert.contextFull': { tr: 'Bağlam %{percent} dolu; yanıt kalitesi düşebilir.', en: 'Context is {percent}% full; answer quality may drop.' },
372
+ 'dashboard.act.wrapUpClear': { tr: '/wrap-up ve /clear', en: '/wrap-up and /clear' },
373
+ 'dashboard.alert.findingsCritical': { tr: '{kind} bulgu raporunda {critical} kritik bulgu var (sağlık {health}/100).', en: 'The {kind} finding report has {critical} critical findings (health {health}/100).' },
374
+ 'dashboardData.prodRefInMcp': { tr: 'Prod projesinin ref\'i ({ref}) .mcp.json\'da: AI prod\'a bağlanabiliyor.', en: 'The prod project\'s ref ({ref}) is in .mcp.json: the AI can connect to prod.' },
375
+ 'dashboardData.prodRefAction': { tr: '.mcp.json → dev ref (docs/operations/accounts.md → Ortamlar)', en: '.mcp.json → dev ref (docs/operations/accounts.md → Ortamlar)' },
376
+ 'dashboardData.rlsMissing': { tr: 'Supabase kullanılıyor ama RLS saldırgan testi yok (tests/security/rls.mjs).', en: 'Supabase is in use but there is no RLS attacker test (tests/security/rls.mjs).' },
377
+ 'dashboardData.rlsAction': { tr: '/kit-update ile şablonu al, tabloları TABLES\'a ekle', en: 'Get the template with /kit-update, add the tables to TABLES' },
378
+ 'guard.commit.skipAsk': { tr: 'Commit kapısı: --skip kurul denetimini ve deterministik kapıyı aşar. Sadece kullanıcı açıkça isterse onayla.', en: 'Commit gate: --skip bypasses the board review and the deterministic gate. Approve only if the user explicitly asks.' },
379
+ 'guard.commit.noCommands': { tr: '(tanımlı komut yok)', en: '(no commands defined)' },
380
+ 'guard.commit.gateApprovalAsk': { tr: 'Kapı komut onayı: AGENTS.md → Komutlar\'daki şu komutlar bundan sonra her kapıda çalışır:\n{list}\nGüvendiğin komutlarsa onayla.', en: 'Gate command approval: from now on the gate runs these commands from AGENTS.md → Komutlar every time:\n{list}\nApprove only if you trust them.' },
381
+ 'guard.destructive.approvalSuffix': { tr: '{reason}. Kullanıcı onayı gerekli.', en: '{reason}. User approval required.' },
382
+ 'guard.destructive.prodDeploy': { tr: 'Prod ortamına deploy', en: 'Deploy to the prod environment' },
383
+ 'guard.destructive.promoteRollback': { tr: 'Prod ortamı değişiyor (promote/rollback)', en: 'The prod environment is changing (promote/rollback)' },
384
+ 'guard.destructive.unclearEnv': { tr: 'Ortam değişkenleri çekiliyor ama ortam düz development/preview değil (değişken veya özel ortam: prod olabilir)', en: 'Environment variables are being pulled but the environment is not plain development/preview (a variable or custom environment: could be prod)' },
385
+ 'guard.destructive.serverDeploy': { tr: 'Sunucuya deploy', en: 'Deploy to a server' },
386
+ 'guard.destructive.storeSubmit': { tr: 'Mağazaya gönderim, prod OTA güncellemesi veya geri alma', en: 'Store submission, prod OTA update or rollback' },
387
+ 'guard.destructive.pushMain': { tr: 'Ana dala doğrudan push', en: 'Direct push to the main branch' },
388
+ 'guard.destructive.rewriteHistory': { tr: 'Git geçmişi yeniden yazılıyor', en: 'Git history is being rewritten' },
389
+ 'guard.destructive.migration': { tr: 'Migration uygulanıyor (hedef ortamı kontrol et)', en: 'A migration is being applied (check the target environment)' },
390
+ 'guard.destructive.remoteDb': { tr: 'Komut localhost dışındaki bir veritabanına bağlanıyor (prod olabilir). Kullanıcı onayı gerekli; AI prod erişim bilgisi kullanmamalı.', en: 'The command connects to a database other than localhost (could be prod). User approval required; the AI must not use prod access credentials.' },
391
+ 'guard.destructive.testShell': { tr: 'Test dosyası kabuk komutuyla değiştiriliyor, taşınıyor veya siliniyor. Testi geçirmek için testi zayıflatmak yasak (AGENTS.md kural 7); test düzenlemesini dosya aracıyla yap. Kullanıcı onayı gerekli.', en: 'A test file is being changed, moved or deleted with a shell command. Weakening a test to make it pass is forbidden (AGENTS.md rule 7); edit tests with a file tool. User approval required.' },
392
+ 'guard.destructive.inlineTest': { tr: 'Satır içi betik bir test yolunu anıyor; test dosyasına yazıyor olabilir. Test dosyasına yalnız test-writer ajanı yazar (AGENTS.md kural 7). Kullanıcı onayı gerekli.', en: 'An inline script names a test path; it may write to a test file. Only the test-writer agent writes to test files (AGENTS.md rule 7). User approval required.' },
393
+ 'guard.destructive.obfuscated': { tr: 'Komut gizlenmiş görünüyor (satır sonu \\, $\'..\', $(...), `...` veya ${...}) ve korunan bir işlem içeriyor. Kullanıcı onayı gerekli.', en: 'The command looks obfuscated (line ending \\, $\'..\', $(...), `...` or ${...}) and contains a guarded operation. User approval required.' },
394
+ 'guard.destructive.indirectHook': { tr: 'Kitin koruma betiği dolaylı yazımla çalıştırılıyor ($DEĞİŞKEN, $(...), `...`, ${...} veya * ?); kural metni bunun içini göremez. Kullanıcı onayı gerekli.', en: 'A kit guard script is run with an indirect spelling ($VARIABLE, $(...), `...`, ${...} or * ?); the rule text cannot see inside it. User approval required.' },
395
+ 'guard.destructive.perm.freezeOff': { tr: 'Düzenleme kilidi kaldırılıyor', en: 'The edit lock is being removed' },
396
+ 'guard.destructive.perm.toolsCommands': { tr: 'Paylaşılan .claude/settings.json → skillOverrides değişiyor (komut listesi)', en: 'The shared .claude/settings.json → skillOverrides is changing (command list)' },
397
+ 'guard.destructive.perm.planAdd': { tr: 'Onaylı planın dosya listesi genişliyor (kapsam kalkanı)', en: 'The approved plan\'s file list is widening (scope shield)' },
398
+ 'guard.destructive.perm.planSave': { tr: 'Kapsam kalkanının dosya listesi yazılıyor', en: 'The scope shield\'s file list is being written' },
399
+ 'guard.destructive.perm.planEnd': { tr: 'Kapsam kalkanı kapatılıyor', en: 'The scope shield is being closed' },
400
+ 'guard.destructive.perm.commitSkip': { tr: 'Commit kapısı ve kurul denetimi atlanıyor', en: 'The commit gate and the board review are being skipped' },
401
+ 'guard.destructive.perm.prefsEdit': { tr: 'Kişisel tercih dosyası (~/.vibe-kit/tercihler.md) değişiyor', en: 'The personal preferences file (~/.vibe-kit/tercihler.md) is changing' },
402
+ 'guard.destructive.perm.gateApprove': { tr: 'Deterministik kapının çalıştıracağı komutlar onaylanıyor', en: 'The commands the deterministic gate will run are being approved' },
403
+ 'guard.destructive.perm.protectedShell': { tr: 'Kural veya koruma dosyası kabuk komutuyla değiştiriliyor', en: 'A rule or guard file is being changed with a shell command' },
404
+ 'guard.destructive.unclearNetPath': { tr: 'hedef ağ yolu ({path})', en: 'target is a network path ({path})' },
405
+ 'guard.destructive.unclearVar': { tr: 'hedef değişken veya komut içeriyor ({path})', en: 'target contains a variable or command ({path})' },
406
+ 'guard.destructive.unclearBrace': { tr: 'hedef süslü parantez açılımı içeriyor ({path})', en: 'target contains a brace expansion ({path})' },
407
+ 'guard.destructive.unclearCd': { tr: '{name} hedefi doğrulanamadı ({target}); sonraki komutların klasörü bilinmiyor', en: 'could not verify the {name} target ({target}); the folder of the following commands is unknown' },
408
+ 'guard.destructive.homeDir': { tr: 'ev dizini', en: 'home directory' },
409
+ 'guard.destructive.unclearXargs': { tr: 'xargs {command} hedef dosyayı göstermiyor', en: 'xargs {command} does not show its target file' },
410
+ 'guard.destructive.unclearNoTarget': { tr: '{command} hedef dosyayı göstermiyor', en: '{command} does not show its target file' },
411
+ 'guard.destructive.unclearBranch': { tr: 'git {sub} {arg}: yol değil (dal olabilir)', en: 'git {sub} {arg}: not a path (may be a branch)' },
412
+ 'guard.destructive.prefsFile': { tr: '{path}: kişisel tercih dosyası (kullanıcı klasörü); kabukla değiştirilmez, node .claude/hooks/prefs.mjs --add / --remove kullanılır. Kullanıcı onayı gerekli.', en: '{path}: personal preferences file (user folder); it is not changed with the shell, use node .claude/hooks/prefs.mjs --add / --remove. User approval required.' },
413
+ 'guard.destructive.gateApproval': { tr: '{path}: kapı komut onayı kaydı (kullanıcı klasörü); kabukla değiştirilmez, node .claude/hooks/gate.mjs --approve kullanılır. Kullanıcı onayı gerekli.', en: '{path}: gate command approval record (user folder); it is not changed with the shell, use node .claude/hooks/gate.mjs --approve. User approval required.' },
414
+ 'guard.destructive.protectedShell': { tr: '{rel}: {text} Kabuk komutuyla değiştiriliyor; kilit, plan ve onay durumları için ilgili kit komutunu kullan. Kullanıcı onayı gerekli.', en: '{rel}: {text} It is being changed with a shell command; for lock, plan and approval states use the matching kit command. User approval required.' },
415
+ 'guard.destructive.unclearRule': { tr: '{unclear}; komut kural veya koruma dosyası adını içeriyor (.claude, .git, AGENTS.md…), hedef doğrulanamadı. Kullanıcı onayı gerekli.', en: '{unclear}; the command names a rule or guard file (.claude, .git, AGENTS.md…) and the target could not be verified. User approval required.' },
416
+ 'guard.destructive.labelLock': { tr: 'Düzenleme kilidi ({lock}/)', en: 'Edit lock ({lock}/)' },
417
+ 'guard.destructive.labelPlan': { tr: 'Kapsam kalkanı (görev {task})', en: 'Scope shield (task {task})' },
418
+ 'guard.destructive.scopeUnclear': { tr: '{label}: {unclear}; hangi dosyaların değişeceği bilinemiyor. Gerekliyse kullanıcıya sor.', en: '{label}: {unclear}; it is not possible to tell which files will change. Ask the user if needed.' },
419
+ 'guard.destructive.scopeRoot': { tr: '{label}: komut proje kökünü veya üst klasörünü hedefliyor ({rel}); kilit/plan dışındaki dosyalar da değişebilir. Gerekliyse kullanıcıya sor.', en: '{label}: the command targets the project root or a parent folder ({rel}); files outside the lock/plan may change too. Ask the user if needed.' },
420
+ 'guard.destructive.lockOutside': { tr: 'Düzenleme kilidi: {rel} kilit ({lock}/) dışında ve komut onu değiştirebilir. Gerekliyse kullanıcıya sor.', en: 'Edit lock: {rel} is outside the lock ({lock}/) and the command may change it. Ask the user if needed.' },
421
+ 'guard.destructive.planOutside': { tr: 'Kapsam kalkanı: {rel} onaylı planda yok (görev {task}) ve komut onu değiştirebilir. Gerekliyse kullanıcıya sor; onaylarsa node .claude/hooks/freeze-guard.mjs --plan-add <yol>.', en: 'Scope shield: {rel} is not in the approved plan (task {task}) and the command may change it. Ask the user if needed; if they approve, run node .claude/hooks/freeze-guard.mjs --plan-add <path>.' },
422
+ 'guard.destructive.prefix': { tr: 'Kalkan: {reason}', en: 'Shield: {reason}' },
423
+ 'guard.freeze.protectedAsk': { tr: 'Kural, koruma ve iş akışı dosyaları kullanıcı onayıyla değişir.', en: 'Rule, guard and workflow files change only with user approval.' },
424
+ 'guard.freeze.prefsFile': { tr: '{path}: kişisel tercih dosyası; elle yazılmaz, node .claude/hooks/prefs.mjs --add / --remove kullanılır.', en: '{path}: personal preferences file; do not write it by hand, use node .claude/hooks/prefs.mjs --add / --remove.' },
425
+ 'guard.freeze.gateApproval': { tr: '{path}: kapı komut onayı kaydı; elle yazılmaz, node .claude/hooks/gate.mjs --approve kullanılır.', en: '{path}: gate command approval record; do not write it by hand, use node .claude/hooks/gate.mjs --approve.' },
426
+ 'guard.freeze.scopeAsk': { tr: 'Kapsam kalkanı: {rel} onaylı planda yok (görev {task}). Gerekliyse kullanıcıya sor; onaylarsa node .claude/hooks/freeze-guard.mjs --plan-add <yol>. Görev bittiyse --plan-end.', en: 'Scope shield: {rel} is not in the approved plan (task {task}). Ask the user if needed; if they approve, run node .claude/hooks/freeze-guard.mjs --plan-add <path>. When the task is done, run --plan-end.' },
427
+ 'guard.freeze.unknownPath': { tr: '(yol bilinmiyor)', en: '(unknown path)' },
428
+ 'guard.package.npmMissing': { tr: 'npm kayıt defterinde böyle bir paket yok', en: 'no such package in the npm registry' },
429
+ 'guard.package.npmStatus': { tr: 'npm yanıtı {status}', en: 'npm responded {status}' },
430
+ 'guard.package.similar': { tr: 'popüler "{similar}" paketine çok benziyor (yazım hatası tuzağı olabilir)', en: 'very similar to the popular package "{similar}" (could be a typosquat)' },
431
+ 'guard.package.newNpm': { tr: '{age} gün önce yayımlanmış', en: 'published {age} days ago' },
432
+ 'guard.package.lowDownloads': { tr: 'haftalık indirme {downloads}', en: '{downloads} weekly downloads' },
433
+ 'guard.package.pypiMissing': { tr: 'PyPI\'da böyle bir paket yok', en: 'no such package on PyPI' },
434
+ 'guard.package.pypiStatus': { tr: 'PyPI yanıtı {status}', en: 'PyPI responded {status}' },
435
+ 'guard.package.newPypi': { tr: 'ilk sürümü {age} gün önce yayımlanmış', en: 'first release was published {age} days ago' },
436
+ 'guard.package.timeout': { tr: 'doğrulanamadı (zaman aşımı)', en: 'could not be verified (timeout)' },
437
+ 'guard.package.network': { tr: 'doğrulanamadı (ağ hatası)', en: 'could not be verified (network error)' },
438
+ 'guard.package.ask': { tr: 'Paket kapısı uyarısı: {list}. Kurmadan önce paketin gerçekten istenen paket olduğundan emin ol.', en: 'Package gate warning: {list}. Before installing, make sure the package is really the one you want.' },
439
+ 'guard.structure.offMap': { tr: '"{rel}" yapı haritasında yok (.claude/structure.json). Doğru yer muhtemelen şunlardan biri: {top}. Geçici veya deneme ise sandbox/ altına yaz. Kalıcı yeni bir yer gerekiyorsa bunu teknik karar olarak sor ve haritayı güncelle (docs/architecture/structure.md).', en: '"{rel}" is not in the structure map (.claude/structure.json). The right place is probably one of: {top}. If it is temporary or a trial, write it under sandbox/. If a new permanent place is needed, ask it as a technical decision and update the map (docs/architecture/structure.md).' },
440
+ 'guard.structure.prefix': { tr: 'Yapı: {reason}', en: 'Structure: {reason}' },
441
+ 'guard.test.skip': { tr: 'test atlanıyor veya tek teste odaklanıyor (.skip / .only / skipIf / xit / pytest skip)', en: 'a test is skipped or focused alone (.skip / .only / skipIf / xit / pytest skip)' },
442
+ 'guard.test.expectRemoved': { tr: 'beklenti (expect/assert) siliniyor veya yoruma alınıyor', en: 'an expectation (expect/assert) is deleted or commented out' },
443
+ 'guard.test.expectWeak': { tr: 'beklenti gevşetiliyor (toBeTruthy, toBeDefined, expect.anything, matcher\'sız expect, assert True)', en: 'an expectation is loosened (toBeTruthy, toBeDefined, expect.anything, expect without a matcher, assert True)' },
444
+ 'guard.test.configRisk': { tr: 'testlerin kapsamını belirleyen ayar değişiyor (include/exclude, testMatch, passWithNoTests, eşik, test script\'i)', en: 'a setting that decides which tests run is changing (include/exclude, testMatch, passWithNoTests, threshold, test script)' },
445
+ 'guard.test.configDeleted': { tr: 'test ayar dosyası siliniyor', en: 'a test config file is deleted' },
446
+ 'guard.test.fileDeleted': { tr: 'test dosyası siliniyor', en: 'a test file is deleted' },
447
+ 'guard.test.movedAway': { tr: 'test dosyası çalışmayan bir yola taşınıyor ({source})', en: 'a test file is moved to a path where it will not run ({source})' },
448
+ 'guard.test.moveOverwrite': { tr: 'taşıma var olan dosyanın üstüne yazıyor ({source} → {path})', en: 'the move overwrites an existing file ({source} → {path})' },
449
+ 'guard.test.ask': { tr: 'Test koruması: {name} içinde {reason}. Testi geçirmek için testi zayıflatmak yasak (AGENTS.md kural 7). Gerekçe gerçekse (yanlış test, değişen kabul kriteri) kullanıcıya söyle ve onayını al; değilse kodu düzelt.', en: 'Test protection: in {name}, {reason}. Weakening a test to make it pass is forbidden (AGENTS.md rule 7). If the reason is real (a wrong test, a changed acceptance criterion), tell the user and get their approval; otherwise fix the code.' },
450
+ 'statusRead.defaultProject': { tr: 'Proje', en: 'Project' },
451
+ 'statusRead.checklist.security': { tr: 'Güvenlik', en: 'Security' },
452
+ 'statusRead.checklist.release': { tr: 'Canlıya alma', en: 'Go-live' },
453
+ 'statusRead.checklist.legal': { tr: 'Yasal / KVKK', en: 'Legal / privacy' },
454
+ 'statusRead.checklist.ai': { tr: 'AI', en: 'AI' },
455
+ 'statusRead.checklist.launch': { tr: 'Lansman', en: 'Launch' },
456
+ 'qaReport.title': { tr: '# QA raporu · {stamp}', en: '# QA report · {stamp}' },
457
+ 'qaReport.result': { tr: '**Sonuç:** {summary} (PRD\'de {count} kriter, kaynak: `{junit}`)', en: '**Result:** {summary} ({count} criteria in the PRD, source: `{junit}`)' },
458
+ 'qaReport.summary': { tr: '{passed} geçti · {failed} kaldı · {notRun} koşulmadı', en: '{passed} passed · {failed} failed · {notRun} not run' },
459
+ 'qaReport.tableHeader': { tr: '| Kriter | Sonuç | Kanıt | Not |', en: '| Criterion | Result | Evidence | Note |' },
460
+ 'models.role.plan': { tr: 'Planlama ve mimari', en: 'Planning and architecture' },
461
+ 'models.role.code': { tr: 'Kod yazma', en: 'Writing code' },
462
+ 'models.role.test': { tr: 'Test yazma', en: 'Writing tests' },
463
+ 'models.role.review': { tr: 'İnceleme ve denetim', en: 'Review and audit' },
464
+ 'models.role.docs': { tr: 'Doküman ve araştırma', en: 'Documents and research' },
465
+ 'models.noRecord': { tr: 'kayıt yok: önerilenler', en: 'no saved choice: recommended values' },
466
+ 'models.unreadable': { tr: 'kayıt okunamadı: önerilenler; --set ile yeniden yaz', en: 'saved choice unreadable: recommended values; rewrite it with --set' },
467
+ 'statusline.notSetUp': { tr: '◆ Kit kurulmadı · başlamak için: /start [fikrin] · var olan kod: /adopt', en: '◆ Kit not set up · to begin: /start [your idea] · existing code: /adopt' },
468
+ 'statusline.step': { tr: 'adım {step}', en: 'step {step}' },
469
+ 'statusline.task': { tr: 'görev {done}/{total}', en: 'task {done}/{total}' },
470
+ 'statusline.question': { tr: 'soru: {mode}', en: 'questions: {mode}' },
471
+ 'statusline.modeOpen': { tr: 'açık', en: 'open' },
472
+ 'statusline.modeOff': { tr: 'kapalı', en: 'off' },
473
+ 'statusline.closed': { tr: '(kapalı: {topics})', en: '(closed: {topics})' },
474
+ 'statusline.pending': { tr: 'bekleyen karar: {count}', en: 'pending decisions: {count}' },
475
+ 'statusline.limit5h': { tr: '5s %{percent}', en: '5h {percent}%' },
476
+ 'statusline.limitWeek': { tr: 'hf %{percent}', en: 'weekly {percent}%' },
477
+ 'statusline.context': { tr: 'bağlam %{percent}', en: 'context {percent}%' },
478
+ 'statusline.unreadable': { tr: '▶ durum okunamadı', en: '▶ status unreadable' },
479
+ 'usage.none': { tr: 'Limit bilgisi yok. Masaüstü uygulamasındaysan get_usage aracını kullan. Terminal/IDE\'de durum çubuğu ilk API yanıtından sonra yazar. İkisi de yoksa kullanıcıdan /usage sonucunu iste.', en: 'No limit data. In the desktop app, use the get_usage tool. In the terminal or IDE the status line writes it after the first API response. If neither exists, ask the user for the /usage result.' },
480
+ 'usage.window5h': { tr: '5 saatlik', en: '5-hour' },
481
+ 'usage.windowWeek': { tr: 'haftalık', en: 'weekly' },
482
+ 'usage.windowPart': { tr: '{name}: %{percent}{tail}', en: '{name}: {percent}%{tail}' },
483
+ 'usage.renewed': { tr: '(yenilendi)', en: '(renewed)' },
484
+ 'usage.resets': { tr: 'sıfırlanma {clock}, {left} sonra', en: 'resets {clock}, in {left}' },
485
+ 'usage.leftDays': { tr: '{days} gün {hours} sa', en: '{days} d {hours} h' },
486
+ 'usage.leftHours': { tr: '{hours} sa {minutes} dk', en: '{hours} h {minutes} min' },
487
+ 'usage.stale': { tr: ' — eski olabilir, get_usage veya /usage ile doğrula', en: ' — may be outdated, verify with get_usage or /usage' },
488
+ 'usage.summary': { tr: '{parts} · seviye: {level} · {age} dk önce okundu{stale}', en: '{parts} · level: {level} · read {age} min ago{stale}' },
489
+ 'usage.level.green': { tr: 'yeşil', en: 'green' },
490
+ 'usage.level.yellow': { tr: 'sarı', en: 'yellow' },
491
+ 'usage.level.red': { tr: 'kırmızı', en: 'red' },
492
+ 'usage.level.unknown': { tr: 'bilinmiyor', en: 'unknown' },
493
+ 'notify.done': { tr: 'İş bitti ({minutes} dk). Sonuca bakabilirsin.', en: 'Job finished ({minutes} min). You can check the result.' },
494
+ 'notify.waiting': { tr: 'Claude cevabını bekliyor.', en: 'Claude is waiting for your answer.' },
495
+ };
@@ -7,8 +7,11 @@
7
7
  import fs from 'node:fs';
8
8
  import path from 'node:path';
9
9
  import { findRoot, isMain } from './shared.mjs';
10
+ import { t } from './lang.mjs';
10
11
 
11
- export const ROLES = { plan: 'Planlama ve mimari', code: 'Kod yazma', test: 'Test yazma', review: 'İnceleme ve denetim', docs: 'Doküman ve araştırma' };
12
+ export const ROLES = { plan: 'Planning and architecture', code: 'Writing code', test: 'Writing tests', review: 'Review and audit', docs: 'Documents and research' };
13
+ // Role name in the project language, for text the user sees (the dashboard)
14
+ export const roleLabel = (root, role) => t(root, `models.role.${role}`);
12
15
  // test differs from code on purpose: another model does not share the coder's blind spots (AGENTS.md rule 7)
13
16
  export const RECOMMENDED = { plan: 'opus:high', code: 'sonnet:high', test: 'opus:high', review: 'sonnet:high', docs: 'haiku:high' };
14
17
  export const MODELS = ['opus', 'sonnet', 'haiku', 'fable'];
@@ -30,34 +33,34 @@ export function readModels(file = modelsFile()) {
30
33
 
31
34
  // pairs: ['code=sonnet:medium', ...]. Returns an error text or null.
32
35
  export function setModels(pairs, file = modelsFile()) {
33
- if (!pairs.length) return `Kullanım: --set ${Object.entries(RECOMMENDED).map(([r, v]) => `${r}=${v}`).join(' ')}`;
36
+ if (!pairs.length) return `Usage: --set ${Object.entries(RECOMMENDED).map(([r, v]) => `${r}=${v}`).join(' ')}`;
34
37
  const next = readModels(file);
35
38
  for (const pair of pairs) {
36
39
  const [role, value, extra] = pair.toLowerCase().split('=');
37
- if (extra !== undefined || !valid(role, value)) return `Geçersiz: "${pair}". Rol: ${Object.keys(ROLES).join(', ')} · model: ${MODELS.join(', ')} · effort: ${EFFORTS.join(', ')} (örnek code=sonnet:medium)`;
40
+ if (extra !== undefined || !valid(role, value)) return `Invalid: "${pair}". Role: ${Object.keys(ROLES).join(', ')} · model: ${MODELS.join(', ')} · effort: ${EFFORTS.join(', ')} (example code=sonnet:medium)`;
38
41
  next[role] = value;
39
42
  }
40
43
  try {
41
44
  fs.mkdirSync(path.dirname(file), { recursive: true });
42
45
  fs.writeFileSync(file, JSON.stringify(next, null, 2) + '\n');
43
46
  } catch (e) {
44
- return `Dosya yazılamadı (${e.code ?? e.message}): ${file}`;
47
+ return `Could not write the file (${e.code ?? e.message}): ${file}`;
45
48
  }
46
49
  return null;
47
50
  }
48
51
 
49
- // '' when a saved choice is in use; otherwise why the recommended values are shown
50
- export function modelsNote(file = modelsFile()) {
51
- if (!fs.existsSync(file)) return 'kayıt yok: önerilenler';
52
- try { JSON.parse(fs.readFileSync(file, 'utf8')); return ''; } catch { return 'kayıt okunamadı: önerilenler; --set ile yeniden yaz'; }
52
+ // '' when a saved choice is in use; otherwise why the recommended values are shown (the dashboard shows it, so project language)
53
+ export function modelsNote(file = modelsFile(), root = findRoot()) {
54
+ if (!fs.existsSync(file)) return t(root, 'models.noRecord');
55
+ try { JSON.parse(fs.readFileSync(file, 'utf8')); return ''; } catch { return t(root, 'models.unreadable'); }
53
56
  }
54
57
 
55
58
  export const showModels = (file = modelsFile()) => {
56
59
  const m = readModels(file);
57
60
  const note = modelsNote(file);
58
- return Object.keys(ROLES).map((r) => `${r}: ${m[r].replace(':', ' / ')} (${ROLES[r]})${m[r] === RECOMMENDED[r] ? '' : ` · önerilen ${RECOMMENDED[r].replace(':', ' / ')}`}`).join('\n')
61
+ return Object.keys(ROLES).map((r) => `${r}: ${m[r].replace(':', ' / ')} (${ROLES[r]})${m[r] === RECOMMENDED[r] ? '' : ` · recommended ${RECOMMENDED[r].replace(':', ' / ')}`}`).join('\n')
59
62
  + (note ? `\n(${note})` : '')
60
- + (m.code.split(':')[0] === m.test.split(':')[0] ? '\nUyarı: kod ve test rolü aynı model; farklı model önerilir (aynı model aynı kör noktayı paylaşır).' : '');
63
+ + (m.code.split(':')[0] === m.test.split(':')[0] ? '\nWarning: the code and test roles use the same model; a different model is recommended (the same model shares the same blind spots).' : '');
61
64
  };
62
65
 
63
66
  if (isMain(import.meta.url)) {
@@ -69,7 +72,7 @@ if (isMain(import.meta.url)) {
69
72
  } else if (mode === '--show') {
70
73
  console.log(showModels());
71
74
  } else {
72
- console.error('Kullanım: --show | --set plan=<model>:<effort> code=… test=… review=… docs=…');
75
+ console.error('Usage: --show | --set plan=<model>:<effort> code=… test=… review=… docs=…');
73
76
  process.exit(1);
74
77
  }
75
78
  }