From 1e3c66913d22c2c81c0a56b0aeb6cf78879c619b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Fri, 9 Oct 2026 17:01:18 +0300 Subject: [PATCH] Mcp problemleri giderildi --- .github/instructions/lowcode.instructions.md | 66 +++++++++++++++---- README.md | 2 +- .../IMcpDevelopAppService.cs | 7 +- .../McpDevelopAppService.cs | 11 ++-- .../McpServerInfoDefaults.cs | 2 +- .../Tools/McpDevelopPrompts.cs | 8 +-- .../Tools/McpDevelopTools.cs | 8 ++- .../TenantLocalizationInitializer.cs | 14 ++-- claude.md | 15 ++++- .../seeds/data/App.Definitions.Sequence.json | 21 +++++- .../53294e77-a4fb-45e4-a80e-acf07b5d75be.json | 2 +- 11 files changed, 115 insertions(+), 41 deletions(-) diff --git a/.github/instructions/lowcode.instructions.md b/.github/instructions/lowcode.instructions.md index 59ed6300..ed359629 100644 --- a/.github/instructions/lowcode.instructions.md +++ b/.github/instructions/lowcode.instructions.md @@ -525,7 +525,7 @@ alanlar wizard dosyasının `Fields` bölümünden) ve yalnızca `create_table` | `delete_wizard` | Wizard'ı ve yalnızca onun ürettiği kayıtları siler; `dropTables: true` ekranın tablosunu da düşürür | Bağımlı wizard varsa reddeder. Tablo kullanıcı açıkça onaylamadan düşürülmez; `App.SqlQueryManager` ister (§4.5) | | `start_dev_request` | `App.DevRequests` talebini üstlenir: `Ready to Start` durumundaysa `In Progress` durumuna alır, değilse reddeder | Ek olarak `App.DevRequests.Update` ister. Açıklamadaki görseller ayrı resim içeriği olarak gelir (§0.11) | | `get_dev_request` | Talebi durumuna dokunmadan okur (aynı metin + analiz + resim içerikleri) | Analizden önce ya da yarım kalan talebe dönmek için; `App.DevRequests` ister | -| `save_dev_request_analysis` | `Backlog`/`Analysis` durumundaki talebin analizini `Analysis` kolonuna yazar (var olanı değiştirir), talebi `Analysis` durumuna alır; diğer durumları reddeder. Modül dokümanına yazmaz; doküman üretimde açılır (§0.13) | Ek olarak `App.DevRequests.Update` ister. Standart §0.12; `Description`'a dokunmaz | +| `save_dev_request_analysis` | `Backlog`/`Analysis` durumundaki talebin analizini `Analysis` kolonuna yazar (var olanı değiştirir); `productionReady: true` (Üretime hazır: Evet) talebi `Ready to Start`'a, `false` (şartlı/Hayır) `Analysis` durumuna alır; diğer durumları reddeder. Modül dokümanına yazmaz; doküman üretimde açılır (§0.13) | Ek olarak `App.DevRequests.Update` ister. Standart §0.12; `Description`'a dokunmaz | | `append_dev_request_note` | Talebin `Analysis` kolonunun sonuna HTML ekler | Üretim sonuç notu için; `Description` ve `Analysis` `update_row` ile yazılmaz (§0.11) | | `add_dev_request_subtasks` | `SubTasks` listesine tamamlanmış satırlar ekler | Atanan = bağlanan kullanıcı, bitiş = bugün (sunucu yazar); `SubTasks`'ı `update_row` ile yazma (§0.11) | | `verify_wizard` | DB Migrate ile kurulmuş ekranı veri yazmadan doğrular (migrate bekleyen dosyada `install` kontrolü başarısız döner, diğerleri yapılmaz): menü, yetki tanımı, ekran sorgusu (List) ya da bileşen (Custom), seed kapanışı | İsteğe bağlı: kullanıcı migrate sonrası isterse. Talep döngüsünün (§0.11) adımı değildir. `passed` yalnızca engelleyici bir kontrol kalırsa `false` | @@ -581,7 +581,8 @@ kiracı bağlamında geliştirme araçları kapalıdır. Gereken yetkiler: `App. `App.DeveloperKit.McpServers.Invoke` + `.Write` ve üretimin kendi yetkileri (§0.10). Talep yaşam döngüsü: `Backlog` → **`Analysis`** (MCP analiz eder, §0.12) → `Ready to Start` -(analizi beğenen kullanıcı taşır; beğenmezse analiz yeniden yazılır ya da elle düzeltilir) → +(analiz "Üretime hazır: Evet" ise MCP doğrudan taşır; şartlı/Hayır analiz `Analysis`'te kalır, +kullanıcı onaylayıp taşır ya da analiz yeniden yazılır/elle düzeltilir) → `In Progress` → `Testing` → `Staging`. Üretim `Ready to Start`'tan başlar ve talebin `Description`'ı ile onaylanmış `Analysis`'i birlikte tarif sayılır. @@ -679,9 +680,10 @@ kiracıları dolaşır. Rapor bu adımı tek satırla belirtir. ### 0.12 Talep analizi — `Backlog` → `Analysis` -"Analiz et" dendiğinde `Backlog` talepleri üretimden önce analiz edilir; kullanıcı analizi okuyup -beğenirse talebi `Ready to Start`'a kendisi taşır, beğenmezse analiz değişir (MCP'ye yeniden -analiz ettirir ya da `Analysis` sekmesinde elle düzeltir). Analiz **üretim yapmaz**: tablo, wizard, +"Analiz et" dendiğinde `Backlog` talepleri üretimden önce analiz edilir. Analiz koşulsuz üretime +hazırsa (madde 11: **Evet**) talep doğrudan `Ready to Start`'a geçer; şartlı ya da **Hayır** ise +`Analysis`'te kalır — kullanıcı şartları onaylayıp kendisi taşır ya da analiz değişir (MCP'ye yeniden +analiz ettirir veya `Analysis` sekmesinde elle düzeltir). Analiz **üretim yapmaz**: tablo, wizard, bileşen, seed dosyası yazılmaz; yalnızca okuma araçları ve `save_dev_request_analysis` kullanılır. | Adım | Araç | Durum | @@ -689,11 +691,12 @@ bileşen, seed dosyası yazılmaz; yalnızca okuma araçları ve `save_dev_reque | 1. Kuyruğu oku (yalnızca toplu) | `query_list` — `ListFormCode: App.DevRequests`, filtre `["Status","=","Backlog"]`, sıralama `SortOrder` | — | | 2. Talebi oku | `get_dev_request` — metin + görseller | — | | 3. Keşif | `list_wizards` (menü kökleri, modüller, izin grupları), `list_lists` / `describe_list` / `search_schema` (var olan ekran, tablo, lookup kaynağı), `list_components`, `get_dev_guide` (§0.6, §0.7, §0.8, §1) | — | -| 4. Yaz | `save_dev_request_analysis` — analizin tamamı, HTML. Modül dokümanına yazılmaz; dosya ve dal bölümü üretimde deploy ile açılır, analiz "2. Analiz ve kararlar" alt bölümüne üretimde `save_module_doc` ile taşınır (§0.13) (Timesheets satırını sunucu yazar, §0.11) | Analysis | +| 4. Yaz | `save_dev_request_analysis` — analizin tamamı, HTML, ve madde 11'le aynı `productionReady`. Modül dokümanına yazılmaz; dosya ve dal bölümü üretimde deploy ile açılır, analiz "2. Analiz ve kararlar" alt bölümüne üretimde `save_module_doc` ile taşınır (§0.13) (Timesheets satırını sunucu yazar, §0.11) | Evet → Ready to Start; şartlı/Hayır → Analysis | **Durum kuralı sunucudadır:** araç yalnızca `Backlog` ya da `Analysis` durumundaki talebi kabul eder; `Analysis`'teki talebe yeniden çağrılırsa analiz değiştirilir. `Ready to Start` ve sonrası -reddedilir. `Description`'a hiçbir koşulda yazılmaz. +reddedilir. Hedef durumu `productionReady` belirler (`true` → `Ready to Start`, `false` → `Analysis`); +model durumu `update_row` ile değiştirmez. `Description`'a hiçbir koşulda yazılmaz. **Analiz standardı.** HTML, aşağıdaki başlıklar bu sırayla (`

