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
@@ -1,156 +1,156 @@
1
- # Stack: Backend / API / Otomasyon
1
+ # Stack: Backend / API / Automation
2
2
 
3
- > Bu dosya her oturumda AI'ya yüklenir. Projede farklı bir seçim yaptıysan burayı güncelle
4
- > ve nedenini `docs/decisions/log.md`'ye yaz.
3
+ > This file is loaded into the AI every session. If the project makes a different choice, update this file
4
+ > and write the reason to `docs/decisions/log.md`.
5
5
 
6
- ## Karar noktaları
6
+ ## Decision points
7
7
 
8
- `/start` bu kararları sırayla sorar (`docs/workflow/decision-protocol.md`). Her kararda bu projeye en uygun 2-4 seçeneği sun; **önerilen** etiketi varsayılandır, ama PRD'ye göre başka seçenek daha uygunsa onu öner ve nedenini söyle. Fiyat, ücretsiz katman ve kısıt gibi değişebilen iddiaların yanında `(kaynak: <adres>, YYYY-AA-GG)` notu varsa ve 90 günden yeniyse yeniden araştırılmaz.
8
+ `/start` asks these decisions in order (`docs/workflow/decision-protocol.md`). For each decision, offer the 2-4 options that fit this project best. The **recommended** label is the default, but if another option fits the PRD better, recommend that one and say why. A claim that can change (price, free tier, limit) with a `(kaynak: <adres>, YYYY-AA-GG)` note newer than 90 days is not researched again.
9
9
 
10
- | # | Karar | Seçenekler (ne zaman daha iyi) |
10
+ | # | Decision | Options (when each is better) |
11
11
  |---|---|---|
