2026-03-25 05:52:55 +00:00
# Sozsoft Platform - Claude Instructions
This file provides Claude-specific operating rules for this repository.
Primary source of truth for platform behavior is:
- `.github/instructions/ai.instructions.md`
If there is any conflict, follow `.github/instructions/ai.instructions.md` .
2026-08-10 09:08:08 +00:00
## Communication Rules (apply to every response)
1. **Never introduce or summarize the platform.** Assume the user knows what this
application is, how it is built, and which technologies it uses. Do not open a response
with "Sozsoft Platform is a multi-tenant low-code engine…" or any equivalent framing.
2. **Answer the request, nothing more.** No unsolicited architecture overviews, no
restating the decision order, no re-explaining ListForm/DeveloperKit concepts unless
the user actually asked about them.
3. **No preamble, no epilogue.** Skip "Great question", "I reviewed the codebase",
summaries of what you are about to do, and closing recaps of what you just did.
4. **Match the question's size.** A yes/no question gets a sentence. A config question
gets the config. Only a full feature request gets a full proposal.
5. **Respond in the language the user writes in** (Turkish → Turkish).
6. Mention a rule from this file only when it changes the answer — never as boilerplate.
2026-03-25 05:52:55 +00:00
## Purpose
- Maximize delivery through runtime configuration.
- Minimize custom code.
- Preserve platform consistency, security, and tenant isolation.
Primary principle: Configuration first, code last.
## Mandatory Decision Order
2026-08-10 09:08:08 +00:00
For every request, evaluate in this order — internally. State the chosen step only when the
user is asking how to build something, and state it in one line, not as a walkthrough of the
options you rejected.
2026-03-25 05:52:55 +00:00
1. Dynamic configuration with existing ListForm ecosystem
2. SQL Query Manager + Custom Endpoint
3. Dynamic Service
4. Code change (last resort, justification required)
## Non-Negotiable Rules
1. Do not propose new custom React component/page development for standard feature requests.
2. Build new screens using platform configuration mechanisms.
2026-08-10 09:08:08 +00:00
3. Every implementation proposal must include tenant and permission design.
2026-03-25 05:52:55 +00:00
4. Never bypass platform authorization patterns.
5. Never hardcode secrets, tenant IDs, or connection strings.
2026-08-28 07:47:17 +00:00
6. Never step outside the framework without explicit approval (standing default 10).
2026-03-25 05:52:55 +00:00
Exception:
2026-08-10 09:08:08 +00:00
- Custom React/backend code is allowed only when the user explicitly requests implementation
and configuration is insufficient.
- In such cases, explain why configuration-first options are not enough — in a sentence or two.
2026-03-25 05:52:55 +00:00
## Architecture Guardrails
- Backend: Respect ABP module boundaries and explicit, auditable permissions.
- Frontend: Use existing dynamic view infrastructure and metadata-driven behavior.
- Data: Use parameterized SQL patterns and enforce tenant-safe access.
## Dynamic Platform Expectations
- Menus and routes are database-driven.
- Dynamic List/Form/Component infrastructure is the default solution path.
- Keep route, menu, permission, and datasource mappings coherent.
## Security and Compliance
- Enforce RBAC and permission-driven visibility in all layers.
- Never output real credentials, tokens, keys, or secrets.
- Use placeholders in examples.
- Maintain tenant isolation in every query and action.
## Response Contract
2026-08-10 09:08:08 +00:00
The list below applies **only** to a full implementation proposal for a new screen, module,
or integration. It is not a template for questions, debugging, code review, refactors,
explanations, or small changes.
Even for a full proposal: include only the items that carry real content for that request,
and drop the rest. An empty or obvious heading is noise.
2026-03-25 05:52:55 +00:00
1. Goal
2. Decision flow result (which step used)
3. Artifacts to configure
4. SQL/query/endpoint design (if needed)
5. Menu + route + component mapping
6. Permission and role mapping
7. Tenant isolation notes
8. Validation and test checklist
9. Rollback strategy
2026-08-26 18:44:53 +00:00
---
## Standing Context (read this before proposing anything)
These sections encode expectations the user will **not** repeat in every prompt.
`README.md` is the technical map of the platform; this file is how to act on it.
### Where the truth lives
| Konu | Kaynak |
| --- | --- |
| Platform davranı şı , karar sı rası , çı ktı sözleşmesi | `.github/instructions/ai.instructions.md` |
| **Artefakt üretimi** : seed şemaları , enum değerleri, çalı şan örnekler | `.github/instructions/lowcode.instructions.md` |
2026-08-28 07:47:17 +00:00
| **Yetenek envanteri** : JSON kolonları nı n alan alan sözleşmesi, grafik/pivot/tasarı mcı /mail modülü, Saas + Administration menüsündeki hazı r ekranlar | `.github/instructions/lowcode-reference.instructions.md` |
2026-08-26 18:44:53 +00:00
| `api/` kod standardı (sürüm, nullable, ölü kod, modern C#, ABP katmanları ) | `.github/instructions/dotnet.instructions.md` |
| Modül/liste ekleme prosedürü, seeder dosya sorumlulukları | `.github/instructions/list.instructions.md` |
| Ne nerede yaşı yor, hangi ekran ne yapı yor | `README.md` |
| Yetki kodları | `PlatformConsts.AppCodes` (backend) + `constants/permission.constant.ts` (UI) |
| Seed yolları | `SeedPathResolver` |
Bir çelişki varsa sı ra: `ai.instructions.md` → `dotnet.instructions.md` → bu dosya → `README.md` .
### Standing defaults — do not ask again
1. **Yeni tablo** → tenant + tam audit kolonları varsayı lan gelir (`Id`, `TenantId` ,
`CreationTime` , `CreatorId` , `LastModificationTime` , `LastModifierId` , `IsDeleted` ,
`DeletionTime` , `DeleterId` ). Kullanı cı açı kça "tenant yok / audit yok" demedikçe çı karma.
2. **Yeni ekran** → Wizard yolu. `Definitions` altı na otomatik yerleştirme yok; modüle ait yeni
bir kök menü oluştur, `Order = max(Order) + 1` .
3. **Yeni ekran/menü** → yetki sözleşmesi olmadan önerilmez. Menü ve route aynı ekran
sözleşmesini göstermeli.
4. **Kullanı cı ya görünen her metin** → dil anahtarı üzerinden, EN + TR birlikte. Koda gömülü
metin önerme.
5. **Runtime'da üretilen her artefakt** (wizard, custom component, crud endpoint) → ilgili seed
dosyası da yazı lı r/güncellenir. Veritabanı sı fı rlandı ğı nda geri gelmeyen bir şey üretme.
2026-08-28 07:47:17 +00:00
6. **Yeni ekran/komponent talebi — yazı lı ya da görsel** → dosya yazmadan önce **keşif turu** :
toplu sorularla (tur başı na en fazla 4, seçenekli, önerilen varsayı lanlı ) ekran türü, veri
kaynağı , modül, kapsam ve yolun soru setini al; tarifi kur ve **onaylat** , sonra
`configs/seeds/` altı na üret. Şüphede Wizard. Kullanı cı "sorma / sen seç" derse
varsayı lanlarla üret ve sonunda listele. Depodan okunabilen şeyi sorma; tabloya yazma hedefi,
onaycı ve hesap formülü asla varsayı lmaz. Ekran görüntüsü piksel sözleşmesi değildir;
görsel Tur 2'nin çoğunu cevaplar, yalnı zca görselden okunamayanlar sorulur.
Bu kural yalnı zca **yeni üretim** içindir; düzeltme/alan ekleme/debug doğrudan yapı lı r.
Ayrı ntı : `lowcode.instructions.md` §0.6– §0.7.
2026-08-26 18:44:53 +00:00
7. **Ekran içi hesap/koşul ihtiyacı ** → önce `EditorScript` (Script Builder tarifleri), sonra
`EditorOptions` ; kod yazmak son çare.
8. **SQL** → her zaman parametreli. String birleştirme ile sorgu kurma.
9. **Silme** → `DeleteCommand = DefaultDeleteCommand("{Tablo}")` ; ham SQL string'i yazma.
2026-08-28 07:47:17 +00:00
10. **Çerçeve sı nı rı ** → uygulama kendini kendi mekanizmaları yla geliştirir (seed artefaktları ;
var olan `ui` bileşenine eksik olay/prop/küçük yetenek ekleme — komponentin %70'i hazı r
araçlarla kuruluyorsa kalanı bu eklemelerle tamamlanı r, yeni bileşen yazı lmaz; geriye dönük
uyumlu tarif/seçenek/token ekleme).
Bunun dı şı na çı kan her şey — yeni React bileşeni/sayfası , çekirdek motor, yeni entity/
migration, platform tablosu şeması , yeni paket, `Routes` , dı ş entegrasyon — **önce sorulur,
yalnı zca onayla yapı lı r**; onay talebe özeldir. Çerçeve içinde yapı labilen kı sı m sorudan önce
bitirilir. "Yapı lamaz" cevabı yoktur. Listeler: `lowcode.instructions.md` §0.8.
2026-08-26 18:44:53 +00:00
### Cross-cutting: touching one thing means touching these too
- **`scriptRecipes.ts` (TS) ↔ `Domain.Shared/Editors/*.cs` ** — biri değişirse diğeri de değişir.
İkisinin çı ktı sı **birebir aynı ** olmak zorundadı r; aksi hâlde seeder ile bası lan script
dialogda "elle düzenlenmiş" sayı lı r ve kural editörü kapanı r.
2026-09-02 08:32:53 +00:00
- **Wizard seed dosyası nda tekrar yok** → `Wizard` bölümü yalnı zca ekrandan üretilemeyen bilgileri
taşı r. `ListForm` /`Fields` içinde karşı lı ğı olan her alan (veri kaynağı , select, anahtar alan,
kı rı lı m/düzen/düzenleme bayrakları , görünüm option blokları , alt form, widget, iş akı şı , alan
tanı mları ) dosyaya yazı lmadan çı karı lı r (`WizardSeedFileDto.ToSeedJson`) ve okurken geri
doldurulur (`FromSeedJson`). Wizard'a yeni bir alan eklerken karşı lı ğı ListForm'da varsa listeye ekle.
Dosyada kalan wizard alanları üç başlı k altı nda toplanı r — `Menu` , `Language` , `Groups` — ve
`ListFormCode` → `WizardCode` , `MenuParentModuleId` → `ModuleId` adı yla yazı lı r; varsayı lanı olan
alanlar (`CreateMenu: true`, boş `DataSourceConnectionString` ) hiç yazı lmaz. Bu yalnı zca dosya biçimidir; C#
sözleşmesi düzdür, dönüşüm `WizardSeedFileDto.ToSeedJson` / `FromSeedJson` içindedir. **Wizard
seed dosyası her zaman bu iki metotla okunup yazı lı r**; düz `JsonSerializer` çağrı sı bloklu
bölümleri sessizce düşürür.
- **Wizard ile üretilen ekran** → seed dosyası (`configs/seeds/{kapsam}/wizard/{WizardName}.json`)
wizard cevapları nı n yanı nda ekranı n `GridOptionsEditDto` (`ListForm`) ve alanları n
`ColumnFormatEditDto` (`Fields`) sözleşmesini taşı r. ListForm detayı ndan yapı lan her kayı t
(`ListFormsAppService`, `ListFormFieldsAppService` , `ListFormJsonRowAppService` ) bu bölümleri
ve `Wizard` bölümündeki karşı lı kları nı geri yazar (`WizardSeedSynchronizer`). Bu üçlüden birine
yeni bir kayı t yolu eklenirse senkronizasyon çağrı sı da eklenir; yoksa dosya bayatlar.
- **Wizard girdisinden ekran üretimi** → tek kaynak `ListFormWizardDto.BuildListForm/BuildFields` ,
entity'ye yazma `GridOptionsEditDto.ApplyTo` / `ColumnFormatEditDto.ApplyTo` . Deploy, seeder ve
senkronizasyon aynı metotları çağı rı r; ikinci bir üretim kopyası yazma.
- **Katman sı nı rı (DDD)** → `DbMigrator` Application'a referans vermez. Seeder ile AppService'in
paylaştı ğı dönüşüm `Application.Contracts` 'ta DTO metodudur; entity'ye yazma Domain.Shared'deki
`IListFormArtifact` / `IListFormFieldArtifact` sözleşmeleri üzerinden yapı lı r.
Ayrı ntı : `dotnet.instructions.md` §5.
2026-08-26 18:44:53 +00:00
- **Yeni bir yetki** → `PlatformConsts.AppCodes` + `PermissionsData.json` + (UI'da kullanı lacaksa)
`permission.constant.ts` + `LanguagesData.json` .
- **Yeni bir dil anahtarı ** → `LanguagesData.json` ; eklemeden önce anahtarı n zaten var olup
olmadı ğı nı kontrol et.
2026-09-05 18:20:18 +00:00
- **Custom component kaydı /silinmesi** → `data/App.DeveloperKit.CustomComponents.json`
(Custom Components ekranı nı n seed verisi); bileşenin kendi dosyası yoktur, her bileşen bu
dosyada bir satı rdı r. Hem listeden hem Visual Designer'dan (`CustomComponentAppService`) yapı lan
kayı t aynı dosyaya yansı r; kullandı ğı endpoint'ler `crud/{Entity}.json` .
2026-09-07 14:43:46 +00:00
- **Wizard dosyası ** → tek başı na taşı nmaz; export zip'i **özyinelemeli bağı mlı lı k kapanı şı nı **
taşı r (`WizardExportCollector`): alt formları n wizard dosyaları , ekranı n `SeedFilePath` veri
aynası , lookup sorguları nı n işaret ettiği nesnelerin scriptleri, `crud/` ve
`{sql|postgres}/{object|execute}/` dosyaları . `Custom` yolunda `data/` girdisi yalnı zca ilgili
bileşen ve bağı mlı lı k zincirine süzülür; import'ta hedef dosyanı n üstüne yazı lmaz, satı rlar
anahtar üzerinden birleştirilir. Kapanı şa yeni bir bağı mlı lı k türü eklenirse
`WizardImportValidator` 'daki karşı lı ğı da eklenir — biri toplar, diğeri eksikliğini yakalar.
- **Şema değişikliği** → ayrı m **kayı p riskine** göredir. Eksik kolon **eklenir** (kayı psı z;
`ALTER TABLE ADD` ), var olan kolon **hiçbir zaman değiştirilmez** , hiçbir kolon düşürülmez,
hiçbir tablo `DROP` edilmez. Ölçü farkı nda (uzunluk/kesinlik/nullability) import durdurulur ve
fark somut olarak bildirilir; varsayı lanı olmayan `NOT NULL` bir kolonun dolu tabloya eklenmesi
de durdurulur — hangi değerin yazı lacağı iş kararı dı r. Karşı laştı rma tek yerdedir
(`SqlTableSchemaComparer`), analiz ve kapanı ş aynı sonucu kullanı r.
Karşı laştı rmada tip **adı ** kullanı lmaz — sağlayı cı katalogları farklı kanonik ad raporlar ve
metin karşı laştı rması sahte fark üretir. Genel kural: **sağlayı cı ya göre değişen bir değeri
metin olarak karşı laştı rma, katalogdan dinamik oku.**
- **Veritabanı na dokunan her import ucu** → `EnsureImportNotBlocked` ile başlar. Analizdeki
engelleme kararı sunucuda `blocked` dosyası nda durur; yeni bir uç eklenirse kontrolü de eklenir,
yoksa karar istemci tarafı ndan atlanabilir hâle gelir.
- **Wizard import'u** → analiz dosyalar yazı lmadan **önce** doğrular (`WizardImportValidator`);
`Error` seviyesinde bir bulgu varsa oturuma `blocked` işareti düşer ve `ApplyImport` reddeder.
Kapanı ş (`CompleteImport`) bağı mlı lı k sı rası yla çalı şı r: `sql/object` → `sql/execute` → `crud`
→ `data` → `wizard` . Tablo eksikse önce scripti çalı şı r; sı ra değiştirilmez. Ekran kurulumu
wizard ekranı yla **aynı ** yoldan geçer (`DeployWizardAsync`); dosyadaki `ListForm` /`Fields`
sözleşmesi olduğu gibi kullanı lı r, wizard cevapları ndan yeniden türetilmez — türetmek tasarı mcı
değişikliklerini silerdi. Var olan ekrana dokunulmaz, her ekran kendi UoW'unda kurulur.
Engelleyici bulgu iki sı nı ftı r: **arşiv kaynaklı ** (`RequiresReexport` — bozuk/eksik dosya,
karşı lı ğı olmayan referans) hedef ortamda giderilemez, export tekrarlanı r; **ortam kaynaklı **
(eksik tablo, şema farkı ) ekrandan giderilir. Yeni bir `Error` eklerken hangisi olduğu işaretlenir.
Engelleme **oturum genelidir, dosya bazlı değildir** —
import ya bütün olarak çalı şı r ya da hiç. Bunun bedeli, her engelin ekran içinde çözülebilir
olması dı r: tabloya dair bir bulgu üretirken `TableName` (+ tablo hedefte yoksa `TableMissing` )
doldurulur, istemci tablo tasarı mcı sı nı buna göre açar.
2026-09-04 09:05:26 +00:00
- **`ListForm.SeedFilePath` dolu bir ekran** → `SeedSyncInsert/SeedSyncUpdate/SeedSyncDelete`
bayrakları ndan işaretli olan işlemler kapsam klasöründeki `data/{ListFormCode}.json` dosyası na
2026-09-05 18:20:18 +00:00
yansı r (`ListFormSeedDataSynchronizer`); migrate/seed sı rası nda ve wizard import'unun kapanı şı nda
(`CompleteImport`) `ListFormSeedDataApplier` dosyayı geri uygular. Migrate/seed'de kayı t yoksa
eklenir, varsa dokunulmaz; import'ta `overwriteExisting` açı ktı r: var olan kayı t dosyadaki
değerlerle güncellenir ve soft delete izleri (`IsDeleted`/`DeletionTime`/`DeleterId`) temizlenir. Yeni bir kayı t yolu (yeni endpoint, toplu işlem, tipli AppService) eklenirse
senkronizasyon çağrı sı da eklenir; yoksa dosya bayatlar.
2026-09-07 14:43:46 +00:00
- **`crud/{Entity}.json`** → uygulama kuralı `CrudEndpointSeedApplier` 'dadı r ve damga
karşı laştı rmalı dı r: eksik endpoint eklenir, mevcut kayı t yalnı zca dosyanı n `GeneratedAt` değeri
kaydı n `LastModificationTime` /`CreationTime` değerinden yeniyse güncellenir/silinir. Migrate
kullanı cı nı n runtime revizyonunu ezmez. Yeni bir seeder yazarken bu kuralı taklit et: **migrate
varsayı lanı eklemektir, ezmek değil.**
2026-08-31 14:17:50 +00:00
- **`MenusData.json`** → `Routes` bölümüne dokunma; yalnı zca `Modules` ve `Menus` .
2026-09-01 13:44:05 +00:00
- **Çok değerli alan (`dxTagBox` / çoklu `dxGridBox` )** → tek metin kolonunda `|` ile saklanı r.
Ekran varsayı lan `list-form-data/*` ucundan kaydediyorsa birleştirmeyi `QueryHelper` yapar;
tipli DTO alan bir uca (`list-form-dynamic-api/...`, Custom Endpoint, Dynamic Service)
bağlı ysa DTO alanı na `[JsonConverter(typeof(MultiValueStringJsonConverter))]` eklenir —
yoksa istek `400` ile düşer. Ayrı ntı : `lowcode.instructions.md` §4.3.2.1.
2026-08-26 18:44:53 +00:00
### Definition of done
- Ölü kod bı rakma: kullanı lmayan `using` , private üye, alan, DTO, hook, servis, tip. Bir tip
silinmeden önce **repo geneli** (api + ui + configs) referans taraması yapı lı r; DI ile çözülen
tipler düz metin araması nda referanssı z görünür.
- Yorum satı rı na alı nmı ş kod bloğu bı rakı lmaz.
- `api/` değişikliğinden sonra: `dotnet build -p:EnforceCodeStyleInBuild=true` — 0 hata, yeni
`IDE00xx` yok.
- `ui/` değişikliğinden sonra: `npm run typecheck` ve `npm run lint` .
- Yorumlar **neden**i anlatı r, ne yaptı ğı nı değil. Kod zaten ne yaptı ğı nı söylüyor.
2026-09-04 09:05:26 +00:00
- **Dokümantasyon kodla birlikte güncellenir.** Platformun davranı şı nı değiştiren her değişiklik
(yeni/kaldı rı lan seeder, seed klasörü ya da dosya biçimi, ListForm sözleşmesine alan ekleme,
yeni yetki/dil anahtarı , katman sı nı rı , yeni mekanizma) aynı commit içinde ilgili `.md`
dosyası na yansı tı lı r: `README.md` (ne nerede yaşı yor, klasör düzeni, tablolar),
`.github/instructions/lowcode*.instructions.md` (artefakt/yetenek sözleşmesi),
`dotnet.instructions.md` (kod standardı , katman kuralı ), `CLAUDE.md` (çalı şma kuralı ).
Değişiklik hangi md'de karşı lı ğı olduğu bilinmiyorsa önce grep ile eski anlatı m aranı r ve
düzeltilir; bayat kalan bir satı r bı rakma. Doküman güncellemesi "sonraya" bı rakı lmaz.
2026-08-26 18:44:53 +00:00
### Tone
- Türkçe soruya Türkçe cevap.
- Platformu tanı tma, mimariyi özetleme, ne yapacağı nı anlatı p sonra bir de ne yaptı ğı nı özetleme.
- Cevabı n boyutu sorunun boyutu kadar olsun.