`), boş kalan başlık yazılmaz. Kısa ve karar odaklı yaz; talebi tekrar anlatma. @@ -705,8 +708,9 @@ Kısa ve karar odaklı yaz; talebi tekrar anlatma. - Talebin açıkça yazdığı şey (menü yolu, alan, kapsam) **girdidir**: değiştirilmez, daraltılmaz, alternatifi sunulmaz. - Talepte olmayan bilgi için analiz karar verir (**Kararlar**, madde 9). Tabloya yazma hedefi, - onaycı ve hesap formülü de boş bırakılmaz: somut karar **(onay)** etiketiyle yazılır; talebi - `Ready to Start`'a alan kullanıcı onları onaylamış olur. + onaycı ve hesap formülü de boş bırakılmaz: somut karar **(onay)** etiketiyle yazılır; **(onay)** taşıyan + analiz şartlıdır (madde 11), talep `Analysis`'te kalır ve onu `Ready to Start`'a alan kullanıcı + kararları onaylamış olur. - Planın her adımının mevcut araçlarla (`create_table`, `deploy_wizard`, `save_component` ve sözleşmeleri, §4.4) yapılabildiği keşifte doğrulanır (madde 11). @@ -823,9 +827,12 @@ Kısa ve karar odaklı yaz; talebi tekrar anlatma. varsayılamayan konular **(onay)** etiketi taşır. "Açık sorular" başlığı yoktur. 10. **Üretim planı** — bağımlılık sırasıyla (tablo → lookup kaynağı ekran → en derindeki alt form → onu taşıyan alt form → ana ekran) sıralı artefakt listesi (`create_table: …`, `deploy_wizard: ….json`, `save_component: …`); üretimdeki `add_dev_request_subtasks` başlıkları bununla aynı olur. -11. **Üretime hazır** — tek satır: **Evet**, ya da **Hayır — eksik yetenek: …** (çerçeve dışı - ihtiyaç, §0.8, adıyla). Talebi daraltan geçici çözüm önerilmez; "Hayır" taşıyan talep yetenek - eklenene kadar `Ready to Start`'a alınmaz. +11. **Üretime hazır** — tek satır: **Evet**, **Şartlı — …** (**(onay)** etiketli karar ya da + kullanıcının netleştirmesi gereken bir koşul, adıyla) ya da **Hayır — eksik yetenek: …** (çerçeve + dışı ihtiyaç, §0.8, adıyla). Talebi daraltan geçici çözüm önerilmez. Bu satır + `save_dev_request_analysis`'in `productionReady` değeridir: yalnızca **Evet** talebi + `Ready to Start`'a alır; **Şartlı** talep kullanıcı onaylayana, **Hayır** talep yetenek eklenene + kadar `Analysis`'te kalır. ### 0.12.1 Çalışan (persona) ekranları — Wizard ve MCP için @@ -942,7 +949,7 @@ Wizard dışı (entity, özel React) modüller bölümünü elle yazar. | "Ana-detay ekranı" | `SubForms` | 4.6 | | "Üstte KPI kartları" | `Widgets` | 4.6 | | "Alan otomatik dolsun (kullanıcı, tarih, tenant, sorgu sonucu)" | `*FieldsDefaultValueJson` | 4.3.5 | -| "Belge/sipariş numarası otomatik üretilsin" | `Sequence` kaydı + varsayılan değer | 9.9 · 4.3.5 | +| "Belge/sipariş numarası otomatik üretilsin" | `Sequence` kaydı + varsayılan değer | 9.9 · 4.3.5.2 | | "Bağlı açılır listeler (il → ilçe)" | `LookupJson` cascade alanları | 4.3.4 | | "Şu koşuldaki satır renkli olsun" | `ColumnStylingJson` | 4.3.7 | | "Ekranın üstünde tarih/şube/durum filtresi" | `ExtraFilterJson` | 4.3.8 | @@ -1701,6 +1708,37 @@ taşır. `CustomKey`, `DbQuery`, `Sequence` gibi diğer türler `ListForm.FormFi katmanıyla yazılır (§0.10). Deploy girdisinde sözleşmede karşılığı olmayan bir anahtar adıyla reddedilir — sessizce yok sayılmaz. +#### 4.3.5.2 Wizard / MCP ekranında otomatik numara — `App.Definitions.Sequence` + +Bir alanın otomatik numaralanmasına talep karar verdiğinde ("numara otomatik gelsin") ya da analiz +karar verdiğinde (proje/sipariş/talep/belge numarası: `ProjectNo`, `OrderNo`, `RequestNo`, +`DocumentNo` …), numara **`App.Definitions.Sequence`** numaratöründen alınır; numara koda, sorguya ya +da forma yazılmaz. Numara/kod alanı otomatik değilse (kullanıcı girer) kural uygulanmaz: + +1. Numaratör `data/App.Definitions.Sequence.json` dosyasına satır olarak eklenir (`Name`, `Prefix`, + `PaddingSize`, `StartNumber`/`NextNumber`, `ResetPeriod`, `FormatTemplate` — §9.9; `Id` iş anahtarından + türetilmiş sabit GUID, `LastPeriodKey` yazılmaz). Aynı numarayı üreten uygun bir numaratör zaten + varsa (`query_list App.Definitions.Sequence`) o kullanılır, ikincisi açılmaz. +2. Alanın varsayılanı `ListForm.FormFieldsDefaultValueDto`'ya `CustomValueType: 5` ile yazılır; + `Value` numaratörün `Name`'idir: + + ```jsonc + { "FieldName": "ProjectNo", "FieldDbType": 16, "Value": "ProjeCode1", "CustomValueType": 5, "SqlQuery": "" } + ``` + + Formda numara önizlenir, kalıcı numara kayıt anında alınır (§9.9). +3. `@AUTONUMBER`, `DbQuery` ile `MAX(...) + 1`, sabit metin ya da `InsertAfterCommand` ile numara + üretme yazılmaz. Tek istisna talebin açıkça boşluksuz numara istemesidir (§9.9 son paragraf); + o zaman karar analizde **(onay)** ile yazılır. +4. Analiz numaratörü madde 8'de (alan → numaratör adı, `Prefix`, `FormatTemplate`, `ResetPeriod`) + gösterir; talepte biçim yoksa varsayılan `{Prefix}{Number}{Suffix}`, `PaddingSize: 5`, `ResetPeriod: 0` + ve modül kısaltmasından `Prefix` kararı madde 9'a yazılır. + +Kullanıcının kendi girdiği kodlar (Depo Kodu `WH`, birim kodu) numaratör değildir; bu kural +yalnızca otomatik üretilecek numara içindir. `Sequence` kiracıya aittir (`IMultiTenant`): +host veritabanını paylaşan kiracıya seed dosyası uygulanmadığı için numaratör satırı o kiracıda +ekrandan açılır. + ### 4.3.6 Doğrulama — `ValidationRuleJson` Alan başına DevExtreme doğrulama kuralları dizisi. Wizard `IsRequired: true` alanlara `required` @@ -4494,7 +4532,7 @@ hepsi açık gösterilir. "Sipariş numarası otomatik gelsin", "talep numarası her yıl 1'den başlasın" istekleri için kod yazılmaz; bir `Sequence` kaydı açılır ve alanın varsayılan değeri `CustomValueType: 5` ile o -kayda bağlanır (§4.3.5). +kayda bağlanır (§4.3.5). Wizard/MCP üretiminde otomatik numara her zaman bu yoldan üretilir (§4.3.5.2). Ekran: `/admin/list/App.Definitions.Sequence` · Yetki: `App.Definitions.Sequence{,.Create,.Update,.Delete}` diff --git a/README.md b/README.md index 34986aff..7552c930 100644 --- a/README.md +++ b/README.md @@ -1570,7 +1570,7 @@ liste süzgeci ve çağrı kapısı aynı kuralı kullanır. | `verify_wizard` | Deploy edilmiş ekranı veri yazmadan doğrular: menü kaydı ve URL'si, menünün istediği yetki tanımı (`AbpPermissions`), List yolunda ekran sorgusu (`GetSelectAsync`, tek satır, çağıranın yetkisiyle), Custom yolunda bileşen (etkin, rota = menü URL'si) ve seed kapanışı (`ExportAnalysis` uyarıları; engellemez). İsteğe bağlıdır, migrate sonrasında kullanılır; `App.DevRequests` döngüsünün adımı değildir — döngü `Testing`'de biter, kullanıcı elle test edip `Staging`'e alır (`lowcode.instructions.md` §0.11). | | `start_dev_request` | Geliştirme talebini Id ya da tam başlıkla üstlenir: yalnızca `Ready to Start` durumundakini `In Progress` durumuna alır, diğerlerini reddeder; talebin metnini döndürür. Açıklamaya yapıştırılmış base64 görseller (`data:image/png|jpeg|gif|webp`) metinden ayıklanır (`McpDevRequestImages`), yerlerinde `[image-N]` kalır ve her biri ayrı MCP resim içeriği (`ImageContentBlock`) olarak döner — model görseli resim olarak görür, görsel hiçbir yere yüklenmez. Sonuç istemcinin 1 MB sınırına sığdırılır: büyük görseller küçültülüp JPEG'e çevrilir (`IMcpImageShrinker`), sığmayan gönderilmez ve metinde bildirilir. `.Write` + `App.DevRequests.Update` ister. | | `get_dev_request` | Talebi durumuna dokunmadan, `start_dev_request` ile aynı biçimde (metin + analiz + resim içerikleri) okur; analizden önce ya da yarım kalan talebe dönmek için. `App.DevRequests` ister. | -| `save_dev_request_analysis` | `Backlog` ya da `Analysis` durumundaki talebin analizini (HTML) `Analysis` kolonuna yazar — var olanı değiştirir — ve talebi `Analysis` durumuna alır; diğer durumları reddeder. `Description`'a dokunmaz. Modül dokümanına yazmaz; doküman üretimde açılır. Analizin standardı `lowcode.instructions.md` §0.12. `.Write` + `App.DevRequests.Update` ister. | +| `save_dev_request_analysis` | `Backlog` ya da `Analysis` durumundaki talebin analizini (HTML) `Analysis` kolonuna yazar — var olanı değiştirir; `productionReady: true` (Üretime hazır: Evet) talebi `Ready to Start`'a, `false` (şartlı ya da Hayır) `Analysis` durumuna alır; diğer durumları reddeder. `Description`'a dokunmaz. Modül dokümanına yazmaz; doküman üretimde açılır. Analizin standardı `lowcode.instructions.md` §0.12. `.Write` + `App.DevRequests.Update` ister. | | `add_dev_request_subtasks` | Talebin `SubTasks` listesine tamamlanmış satırlar ekler: model yalnızca başlığı verir, atanan kişi bağlanan kullanıcının adı (`userName`), bitiş tarihi bugün (`yyyy-MM-dd`) olarak sunucuda yazılır; var olan satırlar korunur. `.Write` + `App.DevRequests.Update` ister. | | `append_dev_request_note` | Talebin `Analysis` kolonunun sonuna HTML ekler (üretim sonuç notu); `Description` talebin yazıldığı hâliyle kalır. İkisi de `update_row` ile yazılmaz — açıklama base64 görsel taşır. `.Write` + `App.DevRequests.Update` ister. | | `list_components` / `get_component` / `save_component` / `delete_component` | Custom component'ler `ICustomComponentAppService` üzerinden; seed senkronu ve `DataSources` çözümü aynen çalışır. `save_component` ada göre ekler/günceller, tasarımcı belgesi (`Props.visualDesigner`, `sourceMode ≠ code`) taşıyan bileşene kod yazmayı reddeder — kod belgeden üretildiği için tasarımcıdaki ilk kayıtta ezilirdi. | diff --git a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application.Contracts/IMcpDevelopAppService.cs b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application.Contracts/IMcpDevelopAppService.cs index 4ec03c0d..30f84c16 100644 --- a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application.Contracts/IMcpDevelopAppService.cs +++ b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application.Contracts/IMcpDevelopAppService.cs @@ -44,10 +44,11 @@ public interface IMcpDevelopAppService : IApplicationService Task GetDevRequestAsync(string request); /// - /// Talebin analizini yazar (var olani degistirir) ve talebi Analysis durumuna alir; yalnizca - /// Backlog ya da Analysis durumundaki talep analiz edilir. + /// Talebin analizini yazar (var olani degistirir); analiz kosulsuz uretime hazirsa talebi + /// Ready to Start'a, degilse Analysis durumuna alir. Yalnizca Backlog ya da Analysis durumundaki + /// talep analiz edilir. /// - Task SaveDevRequestAnalysisAsync(string request, string html); + Task SaveDevRequestAnalysisAsync(string request, string html, bool productionReady); /// /// Analizin sonuna HTML ekler. Aciklama talebin yazildigi haliyle kalir; uretim notlari diff --git a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs index 4afa30f0..af10f704 100644 --- a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs +++ b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs @@ -581,10 +581,11 @@ public class McpDevelopAppService( /// /// Durum kurali modelin dikkatine birakilmaz: yalnizca Backlog ya da Analysis durumundaki talep - /// analiz edilir. Analysis'teki talebin analizi begenilmediyse yeniden yazilir; Ready to Start'a - /// kullanici alir. + /// analiz edilir. "Uretime hazir: Evet" analiz uretimin karar vermeden uygulayabilecegi analizdir, + /// talep dogrudan Ready to Start'a gecer; sartli ya da Hayir olan analiz kullanicinin kararini + /// bekledigi icin Analysis'te kalir. /// - public async Task SaveDevRequestAnalysisAsync(string request, string html) + public async Task SaveDevRequestAnalysisAsync(string request, string html, bool productionReady) { await EnsureToolAllowedAsync(McpToolNames.SaveDevRequestAnalysis); await AuthorizationService.CheckAsync(DevRequestUpdatePermission); @@ -602,7 +603,9 @@ public class McpDevelopAppService( } devRequest.Analysis = html.Trim(); - devRequest.Status = McpConsts.DevRequestStatuses.Analysis; + devRequest.Status = productionReady + ? McpConsts.DevRequestStatuses.ReadyToStart + : McpConsts.DevRequestStatuses.Analysis; await devRequestRepository.UpdateAsync(devRequest, autoSave: true); await timesheetRecorder.RecordAsync(McpTimesheetTexts.Analysis); diff --git a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/McpServerInfoDefaults.cs b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/McpServerInfoDefaults.cs index ba693f90..d7d10ca5 100644 --- a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/McpServerInfoDefaults.cs +++ b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/McpServerInfoDefaults.cs @@ -24,7 +24,7 @@ internal static class McpServerInfoDefaults "then produce them with deploy_wizard and save_component; the guide's file-writing steps map to these tools. " + "Agree on screen type, data source, module and permissions with the user before deploying. " + "Analyzing development requests (Backlog -> Analysis) follows get_dev_guide section 0.12: read with get_dev_request, " + - "write the analysis with save_dev_request_analysis, produce nothing and never touch Description; the user moves an approved analysis to Ready to Start. " + + "write the analysis with save_dev_request_analysis, produce nothing and never touch Description; pass productionReady true only when the analysis is ready for production without conditions (the request moves to Ready to Start), otherwise it stays in Analysis. " + "Development requests (App.DevRequests) follow get_dev_guide section 0.11: claim each one with " + "start_dev_request, which only accepts requests in Ready to Start; images pasted into the request arrive as image content and are part of the request (layout and demo rows). " + "A request (Description) and its approved Analysis are its own brief: do not ask questions and do not wait for DB Migrate; deploy (demo rows go in deploy_wizard seedRows), complete the module document with get_module_doc / save_module_doc (section 0.13), then move the request to Testing and finish. " + diff --git a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/Tools/McpDevelopPrompts.cs b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/Tools/McpDevelopPrompts.cs index 27ecf6f7..6638f842 100644 --- a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/Tools/McpDevelopPrompts.cs +++ b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/Tools/McpDevelopPrompts.cs @@ -13,7 +13,7 @@ namespace Sozsoft.Mcp.Tools; public static class McpDevelopPrompts { [McpServerPrompt(Name = McpPromptNames.AnalyzeDevRequest)] - [Description("Tek bir gelistirme talebini analiz eder ve Analysis durumuna alir. Talep Backlog ya da Analysis durumunda olmalidir.")] + [Description("Tek bir gelistirme talebini analiz eder; uretime hazirsa Ready to Start'a, degilse Analysis durumuna alir. Talep Backlog ya da Analysis durumunda olmalidir.")] public static string AnalyzeDevRequest( [Description("Talebin Id'si (GUID) ya da tam basligi.")] string request) @@ -22,16 +22,16 @@ public static class McpDevelopPrompts "Talebi ve gorsellerini get_dev_request ile oku; analizi save_dev_request_analysis ile yaz. " + "Hicbir sey uretme (tablo, wizard, bilesen yok) ve Description'a dokunma. " + "Arac reddederse (talep Backlog ya da Analysis degil, bulunamadi ya da birden fazla eslesme var) nedenini bildir ve dur. " + - "Sonunda kisa rapor ver: menu yeri, uretilecek artefaktlar, (onay) etiketli kararlar ve Uretime hazir satiri; talebi Ready to Start'a kullanicinin alacagini belirt."; + "Sonunda kisa rapor ver: menu yeri, uretilecek artefaktlar, (onay) etiketli kararlar, Uretime hazir satiri ve talebin yeni durumu (Ready to Start ya da Analysis)."; [McpServerPrompt(Name = McpPromptNames.AnalyzeBacklogRequests)] - [Description("Backlog durumundaki tum gelistirme taleplerini SortOrder sirasiyla analiz eder ve Analysis durumuna alir.")] + [Description("Backlog durumundaki tum gelistirme taleplerini SortOrder sirasiyla analiz eder; uretime hazir olanlari Ready to Start'a, digerlerini Analysis durumuna alir.")] public static string AnalyzeBacklogRequests() => "App.DevRequests kuyrugundaki Backlog taleplerini query_list ile SortOrder sirasiyla oku ve tek tek analiz et. " + "Once get_dev_guide ile lowcode 0.12 bolumunu oku ve oradaki standarda uy. " + "Her talebi get_dev_request ile oku, analizi save_dev_request_analysis ile yaz; reddedilen talebi atla ve rapora yaz. " + "Hicbir sey uretme ve Description'a dokunma. " + - "Sonunda parti raporu ver: talep basina menu yeri, (onay) etiketli karar sayisi ve Uretime hazir durumu; talepleri Ready to Start'a kullanicinin alacagini tek satirda belirt."; + "Sonunda parti raporu ver: talep basina menu yeri, (onay) etiketli karar sayisi, Uretime hazir durumu ve talebin yeni durumu (Ready to Start ya da Analysis)."; [McpServerPrompt(Name = McpPromptNames.ProcessDevRequest)] [Description("Tek bir gelistirme talebini isler. Talep Ready to Start durumunda olmalidir.")] diff --git a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/Tools/McpDevelopTools.cs b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/Tools/McpDevelopTools.cs index 76521300..7de360d0 100644 --- a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/Tools/McpDevelopTools.cs +++ b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/Tools/McpDevelopTools.cs @@ -138,13 +138,15 @@ public sealed class McpDevelopTools(IMcpDevelopAppService developAppService, IMc => ToContent(await developAppService.GetDevRequestAsync(request)); [McpServerTool(Name = McpToolNames.SaveDevRequestAnalysis, Destructive = true, Idempotent = true)] - [Description("Backlog ya da Analysis durumundaki bir talebin analizini (HTML) Analysis alanina yazar ve talebi Analysis durumuna alir; var olan analiz degistirilir, Description'a dokunulmaz. Diger durumlarda reddeder. Once get_dev_request ile talebi ve gorsellerini oku; analizin bolumleri ve standardi get_dev_guide lowcode 0.12'dedir. Analizi begenen kullanici talebi Ready to Start'a kendisi alir; MCP almaz.")] + [Description("Backlog ya da Analysis durumundaki bir talebin analizini (HTML) Analysis alanina yazar; var olan analiz degistirilir, Description'a dokunulmaz. productionReady true ise talep Ready to Start'a, false ise Analysis durumuna alinir. Diger durumlarda reddeder. Once get_dev_request ile talebi ve gorsellerini oku; analizin bolumleri ve standardi get_dev_guide lowcode 0.12'dedir.")] public async Task> SaveDevRequestAnalysisAsync( [Description("Talebin Id'si (GUID) ya da tam basligi.")] string request, [Description("Analizin tamami, HTML.")] - string html) - => ToContent(await developAppService.SaveDevRequestAnalysisAsync(request, html)); + string html, + [Description("Analizin 'Uretime hazir' satiri kosulsuz Evet ise true; sartli (onay bekleyen, 'Evet, ancak …') ya da Hayir ise false. HTML'deki satirla ayni olmak zorundadir.")] + bool productionReady) + => ToContent(await developAppService.SaveDevRequestAnalysisAsync(request, html, productionReady)); [McpServerTool(Name = McpToolNames.AppendDevRequestNote, Destructive = false, Idempotent = false)] [Description("Talebin Analysis alaninin sonuna HTML ekler; var olan analize ve Description'a dokunmaz. Description talebin yazildigi haliyle kalir; uretim sonuc notunu (

