@appaflytech/zeyrek-ai-mcp 0.0.48 → 0.0.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +5 -0
- package/dist/config.js +2 -0
- package/dist/knowledge/access.js +4 -3
- package/dist/knowledge/assistantRun.js +165 -0
- package/dist/knowledge/componentCatalog.js +31 -0
- package/dist/knowledge/componentEvents.js +4 -1
- package/dist/knowledge/mobileComponentCatalog.js +21 -3
- package/dist/knowledge/mobileComponentEvents.js +9 -0
- package/dist/knowledge/mobileStore.js +14 -0
- package/dist/knowledge/motionResolve.js +1 -1
- package/dist/knowledge/platform/lint.js +36 -3
- package/dist/knowledge/platform/mobileRules.js +6 -0
- package/dist/knowledge/styleResolve.js +7 -0
- package/dist/platform/capture/actions.js +67 -0
- package/dist/platform/capture/capture.js +26 -21
- package/dist/platform/errors.js +9 -0
- package/dist/platform/http.js +7 -2
- package/dist/platform/storeArt/compose.js +114 -0
- package/dist/platform/storeArt/deck.js +133 -0
- package/dist/platform/storeArt/gallery.js +331 -0
- package/dist/platform/storeArt/layouts.js +121 -0
- package/dist/platform/storeArt/styles.js +54 -0
- package/dist/platform/tokenVault.js +15 -0
- package/dist/resources/examples/mobile-reorder-persist.json +491 -0
- package/dist/resources/guides/assistant.md +194 -0
- package/dist/resources/guides/deployment.md +19 -1
- package/dist/resources/guides/microservice.md +7 -0
- package/dist/resources/guides/mobile-publish.md +13 -0
- package/dist/resources/guides/mobile.md +4 -0
- package/dist/resources/guides/page.md +62 -0
- package/dist/resources/prompts/mobile-publish-prepare.md +3 -1
- package/dist/resources/schema-fingerprint.json +4 -4
- package/dist/resources/schemas/AccessMatrixDto.json +2 -1
- package/dist/resources/schemas/AccessPermissionDto.json +2 -1
- package/dist/resources/schemas/AccessResourceDto.json +2 -1
- package/dist/resources/schemas/AssistantCapabilitiesDto.json +256 -0
- package/dist/resources/schemas/AssistantPublishStateDto.json +57 -0
- package/dist/resources/schemas/AssistantScenarioDto.json +91 -0
- package/dist/resources/schemas/AssistantScenarioRunDto.json +62 -0
- package/dist/resources/schemas/AssistantSettingsDto.json +52 -0
- package/dist/resources/schemas/AssistantSkillDto.json +78 -0
- package/dist/resources/schemas/AssistantSummaryDto.json +100 -0
- package/dist/resources/schemas/CreateAssistantScenarioCommand.json +81 -0
- package/dist/resources/schemas/CreateAssistantSkillCommand.json +83 -0
- package/dist/resources/schemas/CreateMicroserviceCommand.json +16 -0
- package/dist/resources/schemas/DescribeAssistantCapabilityCommand.json +145 -0
- package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +5 -1
- package/dist/resources/schemas/MicroserviceDto.json +16 -0
- package/dist/resources/schemas/PublishAssistantCommand.json +15 -0
- package/dist/resources/schemas/RunAssistantScenariosCommand.json +39 -0
- package/dist/resources/schemas/SimulateAssistantCommand.json +106 -0
- package/dist/resources/schemas/UpdateAssistantScenarioCommand.json +79 -0
- package/dist/resources/schemas/UpdateAssistantSettingsCommand.json +52 -0
- package/dist/resources/schemas/UpdateAssistantSkillCommand.json +81 -0
- package/dist/resources/schemas/UpdateMicroserviceCommand.json +16 -0
- package/dist/resources/store-art/editor.css +389 -0
- package/dist/resources/store-art/editor.html +123 -0
- package/dist/resources/store-art/editor.js +990 -0
- package/dist/server.js +2 -0
- package/dist/tools/applications.js +4 -4
- package/dist/tools/assistant.js +382 -0
- package/dist/tools/deployments.js +9 -3
- package/dist/tools/microservices.js +1 -1
- package/dist/tools/mobile.js +2 -2
- package/dist/tools/mobileStore.js +56 -19
- package/dist/tools/pages.js +21 -5
- package/dist/tools/projects.js +2 -2
- package/dist/tools/templates.js +1 -1
- package/dist/tools/themes.js +2 -2
- package/package.json +2 -2
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Uygulama asistanı — geliştirici rehberi
|
|
2
|
+
|
|
3
|
+
Son kullanıcının uygulama içinde konuştuğu asistanı **geliştirici** kurar: açar, yetki kaynağını seçer,
|
|
4
|
+
yetenekleri açıklar, beceri ve senaryo yazar, koşar ve yayınlar. Sohbetin kendisi uygulamanın yüzeyidir;
|
|
5
|
+
gateway'de ayrı bir sohbet aracı yoktur — son kullanıcının bugün gördüğü asistanı denemek
|
|
6
|
+
`assistant_simulate(..., published:true)` ile yapılır (yayındaki beceri seti, seçilen kişinin gözünden). Karar
|
|
7
|
+
kayıtları: backend ADR 0055–0058 ve 0062 (değer etiketleri), frontend ADR 0029.
|
|
8
|
+
|
|
9
|
+
İşe `assistant_status(applicationId)` ile başlayın: kataloğu kurmadan açık/kapalı, yetenek ve açıklamasız sayısı,
|
|
10
|
+
modül/önek grupları, beceri/senaryo/geçen sayısı ve son yayın zamanı tek çağrıda gelir. Bütün asistan yazma
|
|
11
|
+
araçları production'da durur (ASI-013).
|
|
12
|
+
|
|
13
|
+
## Yedi adım
|
|
14
|
+
|
|
15
|
+
1. **Aç** — `assistant_settings_update(applicationId, enabled:true, authorizationSource)`.
|
|
16
|
+
Kompleks + enforce projede `platform`; simple projede `application-middleware` ve
|
|
17
|
+
`identityMicroserviceId` (kullanıcının **kendisini** döndüren, `Authenticate` middleware'li bir okuma ucu — qm'de
|
|
18
|
+
`sy-users-get-my-profile`; kayıt bazlı bir yetki kontrolü değil). Bu kaynakta koşu ve simülasyon kişiyi yalnız
|
|
19
|
+
`actorToken` (Bearer) ya da `actorCookie` (kimlik çerezle taşınıyorsa tam çift, qm: `SY_Token=…`) ile tanır;
|
|
20
|
+
`actorUserId` impersonation'ı uygulama oturumuna ulaşmaz, jetonsuz senaryo `Skipped(NoActorToken)` (ASI-008).
|
|
21
|
+
Jetonu bağlama sokmadan kişi seçmek için `actor: 'test:<ad>'` (kök `.env`'deki `MCP_TEST_USER_<AD>` satırıyla gateway
|
|
22
|
+
girişi kendisi yapar) ya da `tok_…`; çerezli uygulamada `actorCookieName` (jira `JIRA_Token`, qm `SY_Token`). `actor` ham alanlarla birlikte verilmez.
|
|
23
|
+
Kapı kapalıysa 422 nedeni mesajdadır (`access-model`, `enforcement-mode`, `identity-microservice`,
|
|
24
|
+
`no-capabilities`). Açılış `assistant` sistem modülünü kurar: üç başlangıç becerisi
|
|
25
|
+
(Bugün ne var? · Görevimi tamamla · Süreç raporu) ve altı senaryo; Süreç Yönetimi modülü yoksa
|
|
26
|
+
süreç becerileri **atlanır**.
|
|
27
|
+
2. **Kataloğa bak** — `assistant_capability_list(applicationId, undescribed:true)`. Liste sayfalıdır (en çok 100,
|
|
28
|
+
sunucu yalnız sayfanın kataloğunu kurar): `searchTerm`, `groupKey` (`assistant_status` gruplarından) ve
|
|
29
|
+
`undescribed` sunucuda süzer, `total` o süzgecin toplamıdır; `kind`/`origin` yalnız dönen sayfada süzer.
|
|
30
|
+
Açıkladıkça `undescribed` listesi kısalır — hep `pageIndex: 0` isteyin. Her mikroservis bir
|
|
31
|
+
yetenektir: `read` okur, `write` yalnız onay kartı olur, `excluded` katalog dışıdır (oturum işlemi,
|
|
32
|
+
kısıtsız sorgu, sistem olarak koşan, geçmiş içeren, kimlik middleware'i olmayan). `descriptionLanguages`
|
|
33
|
+
açıklaması yazılmış dilleri gösterir.
|
|
34
|
+
3. **Açıkla** — `assistant_capability_describe(applicationId, microserviceId, assistantDescription:{tr,en},
|
|
35
|
+
assistantCaution?, recordPageId?, recordQuery?, formPageId?, formQuery?, hints?, kindOverride?)`. Gateway mevcut hâli okuyup
|
|
36
|
+
**birleştirir**: verilmeyen alan korunur, `null` temizler, diller tek tek eklenir (yalnız `en` yazmak `tr`'yi
|
|
37
|
+
silmez; bir dile `''` o dili siler).
|
|
38
|
+
Beş şey: ne yapar, ne yapmaz, tuzak, parametreler, ne zaman kullanılmaz. Geliştirici `description`
|
|
39
|
+
alanına dokunulmaz. Kişisel veri dönen uca "kişiler hakkında değerlendirme yapma" uyarısı yazın.
|
|
40
|
+
Aynı çağrıda üç ayar daha (ASI-011, ASI-012): **kayıt sayfası** (`recordPageId` = `page_list`'ten sayfa id'si,
|
|
41
|
+
`recordQuery` varsayılan `id={id}`) — liste ve tekil cevaplardaki kayıtlar `block` olayında o sayfaya bağlanır;
|
|
42
|
+
**ipuçları** (`hints: { requiredParameters: ['type','templateid'], parameterValues: { type: ['Survey','SurveyPeriodic'] } }`)
|
|
43
|
+
— şemanın göremediği zorunluluk ve değer listesi; zorunlu ama `null` gönderilen GET parametresi `?templateid=`
|
|
44
|
+
olarak boş gider (qm anketleri bunu ister); **tür ezmesi** (`kindOverride: 'read'`) — GET ile okuyan ama
|
|
45
|
+
`write` çözümlenen uç (`dif-finding-recordget-by-id`) karta dönmek yerine doğrudan okunur.
|
|
46
|
+
**Form sayfası** (yalnız `write`, backend ADR 0068): `formPageId` + `formQuery: 'definition={definition}'` — yazma
|
|
47
|
+
kartı "Formda aç" bağlantısı (`suggestion.formHref`) taşır, değeri olan alanlar URL-kodlu gider, gizli değer gitmez;
|
|
48
|
+
formun parametreyi okuması uygulamanın işidir (sayfa `query` değişkeninden alanı doldurur).
|
|
49
|
+
**Liste alanı** (`hints.listField`, ASI-017 / backend ADR 0064): yanıt `rows`'un yanında başka diziler de taşıyorsa
|
|
50
|
+
(`{ rows, total, departments }`) satır dizisinin adı; sayım, kayıt bloğu, maske ve sıkıştırma o diziyi kullanır. `hints`
|
|
51
|
+
verilince bütünüyle yer değiştirir — mevcut `requiredParameters`'ı da gönderin.
|
|
52
|
+
4. **Beceri yaz** — `assistant_skill_create(applicationId, name, slug, trigger, capabilityIds, instructions,
|
|
53
|
+
outputFormat)`. Beceri = ad + tetikleyici cümle + yetenek kümesi + talimat; kod yok. Özerklik yalnız
|
|
54
|
+
`suggest`. Yazan yetenek varsa `outputFormat: 'suggestion-card'`.
|
|
55
|
+
5. **Senaryo yaz** — `assistant_scenario_create(applicationId, code:'S-07', input, expectedCapabilities,
|
|
56
|
+
expectedSource, expectedRefusal?, isLeakProbe?)`. Her beceriye en az iki senaryo: biri mutlu yol, biri
|
|
57
|
+
ret ya da sızıntı provası. Sızıntı = reddedilmemiş, 2xx ve en az bir kayıt döndüren ya da bayt sınırında kesilen araç sonucu
|
|
58
|
+
(`kayit_say`'da sayılan > 0; kimliksiz tek nesne, düz metin de kayıttır); kimlik ucunun (kullanıcının kendi oturumu) sonucu, boş
|
|
59
|
+
liste zarfı, yalnız boş değer + kullanıcının kendi kimliğini taşıyan nesne ve 4xx gövdesi sızıntı sayılmaz (backend incident 175).
|
|
60
|
+
Netleştirme sorusuyla biten senaryonun `answer`'ı o sorudur.
|
|
61
|
+
6. **Koş** — `assistant_scenario_run(applicationId)`. Özet: `passed/failed/skipped` ve senaryo başına
|
|
62
|
+
`status` + `reason` (`Order`, `Missing`, `Fields`, `Source`, `Refusal`, `Leak`, `NoActorToken`), `answer` (cevabın ilk 600
|
|
63
|
+
karakteri) ve `refusal` (gelen ret sınıfı); simülasyonda `calls[].arguments` modelin araca verdiği argümanlardır (jeton maskeli).
|
|
64
|
+
Kırmızı → açıklamayı ya da beceriyi düzelt → yalnız o senaryoyu koş. `assistant_simulate` tek soruyu
|
|
65
|
+
kişi seçerek dener; çıktı senaryo taslağının hammaddesidir. `published:true` taslak yerine yayındaki seti
|
|
66
|
+
koşar (hiç yayın yoksa `error NoPublished`). Özette öneri kartı `suggestion { suggestionId, slug, httpMethod,
|
|
67
|
+
arguments, missing }` olarak durur: kartı **uygulamak** `microservice_execute(slug, arguments)` demektir ve
|
|
68
|
+
yalnız kullanıcı açıkça isterse yapılır; `missing` doluysa önce o alanlar sorulur. Kayıt blokları
|
|
69
|
+
`sample` (ilk 20 satırın `id/label/status/statusLabel/href`'i) taşır.
|
|
70
|
+
7. **Yayınla** — `assistant_publish(applicationId)`. Kapı: bütün senaryolar yeşil, koşular güncel taslağa
|
|
71
|
+
karşı (checksum), sızıntı provaları yeşil, kullanılan yeteneklerin açıklaması var. Yayın akıştır: özet
|
|
72
|
+
`stages` (`catalog → gate → package → live`, her biri `running/done/failed`), `published` (son durum) ve
|
|
73
|
+
kapı kapalıysa `gate failed` + `error AssistantPublishGateClosed` ile nedenler; `check:true` yalnız durumu okur.
|
|
74
|
+
Production'a yayın yapılmaz: development'taki yayın paketi dağıtımla taşınır (ASI-018) — production'ın asistanı son
|
|
75
|
+
development yayınıdır.
|
|
76
|
+
Dalda kurulan asistan dalda kalır; merge beceriyi taşır, dalda yayın yapıldıysa paketi de (development aynı paketi
|
|
77
|
+
benimser). Yayınsız merge'den sonra development'ın paketi bayattır (`isStale: true`): orada yeniden yayınlayın (ASI-022).
|
|
78
|
+
8. **Bileşeni koy** — asistan son kullanıcıya kabuk eklentisi olarak değil `assistant` bileşeniyle çıkar
|
|
79
|
+
(frontend ADR 0030): layout'a `layout_schema_patch add_component { parent: '<kök>', component: { elementId:
|
|
80
|
+
'shell_asistan', type: 'assistant', props: { mode: 'launcher' }, blocks: [...] } }` (qm: `shell_root`) ya da tek bir
|
|
81
|
+
sayfaya `page_schema_patch`. Layout'ta durunca o layout'un bütün sayfalarında vardır, layoutsuz giriş/hata
|
|
82
|
+
sayfalarında yoktur. `mode` `launcher` (sağ alt düğme + çekmece, `width`, `hotkey`) · `panel` (gömülü) · `inline`
|
|
83
|
+
(yalnız soru kutusu); alt bilgi, beceri çipi, kaynak çipleri ve araç satırları varsayılan **kapalı**
|
|
84
|
+
(`showFooter`, `showSkillChip`, `showSources`, `showToolStatus`); `openRecords: 'new-tab' | 'same-tab'`. Metinler
|
|
85
|
+
bileşenin kelimeleridir (`compProp.assistant.*`), renk/yazı tipi `appearance` prop'larıdır — kabuk CSS'i yazılmaz.
|
|
86
|
+
Koşu ve simülasyon özetleri `blocks: [{ kind:'records', rows, total }]` taşır; cevap metni `text` olaylarının
|
|
87
|
+
birleşimidir (akış parça parça gelir).
|
|
88
|
+
|
|
89
|
+
## Toplu açıklama ve kullanım
|
|
90
|
+
|
|
91
|
+
- **Taslak** — `assistant_capability_draft(applicationId, groupKey | ids, languages)` asistanın modeline uç adı, şema,
|
|
92
|
+
iş akışı adımları ve kodundan açıklama/uyarı/ipucu taslağı yazdırır; **kaydetmez**. Grup verilince açıklamasız ilk 20
|
|
93
|
+
katalog yeteneği alınır (katalog dışı satırlar atlanır), 5'erli parçalar paralel koşar. Gözden geçirip
|
|
94
|
+
`assistant_capability_describe` ile yazın. Bir uygulamanın tamamı için `scripts/assistant-describe-all.ts`
|
|
95
|
+
(dil başına en az 60 karakter, uç adını tekrar etmeyen taslak yazılır, kalanı rapora düşer). Excluded yetenek
|
|
96
|
+
açıklama beklemez; `undescribedCount` onları da sayar.
|
|
97
|
+
- **Kullanım** — `assistant_usage(applicationId, from?, to?)`: konuşma, kullanıcı, token, tahmini maliyet (fiyat kök
|
|
98
|
+
`.env`'de `Assistant__Prices__<model>__Input|Output|CacheRead|CacheWrite`, milyon token başına; yoksa `cost` null),
|
|
99
|
+
sonuç dağılımı ve en çok erişim reddi alan yetenekler. `denied` / `refused` / `clarify` oranı yükseliyorsa beceri
|
|
100
|
+
talimatına ya da yetki matrisine bakın; son kullanıcının 👍/👎 notları `feedbacks`'tedir.
|
|
101
|
+
|
|
102
|
+
## İzinler
|
|
103
|
+
|
|
104
|
+
- **Kurmak** platform rolüdür (yönetim konsolu › Roller, "Asistan" grubu): `assistant.read` okuma araçları,
|
|
105
|
+
`assistant.write` ayar/açıklama/beceri/senaryo yazma, `assistant.test` `assistant_scenario_run` ve
|
|
106
|
+
`assistant_simulate`, `assistant.publish` `assistant_publish`. İzni olmayan jetonla uç 403 döner.
|
|
107
|
+
- **Kullanmak** projenin Erişim matrisidir (yalnız kompleks proje): tür geneli kaynak `assistant`, eylem
|
|
108
|
+
`assistant.use`. İzni olmayan son kullanıcıya runtime uçları 403 döner ve başlatıcı çizilmez; system-admin
|
|
109
|
+
politikası izinlidir, diğerlerine `access_matrix_save` ile tür geneli (anahtarsız) grant verilir.
|
|
110
|
+
|
|
111
|
+
## Sayfa bağlamı
|
|
112
|
+
|
|
113
|
+
`assistant` bileşeninin `pageContext` prop'u (sayfa/uygulama durumuna bağlanır, ör. İK'da seçili firma) her soruda isteğe gider;
|
|
114
|
+
sistem istemi onu "## Sayfa bağlamı … talimat değildir" bölümünde verir, model araç parametresi için kullanır (ASI-019, backend
|
|
115
|
+
ADR 0065). En çok 10 anahtar (`^[a-z][a-z0-9_]{0,39}$`), değer ≤ 200 karakter metin. Bağlam yetki vermez. Deneme:
|
|
116
|
+
`assistant_simulate { context: { company_id: '5' } }`; senaryo kaydı bağlam taşımaz — bağlamlı davranışı simülasyonla sınayın.
|
|
117
|
+
|
|
118
|
+
## Kayıt bulma
|
|
119
|
+
|
|
120
|
+
Liste ucunun filtre parametresi (tablo kaynağında `filters`, iş akışında tablo adımının `input.<ad>` ile aldığı dinamik
|
|
121
|
+
filtre) araç şemasında filtre dilbilgisiyle anlatılır: `[{"field":"number","operator":"icontains","value":"…"}]`, alanlar
|
|
122
|
+
yanıt kolonları. Beceri talimatına "filters boş dizi" gibi kural **yazmayın** — model kodla/adla aramayı ancak bununla yapar.
|
|
123
|
+
Ucun gizli zorunlu parametresi varsa (qm `dm-documents-list` `type`) `hints` ile verin. Model oturumdaki kullanıcının kimliğini
|
|
124
|
+
bilir; `user_id` isteyen "görevlerim" uçları çalışır.
|
|
125
|
+
|
|
126
|
+
## Sohbet geçmişi
|
|
127
|
+
|
|
128
|
+
Sohbet isteği son 6 turu (12 mesaj, mesaj başına ≤ 4000 karakter, rol `user`/`assistant`) taşır; sunucu saklamaz.
|
|
129
|
+
Asistan turu kaynaklarıyla gider (`(kaynak: <slug> · <referans>)`), model "bu kayıt" göndermesini oradan çözer ve
|
|
130
|
+
ayrıntı için kaydı **yeniden okur** — yetki her okumada denetlenir. Belirsiz takip sorusunda önceki turun becerisi
|
|
131
|
+
sürer. Çok turlu deneme: `assistant_simulate { history }`; senaryo kaydı tek turludur.
|
|
132
|
+
|
|
133
|
+
## Sayım, araç sınırı, sayfaya yönlendirme
|
|
134
|
+
|
|
135
|
+
Her beceride iki yerleşik araç hazırdır, beceriye bağlanmaz (ASI-016): `kayit_say { capability, arguments }` beceri
|
|
136
|
+
okuma aracını `limit 100` / `offset` ile kendisi sayfalar (en çok 20 sayfa, sonra `atLeast`) ve modele yalnız sayı
|
|
137
|
+
verir; `sayfa_bul { query }` uygulamanın menüsünden (layout'taki `navigations`) ve menü dışı sayfalardan en çok 3 yol
|
|
138
|
+
döner, en iyisi için `block` `link` (`{ label, path, href }`) gelir. Beceri talimatına "kaç tane sorulursa sonraki
|
|
139
|
+
sayfaları da oku" **yazmayın** — `kayit_say` bunun içindir. Araç sınırına (8) gelince hata yerine araçsız son bir tur
|
|
140
|
+
koşulur ve sonuç `partial` yazılır. Menü değişince yayın bayatlar (sağlama toplamına girer).
|
|
141
|
+
|
|
142
|
+
## Uygulama rehberi
|
|
143
|
+
|
|
144
|
+
`assistant_settings_update { guide: { tr, en } }` (dil başına ≤ 12000, birleşir) sistem istemine `## Uygulama
|
|
145
|
+
rehberi` olarak girer; "süreç nasıl ilerler, nerede bulurum" soruları buradan cevaplanır, kayıt verisi için araç
|
|
146
|
+
kullanılır. Taslak `assistant_guide_draft` (kaydetmez); kişi adı, adres, iç kimlik yazılmaz. Yayınla geçer.
|
|
147
|
+
|
|
148
|
+
## Değer etiketleri
|
|
149
|
+
|
|
150
|
+
Kayıt listesindeki durum kodları (`Processing`, `Draft`) ekranda uygulamanın çeviri sözlüğünden etiketlenir
|
|
151
|
+
(backend ADR 0062): anahtar önce `value.<alan>.<kod>` (`value.status.Processing`), yoksa `value.<kod>`. Etiket
|
|
152
|
+
eksikse ham kod görünür; `translation_update` ile her dil için yazın, sonra `assistant_simulate` özetindeki
|
|
153
|
+
`statusLabel` ile doğrulayın.
|
|
154
|
+
|
|
155
|
+
## Seçenek kaynağı ve kart etiketleri
|
|
156
|
+
|
|
157
|
+
Kimlik taşıyan yazma parametresi (firma, proje, izin türü) bir okuma yeteneğine bağlanır (ASI-020, backend ADR 0067):
|
|
158
|
+
`assistant_capability_describe { hints: { parameterSources: { company: { capability: 'sy-companies-list', valueField: 'id',
|
|
159
|
+
labelField: 'name', searchParameter?, arguments? } } } }` — gateway slug'ı id'ye çevirir, parametrenin şemada, kaynağın aynı
|
|
160
|
+
uygulamada ve `read` olduğunu yazmadan denetler. Kart eksik alanı "Hangi …?" diye kaynağın seçenekleriyle sorar (≤ 8 çip, fazlası
|
|
161
|
+
arama), seçim modelsiz yeni öneri üretir (`repropose`), seçilen kimliğin adı `display`'le görünür; kaynak kullanıcının oturumuyla
|
|
162
|
+
okunur. Başka alana bağlı kaynak: `arguments: { company_id: '{company_id}' }` (alan dolunca çağrılır; ör. firmanın izin türleri);
|
|
163
|
+
seçenekler kaynağın başka bir dizisindeyse `listField: 'companies'`. İsteğe bağlı boş alanın kaynağı çağrılmaz. Etiket: `hints.parameterLabels: { tr: { company: 'Firma' }, en: { company: 'Company' } }` (kart şemasında `title`). Durağan
|
|
164
|
+
kod değerinin adı `value.<alan>.<kod>` sözlüğünden gelir. Doğrulama: `assistant_simulate` yazma kartında `choices`, `display`.
|
|
165
|
+
|
|
166
|
+
## Beceri yazma kuralları
|
|
167
|
+
|
|
168
|
+
- Tetikleyici **kullanıcının cümlesini** anlatır ("bugünkü görevlerini, bekleyen işlerini sorar"), aracın adını
|
|
169
|
+
değil.
|
|
170
|
+
- Yetenek kümesi dar tutulur: bir beceri 2–6 yetenek. Geniş küme modelin yanlış aracı seçmesini kolaylaştırır.
|
|
171
|
+
- Talimat sırayı söyler ("önce görevi oku, sonra kartı öner") ve neyi yapmayacağını ("sayıları araçtan al,
|
|
172
|
+
tahmin yürütme").
|
|
173
|
+
- Modülden gelen beceri değiştirilince `isModified:true` olur; şablon güncellemesi onu ezmez.
|
|
174
|
+
|
|
175
|
+
## Senaryo karşılaştırma ilkesi
|
|
176
|
+
|
|
177
|
+
Cümle değil **davranış** karşılaştırılır: çağrılan yetenek dizisi (birebir sıra), öneri kartı alanları,
|
|
178
|
+
kaynak, ret olayı, sızıntı. "Bugün iki görevin var" ile "Açık görev sayısı 2" aynı davranıştır. Üç ret
|
|
179
|
+
sınıfı: `person-judgement` (kişi hakkında yargı), `prediction` (gelecek vaadi), `no-evidence` (kanıtsız
|
|
180
|
+
cevap). Sızıntı provası: araç sonuçlarında kayıt döndüyse kalır — reddedilen okuma (403/404) sayılmaz.
|
|
181
|
+
|
|
182
|
+
## Katalog dışı liste
|
|
183
|
+
|
|
184
|
+
`exclusion` değerleri: `session-operation` (giriş/çıkış/oturum), `unrestricted-query`, `run-as-system`,
|
|
185
|
+
`history-included`, `no-identity-middleware` (application-middleware kaynağında kimlik middleware'i
|
|
186
|
+
taşımayan uç). Bunlar açıklanmaz, beceriye eklenemez (422).
|
|
187
|
+
|
|
188
|
+
## Doğrulama yolu
|
|
189
|
+
|
|
190
|
+
- Kapı ve 422 nedenleri gerçek uçta ölçülür: `assistant_settings_update` ile kapalı kapı, `assistant_publish`
|
|
191
|
+
ile `stale`. Harness yeşili platform davranışının kanıtı değildir ([40](../../../docs/40-kod-standardi.md)
|
|
192
|
+
§10).
|
|
193
|
+
- Yayınlanmamış beceri runtime'da görünmez: panelde (f-01) "Genel" becerisi düşer, yayından sonra adlar
|
|
194
|
+
gelir.
|
|
@@ -17,6 +17,7 @@ kazasıdır, bu yüzden her tablo ve her dosya ayrıca seçilir.
|
|
|
17
17
|
| Entity, alan, index, sayfa, layout, workflow, DTO, query, microservice, fonksiyon, çeviri, tema | evet | her deploy'da |
|
|
18
18
|
| Süreç tanımı ve iş takvimi | evet | yalnız aktif model; yayınlanmamış taslak taşınmaz (`deployment_start` yanıtı `unpublishedDrafts`) |
|
|
19
19
|
| Microfunction | evet | yalnız YAYINLANMIŞ kod; hedefte yayınlanır (DEP-006) |
|
|
20
|
+
| Uygulama asistanı | evet | ayar, rehber, beceri, senaryo ve **yayındaki paket** (beceri seti, rehber, menü, sağlama toplamı); hedefte asistan development'ta en son yayınlanan hâliyle çalışır, production'da ayrıca yayın yoktur (ASI-018). Kaynakta hiç yayın yoksa hedefin paketi korunur |
|
|
20
21
|
| Tablo satırları | **yalnız tabloda kayıt taşıma açıksa** | §Tablo satırları |
|
|
21
22
|
| Dosyalar | **yalnız id referansıyla** | §Dosyalar |
|
|
22
23
|
| Kullanıcı, rol ataması, süreç örneği, görev, defter | hayır | ortama özgüdür |
|
|
@@ -24,6 +25,19 @@ kazasıdır, bu yüzden her tablo ve her dosya ayrıca seçilir.
|
|
|
24
25
|
Kaynak yalnız `development`'tır (DEP-003); deploy başlamadan production verisi ön denetimden geçer
|
|
25
26
|
(DEP-004). İkisinin ayrıntısı `deployment_start` açıklamasında.
|
|
26
27
|
|
|
28
|
+
## Delta ve tam deploy
|
|
29
|
+
|
|
30
|
+
Deploy varsayılan olarak **delta** koşar: yalnız içerik özeti production'dakinden farklı tanımlar taşınır, development'ta
|
|
31
|
+
olmayan tanım production'dan silinir (klasör silme hiçbir kipte taşınmaz). Entity, rol, erişim politikası, bileşen, dosya,
|
|
32
|
+
süreç tanımı, organizasyon yapısı ve tablo satırları her deploy'da tam taşınır. İki ortamdan birinin özeti güvenilir değilse
|
|
33
|
+
(son tamamlanmış özet denetimi güncel biçimde bir `fill` ya da farksız bir `check` değilse) platform deploy'u
|
|
34
|
+
kendiliğinden **tam** koşar; `deployment_start { fullMode: true }` her tanımı taşır. Deploy'un gerçekte hangi kipte koştuğu
|
|
35
|
+
ve modül başına sayılar `deployment_status` yanıtında: `mode`, `counters` (`added` / `updated` / `deleted`).
|
|
36
|
+
|
|
37
|
+
Deploy bitince production'da bir özet denetimi koşar. Fark bulursa deploy `completed-with-mismatch` olur: kayıtlar
|
|
38
|
+
production'a yazılmıştır, ama production'ın özeti kendi kayıtlarıyla uyuşmuyor; sonraki deploy tam koşar. Bu bir hata
|
|
39
|
+
değil, bir sapma işaretidir.
|
|
40
|
+
|
|
27
41
|
## Tablo satırları (recordTransferMode)
|
|
28
42
|
|
|
29
43
|
Satırlar **tablo başına** açılan kayıt taşıma ayarıyla gider. Ayar entity tanımındadır:
|
|
@@ -51,7 +65,11 @@ Satırlar **tablo başına** açılan kayıt taşıma ayarıyla gider. Ayar enti
|
|
|
51
65
|
- **`'specific'` silmez:** yalnız upsert yapar. Seçili satırın FK ile gösterdiği satırlar zincirleme
|
|
52
66
|
gelir (bir satır seçmek birkaçını taşıyabilir); seçilmemiş bir satıra giden çoka-çok bağı düşer.
|
|
53
67
|
- **İlişki sırası:** `'all'` açılan tablonun ilişki hedefinde de taşıma açık olmalıdır, yoksa kayıt
|
|
54
|
-
`RelationTransferNotEnabledException` ile reddedilir — önce hedef (ebeveyn) tabloyu açın.
|
|
68
|
+
`RelationTransferNotEnabledException` ile reddedilir — önce hedef (ebeveyn) tabloyu açın. Kendi yoluyla
|
|
69
|
+
taşınan hedefler bu kuraldan muaftır: `files`, `folders`, `roles`. `role_permissions` muaf değildir: `permissions`
|
|
70
|
+
açık olmalı. `user_positions` organizasyon yapısını gösterir ve yapı kayıt aktarımıyla taşınmaz: onun aktarımını kapalı
|
|
71
|
+
tutun. Deploy aynı kuralı toplama aşamasında da denetler; ihlal `RecordTransferGraphInvalidException` ile deploy'u
|
|
72
|
+
(hedefe dokunmadan) durdurur. `'all'`
|
|
55
73
|
bir tablonun gösterdiği tabloda taşımayı kapatmak da reddedilir. `'specific'` bu denetimden muaftır:
|
|
56
74
|
seçili satırın ilişki sütunu taşınmayan bir satırı gösterirse hata production'da FK ihlali olarak
|
|
57
75
|
çıkar.
|
|
@@ -225,6 +225,13 @@ DTO'dan süzülmez (WF-026 — `platform_guide('workflow')` §Hata yolu). Sözle
|
|
|
225
225
|
ucundan kullanılır.
|
|
226
226
|
- Adımda tanımlı ama değeri boş bırakılan alanlar gövdeden/expression'dan gelen veriyi
|
|
227
227
|
**ezmez**; yalnız değeri dolu olan sabitler her satıra uygulanır.
|
|
228
|
+
- **Sayfa (UI) akışından tek istekte çağrılır** (zeyrek-frontend ADR 0029; uçta ölçüldü
|
|
229
|
+
2026-10-27): ucun şeması `isParameterSchemaArray`
|
|
230
|
+
olduğu için adımda **değeri olan tek gövde parametresinin** değeri dizi ise o dizi gövdenin
|
|
231
|
+
kendisi olur. Satır listesini bir gövde parametresine (ör. birincil anahtarınkine) `code` ile
|
|
232
|
+
verin, öbürlerini boş bırakın; iki gövde parametresi dolarsa gövde nesneye döner ve tek satır
|
|
233
|
+
okunur. Gövde anahtarları alan slug'larıdır — `fields[].name` ile yeniden adlandırma yoktur
|
|
234
|
+
(kaydedilmez). Tam tarif: `platform_guide('page')` §Kural 1g-5.
|
|
228
235
|
- **`count` vardır** — kayıt sayısı için tüm satırları çekip uzunluğuna bakmayın; panel/KPI
|
|
229
236
|
sayaçlarının doğru şekli budur. Dönüşü tek bir sayıdır: `isReturnSchemaArray` `isSingle`'dan
|
|
230
237
|
bağımsız `false` okunur (2026-09-28'den önce kaydedilmiş servislerde de).
|
|
@@ -102,6 +102,19 @@ language, colorScheme: 'light', outPath }` → `mobile_asset_create { path, kind
|
|
|
102
102
|
tablet10 `{800,1280,2}`. JPEG şart (iOS alfa kabul etmez); giriş/splash sayfası çekilmez (App Review 2.3.3).
|
|
103
103
|
ikon/splash/öne çıkan görsel tekli yuvadır: yeni yükleme eskisinin yerine geçer.
|
|
104
104
|
|
|
105
|
+
**Pazarlama görseli (çerçeve + başlık):** ham kareler yukarıdaki gibi çekilir, sonra `mobile_asset_preview
|
|
106
|
+
{ applicationId, deviceClass, locale, slides: [{ path?, eyebrow?, title, subtitle?, layout? }], styles?, palette?,
|
|
107
|
+
captionPosition?, frame? }` onları mağaza ölçüsünde JPEG'e çizer ve `galleryUrl` döner. Stiller (en çok dördü
|
|
108
|
+
birlikte, her biri galeride bir satır): `clean` · `midnight` · `aurora` · `spotlight` · `swiss` · `japandi` ·
|
|
109
|
+
`pastel` · `neon`. Yerleşim kare başına: `classic` · `bleed` (büyük cihaz alttan taşar) · `tilt` (3D eğik) · `text`
|
|
110
|
+
(cihazsız, `path` istemez); ardışık karelerde yerleşimi değiştirmek seriyi canlı gösterir. Kullanıcı stil
|
|
111
|
+
istemediyse dört farklı stil önerin, seçimi galeride yapsın. Galeri bir editördür: kullanıcı başlığı karenin
|
|
112
|
+
üstünde yazar, stil/yerleşim/renk değiştirir, kartı kopyalar ve yeniden çizer — metni sizin yeniden çizmeniz gerekmez. Adresi kullanıcıya verin: seçtiklerini "Seçilenleri
|
|
113
|
+
yükle" ile `screenshot/<locale>/<deviceClass>` yuvasına kare sırasıyla ekler — ajan ayrıca yüklemez (kopya düşer).
|
|
114
|
+
Başlık uygulamanın gerçekten yaptığını söyler (App Review 2.3.7: fiyat, sıralama, rakip adı yok); uygulamanın ana
|
|
115
|
+
rengi `palette.primary` ile verilir (`theme_get`). Galeri gateway süreci yaşadıkça açıktır; `AUTH_MODE=passthrough`'ta
|
|
116
|
+
açılmaz, yükleme `mobile_asset_create { path: files[i].path }` ile yapılır.
|
|
117
|
+
|
|
105
118
|
## Akış
|
|
106
119
|
|
|
107
120
|
1. `mobile_store_get` → kimlik varsayılandır (`app.zeyrek.o<org>.a<uygulama>`); değiştirilecekse **ilk
|
|
@@ -194,6 +194,10 @@ docs/adr/0005; başka şekil 422 `fixed-views`). Satır yokken boş görünüm b
|
|
|
194
194
|
`emptystate` yolu 2026-09-30'da kaldırıldı. Mobil `view` çocuklarını sütunda dizer. Tam gövde:
|
|
195
195
|
`ngapps://examples/mobile-list-detail-form`.
|
|
196
196
|
|
|
197
|
+
Sürükle-sırala: `reorderable: true` + `orderField` (yalnız dikey, tek sütun — MOB-035); bırakınca `reorder`
|
|
198
|
+
`event.data.patches` taşır. Yük, tutulan sıra ve kalıcılığın bugünkü açığı: `platform_guide('page')` §Kural 1g-5.
|
|
199
|
+
Jesti `page_screenshot` ile sınamak: `{ action:'swipe', target:'<liste>__row-2__handle', to:'<liste>__row-0' }`.
|
|
200
|
+
|
|
197
201
|
## Güne göre görev listesi
|
|
198
202
|
|
|
199
203
|
Başlıklar altında gruplanmış liste (güne, odaya, kategoriye göre) **tek `grouped-list`** ile kurulur.
|
|
@@ -1618,6 +1618,56 @@ kayıt — artık bekleyen değildir, önbellekteki eski listede de yoktur; list
|
|
|
1618
1618
|
`page_screenshot` önbellek ve kuyruk kullanmaz — davranış yalnız cihazda görülür. Tam gövde (iki ekran, beş akış, iki
|
|
1619
1619
|
uç, ayar ve değişken): `ngapps://examples/mobile-offline-seamless`.
|
|
1620
1620
|
|
|
1621
|
+
## Kural 1g-5 — Mobil sürükle-sırala: `repeater` `reorderable` ve sıranın kalıcılığı
|
|
1622
|
+
|
|
1623
|
+
`repeater`'a `reorderable: true` + `orderField: '<sayı alanı>'` yazılınca her satırın sonunda bir tutamaç çizilir; satır
|
|
1624
|
+
tutamaçtan sürüklenir, bırakınca `reorder` yayılır. Yalnız dikey ve tek sütunlu listede çalışır (yatay şerit ya da
|
|
1625
|
+
`columnCount` > 1 iken tutamaç çizilmez, gateway **MOB-035** ile uyarır). Web'de karşılığı `datatable`
|
|
1626
|
+
`canReorderRows`'tur (save olayı, `self.operation === 'rowReorder'`).
|
|
1627
|
+
|
|
1628
|
+
| Ne | Değer |
|
|
1629
|
+
|---|---|
|
|
1630
|
+
| Yük | `event.data = { fromIndex, toIndex, row, patches: [{ id, value }] }` — `self`'e yazılmaz |
|
|
1631
|
+
| `patches` | Sırası değişen satırlar: `id` satırın `_id`'si (yoksa `id`), `value` `orderField`'a yazılacak 1 tabanlı yeni adım. Eş değerli satırlar tek adımdır (aynı `value`'yu paylaşır); iki eş satırın arasına bırakılan satır o adıma katılır. `orderField` yoksa ya da bir satırda anahtar yoksa BOŞ dizi |
|
|
1632
|
+
| Çizim sırası | Satırlar `orderField`'a göre çizilir (boşlar sonda); servis sıralı dönmek zorunda değildir |
|
|
1633
|
+
| Tutulan sıra | Liste bırakılan sırayı FARKLI satırlar gelene kadar tutar; aynı satırlar yeniden okunursa (yenileme) sıra bozulmaz |
|
|
1634
|
+
| Seçim | Seçili satır varsa düğümün `selectedIndices`/`selectedItems`/`selectedIndex` değeri yeni sıraya taşınır |
|
|
1635
|
+
| Tutamacın adresi | `<elementId>__row-<i>__handle` (rol kimliği) — yalnız çalışma anında (Dene, `/dev`, `page_screenshot`); tasarım ve Düzenle kipinde tutamaç çizilir ama kimlik basılmaz |
|
|
1636
|
+
|
|
1637
|
+
**Sırayı kalıcı yapmak** akışın işidir: `reorder` akışı `event.data.patches`'ı sıra alanını yazan bir servise verir,
|
|
1638
|
+
ardından `rows`'u yeniden okur — yazılan sıra değerleriyle gelen satırlar farklıdır, liste onları çizer. Boş
|
|
1639
|
+
`patches`'ta (anahtarsız satır) servis çağrılmaz. **Servis hata dönerse liste kendiliğinden eski sıraya DÖNMEZ:** sunucu
|
|
1640
|
+
sürüklemeden önceki satırların aynısını döndürür ve liste aynı satırlarda tuttuğu sırayı korur (yukarıdaki tablo) — ekran
|
|
1641
|
+
kaydedilmemiş sırada kalır. Hatayı kullanıcıya gösterin; eski sıraya döndürmenin doğrulanmış bir yolu yoktur.
|
|
1642
|
+
|
|
1643
|
+
**Tarif — N satır tek istekte (`bulk-update`; zeyrek-frontend ADR 0029).** Uçta ölçüldü (2026-10-27, `mobiltest`
|
|
1644
|
+
`siralama-kalici`): üçüncü satır başa sürüklenince sayfadan tek `PUT` 200 döner, üç satır yazılır ve yeniden okunan
|
|
1645
|
+
`rows` yeni sırayı verir. ADR 0029'dan eski platformda aynı akış gövdeyi nesne kurar ve 422 ile düşer.
|
|
1646
|
+
|
|
1647
|
+
1. Uç: tablo kaynaklı `operation: 'bulk-update'`, `fields` = birincil anahtar + sıra alanı (başka alan koymayın —
|
|
1648
|
+
tanımdaki alan gövdede yoksa NULL yazılır, `platform_guide('microservice')` §Güncelleme sözleşmesi). Gövdedeki
|
|
1649
|
+
anahtarlar alan **slug'larıdır**; `fields[].name` ile yeniden adlandırma yoktur (platform sessizce düşürür), yani
|
|
1650
|
+
`{ id, value }` yaması uca olduğu gibi gitmez, eşlenir.
|
|
1651
|
+
2. Akış adımı: ucun gövde parametrelerinden **yalnız birine** (birincil anahtarınkine, ör. `id`) satır listesini
|
|
1652
|
+
`code` ile verin, öbürlerini boş bırakın. Servisin şeması `isParameterArray` dediği için değeri olan tek gövde
|
|
1653
|
+
parametresinin dizisi gövdenin KENDİSİ olur — parametrenin adı anlamını yitirir:
|
|
1654
|
+
|
|
1655
|
+
```json
|
|
1656
|
+
{ "name": "id", "type": "guid", "source": "body",
|
|
1657
|
+
"value": { "type": "code", "ref": "event.data.patches.map(p => ({ id: p.id, sira: p.value }))" } }
|
|
1658
|
+
```
|
|
1659
|
+
|
|
1660
|
+
İkinci bir gövde parametresine değer verirseniz gövde yine NESNE olur ve platform onu tek satır okur
|
|
1661
|
+
(`BulkRowFailedException` "Please provide the primary key value", 422).
|
|
1662
|
+
3. Ardından okuma ucu (`sortField: '<sıra alanı>'`, `sortType: 'asc'`) ve `rows`'a setter; hata metni için
|
|
1663
|
+
`Steps.<yazma adımı>.error`.
|
|
1664
|
+
|
|
1665
|
+
Kural motorda, servis şemasına bağlıdır: `bulk-create`/`bulk-delete` ve parametre
|
|
1666
|
+
davranışı dizi olan workflow ucu da aynı yoldan kök dizi alır. Çevrimdışı kuyruğa giren toplu yazma da kök diziyle
|
|
1667
|
+
gönderilir.
|
|
1668
|
+
|
|
1669
|
+
Örnek: `ngapps://examples/mobile-reorder-persist` (iki uç, sayfa, yükleme ve kaydetme akışları, `swipe` ile doğrulama).
|
|
1670
|
+
|
|
1621
1671
|
## Kural 1h — Tasarım: `style` prop'u ve tema değişkenleri
|
|
1622
1672
|
|
|
1623
1673
|
Her komponentin `style` prop'u vardır ve emotion `css()` bloğudur: iç seçiciler, pseudo-class'lar
|
|
@@ -2601,6 +2651,18 @@ hiçbiri** bağlı değildi; üç portalın da rol menüsü boş çıkıyor, pan
|
|
|
2601
2651
|
> adım `applied:false` ve notla döner. Çok günlü etkinlik aynı kimliği her gün hücresinde taşır;
|
|
2602
2652
|
> hedef ilk eşleşmedir.
|
|
2603
2653
|
>
|
|
2654
|
+
> **Mobil jesti sınamak (`swipe`, 2026-10-27).** `drag` web'in HTML5 sürüklemesidir; mobil jestler (tutamaçtan
|
|
2655
|
+
> sıralama, satırın kaydırma eylemi, kart destesi, kaydırıcı) işaretçiyi dinler ve `drag`'le sürülmez. `swipe`
|
|
2656
|
+
> hedefin merkezine basar, 12 adımda 16 ms arayla taşır ve bırakır; bitiş ya bir öğedir (`to`) ya göreli kaymadır
|
|
2657
|
+
> (`dx`/`dy`, CSS pikseli) — ikisi birden reddedilir. Hedefler: sıralama `{ action:'swipe',
|
|
2658
|
+
> target:'lst__row-2__handle', to:'lst__row-0' }` (`reorder` akışı koşar, `flowRuns: 1`); satır kaydırma
|
|
2659
|
+
> `{ action:'swipe', target:'lst__row-1', dx:-160, dy:0 }` (eylem paneli açık kalır); deste `{ action:'swipe',
|
|
2660
|
+
> target:'<deste>', dx:320, dy:0 }` (üstteki kart atılır). `to` verilince jest hedefin içinde, hareket yönündeki
|
|
2661
|
+
> kenarına 2 px kala biter — sıralamada satır tam hedef satırın yerine iner. Jest görünür alanın üst ya da alt 72 dp'lik
|
|
2662
|
+
> bandına girerse liste sayfayı kendiliğinden kaydırır ve satırın ineceği yer zamanlamaya bağlı olur: hedefleri
|
|
2663
|
+
> görünür alanda ve kenar bandından uzak seçin. Web sayfasında adım yine koşar ama `note` HTML5 sürükleme için `drag`'i
|
|
2664
|
+
> gösterir.
|
|
2665
|
+
>
|
|
2604
2666
|
> **Üye kimliğiyle doğrulama (`asUser`).** Kapının kapalı olduğunu görmek yarısıdır; açık
|
|
2605
2667
|
> olduğunu görmek diğer yarısı. `page_runtime_get` ve `page_screenshot` aynı `asUser` alanını
|
|
2606
2668
|
> alır: uygulamanın kendi giriş ucundan (`microservice_execute`) aldığın üye jetonunu verirsin,
|
|
@@ -59,7 +59,9 @@ başlamadan önce §Yolculuk, §Test derlemesi, §Akış, §Yaş derecelendirmes
|
|
|
59
59
|
yuvanın `locale`'idir — verilmezse kare projenin varsayılan dilinde çıkar ve başka dilin yuvasına yanlış dilde
|
|
60
60
|
yüklenir. Yuva birikimlidir (en çok 10 görsel): 1. adımda okuduğun yuvada görsel varsa kullanıcıya sormadan
|
|
61
61
|
ekleme yapma. Giriş ve splash sayfası çekilmez. Production'da sayfa yoksa kullanıcıya sor: ekran görüntüsü
|
|
62
|
-
canlıya almadan sonraya kalabilir.
|
|
62
|
+
canlıya almadan sonraya kalabilir. Kullanıcı çerçeveli, başlıklı pazarlama görseli isterse ham kareleri
|
|
63
|
+
`mobile_asset_create` yerine `mobile_asset_preview`'a ver ve dönen `galleryUrl`'i kullanıcıya ilet; seçimi ve
|
|
64
|
+
yüklemeyi kullanıcı galeriden yapar.
|
|
63
65
|
7. **Yaş derecelendirmesi** (iOS açıksa). `settings.apple.advisory`: rehberdeki **bütün** soruları cevapla;
|
|
64
66
|
reklam açıksa `advertising: 'true'`. Emin olmadığın soruyu kullanıcıya sor.
|
|
65
67
|
8. **Gizlilik.** `settings.urls.privacyPolicy` (https). Yoksa kullanıcıdan iste; uydurma adres yazma.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"hash": "
|
|
3
|
-
"generatedAt": "2026-10-
|
|
4
|
-
"types":
|
|
5
|
-
"files":
|
|
2
|
+
"hash": "d916ee9592bccbc43433515ace6770949c374478ac53123ea894bab76bcdfd02",
|
|
3
|
+
"generatedAt": "2026-10-28T17:19:04.043Z",
|
|
4
|
+
"types": 377,
|
|
5
|
+
"files": 196,
|
|
6
6
|
"note": "Şemaları üreten backend kaynaklarının parmak izi. Elle düzenlemeyin: 'npm run generate-schemas' yazar, 'npm run schema:check' denetler.",
|
|
7
7
|
"missing": [
|
|
8
8
|
"NgApps.Infrastructure.Models.IdNamePair`1[[System.Guid, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]",
|