12
- | 1 | Dil ve framework | **Python + FastAPI** (önerilen: AI/veri işleri, hızlı geliştirme, otomatik OpenAPI dokümanı) · Node.js + TypeScript + Hono/Fastify (frontend ile aynı dil, tip paylaşımı) · Go (yüksek performans, tek binary, düşük bellek) · Django (hazır admin paneli, büyük monolit) |
13
- | 2 | Veritabanı | **PostgreSQL** (önerilen: her şeye yeter, JSON desteği) · SQLite / Turso (tek sunucu, küçük ölçek, sıfır işletme) · MongoDB (şemasız doküman, değişken yapı) |
14
- | 3 | ORM / sorgu | **SQLAlchemy 2 + Alembic** (Python) · SQLModel (Pydantic ile tek model, daha basit) · Node seçildiyse: Drizzle (önerilen) / Prisma |
15
- | 4 | Kimlik doğrulama | **Dış sağlayıcının JWT'si** (Supabase Auth / Clerk; kullanıcı yönetimini sen yazmazsın) · API anahtarı (servisler arası, B2B API) · Kendi oturum/JWT'n (tam kontrol; güvenlik yükü sende) |
16
- | 5 | Arka plan işleri | **Platform cron'u** (önerilen basit zamanlanmış işler için) · ARQ / Celery + Redis (kuyruk, yeniden deneme, yoğun iş) · Temporal / Inngest (çok adımlı, uzun süren iş akışları) · Yok |
17
- | 6 | API stili | **REST + OpenAPI** (önerilen) · GraphQL (çok farklı istemci, esnek sorgu) · tRPC (sadece TypeScript istemci) |
18
- | 7 | Barındırma | **Railway** (önerilen: en kolay, Postgres dahil; ücretsiz kalıcı katman yok, Hobby aylık 5 dolar ve 5 dolarlık kullanım içerir (kaynak: https://docs.railway.com/pricing/plans, 2026-10-26)) · Fly.io (kullanıcıya yakın bölge, ölçekleme) · Render · Google Cloud Run (istek başı ödeme, sıfıra ölçeklenir) · VPS + Coolify (sabit maliyet, bakım sende) |
19
- | 8 | Paket yönetimi | **uv** (önerilen Python için: çok hızlı, kilit dosyası) · Poetry |
20
- | 9 | Gözlem | **Sentry + yapılandırılmış log** (Better Stack / Axiom) · OpenTelemetry (dağıtık servisler) |
21
- | 10 | Test | **pytest + httpx** (önerilen) · Node seçildiyse: Vitest + supertest |
12
+ | 1 | Language and framework | **Python + FastAPI** (recommended: AI/data work, fast development, automatic OpenAPI docs) · Node.js + TypeScript + Hono/Fastify (same language as the frontend, shared types) · Go (high performance, single binary, low memory) · Django (ready-made admin panel, large monolith) |
13
+ | 2 | Database | **PostgreSQL** (recommended: fits everything, JSON support) · SQLite / Turso (single server, small scale, zero operations) · MongoDB (schemaless documents, variable structure) |
14
+ | 3 | ORM / queries | **SQLAlchemy 2 + Alembic** (Python) · SQLModel (one model with Pydantic, simpler) · If Node is chosen: Drizzle (recommended) / Prisma |
15
+ | 4 | Authentication | **An external provider's JWT** (Supabase Auth / Clerk; you do not write user management) · API key (service to service, B2B API) · Your own session/JWT (full control; the security burden is yours) |
16
+ | 5 | Background jobs | **Platform cron** (recommended for simple scheduled jobs) · ARQ / Celery + Redis (queue, retries, heavy work) · Temporal / Inngest (multi-step, long-running workflows) · None |
17
+ | 6 | API style | **REST + OpenAPI** (recommended) · GraphQL (many different clients, flexible queries) · tRPC (TypeScript clients only) |
18
+ | 7 | Hosting | **Railway** (recommended: easiest, Postgres included; no free permanent tier, Hobby is 5 dollars a month and includes 5 dollars of usage (kaynak: https://docs.railway.com/pricing/plans, 2026-10-26)) · Fly.io (region close to users, scaling) · Render · Google Cloud Run (pay per request, scales to zero) · VPS + Coolify (fixed cost, maintenance is yours) |
19
+ | 8 | Package management | **uv** (recommended for Python: very fast, lock file) · Poetry |
20
+ | 9 | Observability | **Sentry + structured logs** (Better Stack / Axiom) · OpenTelemetry (distributed services) |
21
+ | 10 | Testing | **pytest + httpx** (recommended) · If Node is chosen: Vitest + supertest |
22
22
 
23
23
  ## Seçilen teknolojiler
24
24
 
25
- > `/start` Adım 4'te karar noktalarına göre doldurulur. Aşağıdaki tablo **önerilen** yığındır ve onaylanana kadar öneri sayılır.
26
- > Seçim farklıysa bu dosyanın komut, klasör, kural, doğrulama ve kontrol bölümleri seçime göre yeniden yazılır.
25
+ > Filled in by `/start` Step 4 from the decision points. The table below is the **recommended** stack and counts as a proposal until approved.
26
+ > If the choice differs, rewrite this file's commands, folder, rules, verification and checks sections to match.
27
27
 
28
- | Katman | Seçim | Not |
28
+ | Layer | Choice | Note |
29
29
  |---|---|---|
30
- | Dil | Python 3.12+ | Alternatif: Node.js + TypeScript (Hono/Fastify + Drizzle) |
31
- | Paket yönetimi | uv | `pip install` değil, `uv add` |
30
+ | Language | Python 3.12+ | Alternative: Node.js + TypeScript (Hono/Fastify + Drizzle) |
31
+ | Package management | uv | `uv add`, not `pip install` |
32
32
  | API | FastAPI + Pydantic v2 | |
33
- | Ayarlar | pydantic-settings | Tüm config ortam değişkeninden |
34
- | DB | PostgreSQL + SQLAlchemy 2 (veya SQLModel) | |
33
+ | Settings | pydantic-settings | All config comes from environment variables |
34
+ | DB | PostgreSQL + SQLAlchemy 2 (or SQLModel) | |
35
35
  | Migration | Alembic | |
36
- | Arka plan işleri | Cron (platform) / ARQ / Celery | İhtiyaç kadar; basit iş için cron yeter |
36
+ | Background jobs | Cron (platform) / ARQ / Celery | Only as needed; cron is enough for simple jobs |
37
37
  | Lint + format | Ruff | |
38
38
  | Test | pytest + httpx | |
39
- | Paketleme | Docker | |
39
+ | Packaging | Docker | |
40
40
  | Hosting | Railway / Fly.io / Render | |
41
- | Hata takibi | Sentry | |
42
- | Cron izleme | Healthchecks.io (dead man's switch) | İş çalışmazsa alarm |
41
+ | Error tracking | Sentry | |
42
+ | Cron monitoring | Healthchecks.io (dead man's switch) | Alarm if a job does not run |
43
43
 
44
- ## Komutlar
44
+ ## Komutlar (commands)
45
45
 
46
46
  ```bash
47
- uv sync # bağımlılıkları kur
48
- uv run fastapi dev app/main.py # geliştirme
47
+ uv sync # install dependencies
48
+ uv run fastapi dev app/main.py # development
49
49
  uv run pytest # test
50
50
  uv run ruff check . # lint
51
51
  uv run ruff format . # format
52
- uv run alembic revision --autogenerate -m "[ad]" # migration oluştur (çıktıyı mutlaka oku)
53
- uv run alembic upgrade head # migration uygula
54
- uv run --with pip-audit pip-audit # bağımlılık açıkları
52
+ uv run alembic revision --autogenerate -m "[ad]" # create a migration (always read the output)
53
+ uv run alembic upgrade head # apply migrations
54
+ uv run --with pip-audit pip-audit # dependency vulnerabilities
55
55
  docker build -t [ad] . && docker run --env-file .env -p 8000:8000 [ad]
56
56
  ```
57
57
 
58
- ## Klasör yapısı
58
+ ## Folder structure
59
59
 
60
- Özellik bazlı yapı ve kurallar: `docs/architecture/structure.md`. Harita: `.claude/structure.json` (dışına yazım sorulur, CI denetler).
60
+ Feature-based structure and rules: `docs/architecture/structure.md`. Map: `.claude/structure.json` (writing outside it is asked about, CI checks it).
61
61
  ```
62
62
  app/
63
- ├── main.py # uygulama, router kayıtları, /health
63
+ ├── main.py # app, router registration, /health
64
64
  ├── config.py # pydantic-settings
65
- ├── core/ # veritabanı oturumu, güvenlik, loglama, hata işleyiciler, ortak bağımlılıklar
65
+ ├── core/ # database session, security, logging, error handlers, shared dependencies
66
66
  ├── features/
67
- │ └── <özellik>/ # örn. invoice/
68
- │ ├── router.py # HTTP uçları (ince)
69
- │ ├── service.py # iş mantığı
70
- │ ├── repository.py # veritabanı erişimi
67
+ │ └── <feature>/ # e.g. invoice/
68
+ │ ├── router.py # HTTP endpoints (thin)
69
+ │ ├── service.py # business logic
70
+ │ ├── repository.py # database access
71
71
  │ ├── models.py # SQLAlchemy modelleri
72
- │ ├── schemas.py # Pydantic giriş/çıkış şemaları
72
+ │ ├── schemas.py # Pydantic input/output schemas
73
73
  │ ├── dependencies.py
74
74
  │ └── exceptions.py
75
- ├── shared/ # birden fazla özelliğin kullandığı yardımcılar
76
- └── jobs/ # zamanlanmış ve arka plan işleri (idempotent)
75
+ ├── shared/ # helpers used by more than one feature
76
+ └── jobs/ # scheduled and background jobs (idempotent)
77
77
  alembic/ # migration'lar
78
78
  tests/
79
- ├── <özellik>/ # özelliğe göre testler (test_O_01_1_... kabul testleri dahil)
80
- └── live/ # canlı izleme testleri
79
+ ├── <feature>/ # tests by feature (test_O_01_1_... kabul testleri dahil)
80
+ └── live/ # live monitoring tests
81
81
  Dockerfile pyproject.toml uv.lock
82
82
  ```
83
83
 
84
- ## Kodlama kuralları
84
+ ## Coding rules
85
85
 
86
- - Router ince, iş mantığı `services/`'te.
87
- - Her uç noktada Pydantic giriş şeması; dönüşte de şema (iç alanlar sızmasın).
88
- - Tutarlı hata biçimi: `{"error": {"code": "...", "message": "..."}}`.
89
- - Liste uçlarında sayfalama zorunlu.
90
- - **Her dış çağrıda açık timeout** (`requests`'te varsayılan timeout yoktur, istek sonsuza kadar asılı kalabilir) ve gerekiyorsa geri çekilmeli tekrar (retry + backoff).
91
- - İşler (jobs) **idempotent**: iki kez çalışırsa zarar vermez.
92
- - Loglar yapılandırılmış (JSON), istek kimliği (request id) içerir; kişisel veri ve sır içermez.
93
- - `/health` ucu: uygulama + DB bağlantısı.
94
- - Migration'lar elle gözden geçirilir; `autogenerate` her şeyi doğru yakalamaz.
95
- - Async uçta senkron, bloklayan kütüphane kullanma.
86
+ - Keep the router thin; business logic goes in `services/`.
87
+ - Every endpoint has a Pydantic input schema; the response has a schema too (internal fields must not leak).
88
+ - Use a consistent error format: `{"error": {"code": "...", "message": "..."}}`.
89
+ - Pagination is required on list endpoints.
90
+ - **An explicit timeout on every external call** (`requests` has no default timeout, so a request can hang forever) and, where needed, retry with backoff.
91
+ - Jobs are **idempotent**: running twice does no harm.
92
+ - Logs are structured (JSON) and include the request id; they contain no personal data or secrets.
93
+ - `/health` endpoint: the app + the DB connection.
94
+ - Review migrations by hand; `autogenerate` does not catch everything correctly.
95
+ - Do not use a synchronous, blocking library in an async endpoint.
96
96
 
97
- ## Doğrulama (görev bitmeden kanıt)
97
+ ## Verification (evidence before a task is done)
98
98
 
99
- - Uç nokta: sunucuyu çalıştır, `curl -i` (veya httpx) ile ana senaryo + yetkisiz istek + geçersiz girdi. İstek ve yanıtı göster.
100
- - İş/cron: işi elle bir kez tetikle, logu ve DB'deki etkisini göster; iki kez çalıştırıp idempotent olduğunu göster.
101
- - Migration: `alembic upgrade head` → `alembic downgrade -1` → `alembic upgrade head` temiz geçiyor.
99
+ - Endpoint: run the server, then use `curl -i` (or httpx) for the main scenario + an unauthorized request + invalid input. Show the request and the response.
100
+ - Job/cron: trigger the job by hand once, show the log and its effect in the DB; run it twice and show it is idempotent.
101
+ - Migration: `alembic upgrade head` → `alembic downgrade -1` → `alembic upgrade head` passes cleanly.
102
102
 
103
- ## Otomatik kontroller
103
+ ## Automatic checks
104
104
 
105
- | Katman | Ne yapar | Kurulum |
105
+ | Layer | What it does | Setup |
106
106
  |---|---|---|
107
- | Claude hook'ları | Sır yazımını engeller; `.py` dosyasını Ruff ile biçimlendirir ve lint hatasını AI'ya geri bildirir | Hazır (`.claude/settings.json`). Node.js gerekir |
108
- | Pre-commit | Ruff + sır taraması, commit öncesi | `uvx pre-commit install` (bir kez) |
109
- | CI (+ Semgrep, kopya kod, karmaşıklık bütçesi) | Lint, format, migration, test, açık taraması, Docker build, gitleaks, değişen dosyalarda karmaşıklık bütçesi (fonksiyon karmaşıklığı 15, fonksiyon 80, dosya 400 satır; `node .claude/hooks/budget.mjs --check`) | `.github/workflows/ci.yml` hazır; GitHub'a push et |
110
- | Dependabot | Haftalık bağımlılık PR'ları | `.github/dependabot.yml` hazır |
111
- | MCP | Sentry'deki hataları okuma (`/maintain`) | `.mcp.json` hazır; ilk kullanımda Sentry'ye giriş yap |
107
+ | Claude hooks | Block writing secrets; format `.py` files with Ruff and feed lint errors back to the AI | Ready (`.claude/settings.json`). Needs Node.js |
108
+ | Pre-commit | Ruff + secret scan, before commit | `uvx pre-commit install` (once) |
109
+ | CI (+ Semgrep, duplicate code, complexity budget) | Lint, format, migration, test, vulnerability scan, Docker build, gitleaks, complexity budget on changed files (function complexity 15, function 80, file 400 lines; `node .claude/hooks/budget.mjs --check`) | `.github/workflows/ci.yml` is ready; push to GitHub |
110
+ | Dependabot | Weekly dependency PRs | `.github/dependabot.yml` is ready |
111
+ | MCP | Read errors in Sentry (`/maintain`) | `.mcp.json` is ready; sign in to Sentry on first use |
112
112
 
113
- ## Kabul testleri ve özellik bayrakları
113
+ ## Acceptance tests and feature flags
114
114
 
115
- **Kabul testleri** (`docs/quality/test-plan.md` §1a): Test fonksiyonunun adı kriter kimliğini taşır (`test_O_01_1_...`). Pano JUnit raporunu okur:
115
+ **Acceptance tests** (`docs/quality/test-plan.md` §1a): The test function name carries the criterion id (`test_O_01_1_...`). The dashboard reads the JUnit report:
116
116
 
117
117
  ```bash
118
118
  uv run pytest --junitxml=test-results/junit.xml
119
119
  ```
120
120
 
121
- **Özellik bayrakları** (`docs/operations/feature-flags.md`): Acil kapatma yeniden deploy gerektirmemeli. Veritabanında `feature_flags` tablosu (`ad`, `acik`, `yuzde`, `guncellendi`) + süreç içinde 60 sn önbellek. Okuma tek bir yerden yapılır: `app/services/bayrak.py` → `bayrak_acik("ad", kullanici_id)`. Bayrağı değiştirmek bir admin ucu veya SQL ile yapılır ve loglanır.
121
+ **Feature flags** (`docs/operations/feature-flags.md`): An emergency shutoff must not need a redeploy. Use a `feature_flags` table in the database (`ad`, `acik`, `yuzde`, `guncellendi`) + a 60 s in-process cache. Reading happens in one place: `app/services/bayrak.py` → `bayrak_acik("ad", kullanici_id)`. Changing a flag is done through an admin endpoint or SQL and is logged.
122
122
 
123
- ## Sık yapılan AI hataları (bunlara dikkat)
123
+ ## Common AI mistakes (watch for these)
124
124
 
125
- - Koda, teste veya ayara bu makineye özel mutlak yol yazmak (`C:\Users\<ad>\…`, `/home/<ad>/…`, proje klasörünün tam yolu): başka makinede çalışmaz. Yolu `Path(__file__).parent`, ayardan gelen kök veya testte `tmp_path` ile türet. Deterministik kapı bunu yakalar.
126
- - Pydantic v1 sözdizimini (`class Config`, `.dict()`) v2 ile karıştırmak.
127
- - Dış API çağrısında timeout koymamak, hatayı yutmak (`except: pass`).
128
- - CORS'u `allow_origins=["*"]` ile kimlik bilgisiyle birlikte açmak.
129
- - Cron işini sunucu içinde `while True: sleep` ile yazmak (yeniden başlayınca kaybolur, izlenemez).
130
- - DB oturumunu kapatmamak, bağlantı havuzunu tüketmek.
125
+ - Writing a machine-specific absolute path into code, a test or a setting (`C:\Users\<ad>\…`, `/home/<ad>/…`, the full path of the project folder): it does not work on another machine. Derive the path with `Path(__file__).parent`, a root from settings, or `tmp_path` in a test. The deterministic gate catches this.
126
+ - Mixing Pydantic v1 syntax (`class Config`, `.dict()`) with v2.
127
+ - Not setting a timeout on an external API call, swallowing the error (`except: pass`).
128
+ - Opening CORS with `allow_origins=["*"]` together with credentials.
129
+ - Writing a cron job inside the server as `while True: sleep` (lost on restart, cannot be monitored).
130
+ - Not closing the DB session, exhausting the connection pool.
131
131
 
132
- ## Güvenlik (ek)
132
+ ## Security (extra)
133
133
 
134
- - [ ] Kimlik doğrulama: JWT doğrulaması (imza + süre + issuer) veya API anahtarı (hash'lenmiş saklanır).
135
- - [ ] Rate limit (slowapi veya reverse proxy).
136
- - [ ] Prod'da `/docs` ve `/openapi.json` kapalı veya korumalı.
137
- - [ ] CORS beyaz liste.
138
- - [ ] Docker imajı root olmayan kullanıcıyla çalışıyor, imajda `.env` yok.
134
+ - [ ] Authentication: JWT verification (signature + expiry + issuer) or an API key (stored hashed).
135
+ - [ ] Rate limit (slowapi or reverse proxy).
136
+ - [ ] `/docs` and `/openapi.json` are off or protected in prod.
137
+ - [ ] CORS allowlist.
138
+ - [ ] The Docker image runs as a non-root user, and the image has no `.env`.
139
139
 
140
- ## Canlıya alma (ek)
140
+ ## Go live (extra)
141
141
 
142
- - [ ] Dockerfile: çok aşamalı, root olmayan kullanıcı, `HEALTHCHECK`
143
- - [ ] Platformda health check `/health`'e bağlı
144
- - [ ] Migration deploy adımında otomatik veya kontrollü çalışıyor (uygulamadan önce)
145
- - [ ] Ortam değişkenleri platformda; `DEBUG` kapalı
146
- - [ ] Kaynak limitleri (bellek/CPU) ve otomatik yeniden başlatma
147
- - [ ] Her cron işi Healthchecks.io'ya ping atıyor; atmazsa alarm
148
- - [ ] Log saklama ve arama (platform logları veya Better Stack/Axiom)
149
- - [ ] Yük altında basit deneme (`hey`, `k6`): beklenen trafiğin 3 katında hata yok
150
- - [ ] Yanıt süresi hedefi: p95 < 500 ms (ana uçlar)
142
+ - [ ] Dockerfile: multi-stage, non-root user, `HEALTHCHECK`
143
+ - [ ] The platform health check points to `/health`
144
+ - [ ] Migration runs automatically or in a controlled way at the deploy step (before the app)
145
+ - [ ] Environment variables are on the platform; `DEBUG` is off
146
+ - [ ] Resource limits (memory/CPU) and automatic restart
147
+ - [ ] Every cron job pings Healthchecks.io; an alarm fires if it does not
148
+ - [ ] Log retention and search (platform logs or Better Stack/Axiom)
149
+ - [ ] A simple load trial (`hey`, `k6`): no errors at 3 times the expected traffic
150
+ - [ ] Response time target: p95 < 500 ms (main endpoints)
151
151
 
152
- ## Bakım (ek)
152
+ ## Maintenance (extra)
153
153
 
154
- - Haftalık: cron işleri başarılı mı, kuyruk birikmesi var mı, 5xx oranı.
155
- - Aylık: `uv lock --upgrade` + testler, `uv run --with pip-audit pip-audit`, yavaş sorgular (`pg_stat_statements`).
156
- - Çeyreklik: Python ve temel kütüphanelerin majör sürümleri, Docker taban imajı güncellemesi, DB indeks ve boyut gözden geçirme.
154
+ - Weekly: did the cron jobs succeed, is the queue backing up, the 5xx rate.
155
+ - Monthly: `uv lock --upgrade` + tests, `uv run --with pip-audit pip-audit`, slow queries (`pg_stat_statements`).
156
+ - Quarterly: major versions of Python and core libraries, Docker base image update, DB index and size review.
@@ -1,62 +1,62 @@
1
- # Proje yapısı: Backend (FastAPI)
1
+ # Project structure: Backend (FastAPI)
2
2
 
3
- > Bu dosya `.claude/structure.json` haritasının insan için açıklamasıdır; ikisi birlikte güncellenir.
4
- > Yapıya uyum zorunludur: yazım anında hook, her PR'da CI, kurul Mimarı ve `/findings-tech` denetler.
3
+ > This file is the human-readable description of the `.claude/structure.json` map; update both together.
4
+ > Following the structure is mandatory: the hook checks at write time, CI on every PR, the board Architect and `/findings-tech` also check.
5
5
 
6
- ## Kod
6
+ ## Code
7
7
 
8
8
  ```
9
9
  app/
10
- ├── main.py # uygulama, router kayıtları, /health
10
+ ├── main.py # app, router registrations, /health
11
11
  ├── config.py # pydantic-settings
12
- ├── core/ # veritabanı oturumu, güvenlik, loglama, hata işleyiciler, ortak bağımlılıklar
12
+ ├── core/ # database session, security, logging, error handlers, common dependencies
13
13
  ├── features/
14
- │ └── <özellik>/ # örn. invoice/
15
- │ ├── router.py # HTTP uçları (ince)
16
- │ ├── service.py # iş mantığı
17
- │ ├── repository.py # veritabanı erişimi
18
- │ ├── models.py # SQLAlchemy modelleri
19
- │ ├── schemas.py # Pydantic giriş/çıkış şemaları
14
+ │ └── <feature>/ # e.g. invoice/
15
+ │ ├── router.py # HTTP endpoints (thin)
16
+ │ ├── service.py # business logic
17
+ │ ├── repository.py # database access
18
+ │ ├── models.py # SQLAlchemy models
19
+ │ ├── schemas.py # Pydantic input/output schemas
20
20
  │ ├── dependencies.py
21
21
  │ └── exceptions.py
22
- ├── shared/ # birden fazla özelliğin kullandığı yardımcılar
23
- └── jobs/ # zamanlanmış ve arka plan işleri (idempotent)
24
- alembic/ # migration'lar
22
+ ├── shared/ # helpers used by more than one feature
23
+ └── jobs/ # scheduled and background jobs (idempotent)
24
+ alembic/ # migrations
25
25
  tests/
26
- ├── <özellik>/ # özelliğe göre testler (test_O_01_1_... kabul testleri dahil)
27
- └── live/ # canlı izleme testleri
26
+ ├── <feature>/ # tests by feature (including test_O_01_1_... acceptance tests)
27
+ └── live/ # live monitoring tests
28
28
  Dockerfile pyproject.toml uv.lock
29
29
  ```
30
30
 
31
- ## Her projede ortak
31
+ ## Common to every project
32
32
 
33
33
  ```
34
34
  .
35
- ├── .claude/ # Claude Code: komutlar, ajanlar, hook'lar, kurul, bulgular, structure.json
36
- ├── .github/ # CI, Dependabot, bulut ajanları
35
+ ├── .claude/ # Claude Code: commands, agents, hooks, board, findings, structure.json
36
+ ├── .github/ # CI, Dependabot, cloud agents
37
37
  ├── docs/
38
38
  │ ├── product/ # prd, roadmap, glossary, launch, feedback, unit-economics
39
- │ ├── architecture/ # overview, stack, structure (bu dosya)
40
- │ ├── design/ # design-guide (arayüz varsa)
41
- │ ├── decisions/ # log.md (karar günlüğü) + adr-NNNN-*.md (ayrıntılı kararlar)
39
+ │ ├── architecture/ # overview, stack, structure (this file)
40
+ │ ├── design/ # design-guide (if there is an interface)
41
+ │ ├── decisions/ # log.md (decision log) + adr-NNNN-*.md (detailed decisions)
42
42
  │ ├── quality/ # test-plan, metrics, retros
43
43
  │ ├── security/ # checklist
44
44
  │ ├── legal/ # privacy-kvkk
45
45
  │ ├── operations/ # release-checklist, maintenance, accounts, feature-flags
46
46
  │ ├── workflow/ # progress, decision-protocol, skills, board, usage-limits, cost-log
47
- │ ├── findings/ # /findings-* raporları (tür/tarih.md, latest.md)
48
- │ └── archive/ # artık geçerli olmayan ama saklanan dokümanlar
49
- ├── sandbox/ # deneme, keşif kodu, geçici script (git'e girmez)
47
+ │ ├── findings/ # /findings-* reports (type/date.md, latest.md)
48
+ │ └── archive/ # documents that are no longer valid but kept
49
+ ├── sandbox/ # trials, exploration code, temporary scripts (not committed to git)
50
50
  ├── AGENTS.md CLAUDE.md README.md CHANGELOG.md
51
51
  └── .env.example
52
52
  ```
53
53
 
54
- ## Kurallar
54
+ ## Rules
55
55
 
56
- 1. **Yeni dosya, haritadaki yerine.** `.claude/structure.json` haritası dışına yazım sorulur; dağınıklık kalıpları (`*.bak`, `*-old.*`, `* copy*`, `temp/`, `deneme*`) engellenir. CI her PR'da tüm depoyu denetler.
57
- 2. **Özellik bazlı.** Bir özelliğe ait her şey (bileşen, mantık, test) `features/<özellik>/` altında durur. Bir kod iki özellik tarafından kullanılmaya başlarsa paylaşılan katmana (`components/`, `lib/`, `shared/`) taşınır.
58
- 3. **Özellikler birbirinin içine girmez.** `features/a` başka bir özelliğin iç dosyalarını içe aktarmaz; sadece o özelliğin `index` dosyasından dışa açtıklarını kullanır.
59
- 4. **Adlandırma:** Klasörler ve dosyalar `kebab-case`. React bileşen dosyaları `PascalCase.tsx` olabilir; Python modülleri `snake_case.py`. Özellik klasör adı tekil ve İngilizce (`invoice`, `customer`).
60
- 5. **Geçici ve alakasız işler** `sandbox/` altına. İşe yarayan bir şey çıkarsa doğru yere taşınır; `sandbox/` düzenli temizlenir.
61
- 6. **Eski dokümanlar** silinmez, `docs/archive/` altına taşınır ve başına neden arşivlendiği yazılır.
62
- 7. **Haritayı değiştirmek** (yeni üst klasör, yeni katman) bir `teknik` karardır: kullanıcıya sorulur, `docs/decisions/` altına kaydedilir, sonra `.claude/structure.json` ve bu dosya güncellenir.
56
+ 1. **A new file goes to its place in the map.** Writing outside the `.claude/structure.json` map is asked about; clutter patterns (`*.bak`, `*-old.*`, `* copy*`, `temp/`, `deneme*`) are blocked. CI checks the whole repo on every PR.
57
+ 2. **By feature.** Everything that belongs to a feature (component, logic, test) lives under `features/<feature>/`. When two features start using the same code, it moves to the shared layer (`components/`, `lib/`, `shared/`).
58
+ 3. **Features do not reach into each other.** `features/a` does not import another feature's internal files; it uses only what that feature exposes through its `index` file.
59
+ 4. **Naming:** Folders and files use `kebab-case`. React component files may be `PascalCase.tsx`; Python modules use `snake_case.py`. A feature folder name is singular and in English (`invoice`, `customer`).
60
+ 5. **Temporary and unrelated work** goes under `sandbox/`. If something useful comes out of it, it moves to the right place; `sandbox/` is cleaned regularly.
61
+ 6. **Old documents** are not deleted; they move under `docs/archive/`, with a line at the top saying why they were archived.
62
+ 7. **Changing the map** (a new top-level folder, a new layer) is a `teknik` decision: ask the user, record it under `docs/decisions/`, then update `.claude/structure.json` and this file.
@@ -1,5 +1,5 @@
1
1
  {
2
- "description": "Mobil (Expo Router, özellik bazlı). Yeni dosyalar sadece bu kalıplara uyan yerlere yazılır; değiştirmek teknik bir karardır. Ayrıntı: docs/architecture/structure.md",
2
+ "description": "Mobile (Expo Router, by feature). New files are written only to places that match these patterns; changing them is a technical decision. Details: docs/architecture/structure.md",
3
3
  "allow": [
4
4
  "README.md",
5
5
  "CHANGELOG.md",
@@ -1,14 +1,14 @@
1
- # Bu dosya commit edilir; GERÇEK DEĞER YAZMA. Kopyala: cp .env.example .env
2
- # Yerel değerler sadece GELİŞTİRME (dev) projesinden gelir. Prod değerleri sadece EAS ortam değişkenlerinde durur; bu makineye ve AI ortamına girmez.
3
- # EXPO_PUBLIC_ ile başlayanlar uygulama paketine gömülür = herkese açık.
4
- # Gizli anahtar gerektiren her işlem sunucuda (Supabase Edge Function / backend) yapılır.
1
+ # This file is committed; DO NOT WRITE REAL VALUES. Copy: cp .env.example .env
2
+ # Local values come only from the DEVELOPMENT (dev) project. Production values live only in EAS environment variables; they never reach this machine or the AI environment.
3
+ # Variables starting with EXPO_PUBLIC_ are embedded in the app bundle = public.
4
+ # Anything that needs a secret key runs on the server (Supabase Edge Function / backend).
5
5
 
6
6
  EXPO_PUBLIC_API_URL=
7
7
  EXPO_PUBLIC_SUPABASE_URL=
8
- EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY= # sb_publishable_… (gizli anahtar uygulamaya girmez)
8
+ EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY= # sb_publishable_… (the secret key never goes into the app)
9
9
  EXPO_PUBLIC_REVENUECAT_IOS_KEY=
10
10
  EXPO_PUBLIC_REVENUECAT_ANDROID_KEY=
11
11
  EXPO_PUBLIC_SENTRY_DSN=
12
12
 
13
- # Sadece build/EAS tarafında (pakete girmez; EAS Secrets'a da ekle)
13
+ # Build/EAS side only (not bundled in the app; add to EAS Secrets too)
14
14
  SENTRY_AUTH_TOKEN=
@@ -1,5 +1,5 @@
1
- # Expo SDK'ya bağlı paketler Dependabot ile değil, 'npx expo install --fix' ile güncellenir.
2
- # Güvenlik güncellemeleri için: GitHub > Settings > Code security > Dependabot security updates: Açık.
1
+ # Packages tied to the Expo SDK are updated with 'npx expo install --fix', not with Dependabot.
2
+ # For security updates: GitHub > Settings > Code security > Dependabot security updates: On.
3
3
  version: 2
4
4
  updates:
5
5
  - package-ecosystem: npm
@@ -1,4 +1,4 @@
1
- # Her push ve PR'da çalışır. Build (EAS) burada değil, EAS'ta yapılır.
1
+ # Runs on every push and PR. The build (EAS) is not done here; it is done on EAS.
2
2
  name: CI
3
3
 
4
4
  on:
@@ -6,7 +6,7 @@ on:
6
6
  branches: [main]
7
7
  pull_request:
8
8
 
9
- # İşler depoyu sadece okur; ele geçirilen bir adım token ile depoya yazamasın
9
+ # Jobs only read the repo; a hijacked step must not be able to write to the repo with the token
10
10
  permissions:
11
11
  contents: read
12
12
 
@@ -23,16 +23,16 @@ jobs:
23
23
  - run: npx expo lint
24
24
  - run: npx tsc --noEmit
25
25
  - run: npm run --if-present test
26
- - name: SDK uyumu
26
+ - name: SDK compatibility
27
27
  run: npx expo-doctor
28
- - name: Bağımlılık açıkları (yüksek ve üstü)
28
+ - name: Dependency vulnerabilities (high and above)
29
29
  run: npm audit --audit-level=high --omit=dev
30
30
 
31
31
  structure:
32
32
  runs-on: ubuntu-latest
33
33
  steps:
34
34
  - uses: actions/checkout@v7
35
- - name: Klasör yapısı (.claude/structure.json)
35
+ - name: Folder structure (.claude/structure.json)
36
36
  run: node .claude/hooks/structure-guard.mjs --check
37
37
 
38
38
  karmasiklik:
@@ -40,14 +40,14 @@ jobs:
40
40
  steps:
41
41
  - uses: actions/checkout@v7
42
42
  with:
43
- fetch-depth: 0 # base commit'iyle karşılaştırmak için
44
- - name: Karmaşıklık bütçesi (değişen dosyalar; fonksiyon karmaşıklığı 15, fonksiyon 80, dosya 400 satır)
43
+ fetch-depth: 0 # to compare with the base commit
44
+ - name: Complexity budget (changed files; function complexity 15, function 80, file 400 lines)
45
45
  env:
46
46
  BASE: ${{ github.event.pull_request.base.sha || github.event.before }}
47
47
  run: node .claude/hooks/budget.mjs --check --base "$BASE"
48
48
 
49
- # RLS saldırgan testi: CI içinde boş bir yerel Supabase açılır, migration'lar uygulanır. Sır gerekmez; dev ve prod'a dokunmaz.
50
- # Supabase kullanılmıyorsa (supabase/config.toml yoksa) adımlar atlanır.
49
+ # RLS adversarial test: an empty local Supabase starts inside CI and the migrations are applied. No secrets needed; it does not touch dev or prod.
50
+ # If Supabase is not used (no supabase/config.toml), the steps are skipped.
51
51
  rls:
52
52
  runs-on: ubuntu-latest
53
53
  steps:
@@ -59,13 +59,13 @@ jobs:
59
59
  cache: npm
60
60
  - if: hashFiles('supabase/config.toml') != ''
61
61
  run: npm ci
62
- - name: Yerel Supabase
62
+ - name: Local Supabase
63
63
  if: hashFiles('supabase/config.toml') != ''
64
64
  run: npx -y supabase@2.120.0 start -x studio,imgproxy,edge-runtime,logflare,vector,realtime,storage-api,supavisor,postgres-meta
65
- - name: RLS saldırgan testi (anonim ve ikinci kullanıcı)
65
+ - name: RLS adversarial test (anonymous and second user)
66
66
  if: hashFiles('supabase/config.toml') != ''
67
67
  run: |
68
- # Sadece gereken anahtarlar alınır; çıktı kabuk komutu olarak çalıştırılmaz
68
+ # Only the needed keys are taken; the output is not run as a shell command
69
69
  anahtarlar=$(npx -y supabase@2.120.0 status -o env | grep -E '^(API_URL|ANON_KEY|SERVICE_ROLE_KEY|DB_URL|PUBLISHABLE_KEY|SECRET_KEY)=')
70
70
  while IFS="=" read -r ad deger; do deger="${deger%\"}"; export "$ad=${deger#\"}"; done <<< "$anahtarlar"
71
71
  node --test tests/security/rls.mjs
@@ -76,29 +76,29 @@ jobs:
76
76
  image: semgrep/semgrep
77
77
  steps:
78
78
  - uses: actions/checkout@v7
79
- - name: Statik güvenlik analizi (yüksek önemli bulgular CI'ı durdurur)
79
+ - name: Static security analysis (high severity findings stop CI)
80
80
  run: semgrep scan --config p/default --config p/owasp-top-ten --severity ERROR --error
81
81
 
82
82
  kopya-kod:
83
83
  runs-on: ubuntu-latest
84
84
  steps:
85
85
  - uses: actions/checkout@v7
86
- - name: Kopya kod oranı (eşik %5)
86
+ - name: Duplicate code ratio (threshold 5%)
87
87
  run: npx --yes jscpd@4 --threshold 5 --silent --ignore "**/node_modules/**,**/.next/**,**/dist/**,**/build/**,**/.venv/**,**/coverage/**,**/.expo/**" .
88
88
 
89
89
  sir-taramasi:
90
90
  runs-on: ubuntu-latest
91
- # gitleaks PR'da commit listesini okur (pulls/{n}/commits); özel depoda bu izin olmadan 403
91
+ # gitleaks reads the commit list on a PR (pulls/{n}/commits); in a private repo this gives 403 without this permission
92
92
  permissions:
93
93
  contents: read
94
94
  pull-requests: read
95
95
  steps:
96
96
  - uses: actions/checkout@v7
97
97
  with:
98
- fetch-depth: 0 # tüm geçmiş taranır
99
- # Kişisel hesapta ücretsiz; organizasyon deposunda GITLEAKS_LICENSE sırrı gerekir
98
+ fetch-depth: 0 # the whole history is scanned
99
+ # Free on a personal account; an organization repo needs the GITLEAKS_LICENSE secret
100
100
  - uses: gitleaks/gitleaks-action@v3
101
101
  env:
102
102
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
103
- # Token salt okunur: PR yorumu kapalı, sızıntı işi kırmızı yapar
103
+ # The token is read-only: PR comments are off, a leak turns the job red
104
104
  GITLEAKS_ENABLE_COMMENTS: "false"