MCP

+ uretilenler, varsayimlar ve DB Migrate bekleyen wizard'lar) bu aracla ekle. Description'i ya da Analysis'i update_row ile yazma.")] diff --git a/api/src/Sozsoft.Platform.HttpApi.Host/TenantLocalizationInitializer.cs b/api/src/Sozsoft.Platform.HttpApi.Host/TenantLocalizationInitializer.cs index ead30807..fa46d4ea 100644 --- a/api/src/Sozsoft.Platform.HttpApi.Host/TenantLocalizationInitializer.cs +++ b/api/src/Sozsoft.Platform.HttpApi.Host/TenantLocalizationInitializer.cs @@ -44,11 +44,17 @@ public class TenantLocalizationInitializer : ITransientDependency return; } - var language = await _settingManager.GetOrNullGlobalAsync(LocalizationSettingNames.DefaultLanguage) ?? "en"; - var timeZoneId = await _settingManager.GetOrNullGlobalAsync(TimingSettingNames.TimeZone) ?? "UTC"; + // Okunamayan ayar (tanımlar henüz yüklenmemiş, veritabanı o an yanıt vermiyor) mevcut değeri + // korur. Varsayılana düşmek süreç genelindeki saati UTC/Local arasında çevirir; o arada yazılan + // AbpSessions satırları 3 saat kaymış görünür ve oturum temizleyici açık oturumları siler. + var language = await _settingManager.GetOrNullGlobalAsync(LocalizationSettingNames.DefaultLanguage); + var timeZoneId = await _settingManager.GetOrNullGlobalAsync(TimingSettingNames.TimeZone); - ApplyCulture(language); - ApplyClockKind(timeZoneId); + if (!string.IsNullOrWhiteSpace(language)) + ApplyCulture(language); + + if (!string.IsNullOrWhiteSpace(timeZoneId)) + ApplyClockKind(timeZoneId); } private static void ApplyCulture(string language) diff --git a/claude.md b/claude.md index e743156e..733fa836 100644 --- a/claude.md +++ b/claude.md @@ -246,6 +246,14 @@ Bir çelişki varsa sıra: `ai.instructions.md` → `dotnet.instructions.md` → dosya adı önekli yazılır. `configs/seeds/wizard/` altındaki bütün dosyalar bu düzendedir; öneksiz dosya yalnızca eski bir export arşivinden gelebilir ve düzenlenirken adı korunur. Ayrıntı: `lowcode.instructions.md` §4.4 Adım 2. +23. **Otomatik numara Sequence'tan** → wizard/MCP üretiminde talep otomatik numara istediğinde ya da + analiz bir alanın (`ProjectNo`, `OrderNo`, `RequestNo` …) otomatik numaralanmasına karar verdiğinde + alan `App.Definitions.Sequence` numaratörüne bağlanır; elle girilen numara/kod alanı bu kurala + girmez. Numaratör + `data/App.Definitions.Sequence.json`'a satır olarak yazılır (uygun olan varsa yeniden kullanılır), + alanın varsayılanı `FormFieldsDefaultValueDto`'da `CustomValueType: 5`, `Value` = numaratörün `Name`'i. + `@AUTONUMBER`, `MAX + 1` sorgusu ya da SQL ile numara üretilmez (boşluksuz numara açıkça istenmedikçe). + Ayrıntı: `lowcode.instructions.md` §4.3.5.2. ### Cross-cutting: touching one thing means touching these too @@ -377,10 +385,11 @@ Bir çelişki varsa sıra: `ai.instructions.md` → `dotnet.instructions.md` → - **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 (ekran/tablo üretmez, + ile yalnızca `Backlog`/`Analysis` talebini analiz eder (ekran/tablo üretmez, modül dokümanına yazmaz — dosya ve dal bölümü üretimde, deploy ile açılır; onaylanan analiz bölümün - "2. Analiz ve kararlar" alt bölümüne üretimde `save_module_doc` ile yazılır); - `Ready to Start`'a kullanıcı taşır, üretim notu `append_dev_request_note` ile `Analysis`'e eklenir. + "2. Analiz ve kararlar" alt bölümüne üretimde `save_module_doc` ile yazılır). Durumu sunucu + `productionReady` ile belirler: "Üretime hazır: Evet" → `Ready to Start`, şartlı ya da Hayır → + `Analysis` (kullanıcı kararı bekler). Üretim notu `append_dev_request_note` ile `Analysis`'e eklenir. Analiz standardı tek yerdedir: `lowcode.instructions.md` §0.12; prompt'lar oraya yönlendirir. - **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ı diff --git a/configs/seeds/data/App.Definitions.Sequence.json b/configs/seeds/data/App.Definitions.Sequence.json index 966190b2..7959c2dc 100644 --- a/configs/seeds/data/App.Definitions.Sequence.json +++ b/configs/seeds/data/App.Definitions.Sequence.json @@ -25,10 +25,25 @@ "IsActive": true, "PaddingSize": 5, "IncrementStep": 1, - "StartNumber": 1, "NextNumber": 1, - "ResetPeriod": 3, - "FormatTemplate": "{Prefix}-{yyyy}{MM}{dd}-{Number}" + "ResetPeriod": 0, + "StartNumber": 1, + "LastPeriodKey": null, + "FormatTemplate": "{Prefix}{Number}{Suffix}" + }, + { + "Id": "28981dbf-cf64-459c-bffc-fdfaeed4b2ef", + "Name": "ProjeCode1", + "Prefix": "PRJ", + "Suffix": null, + "IsActive": true, + "PaddingSize": 5, + "IncrementStep": 1, + "NextNumber": 1, + "ResetPeriod": 0, + "StartNumber": 1, + "LastPeriodKey": null, + "FormatTemplate": "{Prefix}{Number}{Suffix}" } ] } diff --git a/configs/seeds/data/App.DevRequests/53294e77-a4fb-45e4-a80e-acf07b5d75be.json b/configs/seeds/data/App.DevRequests/53294e77-a4fb-45e4-a80e-acf07b5d75be.json index e25fb724..b06eb083 100644 --- a/configs/seeds/data/App.DevRequests/53294e77-a4fb-45e4-a80e-acf07b5d75be.json +++ b/configs/seeds/data/App.DevRequests/53294e77-a4fb-45e4-a80e-acf07b5d75be.json @@ -18,7 +18,7 @@ "Priority": "5", "Completed": false, "SortOrder": 0, - "Timesheets": null, + "Timesheets": "[{\"id\":\"cb5cb27c-2cbc-1835-a340-3a2432d8e57b\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.1333}]", "SubTasks": null, "Analysis": "" }