Bir yapay zekâ ajanına şunu söyleyin: "Bu ekranı FmgLib.MauiMarkup ile yaz."
Büyük ihtimalle şuna benzer bir şey alırsınız:
new Label()
.SetText("Merhaba")
.SetFontSize(30)
.HorizontalAlign("Center")
Kod makul görünüyor. Bir tanesi bile mevcut değil.
Doğrusu şu:
new Label()
.Text("Merhaba")
.FontSize(30)
.CenterHorizontal()
Bu yazı, bu farkın neden ortaya çıktığı ve nasıl kapatıldığı üzerine. Cevap “daha iyi bir model bekleyin” değil.
Sorun modelde değil
Ajanın uydurduğu metot adlarına bakın: SetText, SetFontSize, HorizontalAlign. Hiçbiri saçma değil — başka kütüphanelerde bunların hepsi gerçek. Model, gördüğü onlarca fluent API'nin ortalamasını alıp makul bir tahmin üretiyor.
Asıl mesele şu: FmgLib.MauiMarkup'ın kuralları basit ama tahmin edilebilir değil.
Fooadlı bindable property →.Foo(...)metodu.Setöneki yok.Baradlı event →.OnBar(...)metodu.Grid.Rowattached property'si.Row(...)olur — önek düşer. AmaShell.TitleColor,.ShellTitleColor(...)olur — önek düşmez.Build()her hot reload'da yeniden çalışır; dolayısıyla durum alanlarda yaşamalı,Build()içinde değil.- Kayıt çağrısı yoktur.
builder.UseFmgLibMauiMarkup()diye bir şey aramayın.
Bu kuralların hiçbiri tip sisteminden çıkarılamaz. Bir ajan Label sınıfına baktığında TextProperty'yi görür ama uzantı metodunun adının .Text mi .SetText mi olacağını göremez — ikisi de eşit derecede mantıklıdır.
İkinci bir etken daha var: internetteki MAUI kodunun ezici çoğunluğu XAML. Ajan bir MAUI ekranı yazması istendiğinde eğilimi XAML'e doğrudur; C# markup istendiğinde de sık sık XAML alışkanlıklarını birebir çevirir — .xaml + .xaml.cs çifti üretmek, InitializeComponent() çağırmak, ContentTemplate'e lambda yerine hazır bir sayfa vermek gibi.
Yani sorun zekâ eksikliği değil, bilgi eksikliği. Ve eksik bilgi yazıya dökülebilir.
Skill nedir?
Bir “skill”, YAML başlıklı düz bir Markdown dosyasından ibaret:
---
name: mauimarkup-mvvm
description: Structure FmgLib.MauiMarkup apps with MVVM — FmgLibContentPage<TViewModel>,
typed BindingContext, compiled Getter/Setter bindings, commands, dependency injection…
Use when writing or refactoring view models, wiring pages to view models…
license: MIT
---
# MVVM with FmgLib.MauiMarkup
...
İşleyişindeki asıl incelik description alanında: ajan yalnızca açıklamaları sürekli görür, gövdeyi ise ancak eldeki görev o açıklamayla eşleştiğinde okur. Yani on skill kurmak, ajanın bağlamına on doküman yüklemek anlamına gelmiyor. Liste ayrılmış, içerik talep üzerine geliyor.
Bu format Agent Skills standardı; Claude Code, Claude uygulamaları, Agent SDK ve SKILL.md okuyabilen herhangi bir ajan ile çalışıyor.
On skill
Toplam yaklaşık 3000 satır; her biri kütüphanenin bir alanını, ajanın hata yaptığı noktalara odaklanarak anlatıyor.
| Skill | Ne öğretiyor |
|---|---|
mauimarkup (zorunlu) |
Fluent model, sayfa iskeleti, dört property overload'ı, layout, event'ler, Assign, isim türetme kuralları, Build() disiplini. Beş dosyalık references/ paketi: cheatsheet, binding'ler, layout tabloları, stil & tema, tuzaklar |
mauimarkup-xaml-migration |
Sayfa bazlı geçiş prosedürü, 30 satırlık XAML→C# eşleme tablosu, çeviri değil karar gerektiren yapılar |
mauimarkup-mvvm |
FmgLibContentPage<TViewModel>, tipli BindingContext, derlenmiş Getter/Setter, komutlar, DI, CommunityToolkit.Mvvm |
mauimarkup-shell |
Shell, FlyoutItem, Tab, ContentTemplate lambda'ları, rotalar, pencereler, menüler |
mauimarkup-collections |
ItemsSource/ItemTemplate, template selector, item layout, EmptyView, sonsuz kaydırma, BindableLayout'un ne zaman kullanılmaması gerektiği |
mauimarkup-styling |
Style<T>, kaynak organizasyonu, AppThemeBinding ile koyu tema, visual state'ler, trigger'lar, Animate…To |
mauimarkup-localization |
JSON ve RESX kurulumu, Translate/TranslateFormat, canlı dil değişimi, fallback zinciri, RTL |
mauimarkup-thirdparty |
[MauiMarkup], [MauiMarkupAttachedProp], otomatik üreteç modu, taban sınıf üretimi, New eki kuralı |
mauimarkup-hotreload |
IFmgLibHotReload, handler seçenekleri, dotnet watch ve IDE kanalları, reload-güvenli Build(), teşhis matrisi |
mauimarkup-review |
Dokuz denetim geçişi, hazır ripgrep sorguları, önem derecesi modeli ve raporlama biçimi |
Hepsini kurmak sorun değil — kullanılmayan skill'in maliyeti sıfır, çünkü gövdesi hiç okunmuyor.
Yine de bir başlangıç noktası isterseniz:
| Durumunuz | Kurun |
|---|---|
| Yeni uygulama başlatıyorsunuz | mauimarkup + shell + mvvm + hotreload |
| Mevcut XAML uygulamasını taşıyorsunuz | mauimarkup + xaml-migration + styling |
| Veri ağırlıklı uygulama | mauimarkup + mvvm + collections |
| Çok dilli yayın | üstüne localization |
| Syncfusion / UraniumUI / SkiaSharp kullanıyorsunuz | üstüne thirdparty |
| Devraldığınız kodu temizliyorsunuz | mauimarkup + review |
Kurulum
Otomatik. Ajanınıza şunu söylemeniz yeterli:
https://fmglibmauimarkup.vodisoft.com/llms.txt adresini getir ve FmgLib.MauiMarkup AI skill'lerini kur.
Katalog sayfasını bulur, listeyi okur ve dosyaları yerine indirir.
Manuel. Her skill bir klasör ve içinde bir SKILL.md. İki yerden birine koyabilirsiniz:
| Kapsam | Konum |
|---|---|
| Kişisel — her projede geçerli | ~/.claude/skills/<skill-adı>/SKILL.md |
| Proje — repoyla birlikte versiyonlanır | <repo>/.claude/skills/<skill-adı>/SKILL.md |
NAME=mauimarkup-mvvm
mkdir -p ~/.claude/skills/$NAME
curl -fsSL https://raw.githubusercontent.com/VodiSoft/FmgLib.MauiMarkup/master/skills/$NAME/SKILL.md \
-o ~/.claude/skills/$NAME/SKILL.md
Çekirdek skill'in ayrıca references/ klasörü var; göreli yolların bozulmaması için onu olduğu gibi kopyalayın.
Ekipler için proje kapsamı tercih edilmeli. Klasörü <repo>/.claude/skills/ altına commit ederseniz her geliştirici ve her CI ajanı aynı talimatlarla çalışır. Kurulum farkından doğan “bende düzgün yazıyordu” tartışması ortadan kalkar.
Pratikte ne değişiyor?
Skill'lerin kodladığı düzeltmelerden bazıları — her biri ajanların düzenli olarak yaptığı bir hata:
| Skill'siz | Skill'li |
|---|---|
.SetText(), .HorizontalAlign() uydurur |
Property adından .Text(), .CenterHorizontal() türetir |
.xaml + .xaml.cs çifti üretir |
Tek .cs dosyası, InitializeComponent() yok |
Build() içinde new MyViewModel() |
View model constructor'da alanda — durum hot reload'ı atlatır |
.ContentTemplate(new HomePage()) |
.ContentTemplate(() => new HomePage()) |
.TextColor(isDark ? white : black) |
.TextColor(e => e.OnLight(black).OnDark(white)) — canlı tema binding'i |
Her yerde e.Path("UserName") |
e.Getter(static (VM vm) => vm.UserName) — derleyici denetimli |
5000 elemanlı liste için BindableLayout |
CollectionView, çünkü yalnızca o sanallaştırıyor |
builder.UseFmgLibMauiMarkup() ekler |
Böyle bir kayıt çağrısı olmadığını bilir |
| Syncfusion kontrolü için elle uzantı yazar | [MauiMarkup(typeof(SfButton))] yazıp üretece bırakır |
Bu listedeki maddelerin çoğu “derlenmiyor” kategorisinde bile değil — ikinci sütundaki üç madde (tema koşulu, Path yerine Getter, BindableLayout) sorunsuz derlenir ama yanlıştır. Ajanın bulduğu ilk çalışan çözüm ile doğru çözüm arasındaki fark, tam olarak skill'lerin doldurduğu boşluk.
Kurulumu doğrulama
Skill'lerin net cevabı olan bir şey isteyin:
MauiMarkup ile bir giriş sayfası yaz: e-posta alanı, şifre alanı ve ikisi de doldurulmadan etkin olmayan bir gönder butonu.
Doğru cevap tek bir .cs dosyasıdır: IFmgLibHotReload uygular, ağacı Build() içinde kurar, alanları .Assign(out var …) ile yakalar ve içinde hiç XAML geçmez. Bunlardan biri eksikse skill devreye girmemiş demektir — genellikle dosya yanlış klasördedir.
Kütüphane yazarları için asıl ders
Bu işin ilginç tarafı FmgLib'e özgü değil.
Yıllardır dokümantasyonu insanlar için yazdık: kavramları anlatan, örnek veren, gerekçe sunan metinler. Ajanların ihtiyacı olan şey farklı — kısa, kesin, karar verdiren talimatlar. “Property adı metot adıdır” cümlesi bir insan için sıkıcı bir ayrıntıdır; bir ajan için o cümle, uydurma metot adlarıyla dolu bir dosya ile derlenen bir dosya arasındaki farktır.
Üç pratik sonuç çıkarıyoruz:
- Skill'ler kütüphane deposunda yaşamalı. API değişikliği ve skill güncellemesi aynı commit'te gitmeli; ayrı bir repo ya da web sayfası kaçınılmaz olarak eskir.
- Eskimiş bir skill, hiç skill olmamasından kötüdür. Ajan yanlış bilgiyi kendinden emin biçimde tekrar eder ve siz onu düzeltmek yerine kodu düzeltmeye çalışırsınız.
- Skill'in değeri, kapsadığı API'de değil, önlediği hatalarda. Yukarıdaki “Skill'siz / Skill'li” tablosunu skill yazmadan önce yapın: ajana görevi verin, hatalarını not edin, skill'i o hataların üzerine yazın.
Özet
- Ajanlar kütüphanenizi bilmediği için değil, kurallarınızı tahmin edemediği için yanlış kullanır.
- Skill = YAML başlıklı Markdown; ajan yalnızca açıklamayı görür, gövdeyi görev eşleştiğinde okur. Kullanılmayan skill maliyet üretmez.
- On skill, kütüphanenin alanlarını kapsıyor; çekirdek olan
mauimarkupher durumda gerekli. - Ekip çalışıyorsanız
<repo>/.claude/skills/altına commit edin — herkes ve CI aynı talimatla çalışsın. - Doğrulamak için basit bir giriş sayfası isteyin; cevap tek
.csdosyası ve sıfır XAML olmalı.
Sonuç olarak elde ettiğiniz şey, “AI'ya kod yazdırmak” değil: ajanın kütüphanenizin kurallarını bilerek yazması. İkisi arasındaki fark, ürettiği kodu kontrol etmekle yeniden yazmak arasındaki fark kadar.