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-09-22 20:59:36 +00:00
6. Never step outside the framework without explicit approval (standing default 11).
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-09-29 11:46:39 +00:00
| **Yetenek envanteri** : JSON kolonları nı n alan alan sözleşmesi, grafik/pivot/tasarı mcı /mail modülü, Saas + Administration + İK 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` |
2026-10-05 12:58:59 +00:00
| Bir modülün nası l çalı ştı ğı , analizi ve kararları | `configs/seeds/docs/modules/{Modül}.md` (dizin: `README.md` §10.5) |
2026-08-26 18:44:53 +00:00
| 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.
2026-09-28 09:28:56 +00:00
Yeni **tanı m** tablosu (tanı m olup olmadı ğı na talebin içeriğine göre analizde karar verilir;
sabit ad listesi yoktur) buna ek olarak `IsActive bit NOT NULL DEFAULT 1` ile gelir; liste + form alanı , varsayı lan
2026-10-02 07:09:23 +00:00
`true` , Aktif/Pasif widget'ı . Tanı m olmasa da MCP ile (ya da wizard ile) üretilen her ekranda
`IsActive` kolonu aynı varsayı lanla gelir: tabloda `NOT NULL DEFAULT 1` (`create_table`'da
`isNullable: false` , `defaultValue: "1"` ), formda yeni kayı t `true` ile açı lı r
(`FormFieldsDefaultValueJson`). Ayrı ntı : `lowcode.instructions.md` §8.1.
2026-09-28 12:50:38 +00:00
Görsel tutan her kolon (fotoğraf, logo, avatar kopyası ) `nvarchar(MAX)` + editör `dxImageUpload` ;
değer base64 saklanı r, sı nı rlı boy ve `dxImageViewer` kullanı lmaz (deploy ikisini de reddeder).
2026-08-26 18:44:53 +00:00
2. **Yeni ekran** → Wizard yolu. `Definitions` altı na otomatik yerleştirme yok; modüle ait yeni
2026-09-29 14:55:13 +00:00
bir kök menü oluştur, `Order = max(Order) + 1` . Yetki ağacı menü ağacı nı izler: ekranı n okuma
2026-09-30 14:57:25 +00:00
yetkisi menüdeki dalı n ara yetkisinin altı na yazı lı r; menüsüz alt formun yetkisi ise listenin
yetkisine bağlanı r (`ParentName` = listenin yetki kodu) (`lowcode.instructions.md` §0.12 Menü yeri).
2026-08-26 18:44:53 +00:00
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-09-22 20:59:36 +00:00
7. **Ziyaretçiye açı k yeni yol** (public `RoutePath` taşı yan custom component, `Pub` menüsü,
yeni public sayfa) → SEO alanları da doldurulur. Ayrı bir SEO tablosu yoktur: meta, yolu
tanı mlayan kaydı n `Seo*` kolonları ndadı r — `data/App.Menus.Routes.json` ya da
`data/App.DeveloperKit.CustomComponents/{Id}.json` . Metin `::Anahtar` ile dil anahtarı taşı r.
Kullanı cı SEO bilgisi girmez; üreten yazar. Genel varsayı lanlar kayı tta değil
`App.SiteManagement.Seo.*` ayarları ndadı r. Ayrı ntı : `lowcode.instructions.md` §0.9.
8. **Ekran içi hesap/koşul ihtiyacı ** → önce `EditorScript` (Script Builder tarifleri), sonra
2026-08-26 18:44:53 +00:00
`EditorOptions` ; kod yazmak son çare.
2026-09-22 20:59:36 +00:00
9. **SQL** → her zaman parametreli. String birleştirme ile sorgu kurma.
10. **Silme** → `DeleteCommand = DefaultDeleteCommand("{Tablo}")` ; ham SQL string'i yazma.
11. **Çerçeve sı nı rı ** → uygulama kendini kendi mekanizmaları yla geliştirir (seed artefaktları ;
2026-08-28 07:47:17 +00:00
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-09-24 07:24:48 +00:00
12. **Liste ekranı görünümleri** → prompt/görsel/tarifle üretilen her liste ekranı `Grid` + `Card` +
`Pivot` + `Chart` açı k, `DefaultLayout: "grid"` ile gelir; "liste/grid" demek diğerlerini
kapatmak değildir. Bir görünüm yalnı zca istek onu açı kça dı şarı da bı raktı ğı nda `false` yazı lı r.
Tree/Gantt/Scheduler/Todo yalnı zca istenince açı lı r. Ayrı ntı : `lowcode.instructions.md` §9.8.
2026-09-28 09:28:56 +00:00
13. **Liste ekranı widget'ları ** → Wizard ya da MCP `deploy_wizard` ile üretilen her List ekranı
sorulmadan **en az 3 kartlı k** `Widgets` ile gelir; kartlar tablonun durum / boolean bayrak /
tarih / tutar kolonları ndan seçilir, başlı klar dil anahtarı dı r (`App.Widget.*` önce). Kiracı
tablosunda her kart `"TenantId" = '@TENANTID'` taşı r; `IsDeleted` koşulu yazı lmaz. Form/Chart,
2026-09-30 20:52:33 +00:00
alt form ve basit tanı m listeleri istisnadı r. **Alt form oluşturulurken widget oluşturulmaz** :
başka bir ekranı n `SubForms` sekmesi olarak üretilen her ekran — menüsüz ya da kendi menüsü olan —
`Widgets: []` ile deploy edilir. Deploy menüsüz (`CreateMenu: false`) wizard'ı n `Widgets` 'ı nı
ayrı ca düşürür; ekran alt form sekmesinde açı ldı ğı nda şerit de çizilmez
(`useListFormWidgets(…, isSubForm)`) — kart sorgusu ana kayda göre süzülmez. Ayrı ntı :
`lowcode.instructions.md` §4.6.1.
Alt form ekranı nı n menü/yetki/düzenleme kuralları (menüsüz alt formun yetkisi ana ekranı n altı nda,
`Form` sekmesi tek kayı t + `AllowAdding` /`AllowUpdating` açı k): `lowcode.instructions.md` §4.6.
2026-10-04 15:04:16 +00:00
14. **Modül dokümanı ** → MCP ya da wizard ile oluşturulan her modül çalı şma şeklini
2026-10-05 12:58:59 +00:00
`configs/seeds/docs/modules/{Modül}.md` dosyası nda taşı r: keşif cevapları ve onaylanan
2026-10-04 15:04:16 +00:00
tarif (analiz), ekranlar, veri modeli, hesaplar/durum geçişleri, yetki dağı lı mı , entegrasyonlar,
sı k sorulanlar. Dosyayı ve "Ek — Ekran envanteri"ni deploy kendisi açar/yeniler; anlatı m
bölümlerini (`module-doc:todo`) üreten doldurur — MCP'de `save_module_doc` , Claude Code'da dosyaya
doğrudan. MCP talebi doküman tamamlanmadan `Testing` 'e alı namaz. Wizard dı şı modül dokümanı elle
yazı lı r. README'ye yalnı zca §10.5 dizin satı rı ve ilgili bölümde tek cümlelik bağlantı yazı lı r.
"X nası l çalı şı yor?" sorusunda önce bu dosya okunur. Ayrı ntı : `lowcode.instructions.md` §0.13.
15. **Ekran açı klaması ** → wizard/MCP ile üretilen her liste ekranı nı n (alt formlar dahil)
`DescTr` /`DescEn` metni ayrı ntı lı dı r; başlı ktaki ⓘ simgesinde gösterilir: ne işe yaradı ğı ,
menüde nerede / hangi ekranı n sekmesi olduğu, ana alanlar, otomatik hesap ve geçişler, ilişkili
ekranlar (`RichText` biçimi). MCP `deploy_wizard` 3 satı r / 150 karakterin altı nı reddeder.
Ayrı ntı : `lowcode.instructions.md` §4.4.2.
2026-08-26 18:44:53 +00:00
### Cross-cutting: touching one thing means touching these too
2026-10-04 15:04:16 +00:00
- **Modül dokümanı ** → `ModuleDocManager.RefreshAllAsync` wizard'ı yazan her yoldan çağrı lı r (deploy,
silme, `WizardSeedSynchronizer` , import kapanı şı ); wizard dosyası nı yazan yeni bir yol eklenirse
çağrı da eklenir, yoksa envanter bayatlar. Wizard → doküman eşlemesi tek yerdedir
(`ModuleDocCatalog`: beyan → alt formun ana ekranı → menü dalı ); envanter biçimi
`ModuleDocRenderer` 'dadı r. Export kapanı şı dokümanı taşı r (`WizardExportCollector`), import
`docs/modules/*.md` yolunu kabul eder.
2026-08-26 18:44:53 +00:00
- **`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-29 06:14:07 +00:00
- **`htmlEditorOptions.ts` ↔ `EditorOptions.Html` ** — HtmlEditor varsayı lanı iki yerde yazı lı r ve
bloklar birebir aynı dı r. İstemci iç içe blokları tek seviye birleştirdiği için seed edilen
`toolbar` varsayı lanı n yerine geçer; biri değişip diğeri değişmezse seed'li ekranlar eski araç
çubuğunu gösterir.
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
2026-10-01 12:01:57 +00:00
doldurulur (`FromSeedJson`). Wizard'a yeni bir alan eklerken karşı lı ğı ListForm'da varsa listeye ekle (`CommandColumns` →
`CommandColumnJson` bu yolla taşı nı r; wizard ekranı nda adı mı yoktur, UI modeli düzenlemede korur).
2026-09-02 08:32:53 +00:00
Dosyada kalan wizard alanları üç başlı k altı nda toplanı r — `Menu` , `Language` , `Groups` — ve
2026-09-29 06:14:07 +00:00
`ListFormCode` → `WizardCode` , `MenuParentModuleId` → `ModuleId` , `LanguageTexts` → `Language.Texts`
adı yla yazı lı r; varsayı lanı olan alanlar (`CreateMenu: true`, boş `DataSourceConnectionString` , boş
`MenuParentPath` / `LanguageTexts` ) hiç yazı lmaz. Bu yalnı zca dosya biçimidir; C#
2026-09-02 08:32:53 +00:00
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.
2026-10-05 12:58:59 +00:00
- **Wizard ile üretilen ekran** → seed dosyası (`configs/seeds/wizard/{WizardName}.json`)
2026-09-02 08:32:53 +00:00
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-09-17 17:54:23 +00:00
- **Yeni bir yetki** → `PlatformConsts.AppCodes` + `data/Abp.Identity.Permissions.json` + (UI'da kullanı lacaksa)
2026-09-24 19:39:00 +00:00
`permission.constant.ts` + `data/App.Languages.LanguageText.json` . Yetki ekranı ndaki sı ra `AbpPermissions.Order`
2026-09-20 20:23:39 +00:00
(grup için `AbpPermissionGroups.Order` ) sütunundan gelir ve seed satı rı ndaki `Order` alanı yla
yazı lı r; sı ra kardeşler arası ndadı r — her üst yetkinin altı nda 1'den başlar, yeni satı rı menüdeki
yerine denk gelen numarayla ekle.
2026-09-17 09:01:14 +00:00
- **`/mcp` ucuna yeni bir araç** → üç yer birlikte değişir: `McpToolNames` (ad kayı t defteri),
ilgili `Mcp*Tools` sı nı fı (`Sozsoft.Mcp.HttpApi`) ve arkası ndaki AppService sözleşmesi
(`Sozsoft.Mcp.Application.Contracts`). Arac adı `McpToolNames.All` içinde yoksa araç listesi
süzgecinden geçmez ve hiç görünmez; MCP Servers ekranı ndaki `AllowedTools` seçenekleri de
2026-09-18 13:47:23 +00:00
`SelectableTools` 'dan üretildiği için kendiliğinden güncellenir. Sunucu kaydı nda tek anahtar
`AllowedTools` 'tur: boşsa tüm araçlar, doluysa yalnı zca seçilenler açı ktı r; araç tipine göre ayrı
2026-09-24 11:58:23 +00:00
bir bayrak yoktur, sı nı rı kullanı cı yetkisi çizer. **İki MCP yetkisi vardı r:** `.Invoke` uca
erişim ve okumadı r (MCP servislerinin sı nı f düzeyinde aranı r); `.Write` MCP üzerinden yapı lan her değişikliktir ve
değişiklik yapan her araç `RequiredPermissions` 'ta `.Write` 'a bağlanı r — okuma/yazma ayrı mı için
yeni yetki açı lmaz. **Kiracı veri okur ve yazar, geliştirme yapamaz** : kiracı bağlamı nda açı k
araçlar `McpToolNames.TenantTools` ile sı nı rlı dı r (şema, `query_list` , `run_select` ,
`insert_row` /`update_row`/`delete_row`) ve `AllowedTools` bu kümeyi yalnı zca daraltı r. Satı r
yazma ekranı n C/U/D sözleşmesinden geçtiği için kiracı ya açı ktı r; ekran yetkisinden geçmeden
yazabilen araç (procedure, Custom Endpoint) ve geliştirme araçları (`DevelopTools`) `TenantTools` 'a
eklenmez. Geliştirme işlemi yine Wizard / Custom Components AppService'inden geçer.
2026-09-24 13:29:53 +00:00
** `/mcp` istek düzeyindeki unit of work'ün dı şı ndadı r** (`AbpAspNetCoreUnitOfWorkOptions.IgnoredUrls`):
cevap SSE ile aktı ğı için istek UoW'si sonuç istemciye gittikten sonra commit edilir ve bağlantı
kapanı nca geri alı nı r — araç başarı lı görünür, EF kayı tları kaybolur. Her MCP servis çağrı sı
kendi UoW'sini sonuç dönmeden tamamlar; bu istisna kaldı rı lmaz.
2026-09-17 09:01:14 +00:00
Kapı iki yerdedir: `AddListToolsFilter` listeyi süzer, `McpAppService.EnsureToolAllowedAsync`
2026-09-24 11:58:23 +00:00
çağrı yı reddeder — süzme tek başı na yetki sı nı rı değildir, ikisi birlikte yazı lı r. `Invoke`
uçta değil her MCP servisinin sı nı f düzeyindeki `[Authorize]` 'dadı r; yeni bir MCP AppService'i de
bu attribute'la açı lı r.
**Hata istemciye yalnı zca `McpException` olarak ulaşı r** ; `McpToolErrorTranslator` (çağrı
filtresi) yetki reddini "şu yetkiniz yok" mesajı na, `UserFriendlyException` 'ı mesajı na çevirir.
Kullanı cı nı n göreceği her hata bu iki türden biriyle atı lı r. Yeni aracı n arkası ndaki servis
bir yetkiyi `[Authorize]` attribute'uyla istiyorsa (ret mesajı yetki adı nı taşı maz) o yetki
`McpToolNames.ServicePermissions` 'a eklenir; ekran yetkisi gereken araç yetkiyi
`IMcpListFormAccessFilter.GetPermissionNameAsync` + `CheckAsync` ile adı yla önceden ister.
Araç → yetki tablosu `README.md` §13.9'dadı r; araç ya da yetki değişirse tablo da değişir.
Hazı r prompt'lar (`McpPromptNames` + `McpDevelopPrompts` ) yalnı zca metindir; adı mları tekrar
etmez, `get_dev_guide` bölümüne yönlendirir. Bir kural bağlayı cı ysa prompt'a değil araca yazı lı r
(örnek: `Ready to Start` şartı `start_dev_request` 'tedir).
2026-09-25 06:39:34 +00:00
- **Wizard deploy veritabanı na yazmaz** → wizard ekranı , MCP `deploy_wizard` ve düzenleme aynı
yoldan (`ListFormWizardAppService.Create`) geçer ve **yalnı zca seed dosyası yazar** : `wizard/{Ad}.json`
+ menü/modül/izin grubu/yetki/dil satı rları (`data/App.Menus.{Menu,Module}.json`,
`data/Abp.Identity.Permission{Groups,s}.json` , `data/App.Languages.LanguageText.json` ;
`WizardSeedRowStore` , anahtarlar `WizardSeedRowKeys` ). Kurulum yalnı zca DB Migrate'tedir:
`WizardDataSeeder` ekrana özgü kayı tları (veri kaynağı , ListForm, alan, iş akı şı ) kurar,
`ListFormSeedDataApplier` satı rları ekler. Deploy/import dosyaya `Pending` yazar; Wizard Manager
onu "Migrate bekliyor" gösterir (`WizardFileInfoDto.IsPending`), migrate önceki sürümün kayı tları nı
(`Pending.Replaced`) kaldı rı p ekranı yeniden kurar ve `Pending` 'i siler. Yetkiler **hiçbir role
otomatik atanmaz** (admin dahil); rol ekranı ndan verilir. Deploy'a veritabanı yazan ya da silen bir
adı m ekleme. Ayrı ntı : `lowcode.instructions.md` §4.0.
2026-09-24 11:58:23 +00:00
- **MCP ile demo veri** → geliştirme isteği örnek satı r taşı yorsa (prompt'taki tablo/liste, ekran
görüntüsü) ekran `deploy_wizard` 'a `SeedData: true` ile gider (`SeedFilePath = data/{ListFormCode}.json`
2026-09-25 07:52:06 +00:00
+ `SeedSync*` açı k, `ListFormWizardDto.BuildListForm` ) ve satı rlar aynı çağrı da `seedRows` ile
2026-10-05 12:58:59 +00:00
`configs/seeds/data/{ListFormCode}.json` dosyası na yazı lı r (`McpDevelopAppService`; alan adları
2026-09-25 07:52:06 +00:00
ekrana göre doğrulanı r, `Guid` anahtarı sunucu üretir). Migrate ekranı kurar, ardı ndan satı rları
ekler; MCP migrate'i beklemez. Talep döngüsü `Testing` 'de biter, `Staging` 'e kullanı cı alı r. Dosya elle yazı lmaz, görselden okunamayan değer uydurulmaz.
2026-09-24 11:58:23 +00:00
`SeedData` wizard ekranı nda sorulmaz ama düzenlemede korunur (`RefreshFrom` + UI modeli).
Ayrı ntı : `lowcode.instructions.md` §0.10.1.
- **Talepteki görsel** → `App.DevRequests` açı klaması na yapı ştı rı lan görsel base64 `data:` URI olarak
kalı r, hiçbir yere yüklenmez. `start_dev_request` / `get_dev_request` onu metinden ayı klar
(`McpDevRequestImages`) ve MCP resim içeriği (`ImageContentBlock`) olarak döndürür; metinde
2026-09-28 09:28:56 +00:00
`[image-N]` kalı r. Açı klama bu yüzden `update_row` ile yeniden yazı lmaz. `SubTasks` de
`add_dev_request_subtasks` ile yazı lı r: atanan kişi bağlanan kullanı cı , bitiş tarihi bugün —
2026-09-28 12:50:38 +00:00
sunucu doldurur, modele bı rakı lmaz. `Timesheets` 'i tamamen sunucu yazar
(`IMcpDevRequestTimesheetRecorder`): `get_dev_request` /`start_dev_request` talebi etkin talep yapar,
2026-09-29 06:14:07 +00:00
sonraki her üretim/veri yazma işlemi (`create_table`, `deploy_wizard` , `delete_wizard` ,
2026-10-01 12:01:57 +00:00
`save_component` , `delete_component` , `save_report_category` , `save_report_template` ,
`delete_report_template` , satı r araçları , `save_dev_request_analysis` ,
2026-09-29 06:14:07 +00:00
`append_dev_request_note` , `add_dev_request_subtasks` ) ona `App.Mcp.Timesheet.*` anahtarı ndan Türkçe
açı klama ve ölçülen süreyle bir satı r ekler; yalnı zca talebi açan `start_dev_request` satı r yazmaz. Yeni bir üretim/veri yazma aracı eklenirse kaydedici çağrı sı ve dil anahtarı da eklenir.
2026-09-29 14:18:47 +00:00
Satı r aracı n UoW'si commit edildikten sonra ayrı UoW'de yazı lı r; aynı UoW'de yazmak Dapper
transaction'ı nı n `Sas_H_DevRequest` kilidini EF'in ayrı bağlantı sı ndan bekletip zaman aşı mı na düşürür.
2026-09-28 09:28:56 +00:00
- **Talep analizi** → `Description` talebin yazı ldı ğı hâliyle kalı r; MCP ona yazmaz. Analiz ve
üretim notları `Analysis` kolonundadı r (Todo panosunda `AnalysisExpr` , Açı klama yanı nda sekme).
Durum sı rası `Backlog → Analysis → Ready to Start → …` : "Analiz et" `save_dev_request_analysis`
ile yalnı zca `Backlog` /`Analysis` talebini analiz edip `Analysis` 'e alı r (hiçbir şey üretmez),
`Ready to Start` 'a kullanı cı taşı r, üretim notu `append_dev_request_note` ile `Analysis` 'e eklenir.
Analiz standardı tek yerdedir: `lowcode.instructions.md` §0.12; prompt'lar oraya yönlendirir.
2026-09-17 09:01:14 +00:00
- **MCP şema araçları ** → tablo/sütun bilgisi canlı katalogdan değil `Sas_H_DbTableColumn`
sözlüğünden okunur (`IMcpSchemaDictionary`). Sözlüğün alan adları
`dbo.Sas_H_ListFormFieldsDictionaryJson` prosedürünün ürettiği JSON ile birebir aynı dı r;
2026-09-30 22:54:21 +00:00
prosedür değişirse `McpDictionaryListForm` /`McpDictionaryField` de değişir. Sözlük tablo kataloğunu
değil ekranları n alanları nı döker: bir tablonun ekranda alan olarak tanı mlanmamı ş kolonunu MCP göremez.
Modelin okuması gereken kolon (ör. `AbpUsers` 'ı n kişisel bilgileri) ilgili ekranda gizli alan olarak durur.
2026-09-17 09:01:14 +00:00
- **MCP OAuth** → bilinen sağlayı cı lar (Claude, ChatGPT) seed edilmiş `Platform_Mcp` istemcisini,
diğer MCP istemcileri `/connect/register` ile üretilen `mcp_` önekli açı k onaylı istemcileri
kullanı r (`McpOAuthClientManager`; seed `McpOAuthClientDataSeedContributor` ). Bilinen sağlayı cı
eklemek = DbMigrator'daki `Platform_Mcp:RedirectUris` listesine callback eklemek. MCP
istemcisi kararı tek yerdedir (`McpConsts.IsMcpClient`): `resource` parametresi yok sayı lı r ve
token kullanı cı oturumuna bağlanmaz; token ucuna yeni bir oturum yolu eklenirse bu istisna
korunur, yoksa connector web oturumunu düşürür.
- **MCP yetki vermez** → yeni bir MCP aracı kullanı cı nı n uygulamadaki yetkisini aşamaz: liste verisi
ekranı n sorgusundan (`IListFormSelectAppService`/`IListFormDataAppService`) geçer; liste
yetkisini aşan bir yetenek (ham SQL gibi) `McpToolNames.RequiredPermissions` 'a uygulamadaki
2026-09-24 11:58:23 +00:00
karşı lı k gelen yetkiyle eklenir. `create_table` bu yüzden `.Write` 'a ek olarak `App.SqlQueryManager`
2026-09-18 13:47:23 +00:00
ister; tablo scriptini tasarı mcı nı n `generateCreateTableSql` çı ktı sı yla aynı biçimde üretir
(`McpTableCreator`) — tasarı mcı nı n şablon kolonları ya da script biçimi değişirse o da değişir.
2026-10-05 14:11:06 +00:00
- **Çalı şan (persona) ekranları ve profil** → çalı şanı n/yöneticinin kendi listeleri İK menüsüne
konmaz: menüsüz `App.Hr.My*` /`Team*` wizard + Intranet panosu widget'ı . Profil sayfası nı n İzinlerim /
Puantajı m / Performansı m sekmeleri persona ekranları nı salt okunur gösteren çekirdek bileşenlerdir
(düzenle/sil yok, tek aksiyon izin talebi oluşturma); yeni persona
ekranı nı profile eklemek kod + rota değişikliğidir (onay). Çalı şan Bilgileri sekmesi ve Genel sekmesi
kullanı cı nı n kendi alanları nı `my-profile` ek alanları ndan okur (`PlatformProfileAppService.ProfileExtraProperties`);
sağlı k, ücret ve işten çı kı ş alanları bu listeye girmez. Ayrı ntı : `lowcode.instructions.md` §0.12.1.
2026-09-29 06:14:07 +00:00
- **Bildirim kapsamı ** → bildirim tipi, kuralı ve kuyruğu kiracı ya aittir (`Adm_T_NotificationTemplate`,
`Adm_T_NotificationType` , `Adm_T_NotificationRule` , `Adm_T_Notification` ; dördü de `IMultiTenant` ) ve ekranları n tamamı
2026-09-22 09:48:14 +00:00
Administration › Bildirimler altı ndadı r. Ayrı bir manuel gönderim tablosu yoktur: **Bildirimler**
ekranı nı n ekleme formu elle gönderimdir, uç alı cı × kanal açı lı mı nı kuyruğa yazar
(`list-form-dynamic-api/notification-insert`). Yeni kiracı ya varsayı lan tür/kural kümesi
2026-10-05 12:58:59 +00:00
gelir: kendi veritabanı olan kiracı seed dosyası ndan alı r, host veritabanı nı paylaşana
`NotificationTenantDefaultsSeedContributor` aynı dosyalardan yeni kimliklerle kopyalar; iki yol
aynı kiracı da çalı şmaz. Kiracı verisine dokunan zamanlanmı ş işin
2026-09-22 09:48:14 +00:00
`Scope` alanı `Tenant` ya da `Host ve Kiracı lar` olmalı dı r — `Host` kapsamı nda çalı şan bir iş
kiracı satı rları nı göremez (`WorkerScopeEnum`, `PlatformBackgroundWorker` ).
2026-09-20 20:23:39 +00:00
- **Bildirim bayrakları ** → sı ra değişmez: `IsSent` (iletildi) olmadan `IsRead` yazı lmaz, `IsRead`
ile `ReadTime` birlikte yazı lı r. `UiActivity` kayı t oluşurken iletilmiş sayı lı r, `UiToast` /`Desktop`
tarayı cı da gösterildiğinde (`NotificationChannels.BrowserChannels`; `sent-many` ucu yalnı zca bu
kümeyi işaretler), kalan kanalları `NotificationWorker` işaretler — gönderim okuma değildir.
Kullanı cı tercihi (`IsCustomized` + `RecipientType = User` ) kural değildir, yalnı zca sahibini
kapatı r; alı cı yı kurallar belirler. Yeni bildirim üretildiği anda `/notificationhub` ile
duyurulur (`INotificationRealtimeNotifier`; sözleşme bildirim modülünün Domain'inde, SignalR
gerçeklemesi barı ndı ran uygulamada — modül katmanı ASP.NET Core'a bağlanmaz) — duyuru en iyi çabadı r, istemcideki yedek yoklama kaldı rı lmaz.
Ayrı ntı : `README.md` §13.3– §13.5.
2026-09-22 20:59:36 +00:00
- **SEO** → **ayrı bir SEO tablosu yoktur** ; meta, yolu tanı mlayan kaydı n üzerinde yaşar. Üç
parça birlikte çalı şı r: genel varsayı lanlar `App.SiteManagement.Seo.*` ayarları , yol bazlı
alanlar `Route.Seo*` ve `CustomComponent.Seo*` (ikisinin de `SeedSync*` bayrakları açı k),
istemci tarafı `SeoHead` . Üçü de uygulama konfigürasyonunun `seo` alanı ndan beslenir
(`PlatformApplicationConfigurationContributor` → `SeoAppService.GetConfigAsync` ); `sitemap.xml`
ve `robots.txt` aynı servisten `SeoController` ile yayı nlanı r. Aynı yolu iki kaynak da
tanı mlı yorsa bileşen kazanı r — çalı şma zamanı nda da bileşen fiziksel rotayı gölgeler.
**Ziyaretçiye açı k yeni bir yol üreten her iş SEO alanları nı da doldurur** (standing default 7).
Sitemap'e giren kaynaklar (`Pub` menüleri, aktif custom component rotaları , yayı nlanmı ş blog
yazı ları ) `SeoAppService` içindedir; yeni bir public kaynak türü eklenirse toplayı cı ya da
eklenir, yoksa sayfa sitemap'te görünmez. Yeni bir meta alanı = iki entity + `SeoRouteDto` +
`SeoFields` (seeder) + `SeoHead` birlikte.
2026-10-05 12:58:59 +00:00
- **Yeni bir dil anahtarı ** → `configs/seeds/data/App.Languages.LanguageText.json` (EN + TR iki satı r;
2026-09-24 19:39:00 +00:00
`Id` = `Sas_H_LanguageText:{ResourceName}:{Key}:{CultureName}` adı ndan URL isim alanlı v5 GUID); eklemeden önce anahtarı n zaten var olup
2026-08-26 18:44:53 +00:00
olmadı ğı nı kontrol et.
2026-09-09 06:06:25 +00:00
- **Custom component sı nı fları ** → bileşen kodu veritabanı nda yaşar, Tailwind derlemede yalnı zca
seed dosyası nı görür. Seed dosyası `ui/` dı şı nda olduğu için aynı sı nı flar `ui/safelist.txt`
sonuna da yazı lı r (`twSafelistGenerator`, derlemede otomatik); yoksa uygulama sunucuda stilsiz
kalı r. İkinci bir safelist dosyası açma.
2026-09-21 19:40:13 +00:00
- **Custom component kaydı /silinmesi** → `data/App.DeveloperKit.CustomComponents/{Id}.json`
(Custom Components ekranı nı n seed verisi); ekran klasör modundadı r, her bileşen kendi satı r
dosyası ndadı r. Hem listeden hem Visual Designer'dan (`CustomComponentAppService`) yapı lan kayı t
aynı klasöre 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.
2026-09-30 07:28:12 +00:00
- **Talep bağı (`DevRequest`)** → MCP `deploy_wizard` wizard dosyası na etkin talebi
(`IMcpDevRequestTimesheetRecorder.GetActiveRequestIdAsync`) `DevRequest { Id, Title }` olarak
yazar; bağ modelin girdisinden gelmez (`ListFormWizardDto.DevRequestId` `[JsonIgnore]` ). Elle
yapı lan kayı t önceki bağı korur, talepsiz wizard'da bölüm hiç yazı lmaz. Wizard Manager talebi
gösterir, kaydı na bağlar ve talebin bütün wizard'ları nı tek kapanı şta export eder
(`export-dev-request`; `WizardExportCollector.CollectAsync` birden çok dosya alı r). Wizard
dosyası nı yeniden yazan yeni bir yol eklenirse `DevRequest` korunur — dosyayı DTO olarak okuyup
yazan yollar bunu kendiliğinden yapar.
2026-09-07 14:43:46 +00:00
- **Ş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`
2026-09-25 06:39:34 +00:00
→ `data` → `wizard` . Tablo eksikse önce scripti çalı şı r; sı ra değiştirilmez. Ekran import'ta
**kurulmaz** : wizard dosyası na `Pending` yazı lı r ve ekran deploy'daki gibi DB Migrate'te kurulur;
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. Wizard'ı n menü/yetki/dil satı rları nı
taşı yan platform dosyaları `data` adı mı nda uygulanmaz (`WizardSeedRowStore.ListFormCodes`).
2026-09-07 14:43:46 +00:00
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`
2026-10-05 12:58:59 +00:00
bayrakları ndan işaretli olan işlemler seed klasöründeki hedefe yansı r
(`ListFormSeedDataSynchronizer`); yalnı zca host bağlamı ndaki kayı t yansı r, kiracı nı n kaydı
veritabanı nda kalı r. Hedef iki biçimdedir ve ayrı m uzantı dadı r: `.json` ile biten
2026-09-21 19:40:13 +00:00
değer **tek dosyadı r** (`data/{ListFormCode}.json`, bütün satı rlar orada), uzantı sı z değer
**klasördür** (`data/{ListFormCode}/{anahtar}.json`, her satı r kendi dosyası nda) ve klasör yoksa
ilk kayı tta oluşturulur. Klasör modu satı rı büyük ya da sı k yazı lan ekranlar içindir
(varsayı lan tek dosya; şu an klasör kullanan tek ekran Custom Components). Applier `data/`
altı nı özyinelemeli tarar ve **bir klasörün tamamı nı tek unit of work'te** uygular — ekran
tanı mı , alan listesi ve veri kaynağı satı r dosyası başı na değil ekran başı na bir kez çözülür;
dosyadaki `ListFormCode` boşsa ekran kodu klasör adı ndan gelir. Tek dosyaya bağlı eski bir kayı t,
klasörü diskte varsa migrate sı rası nda klasöre taşı nı r.
Migrate/seed sı rası nda ve wizard import'unun kapanı şı nda
2026-09-05 18:20:18 +00:00
(`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
2026-10-01 09:37:30 +00:00
değerlerle güncellenir ve soft delete izleri (`IsDeleted`/`DeletionTime`/`DeleterId`) temizlenir. Satı rı veritabanı ndan okuyan senkronizasyon açı k UoW varsa commit sonrası nda kendi UoW'sinde çalı şı r (EF ile yazan çağı ran, ör. `MenuAppService` , aksi hâlde eski değeri dosyaya yazardı ); yalnı zca dosyaya dokunan `RemoveRowsByFieldAsync` hemen çalı şı r. Yeni bir kayı t yolu (yeni endpoint, toplu işlem, tipli AppService) eklenirse
2026-09-05 18:20:18 +00:00
senkronizasyon çağrı sı da eklenir; yoksa dosya bayatlar.
2026-10-05 12:58:59 +00:00
- **Seed kapsamı ** → `configs/seeds/` tek klasördür; `host/` ya da `tenants/{tenantId}/` yoktur.
Host ve kendi veritabanı olan her tenant aynı dosyalarla kurulur, host veritabanı nı paylaşan
tenant'ta dosyalar yeniden uygulanmaz (`SeedFileScope`; migrate kararı `DataSeedContext` 'e yazar).
Dosyayı okuyan yeni bir seeder `SeedFileScope.IsEnabled` ile başlar. Dosyalar yalnı zca host
bağlamı nda yazı lı r; dosyaya yazan yeni bir yol tenant bağlamı nda yazmaz. Bekleyen wizard kurulumu
(`Pending`) dosyaları uygulayan son veritabanı nda kapanı r (`SeedFileScope.CompletesPending`).
Tek istisna `{sql|postgres}/host/{object,execute}` : yalnı zca host'ta çalı şı r; tenant veritabanı nda
karşı lı ğı olmayan nesneye (HangFire tabloları ) dayanan script buraya konur, tablo önekine bakı lmaz.
Kendi veritabanı olan tenant'ta EF ile yalnı zca `IMultiTenant` varlı klar o veritabanı na gider;
ListForm, menü ve yetki tanı mı nı ABP her zaman host'ta okur. Kiracı tablosunun satı rları kiracı
adı yla kayı tlı `DataSource` üzerinden gider. Kiracı yalnı zca kimliğiyle değiştirildiğinde ad boş
kalı r; bu durumda adı `DataSourceManager` kiracı kaydı ndan okur. Yeni tenant yöneticisi ilk
seed'de kiracı tarafı bütün yetkileri alı r (`PlatformIdentityDataSeeder`). Bunun nedeni,
DbMigrator'da dinamik yetki deposunun kapalı olması dı r: ABP'nin yetki seed'i seed dosyası ndan
gelen yetkileri göremez.
2026-09-25 06:39:34 +00:00
- **Seed dosyası yazmak** → veri dosyası `ListFormSeedDataFileDto.Serialize` , wizard dosyası
`WizardSeedFileDto.ToSeedJson` ile yazı lı r; düz `JsonSerializer.Serialize` + `File.WriteAllText`
kullanı lmaz. System.Text.Json emojiyi her zaman vekil çift kaçı şı na çevirir; dosya baştan
yazı ldı ğı nda bütün emojiler sahte fark üretir. İkisi de `SeedJsonText.RestoreSurrogatePairs` 'ten
2026-09-25 07:52:06 +00:00
geçer. Veri dosyası nı n `GeneratedAt` değeri oluşturma anı dı r: `Serialize` yalnı zca boşsa doldurur,
hiçbir yazma yolu onu güncellemez — ekleyip geri kaldı ran işlem (wizard deploy + silme) dosyayı
birebir önceki hâline döndürür. `crud/` dosyaları nı n damgası ayrı dı r ve karar verir (aşağı da).
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-09-29 11:46:39 +00:00
- **Modül = menü = tablo öneki = yetki kökü** → kök menüler `Sas` (`App.Saas`), `Adm`
(`App.Administration`), `Hr` (`App.Hr`, İK) ve `Pub` modüllerindedir. Bir ekranı modüller arası
taşı mak birlikte yapı lı r: `TableNameResolver` (`MenuPrefix`) + `AppCodes` (Seed/Platform) +
`ListFormSeeder_{Saas,Administration,Hr}.cs` + `data/{ListFormCode}.json` adı + menü/yetki/dil
satı rları + route `Authority` . Yetki `Modules` değeri: Saas/Administration `Sas|Adm` , İK `Sas|Hr`
(`Sas` host, `Adm` /`Hr` kiracı görünürlüğü). İK departman/pozisyon `BranchId` zorunludur; seed
satı rı host şubesine (`PlatformConsts.Branches.BranchIdDefaultValue`) bağlanı r.
2026-10-05 12:58:59 +00:00
- **Menü ağacı ve yetkiler** → `configs/seeds/data/App.Menus.{Routes,Module,Menu}.json` ve
2026-09-17 17:54:23 +00:00
`Abp.Identity.Permission{Groups,s}.json` ; platformun kendi menü/yetki kayı tları da diğer liste
verisiyle aynı mekanizmadan (`ListFormSeedDataApplier`) geçer, ayrı bir seeder yoktur. `Order`
2026-09-18 06:03:19 +00:00
alanı bağı mlı lı k sı rası nı kurar: route → modül → menü, yetki grubu → yetki, ülke grubu → ülke →
2026-09-18 06:28:25 +00:00
şehir → ilçe (`App.Definitions.{CountryGroup,Country,City,District}.json`), bildirim tipi → kuralı
(`App.Notifications.Notification{Types,Rules}.json`). Para birimi, hitap, AI bot
(`App.Definitions.{Currency,ContactTitle,AiBot}.json`), ayar tanı mları (`App.SettingDefinitions.json`)
2026-09-24 19:39:00 +00:00
ve zamanlanmı ş işler (`App.BackgroundWorkers.RecurringJobs.json`), dil → metin
(`App.Languages.{Language,LanguageText}.json`; `LanguagesData.json` + `LanguageDataSeeder` kaldı rı ldı ) da buradadı r; `HostData.json`
2026-09-18 06:28:25 +00:00
kaldı rı ldı , `HostDataSeeder` yalnı zca bağlantı cümlesi appsettings'ten gelen varsayı lan veri kaynağı nı kurar. Dosyalar ekranı n
2026-09-18 06:03:19 +00:00
anahtarı nı (`KeyFieldName`) kullanı r; `Guid` anahtarlı satı rı n `Id` 'si iş anahtarı ndan türetilmiş
2026-09-22 20:59:36 +00:00
sabit bir GUID'dir, satı r eklerken aynı kuralla üret. `App.Menus.Routes.json` dosyası na
yalnı zca var olan satı rı n `Seo*` alanları için dokunulur (standing default 7); rota eklemek,
silmek ya da yolunu değiştirmek çerçeve dı şı dı r.
2026-09-09 06:06:25 +00:00
- **Public site** → menü `Menu` tablosunda `ModuleId = "Pub"` altı nda (`PlatformConsts.PublicSite`);
`App.Public.Header` hem üst menüyü hem alt bilgideki hı zlı bağlantı ları besler (ikisi de
`PublicNav` düğümü) ve ziyaretçiye uygulama konfigürasyonunun `publicMenus` alanı yla taşı nı r
(menü ucu `[Authorize]` ). Sayfa ise Custom Component'tir: `/admin/` ile
başlamayan `RoutePath` otomatik public route olur ve aynı yolu paylaşan fiziksel route'u gölgeler;
`RoutePath` boş bı rakı labilir (rotası z bileşen). Yeni public sayfa =
2026-09-21 19:40:13 +00:00
`data/App.DeveloperKit.CustomComponents/{Id}.json` satı rı + `Pub` menü kaydı ; ikisi birlikte yazı lı r.
2026-09-09 06:06:25 +00:00
Üst ve alt bilgi rotası z bileşenlerdir (`PublicHeader`, `PublicFooter` ), layout ikisini de
`renderComponent` ile çizer; rotası z bileşende `RoutePath` **NULL** yazı lı r (tekil indeks yalnı zca
dolu değerleri kapsar). Üst bilginin davranı şı `components/publicSite` katalog düğümlerinde,
yerleşimi tasarı mcı dadı r.
**Public bileşenlerin hepsi tasarı mcı belgesidir** (`Props.visualDesigner`, `sourceMode: visual` );
kod belgeden üretilir (`generateDesignerCode`), elle yazı lmı ş koda dönülmez. Runtime kapsamı nda
`react-icons` /`react-router` yoktur — ikon `PlatformIcon` düğümü, gezinme `a` düğümü. Kanvası n
doğrudan çizdiği katalog düğümleri tek sözlüktedir (`componentEditor/runtimeNodes.ts`); yeni bir
düğüm eklerken bileşen + bu sözlük + `catalog.ts` tanı mı + dil anahtarı birlikte yazı lı r. Elle
yazı lmı ş bir bileşen tasarı mcı da kod modunda açı lı r, kanvasa çevrilmez. Ayrı ntı : `README.md` §10.4.
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.
2026-10-04 15:04:16 +00:00
- Modül/ekran/bileşen ekleyen ya da davranı şı nı değiştiren iş modül dokümanı nı
2026-10-05 12:58:59 +00:00
(`configs/seeds/docs/modules/{Modül}.md`) yazar veya günceller; liste ekranı nı n açı klaması
2026-10-04 15:04:16 +00:00
ayrı ntı lı dı r (standing default 14– 15).
2026-08-26 18:44:53 +00:00
- `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.