@appaflytech/zeyrek-ai-mcp 0.0.43 → 0.0.45
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/dist/knowledge/backendConstraints.js +86 -2
- package/dist/knowledge/componentCatalog.js +63 -26
- package/dist/knowledge/componentEvents.js +6 -0
- package/dist/knowledge/connectDataBind.js +43 -6
- package/dist/knowledge/connectDataDefinition.js +74 -3
- package/dist/knowledge/connectDataRules.js +14 -0
- package/dist/knowledge/mobileComponentCatalog.js +66 -7
- package/dist/knowledge/mobileStore.js +61 -2
- package/dist/knowledge/platform/mobile.js +1 -1
- package/dist/knowledge/platform/mobileRules.js +2 -1
- package/dist/knowledge/platform/mobileTabs.js +31 -2
- package/dist/knowledge/platform/web.js +1 -1
- package/dist/knowledge/rules.js +195 -4
- package/dist/knowledge/textHooks.js +434 -0
- package/dist/platform/capture/capture.js +1 -1
- package/dist/platform/capture/readiness.js +4 -0
- package/dist/platform/errors.js +22 -2
- package/dist/prompts/mobilePublish.js +21 -0
- package/dist/resources/examples/flow-biometric-confirm.json +199 -0
- package/dist/resources/examples/microfunction-node-dependencies.json +19 -0
- package/dist/resources/guides/access.md +3 -3
- package/dist/resources/guides/component.md +20 -4
- package/dist/resources/guides/deployment.md +98 -0
- package/dist/resources/guides/entity.md +1 -1
- package/dist/resources/guides/expressions.md +5 -1
- package/dist/resources/guides/external-component.md +6 -4
- package/dist/resources/guides/merge.md +81 -4
- package/dist/resources/guides/microfunction.md +104 -9
- package/dist/resources/guides/microservice.md +34 -5
- package/dist/resources/guides/mobile-connect-data.md +70 -0
- package/dist/resources/guides/mobile-flow.md +64 -0
- package/dist/resources/guides/mobile-publish.md +161 -16
- package/dist/resources/guides/mobile-steps.md +17 -0
- package/dist/resources/guides/mobile.md +41 -23
- package/dist/resources/guides/page.md +11 -5
- package/dist/resources/guides/translation.md +95 -0
- package/dist/resources/knowledge.js +3 -1
- package/dist/resources/prompts/mobile-publish-prepare.md +89 -0
- package/dist/resources/schema-fingerprint.json +4 -4
- package/dist/resources/schemas/ApplyMicrofunctionArchiveChangesCommand.json +76 -0
- package/dist/resources/schemas/ConnectDataDescribeDto.json +44 -0
- package/dist/resources/schemas/ConnectDataResultDto.json +10 -0
- package/dist/resources/schemas/CreateMicrofunctionCommand.json +8 -0
- package/dist/resources/schemas/InvokeMicrofunctionCommand.json +0 -4
- package/dist/resources/schemas/MobileStorePreflightScope.json +13 -0
- package/dist/resources/schemas/StartMobileBuildCommand.json +35 -1
- package/dist/resources/schemas/UpdateMicrofunctionCommand.json +8 -0
- package/dist/resources/schemas/UpsertMobileStoreSettingsCommand.json +75 -0
- package/dist/server.js +2 -0
- package/dist/tools/common.js +6 -0
- package/dist/tools/components.js +19 -6
- package/dist/tools/connectData.js +9 -4
- package/dist/tools/deployments.js +1 -1
- package/dist/tools/designSchemaPatch.js +16 -4
- package/dist/tools/environments.js +3 -3
- package/dist/tools/files.js +1 -1
- package/dist/tools/flows.js +29 -3
- package/dist/tools/layouts.js +32 -12
- package/dist/tools/merges.js +8 -8
- package/dist/tools/microfunctions.js +53 -3
- package/dist/tools/mobileStore.js +83 -21
- package/dist/tools/pages.js +59 -24
- package/dist/tools/platformInfo.js +4 -2
- package/dist/tools/textHookGuard.js +116 -0
- package/package.json +2 -2
|
@@ -20,8 +20,10 @@ anlamları ayrı.
|
|
|
20
20
|
`page_update({ layoutId })` × N → `application_update({ homepageId, properties.mobile.tabs })`.
|
|
21
21
|
Sekme ayarı sayfa **id**'si ister; bu yüzden sayfalardan SONRA yazılır.
|
|
22
22
|
2. **Veri.** Entity, microservice ve workflow web'dekiyle aynıdır (`platform_guide('microservice')`).
|
|
23
|
-
Sayfa akışı `microservice` adımıyla aynı uçları çağırır.
|
|
24
|
-
|
|
23
|
+
Sayfa akışı `microservice` adımıyla aynı uçları çağırır. Veri bağlamanın telefon
|
|
24
|
+
kararları: `platform_guide('mobile-connect-data')`.
|
|
25
|
+
3. **Ekranlar.** `page_schema_patch` ile bileşen ekle, akış bağla (`flow_create` → `set_event`). Cihaza
|
|
26
|
+
dokunan adımlar (izin, konum, bildirim, reklam, geri, kod tarama): `platform_guide('mobile-steps')`.
|
|
25
27
|
4. **Doğrulama.** `page_screenshot` (mobilde varsayılan `device: 'phone'`, 390x844 @2) ve
|
|
26
28
|
`page_runtime_get({ resolveStyles: true })` (düğümün React Native stili). Ayrıntı §Doğrulama.
|
|
27
29
|
|
|
@@ -119,12 +121,9 @@ mobil bileşenlere geçen notlar). Web'de karşılığı olmayan bileşende (`ap
|
|
|
119
121
|
- **Dönen kart ve kart destesi** (2026-10-08): `flip-card` (children = [ön `view`, arka `view`]; `isFlipped`,
|
|
120
122
|
`flip`) ve `swipeable-stack` (`repeater` şekli: [kart `view`, boş `view`], `rows`, `currentIndex`;
|
|
121
123
|
`swipeLeft` / `swipeRight` / `finish` yükü `event.data`) mobile özgüdür.
|
|
122
|
-
- **Faz 10
|
|
123
|
-
|
|
124
|
-
`
|
|
125
|
-
`table` (varsayılan, yatay kaydırılan tablo; başlığa dokunuş `__sort-<kolon>`) ya da `cards` (satır başına
|
|
126
|
-
kart). Eylemler `__action-<satır>-<sıra>`, `dropdown` kipinde `__more-<satır>` → alttan eylem sayfası;
|
|
127
|
-
sayfa çubuğu `__page-prev`/`__page-next`. Filtre düzenleyicisi, özet satırı ve sabit eylem sütunu yok.
|
|
124
|
+
- **Faz 10:** `datatable` web ikizidir (kolon, sıralama, sayfa ve akış sözleşmesi web'in). Telefon farkları
|
|
125
|
+
(`variant: table | cards`, filtre çipleri, düzenleme alt sayfası, sonsuz kaydırma) `component_get`
|
|
126
|
+
`mobileKnowledge`'ta; bağlı tablonun telefon ayarı `platform_guide('mobile-connect-data')`'da.
|
|
128
127
|
- Web'e özgü bileşenlerin mobil karşılığı:
|
|
129
128
|
|
|
130
129
|
| Web | Mobilde |
|
|
@@ -136,6 +135,7 @@ mobil bileşenlere geçen notlar). Web'de karşılığı olmayan bileşende (`ap
|
|
|
136
135
|
| `iframe` | `webview` (`src` ya da `html`) |
|
|
137
136
|
| `theme-toggle` | cihaz teması |
|
|
138
137
|
| `fileUpload` | `fileInput` (alan) ya da `filebutton` (düğme) — sürükle-bırak yok |
|
|
138
|
+
| `attachments` | `filebutton` (`isMultiple`) — önizlemeli kart ızgarası, popup ve sürükle-bırak yok |
|
|
139
139
|
|
|
140
140
|
**Harici bileşen mobilde yoktur** (`MOB-006`): protokol v1 tarayıcı `.mjs` paketidir;
|
|
141
141
|
`external_component_*` araçları mobil uygulamada platforma gitmez. **Geçici yol `html`** (2026-09-28):
|
|
@@ -365,7 +365,7 @@ etiketi ailesini `typographyStyle`'dan alır, alan etiketleri platform yazı tip
|
|
|
365
365
|
## Gezinme
|
|
366
366
|
|
|
367
367
|
- **Yığın varsayılandır; ayar yoktur.** `redirect` adımı hedef sayfayı yığına iter, geri hareketi
|
|
368
|
-
(cihaz
|
|
368
|
+
(cihaz, app-bar ya da tarayıcı geri) önceki ekrana döner. Göreli yol uygulama
|
|
369
369
|
köküne eklenir; tam adres (`https://…`) dışarıda açılır.
|
|
370
370
|
- **Sekmeler uygulama ayarıdır, layout'ta değil.** `application_update({ properties: { mobile: { tabs } } })`:
|
|
371
371
|
|
|
@@ -377,7 +377,7 @@ etiketi ailesini `typographyStyle`'dan alır, alan etiketleri platform yazı tip
|
|
|
377
377
|
"style": "default",
|
|
378
378
|
"items": [
|
|
379
379
|
{ "page": "<page_list id>", "label": "Görevler", "icon": "list" },
|
|
380
|
-
{ "page": "<
|
|
380
|
+
{ "page": "<id>", "label": "Sepet", "badge": { "source": "state", "ref": "sepet.adet" }, "reselect": "keep" }
|
|
381
381
|
],
|
|
382
382
|
"showLabels": true
|
|
383
383
|
}
|
|
@@ -385,14 +385,19 @@ etiketi ailesini `typographyStyle`'dan alır, alan etiketleri platform yazı tip
|
|
|
385
385
|
}
|
|
386
386
|
```
|
|
387
387
|
|
|
388
|
-
`items` 1–5 sayfa **id**'si (slug değil),
|
|
389
|
-
|
|
390
|
-
`text-secondary` — değiştirmek için `theme_update`; eski `appearance` alanı okunmaz; `style: 'custom'` + `customWidgetId` çubuğu kendi widget'ınla çizer. Tutarsız ayar ve
|
|
388
|
+
`items` 1–5 sayfa **id**'si (slug değil), tekrarsız; `floating` köşe `pill` + gölge `md`. Renk ayarda YOK: zemin `surface`, seçili `accent-primary`, seçilmemiş
|
|
389
|
+
`text-secondary` (`theme_update`); `style: 'custom'` + `customWidgetId` çubuğu o widget'la çizer. Tutarsız ayar ve
|
|
391
390
|
layout/sayfada eski `tab-bar` / `drawer-menu` düğümü `MOB-007` alır. Sekme dışı sayfalar yığına açılır.
|
|
391
|
+
`badge.ref` **saklı** state yolu; `keep`: ikinci dokunuşta yığın durur.
|
|
392
|
+
Çubuk düzeyinde iki davranış anahtarı vardır ve **yalnız varsayılandan ayrılınca yazılır**: `"keepStackOnSwitch": false`
|
|
393
|
+
(sekme değişince hedef sekme köke döner; alan yoksa yığın korunur) ve `"hideOnKeyboard": true` (klavye açılınca çubuk
|
|
394
|
+
gizlenir; alan yoksa görünür). `true`/`false`'tan başka değer (ör. metin `"false"`) yok sayılır ve `MOB-007` uyarır.
|
|
395
|
+
İkinci dokunuş (`reselect`) ile sekme değişimi (`keepStackOnSwitch`) ayrı ayardır; eski runtime anahtarları bilmez ve
|
|
396
|
+
varsayılan davranışta kalır.
|
|
392
397
|
- **Çekmece bir bileşendir.** `drawer` widget'ı + `app-bar`'ın `menuTarget` prop'u çekmeceyi açar.
|
|
393
398
|
Çekmece layout'un kök dizisindedir (`views: [shell_root, nav_drawer]`), kabuk kabının içinde değil.
|
|
394
399
|
- Kabuk örnekleri: `ngapps://examples/mobile-app-shell-stack` (yığın), `ngapps://examples/mobile-app-shell-tab`
|
|
395
|
-
(sekmeler), `ngapps://examples/mobile-app-shell-drawer` (çekmece);
|
|
400
|
+
(sekmeler), `ngapps://examples/mobile-app-shell-drawer` (çekmece); liste → detay → form:
|
|
396
401
|
`ngapps://examples/mobile-list-detail-form`; kod tarama (düğme → `scan-code` → alana yaz):
|
|
397
402
|
`ngapps://examples/mobile-scan-code`.
|
|
398
403
|
|
|
@@ -425,9 +430,9 @@ Mobil uygulama web ile **aynı sözlüğü ve aynı motoru** kullanır (plans/mo
|
|
|
425
430
|
Motorun kendi adımları (`setter`, `condition`, `microservice`, `code`, `function`, `flow-trigger`,
|
|
426
431
|
`validation`) iki platformda aynıdır. Barındırıcıya dokunan adımlar ayrı rehberdedir:
|
|
427
432
|
`platform_guide('mobile-steps')` — `redirect`, `alert`, `confirm`, `download`, `storage`, `setcookie`, `share`,
|
|
428
|
-
`haptic`, `location`, `notification-permission` / `-schedule` / `-cancel`, `permission`, `open-settings`, `back
|
|
429
|
-
|
|
430
|
-
tarifleri. Bu adımlardan birini yazmadan önce onu okuyun.
|
|
433
|
+
`haptic`, `location`, `notification-permission` / `-schedule` / `-cancel`, `permission`, `open-settings`, `back`,
|
|
434
|
+
`ad-show` ve `scan-code`'un mobildeki davranışı, argümanları, `Steps.<adım>` sonucu; bildirim, izin, reklam ve
|
|
435
|
+
konum tarifleri. Bu adımlardan birini yazmadan önce onu okuyun.
|
|
431
436
|
|
|
432
437
|
Sayfa ve layout `mount` akışları ilk çizimden sonra, `destroy` akışları sayfa kalkarken koşar. Yığındaki
|
|
433
438
|
ve sekmedeki ekran bağlı kalır: geri dönüşte `mount` KOŞMAZ. Listeyi yeniden okumak için sayfanın
|
|
@@ -519,17 +524,30 @@ variable_create({ applicationId, pageId, variables: [
|
|
|
519
524
|
kabuğun yükleme göstergesi) durur, aynı sayfanın iki karesi aynı çıkar. Hareketin kendisini görmek için
|
|
520
525
|
`motion: 'play'` (kare çekildiği ana bağlıdır; yanıt `motionNote` taşır).
|
|
521
526
|
|
|
522
|
-
##
|
|
527
|
+
## Studio'da ne görünür
|
|
523
528
|
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
529
|
+
Mobil ekran tasarımcısındaki telefon ekranın **runtime çizimidir**: kayıtlı sayfa gerçek veri, kabuk ve akışlarla
|
|
530
|
+
çizilir, kaydedilmemiş değişiklik anında üstüne yansır. Ayrı bir "canlı" kip yoktur; "Canlı" yalnız
|
|
531
|
+
production ortamının adıdır. **Düzenle** kipinde dokunuş seçer (production'da akış koşmaz), **Dene** kipinde
|
|
532
|
+
uygulamadaki gibi çalışır ve development'ta gerçek veriye yazar. **Ekran durumu** çipi (Gerçek veri · Örnek veri ·
|
|
533
|
+
Yükleniyor · Boş · Hata · Erişim yok) hâli yalnız telefonda zorlar, şemaya yazmaz. **Kim olarak** çipi telefonu bir
|
|
534
|
+
uygulama kullanıcısı, rol ya da Studio kullanıcısı olarak çizer; o kimliğin göremediği bileşen taralıdır. Yeni
|
|
535
|
+
bağlanan liste kayda kadar örnek satırla çizilir. `page_screenshot` aynı runtime'ı kayıtlı hâliyle çeker (taslak,
|
|
536
|
+
örnek rozeti ve tarama karede yok). Tasarımcı şema yayınına abone değildir: MCP'nin yazdığı değişikliği açık
|
|
537
|
+
tasarımcı kendiliğinden göstermez, kullanıcı ekranı yeniden açar.
|
|
538
|
+
|
|
539
|
+
## Cihazda dene
|
|
540
|
+
|
|
541
|
+
Studio'daki **Cihazda dene** penceresinin iki yolu var; tarayıcıda deneme yolu yoktur. **Telefonunda:** Zeyrek
|
|
542
|
+
Mobile App Store'dan ya da Google Play'den yüklenir (pencere mağaza bağlantısını verir; davet yoktur), pencerede
|
|
543
|
+
çıkan kod okutulur (120 sn geçerli). **Senin Mac'inde:** kullanıcı kendi Mac'ini bir kez ekler, simülatör o Mac'te
|
|
544
|
+
açılır; Mac'i olmayan için Zeyrek'in Mac'inde açma henüz yoktur. **Kaydettiğinde güncellenir:** yazdığın yama
|
|
545
|
+
telefonda ve simülatörde yenilenir. Ajan kod üretmez, önizleme başlatmaz; kullanıcıyı bu pencereye yönlendirir.
|
|
528
546
|
|
|
529
547
|
## Yayın
|
|
530
548
|
|
|
531
549
|
Mağaza yayını ayrı rehberdedir: `platform_guide('mobile-publish')` — `mobile_store_*` / `mobile_asset_*` /
|
|
532
|
-
`mobile_build_*` akışı, ekran görüntüsü, ön kontrol (P-01…P-
|
|
550
|
+
`mobile_build_*` akışı, ekran görüntüsü, ön kontrol (P-01…P-22), derleme hata kodları ve insanın Studio › Yayın'da
|
|
533
551
|
yaptıkları. Derlenen uygulama
|
|
534
552
|
**production ortamını** okur; ilk derleme kimlik alanlarını (`bundleIdentifier`, `androidPackage`, `scheme`) kilitler.
|
|
535
553
|
|
|
@@ -95,7 +95,7 @@ alanlar denetlenmez); katalog okunamazsa denetim susar ve yazma eskisi gibi geç
|
|
|
95
95
|
`Data = RedirectPage.Slug`). Sabit `'/hastalar'` yazarsan sayfa slug'ı değişince bağlantı
|
|
96
96
|
sessizce kırılır; `pageId` referansı değişiklikten etkilenmez. Aynısı `flow` prop'u için
|
|
97
97
|
`type: 'flow'` + `ref: <flowId>`, dosya için `type: 'file'` + `ref: <fileId>`.
|
|
98
|
-
İSTİSNA: form dosya alanının (fileInput / filebutton / fileUpload) `value`'suna `type: 'file'` bağlama — çip
|
|
98
|
+
İSTİSNA: form dosya alanının (fileInput / filebutton / fileUpload / attachments) `value`'suna `type: 'file'` bağlama — çip
|
|
99
99
|
URL yazar ve kullanıcı dokunmadan kaydederse tekil FILE alanı sessizce NULL'lanır (ölçüldü 2026-10-02). Varsayılan
|
|
100
100
|
dosya için `{ type: 'static', data: { type: 'ref', value: <fileId>, fileName, absolute_path } }` ver (`component_get`
|
|
101
101
|
notu).
|
|
@@ -1061,16 +1061,19 @@ parametresini geçir.
|
|
|
1061
1061
|
|
|
1062
1062
|
| istenen | yol |
|
|
1063
1063
|
|---|---|
|
|
1064
|
-
| Değere göre sabit renk | `tag` kolonu + `colorMap`: `[{ value: 'Active', label: 'Aktif', color: 'success' }]` — hücrenin KENDİ değerine bakar, satırın başka alanına göre hesaplanamaz |
|
|
1064
|
+
| Değere göre sabit renk | `tag` kolonu + `colorMap`: `[{ value: 'Active', label: 'Aktif', color: 'success' }]` — hücrenin KENDİ değerine bakar, satırın başka alanına göre hesaplanamaz. `value` KOD, `label` görünen yazıdır (çeviri sarmalı olabilir); `value`'ya görünen yazı yazılmaz (TR-005) |
|
|
1065
1065
|
| Satıra göre koşullu renk | hücre değerini `{ label, color }` nesnesi olarak yaz: renk satır verisinde taşınır |
|
|
1066
1066
|
|
|
1067
1067
|
```jsonc
|
|
1068
1068
|
// setter: rows'a yazmadan önce hücreyi { label, color } nesnesine çevir
|
|
1069
1069
|
{ "type": "change", "element": "tbl", "property": "rows", "source": "component",
|
|
1070
1070
|
"mapping": { "source": "", "mappings": {} },
|
|
1071
|
-
"value": { "type": "code", "ref": "(Steps.listele?.data || []).map(function (r) { return Object.assign({}, r, { durum: { label: r.
|
|
1071
|
+
"value": { "type": "code", "ref": "(Steps.listele?.data || []).map(function (r) { return Object.assign({}, r, { durum: { label: t('common.status.' + r.status), color: r.status === 'Cancelled' ? 'error' : 'success' } }); })" } }
|
|
1072
1072
|
```
|
|
1073
1073
|
|
|
1074
|
+
Renk kararı KODA bakar (`r.status === 'Cancelled'`), görünen yazıya değil (`r.durum === 'İptal'` dil değişince tutmaz —
|
|
1075
|
+
gateway TR-005 ile durdurur; `platform_guide('translation')` §Mantık görünen metne bağlanmaz).
|
|
1076
|
+
|
|
1074
1077
|
Renk semantik ad (`primary · info · success · warning · error` — tema token'ına çözülür, tema
|
|
1075
1078
|
değişince izler) ya da hex/rgb/CSS renk adıdır; temalarda `info` neredeyse beyazdır, mavi için
|
|
1076
1079
|
`primary` yaz. `colorMap` satırının `mode: 'solid'`'i o değeri dolu zemin + beyaz yazıyla çizer.
|
|
@@ -2119,6 +2122,9 @@ de silip yeniden ekleme gerekmez:
|
|
|
2119
2122
|
{ "op": "set_appearance", "target": "box_summary", "appearance": { "heightType": "auto", "tooltip": null } }
|
|
2120
2123
|
```
|
|
2121
2124
|
|
|
2125
|
+
İpucunu çeviriye bağlamak için metne `t:` öneki konur (`"tooltip": "t:shell.profile"`); ayrıntı
|
|
2126
|
+
`platform_guide('translation')` §Bileşen ipucu.
|
|
2127
|
+
|
|
2122
2128
|
Op **birleştirir**: yalnız verilen alanları yazar, gerisini korur; `null` alanı temizler (null
|
|
2123
2129
|
kabul etmeyen `heightType` gibi alanlar hariç). Alan adları `page_schema_get`'in döndürdüğü
|
|
2124
2130
|
appearance anahtarlarıdır; bilinmeyen alan `unknown-appearance-field`, tanınmayan ya da null
|
|
@@ -2340,7 +2346,7 @@ bağlanır, filtre `source:'expression'` + `value:'user.id'` olur.
|
|
|
2340
2346
|
| Puan / kod girişi | `rating` · `otpinput` |
|
|
2341
2347
|
| Tarih / saat / aralık | `datepicker` · `datetimepicker` · `daterangepicker` · `datetimerangepicker` · `timepicker` (yalnız HH:mm) |
|
|
2342
2348
|
| Kimlik alanları | `textinput` (e-posta için `inputMask` Email hazır maskesi ya da `regex` kuralı — `email` diye bir bileşen YOK, `add_component` `unknown-type` ile reddedilir) · `password` |
|
|
2343
|
-
| Dosya | `fileUpload` (dropzone) · `fileInput` · `filebutton` · `file-viewer` |
|
|
2349
|
+
| Dosya | `attachments` (ek dosyalar: sürükle-bırak ya da düğme + önizlemeli kartlar, görsel/video/PDF popupta) · `fileUpload` (dropzone) · `fileInput` · `filebutton` · `file-viewer` |
|
|
2344
2350
|
| Liste | `datatable` (Kural 1e) · `repeater` (kart listesi VE dinamik form — Kural 1g) · `tree-view` (hiyerarşi; `isSearchable` ile istemci içi arama) · `timeline` (tarihli olay akışı) |
|
|
2345
2351
|
| Pano / takvim | `kanban` (durum kolonlarında sürüklenebilir kartlar; taşıma `cardMove` ile `event.data`'dan okunur, kalıcılık AKIŞIN işidir) · `eventcalendar` (ay/hafta/gün/ajanda; veri `rows`'a akışla yazılır, `monthChange`/`viewChange` görünen `start`/`end` aralığıyla tazeleme kancasıdır) |
|
|
2346
2352
|
| Kayıt detayı | `detailview` — tek kaydı etiket/değer ızgarası basar (alan başına format, iç içe alan yolu); OLAY YAYMAZ, tıklanabilirlik gerekiyorsa kapsayıcıya sar |
|
|
@@ -2730,7 +2736,7 @@ micro-op hattına dönün.
|
|
|
2730
2736
|
korumalı sayfada `middlewareBlocked` dönmesi beklenen davranıştır ve kendisi bir
|
|
2731
2737
|
doğrulamadır. Tam doğrulama seti: `page_schema_validate` (kuru koşu) + `page_get` (bağlar)
|
|
2732
2738
|
+ `page_runtime_get` (son hâl).
|
|
2733
|
-
- **Sayfada dosya toplanabilir:** `fileUpload` (dropzone) · `fileInput` · `filebutton`
|
|
2739
|
+
- **Sayfada dosya toplanabilir:** `attachments` (ek dosya listesi) · `fileUpload` (dropzone) · `fileInput` · `filebutton`
|
|
2734
2740
|
komponentleri vardır, göstermek için `image` · `file-viewer`. Yani "dosya yükleyerek cevapla"
|
|
2735
2741
|
tipi bir alan kurulabilir. Gateway tarafında `file_upload`/`file_download` tool'ları eklendi
|
|
2736
2742
|
(multipart / `outPath`) ama **canlı platforma karşı henüz doğrulanmadı** — ilk kullanımda
|
|
@@ -119,6 +119,45 @@ backend'de zaten tanımlı, Studio'nun "Translate" aksiyonunun ürettiği şekil
|
|
|
119
119
|
tipli prop'larda "Translate" aksiyonu gösterilir, ama şema düzeyinde her static prop aynı Prop
|
|
120
120
|
şeklini kabul eder).
|
|
121
121
|
|
|
122
|
+
## Mantık görünen metne bağlanmaz (TR-005 / TR-006)
|
|
123
|
+
|
|
124
|
+
Davranışı (koşul, görünürlük, renk, ikon, dal, CSS seçici) ekranda GÖRÜNEN bir yazıya bağlayan kod **metin kancasıdır**:
|
|
125
|
+
yazı dile, çeviriye ve tasarımcının düzeltmesine göre değişir; değişince karşılaştırma sessizce tutmaz. qm'de İngilizceye
|
|
126
|
+
geçince ev ikonu kayboldu, onay düğmeleri görünür oldu, durum renkleri griye düştü (2026-10-13…16, onlarca yer). Kural
|
|
127
|
+
tek dilli uygulamada da geçerlidir: yazı düzeltilince aynı kırılma olur. **Hiçbir karar görünen metne bağlanmaz.**
|
|
128
|
+
|
|
129
|
+
| Yasak (kanca) | Doğru |
|
|
130
|
+
|---|---|
|
|
131
|
+
| `r.durum === 'Onaylandı' ? 'success' : 'warning'` | Kayıttaki kod: `r.status === 'Approved'`; yazıyı ayrıca `t('common.status.' + r.status)` ile bas |
|
|
132
|
+
| `{{ bc.title !== 'Aksiyonlar' ? 'home' : '' }}` (başlığa göre ikon) | Adres parametresi (`Page.queryParams.task`) ya da akışın açıkça yazdığı state |
|
|
133
|
+
| `statusText === 'Açma onayı'` (düğme görünürlüğü) | Kodu ayrı alanda taşı: `statusCode === 'ActionOpenApproval'` |
|
|
134
|
+
| `['Onaylandı', 'Reddedildi'].includes(durum)` | Kod listesi: `['Approved', 'Rejected'].includes(status)` |
|
|
135
|
+
| `/Klasörler/.test(panel.textContent)` (html betiği) | Dilden bağımsız işaret: sınıf (`klasor-paneli`), `data-*` özniteliği, `elementId` |
|
|
136
|
+
| CSS `[aria-label="Kolonlar"]` | Yapısal seçici (`.ng-tools__button[aria-expanded]`) ya da sınıf |
|
|
137
|
+
| `colorMap: [{ value: 'Aktif', color: 'success' }]` | `value` kod, görünen yazı `label`'da (çeviri sarmalı olabilir) |
|
|
138
|
+
| `currentItem.title === 'Dokümanlar'` (breadcrumb tıklaması) | Öğeye ek alan: `{ key: 'klasor', title }` → `currentItem.key === 'klasor'` |
|
|
139
|
+
| Sekmeyi ya da hata satırını yazısıyla tanımak | Sekme `key`'i / kimliği (`<tabs>__tab-<key>`), bağlamdaki kod |
|
|
140
|
+
|
|
141
|
+
Gateway akış, sayfa, layout ve widget yazımında denetler (`flow_*`, `page_schema_patch` / `_validate`, `page_create`,
|
|
142
|
+
`page_update`, `layout_*`, `component_schema_patch`, `component_create` / `_update`):
|
|
143
|
+
|
|
144
|
+
- **TR-005 (block):** bu yazımla gelen kanca isteği platforma göndermeden durdurur. Kanca sayılan: ASCII dışı (Türkçe)
|
|
145
|
+
harfli ya da boşluklu metinle karşılaştırma (`===`, `!==`, `case`, `includes`, `startsWith`, `indexOf`, düzenli ifade
|
|
146
|
+
testi, dizi üyeliği), görünen alana bakan karşılaştırma (`title`, `label`, `text`, `textContent`, `innerText`,
|
|
147
|
+
`nodeValue`, `getAttribute('aria-label')` …), etiket CSS seçicisi (`[aria-label=…]`, `[title=…]`), `colorMap` değerinde
|
|
148
|
+
görünen metin. Tek harf (`case 'ş'`), karakter sınıfı (`/[çğıöşü]/`), `Page.queryParams` değeri ve `${…}` ile kurulan
|
|
149
|
+
seçici kanca sayılmaz. Yalnız ASCII harfli boşluklu metin (`'User Group'` sunucu kodu da olabilir) sözlükte ya da
|
|
150
|
+
sayfanın yazısında geçiyorsa kanca sayılır.
|
|
151
|
+
- Kayıtta zaten duran kanca **warn**: yazım durmaz. Dokunduğunuz yerdeyse aynı değişiklikte koda çevirin; o metni
|
|
152
|
+
çevirmeyin — karşılaştırma kırılır.
|
|
153
|
+
- **TR-006 (warn):** tek kelimelik metin (`'Aktif'`, `'Evet'`, `'Anasayfa'`) biçimden koddan ayrılmaz; projenin varsayılan
|
|
154
|
+
dilindeki sözlük değeriyle ya da sayfanın yazısıyla aynıysa uyarır. Bir kod değeriyse yok sayın.
|
|
155
|
+
- Kaçış: sunucu yalnız metin döndürüyor ve karşılaştırılacak kod yoksa aynı çağrıya `policyOverride: true` — bulgu
|
|
156
|
+
yanıtta uyarı olarak kalır. Kalıcı çözüm sunucudan kod istemektir (`platform_gap_report`).
|
|
157
|
+
|
|
158
|
+
Denetim sözdizimseldir: kodun içindeki karşılaştırmayı arar, etiket ve mesaj gibi düz metni kanca saymaz. Sunucu tarafı
|
|
159
|
+
(workflow, microservice, Studio fonksiyonu) denetlenmez — orada da aynı kural geçerlidir.
|
|
160
|
+
|
|
122
161
|
## Dil değiştirme: `language-selector`
|
|
123
162
|
|
|
124
163
|
Son kullanıcı dili `language-selector` komponentiyle değiştirir (`platform_guide('component')`
|
|
@@ -153,6 +192,46 @@ budur. Lambda yalnız `{{#t}}` geçen şablona eklenir; `context` kendi `t` alan
|
|
|
153
192
|
basılır; datatable'ın `html` hücresi bu sözdizimini tanımaz. 2026-10-14 frontend'i (frontend ADR 0021),
|
|
154
193
|
uzak kurulumda dağıtımdan sonra.
|
|
155
194
|
|
|
195
|
+
## Bileşenin kendi kelimeleri: `compProp.<bileşen>.<kelime>`
|
|
196
|
+
|
|
197
|
+
Web bileşenleri son kullanıcıya kendi kelimelerini gösterir — tablonun "Rows per page"i, boş durumu,
|
|
198
|
+
filtre kurucusu, açılır kutunun "Bir seçenek seçin"i, adım bileşeninin "İleri / Geri"si, etkinlik takviminin "Bugün"ü.
|
|
199
|
+
2026-10-15'ten beri web bileşenleri bu modelde (`attachments` 2026-10-21'den beri, ortak kelimelerle). Bunlar prop değildir; uygulama sözlüğünde satırdır (frontend ADR 0023 / 0024, 2026-10-15):
|
|
200
|
+
|
|
201
|
+
- bileşenin **kendi** kelimesi `compProp.<bileşen>.<kelime>` — `datatable` (eski adı `table` aynı anahtarları
|
|
202
|
+
kullanır), `version-compare`, `chart` (tip seçicinin adları `type<Tür>`: `compProp.chart.typeBar`) ve `pagination`
|
|
203
|
+
(`compProp.pagination.next`, `…rowsOption` — tablonun aynı adlı kelimelerinden ayrı satırdır);
|
|
204
|
+
- birçok bileşende geçen **ortak** kelime tek satır `compProp.common.<kelime>` ("Yükleniyor…", "Kapat",
|
|
205
|
+
"Temizle", "Ara", korumalı değer penceresi …) — bir kez çevrilir, bütün bileşenlerde değişir;
|
|
206
|
+
- form alanının **varsayılan doğrulama mesajı** da ortak kelimedir: kuralın `message`'ı boşsa
|
|
207
|
+
`compProp.common.validationRequired` / `validationMinLength` / `validationMaxLength` / `validationMinValue` /
|
|
208
|
+
`validationMaxValue` / `validationRegex` / `validationEmail` gösterilir, `{value}` kuraldan dolar. Doğrulama kelimesi
|
|
209
|
+
taşıyan bir bileşen studio'da tohumlanınca yedi kuralın hepsinin satırı yazılır (akışın doğrulama adımı her kuralı
|
|
210
|
+
uygulayabilir).
|
|
211
|
+
|
|
212
|
+
Ekrandaki zincir: düğümün `texts` prop'u → sözlükteki satır (bileşenin dili → varsayılan dil) → bileşenin
|
|
213
|
+
tohum metni (dil → İngilizce). Sözlükte satır yokken ekran eskisiyle aynıdır. Bir dilde satır yoksa varsayılan
|
|
214
|
+
dildeki satır görünür (K60).
|
|
215
|
+
|
|
216
|
+
- **Bütün tablolarda değiştirmek:** sözlüğe yaz — `translation_update` ile
|
|
217
|
+
`compProp.datatable.rowsPerPage` = `{ tr: 'Sayfa başına kayıt', en: 'Records per page' }`.
|
|
218
|
+
- **Yalnız bir tabloda değiştirmek:** o düğümün gizli `texts` prop'una yalnız o kelimeyi yaz —
|
|
219
|
+
`{ "op": "replace_prop", "target": "<tablo>", "prop": "texts", "value": { "rowsPerPage":
|
|
220
|
+
{ "type": "translation", "ref": "page.x.kayitSayisi" } } }`. Yazılmayan kelime sözlükten gelir;
|
|
221
|
+
`texts`'e bütün kelimeleri kopyalama.
|
|
222
|
+
- Tablonun kelime adlarının tam listesi (124) `component_get('datatable')` › `propNotes.texts`'te; her
|
|
223
|
+
bileşenin listesi studio'nun Translations sekmesinde. İşleç yazıları `op<İşleç>` (`opEq`) ve kısa hâlleri
|
|
224
|
+
`opShort<İşleç>` (`opShortContains`). Listede olmayan ad yazılmaz — bileşen onu okumaz.
|
|
225
|
+
- Kelime gibi çalışan ayarlar (`placeholder`, `emptyText`, `trueLabel` …) boş bırakılır; boşken ortak kelime
|
|
226
|
+
görünür. Ayrıntı `platform_guide('component')` §Arayüz metni.
|
|
227
|
+
- Satırları studio yazar, yalnız iki yoldan: kelimeli bileşen studio'da **paletten** sayfaya konunca eksik
|
|
228
|
+
bileşen satırları tohumla (tr / en / ar) eklenir; çeviri panelindeki "Eksik bileşen
|
|
229
|
+
kelimelerini ekle" bütün sayfa, layout ve widget'ları tarar ve satırları Kaydet'le yazar. Dolu
|
|
230
|
+
satıra ikisi de dokunmaz. **MCP ile eklenen bileşen (`add_component`, `page_schema_patch`) satır
|
|
231
|
+
yazdırmaz** — sözlükte satır yokken bileşen tohum metnini gösterir; kelimeyi değiştireceksen satırı
|
|
232
|
+
`translation_update` ile kendin yaz. Tohumu olmayan dil (ru) boş kalır — onu da `translation_update`
|
|
233
|
+
ile doldur. Mobil bileşenler kelimeleri henüz sözlükten okumaz (tohum gösterir).
|
|
234
|
+
|
|
156
235
|
## Kareyi ikinci dilde almak: `page_screenshot(language:)`
|
|
157
236
|
|
|
158
237
|
Dil değiştirici **kanıt için gerekli değildir.** Runtime boot dilini şu sırayla seçer:
|
|
@@ -221,6 +300,22 @@ Runtime `t:` ile başlayan bir mesajı anahtar sayar ve normal zincirden çözer
|
|
|
221
300
|
olduğu gibi gösterilir. Çözüm çalışma anında olduğu için şema varsayılanlarını değiştirmek
|
|
222
301
|
gerekmez — `schema.ts`'e dokunulmaz, katalog yeniden yüklenmez.
|
|
223
302
|
|
|
303
|
+
## Bileşen ipucu: `appearance.tooltip` ve `t:` öneki
|
|
304
|
+
|
|
305
|
+
Üstüne gelince çıkan ipucu bir prop değil, düğümün `appearance.tooltip` alanıdır (düz metin);
|
|
306
|
+
`set_prop_type` ona uygulanamaz. Doğrulama mesajıyla aynı sözleşme geçerlidir — metnin kendisine
|
|
307
|
+
`t:` öneki konur:
|
|
308
|
+
|
|
309
|
+
```jsonc
|
|
310
|
+
{ "op": "set_appearance", "target": "shell_profile", "appearance": { "tooltip": "t:shell.profile" } }
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
Ekran anahtarı uygulama sözlüğünden okur (aktif dil → varsayılan dil → anahtarın kendisi) ve dil
|
|
314
|
+
değişince ipucu da değişir; öneksiz metin olduğu gibi kalır. Studio'da bağ, ipucu yazılmış
|
|
315
|
+
bileşenin Translations sekmesindeki "İpucu" satırından kurulur ve kaldırılır; Properties'teki kutu
|
|
316
|
+
bağlıyken anahtarı çip olarak gösterir. Yalnız web: mobil panelde ipucu alanı yoktur
|
|
317
|
+
(`platform_guide('mobile')`). Tasarım kanvası ipucu çizmez; önizleme ve çalışma anı çizer.
|
|
318
|
+
|
|
224
319
|
## Dosyayla toplu çeviri (Excel)
|
|
225
320
|
|
|
226
321
|
İnsan bir çevirmene yeni bir dil yaptıracaksa: sözlük Excel'e iner, çevirmen hedef sütunu doldurur,
|
|
@@ -13,7 +13,9 @@ export function listKnowledgeFiles(kind) {
|
|
|
13
13
|
/**
|
|
14
14
|
* `schemas` MCP kaynağı olarak YAYINLANMAZ (yalnız `guides` ve `examples` kayıtlıdır) ama
|
|
15
15
|
* dosyalar aynı klasör düzeninde durur ve drift testleri onları da okur — şema kaynağı
|
|
16
|
-
* platformun swagger'ından üretiliyor ve bir alanın oradan düşmesi sessizce olur.
|
|
16
|
+
* platformun swagger'ından üretiliyor ve bir alanın oradan düşmesi sessizce olur. `prompts`
|
|
17
|
+
* kaynak değil MCP prompt'udur (`src/prompts/`, ADR 0003); metni burada durur ki `copy-assets`
|
|
18
|
+
* onu `dist`'e taşısın ve gözden geçirme metin olarak yapılsın.
|
|
17
19
|
*/
|
|
18
20
|
export function readKnowledgeFile(kind, file) {
|
|
19
21
|
return readFileSync(join(resourcesDirectory, kind, file), 'utf8');
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Mobil uygulamayı yayına hazırla
|
|
2
|
+
|
|
3
|
+
Uygulama: `{{applicationId}}`. Görev: Studio › Yayınla'nın **3 · Test sürümü** (kimlik ve sürüm, Apple hesabı,
|
|
4
|
+
Google Play hesabı, test ön kontrolü) ve **4 · Yayına hazırla** (mağaza metinleri, görseller, yaş derecelendirmesi,
|
|
5
|
+
gizlilik, beyanlar, sürüm-fiyat-yayın, konsolda kalanlar) adımlarını zeyrek-ai araçlarıyla doldurmak, ön kontrolü
|
|
6
|
+
kuru koşmak ve insana kalan işi tek listede vermek. Kurallar ve alan sınırları `platform_guide('mobile-publish')`'dedir;
|
|
7
|
+
başlamadan önce §Yolculuk, §Test derlemesi, §Akış, §Yaş derecelendirmesi ve §Ön kontrol bölümlerini oku.
|
|
8
|
+
|
|
9
|
+
## Sınırlar — bunlar pazarlık konusu değil
|
|
10
|
+
|
|
11
|
+
- **Gizli bilgi girmezsin:** Apple/Google hesabı, sertifika, profil, keystore, harita anahtarı, demo parolası,
|
|
12
|
+
APNs anahtarı, `google-services.json`. Bunlar Studio › Yayın › Hesaplar'da insanın işidir.
|
|
13
|
+
- **Beyanı kendin işaretlemezsin:** `mobile_store_update { applicationId, declarations }` ile `true` yalnız kullanıcı o formu
|
|
14
|
+
App Store Connect / Play Console'da doldurduğunu **bu konuşmada açıkça söyledikten sonra** yazılır.
|
|
15
|
+
- **Geri dönüşsüz bir şey kendiliğinden başlatmazsın:** production'a dağıtım ve mağazaya gönderim yok; ön kontrol
|
|
16
|
+
`mobile_build_start` ile yalnız `dryRun: true` koşulur. Test derlemesi isteğe bağlıdır ve **yalnız kullanıcı bu
|
|
17
|
+
konuşmada açıkça isterse** `dryRun`'sız başlatılır (adım 4). Apple'daki kimlik kaydı da silinemez: yalnız
|
|
18
|
+
kullanıcı kimliği bu konuşmada onayladıktan sonra yapılır (adım 4).
|
|
19
|
+
- **Kilitli alana dokunmazsın:** `lockedFields` içindeki kimlik ve sayaçlar ilk derlemeden sonra değişmez.
|
|
20
|
+
- Bir alanın değerini uydurmazsın: uygulamanın içeriğinden (sayfalar, akışlar, mevcut ayar) çıkaramadığın her
|
|
21
|
+
şeyi — şirket adı, destek e-postası, gizlilik politikası adresi, fiyat — kullanıcıya **tek seferde, liste
|
|
22
|
+
olarak** sor.
|
|
23
|
+
|
|
24
|
+
## Sıra
|
|
25
|
+
|
|
26
|
+
### 3 · Test sürümü
|
|
27
|
+
|
|
28
|
+
1. **Durumu oku.** `mobile_store_get { applicationId, detail: ['assets', 'signing', 'changes'] }`. Not et:
|
|
29
|
+
`persisted`, `lockedFields`, `settings.releaseTargets` (bu sürüm hangi mağazalara gidiyor), mevcut `listing`
|
|
30
|
+
dilleri, görsel yuvaları, beyanlar, `signing` eksikleri. Kapalı mağazanın alanlarını doldurma.
|
|
31
|
+
2. **Kimlik ve sürüm.** `persisted: false` ise kimlik otomatik varsayılandır: kullanıcı onaylarsa
|
|
32
|
+
`bundleIdentifier`, `androidPackage`, `scheme`'i ilk derlemeden önce yaz. `displayName` ve `version`
|
|
33
|
+
(MAJOR.MINOR.PATCH) dolu olsun.
|
|
34
|
+
3. **Hesaplar.** Bu sürümün gittiği mağazaların `signing` eksiklerini (Apple hesabı, Google Play hesabı, sertifika,
|
|
35
|
+
profil, keystore) kalanlar listesine yaz — Studio › Yayın › Hesaplar.
|
|
36
|
+
4. **Test ön kontrolü.** Açık her platform için
|
|
37
|
+
`mobile_build_start { applicationId, platform, target, scope: 'test', dryRun: true }` (iOS `testflight`, Android
|
|
38
|
+
`internal`). Kullanıcı başka bir ortamdan (development ya da hazır bir dal) test etmek istiyorsa `environment` ekle;
|
|
39
|
+
ön kontrol o ortamda sorar. Ajanın düzeltebildiği `fail` satırlarını düzelt ve yeniden koş; düzeltemediklerini
|
|
40
|
+
kalanlara yaz. iOS'ta `asc_bundle_id_missing` çıkarsa kimliği (`bundleIdentifier`) kullanıcıya göster ve Apple'daki
|
|
41
|
+
kaydın silinemeyeceğini söyle; yalnız açık onayıyla `mobile_store_update { applicationId, registerAppleBundleId: true }`,
|
|
42
|
+
sonra ön kontrolü yeniden koş. Onay yoksa kalanlara yaz. Test derlemesi isteğe bağlıdır: yalnız kullanıcı açıkça
|
|
43
|
+
isterse aynı çağrıyı `dryRun`'sız yap — her başlatma derleme numarası ayırır ve kimliği kilitler. Production'dan
|
|
44
|
+
alınan test derlemesi sonradan yeniden derlenmeden incelemeye / yükseltmeye gidebilir; development ya da dal
|
|
45
|
+
derlemesi asla mağazaya gitmez — kullanıcıya bunu ortamı seçerken söyle.
|
|
46
|
+
|
|
47
|
+
### 4 · Yayına hazırla
|
|
48
|
+
|
|
49
|
+
5. **Mağaza metinleri.** Uygulamanın dilleri için `settings.listing.<dil>`: `title` (≤ 30), `subtitle` (≤ 30),
|
|
50
|
+
`shortDescription` (≤ 80), `description` (≤ 4000), `keywords` (dizi; virgülle birleşince ≤ 100), `releaseNotes`. Metni
|
|
51
|
+
uygulamanın gerçek ekranlarından yaz; reklam dili, rakip adı, "en iyi" gibi ifadeler yok. iOS açıksa
|
|
52
|
+
`apple.categories.primary` ve `apple.copyright`, Android açıksa `play.contactEmail`.
|
|
53
|
+
6. **Görseller.** Derleme görselleri (`icon`, `adaptiveForeground`, `adaptiveBackground`,
|
|
54
|
+
`adaptiveMonochrome`, `splash`) eksikse kullanıcıdan dosya iste ya da var olan dosyanın yolunu sor.
|
|
55
|
+
Ekran görüntüsü: her mağaza dili ve açık platformun cihaz sınıfı için 3–5 gerçek ekran —
|
|
56
|
+
`page_screenshot { applicationSlug, pageSlug, environment: 'production', device, format: 'jpeg', quality: 92, language, colorScheme: 'light', outPath }`
|
|
57
|
+
→ `mobile_asset_create { applicationId, kind: 'screenshot', deviceClass, locale, path }`. `applicationSlug`
|
|
58
|
+
`application_list`'ten, `pageSlug` `page_list`'ten; `device` rehberdeki cihaz tablosundan; `language` o
|
|
59
|
+
yuvanın `locale`'idir — verilmezse kare projenin varsayılan dilinde çıkar ve başka dilin yuvasına yanlış dilde
|
|
60
|
+
yüklenir. Yuva birikimlidir (en çok 10 görsel): 1. adımda okuduğun yuvada görsel varsa kullanıcıya sormadan
|
|
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.
|
|
63
|
+
7. **Yaş derecelendirmesi** (iOS açıksa). `settings.apple.advisory`: rehberdeki **bütün** soruları cevapla;
|
|
64
|
+
reklam açıksa `advertising: 'true'`. Emin olmadığın soruyu kullanıcıya sor.
|
|
65
|
+
8. **Gizlilik.** `settings.urls.privacyPolicy` (https). Yoksa kullanıcıdan iste; uydurma adres yazma.
|
|
66
|
+
9. **Beyanlar.** Açık mağazanın beyanlarını (`appPrivacy` · `dataSafety`, `contentRating`, `targetAudience`,
|
|
67
|
+
`appAccess`) kullanıcıya hatırlat; onay gelenleri işaretle, gelmeyenleri kalanlar listesine yaz.
|
|
68
|
+
10. **Sürüm, fiyat, yayın.** `apple.releaseType` (varsayılan `manual`), `apple.pricing`, `apple.territories`;
|
|
69
|
+
kullanıcının tercihi yoksa varsayılanı koru ve bunu raporda söyle. Konsolda elle yapılanları (fiyat planı,
|
|
70
|
+
içerik derecelendirme anketi gibi) kalanlara yaz.
|
|
71
|
+
11. **Mağaza ön kontrolü.** Açık her platform için `mobile_build_start { applicationId, platform, target, dryRun: true }`
|
|
72
|
+
(iOS `testflight`, Android `internal`; kapsam `store` — mağazaya giden işin bütün kuralları). Ajanın düzeltebildiği
|
|
73
|
+
`fail` satırlarını düzelt ve yeniden koş; düzeltemediklerini kalanlara yaz.
|
|
74
|
+
|
|
75
|
+
Her `mobile_store_update` yanıtındaki `changed` ve MOB-022 uyarılarını oku; 409 (bayat kayıt) gelirse aynı
|
|
76
|
+
yamayla yeniden çağır.
|
|
77
|
+
|
|
78
|
+
## Rapor
|
|
79
|
+
|
|
80
|
+
Sonunda iki tablo ver:
|
|
81
|
+
|
|
82
|
+
1. **Doldurduklarım** — adım · bölüm · alan · yazılan değer (uzun metinde ilk 60 karakter).
|
|
83
|
+
2. **Sana kalanlar** — iş · nerede (Studio › Yayın › Hesaplar, App Store Connect, Play Console) · neden ·
|
|
84
|
+
hangi adımı kilitliyor.
|
|
85
|
+
|
|
86
|
+
Ardından tek cümleyle sıradaki adımı söyle. Studio sonraki adımı ancak öncekinin koşulu karşılanınca açar:
|
|
87
|
+
3 · Test sürümü'nde kimlik ya da bu sürümün gittiği mağazanın hesap bölümü eksikse 4 · Yayına hazırla açılmaz (test
|
|
88
|
+
derlemesi kapı değildir); 4 · Yayına hazırla'da eksik bölüm kalırsa 5 · Canlıya al açılmaz; 5'te production'a gitmemiş
|
|
89
|
+
değişiklik (`changes.live`) varsa dağıtım insan onaylıdır — kullanıcıya Studio'dan canlıya almasını söyle.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"hash": "
|
|
3
|
-
"generatedAt": "2026-10-
|
|
4
|
-
"types":
|
|
5
|
-
"files":
|
|
2
|
+
"hash": "c1fb21eeab36758c9d81fcd1b41ece1b456a514e7aa944c41e190727b5cdc0ed",
|
|
3
|
+
"generatedAt": "2026-10-21T05:42:28.082Z",
|
|
4
|
+
"types": 348,
|
|
5
|
+
"files": 173,
|
|
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]]",
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": {
|
|
3
|
+
"required": [
|
|
4
|
+
"operations"
|
|
5
|
+
],
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"id": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"format": "uuid"
|
|
11
|
+
},
|
|
12
|
+
"expectedHash": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"nullable": true
|
|
15
|
+
},
|
|
16
|
+
"operations": {
|
|
17
|
+
"minItems": 1,
|
|
18
|
+
"type": "array",
|
|
19
|
+
"items": {
|
|
20
|
+
"$ref": "#/components/schemas/NgApps.Application.Contexts.Studio.Microfunctions.MicrofunctionArchiveOperationDto"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"additionalProperties": false
|
|
25
|
+
},
|
|
26
|
+
"components": {
|
|
27
|
+
"schemas": {
|
|
28
|
+
"NgApps.Application.Contexts.Studio.Microfunctions.MicrofunctionArchiveOperationDto": {
|
|
29
|
+
"required": [
|
|
30
|
+
"path"
|
|
31
|
+
],
|
|
32
|
+
"type": "object",
|
|
33
|
+
"properties": {
|
|
34
|
+
"type": {
|
|
35
|
+
"$ref": "#/components/schemas/NgApps.Domain.Contexts.Studio.Microfunctions.MicrofunctionArchiveOperationType"
|
|
36
|
+
},
|
|
37
|
+
"path": {
|
|
38
|
+
"minLength": 1,
|
|
39
|
+
"pattern": "^(?!.*(?:^|/)\\.{1,2}(?:/|$))[^/\\\\\\x00]+(?:/[^/\\\\\\x00]+)*$",
|
|
40
|
+
"type": "string"
|
|
41
|
+
},
|
|
42
|
+
"content": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"nullable": true
|
|
45
|
+
},
|
|
46
|
+
"encoding": {
|
|
47
|
+
"$ref": "#/components/schemas/NgApps.Domain.Contexts.Studio.Microfunctions.MicrofunctionArchiveContentEncoding"
|
|
48
|
+
},
|
|
49
|
+
"newPath": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"nullable": true
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"additionalProperties": false
|
|
55
|
+
},
|
|
56
|
+
"NgApps.Domain.Contexts.Studio.Microfunctions.MicrofunctionArchiveOperationType": {
|
|
57
|
+
"enum": [
|
|
58
|
+
"write-file",
|
|
59
|
+
"create-directory",
|
|
60
|
+
"delete",
|
|
61
|
+
"rename"
|
|
62
|
+
],
|
|
63
|
+
"type": "string",
|
|
64
|
+
"format": ""
|
|
65
|
+
},
|
|
66
|
+
"NgApps.Domain.Contexts.Studio.Microfunctions.MicrofunctionArchiveContentEncoding": {
|
|
67
|
+
"enum": [
|
|
68
|
+
"utf8",
|
|
69
|
+
"base64"
|
|
70
|
+
],
|
|
71
|
+
"type": "string",
|
|
72
|
+
"format": ""
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -28,6 +28,9 @@
|
|
|
28
28
|
},
|
|
29
29
|
"source": {
|
|
30
30
|
"$ref": "#/components/schemas/NgApps.Domain.Contexts.Studio.ConnectData.ConnectDataSourceMetaModel"
|
|
31
|
+
},
|
|
32
|
+
"lookupMobile": {
|
|
33
|
+
"$ref": "#/components/schemas/NgApps.Domain.Contexts.Studio.ConnectData.ConnectDataLookupMobileModel"
|
|
31
34
|
}
|
|
32
35
|
},
|
|
33
36
|
"additionalProperties": false
|
|
@@ -100,6 +103,13 @@
|
|
|
100
103
|
},
|
|
101
104
|
"isMultiple": {
|
|
102
105
|
"type": "boolean"
|
|
106
|
+
},
|
|
107
|
+
"dateBuckets": {
|
|
108
|
+
"type": "array",
|
|
109
|
+
"items": {
|
|
110
|
+
"type": "string"
|
|
111
|
+
},
|
|
112
|
+
"nullable": true
|
|
103
113
|
}
|
|
104
114
|
},
|
|
105
115
|
"additionalProperties": false
|
|
@@ -190,6 +200,9 @@
|
|
|
190
200
|
"isSchemaSampled": {
|
|
191
201
|
"type": "boolean"
|
|
192
202
|
},
|
|
203
|
+
"grouping": {
|
|
204
|
+
"type": "boolean"
|
|
205
|
+
},
|
|
193
206
|
"parameters": {
|
|
194
207
|
"type": "array",
|
|
195
208
|
"items": {
|
|
@@ -200,6 +213,19 @@
|
|
|
200
213
|
},
|
|
201
214
|
"additionalProperties": false
|
|
202
215
|
},
|
|
216
|
+
"NgApps.Domain.Contexts.Studio.ConnectData.ConnectDataLookupMobileModel": {
|
|
217
|
+
"type": "object",
|
|
218
|
+
"properties": {
|
|
219
|
+
"mode": {
|
|
220
|
+
"type": "string",
|
|
221
|
+
"nullable": true
|
|
222
|
+
},
|
|
223
|
+
"row": {
|
|
224
|
+
"$ref": "#/components/schemas/NgApps.Domain.Contexts.Studio.ConnectData.ConnectDataMobileRowModel"
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
"additionalProperties": false
|
|
228
|
+
},
|
|
203
229
|
"NgApps.Domain.Contexts.Access.Policies.FieldAccess": {
|
|
204
230
|
"enum": [
|
|
205
231
|
"hidden",
|
|
@@ -338,6 +364,24 @@
|
|
|
338
364
|
}
|
|
339
365
|
},
|
|
340
366
|
"additionalProperties": false
|
|
367
|
+
},
|
|
368
|
+
"NgApps.Domain.Contexts.Studio.ConnectData.ConnectDataMobileRowModel": {
|
|
369
|
+
"type": "object",
|
|
370
|
+
"properties": {
|
|
371
|
+
"title": {
|
|
372
|
+
"type": "string",
|
|
373
|
+
"nullable": true
|
|
374
|
+
},
|
|
375
|
+
"subtitle": {
|
|
376
|
+
"type": "string",
|
|
377
|
+
"nullable": true
|
|
378
|
+
},
|
|
379
|
+
"trailing": {
|
|
380
|
+
"type": "string",
|
|
381
|
+
"nullable": true
|
|
382
|
+
}
|
|
383
|
+
},
|
|
384
|
+
"additionalProperties": false
|
|
341
385
|
}
|
|
342
386
|
}
|
|
343
387
|
}
|
|
@@ -177,6 +177,13 @@
|
|
|
177
177
|
},
|
|
178
178
|
"isMultiple": {
|
|
179
179
|
"type": "boolean"
|
|
180
|
+
},
|
|
181
|
+
"dateBuckets": {
|
|
182
|
+
"type": "array",
|
|
183
|
+
"items": {
|
|
184
|
+
"type": "string"
|
|
185
|
+
},
|
|
186
|
+
"nullable": true
|
|
180
187
|
}
|
|
181
188
|
},
|
|
182
189
|
"additionalProperties": false
|
|
@@ -249,6 +256,9 @@
|
|
|
249
256
|
"isSchemaSampled": {
|
|
250
257
|
"type": "boolean"
|
|
251
258
|
},
|
|
259
|
+
"grouping": {
|
|
260
|
+
"type": "boolean"
|
|
261
|
+
},
|
|
252
262
|
"parameters": {
|
|
253
263
|
"type": "array",
|
|
254
264
|
"items": {
|