@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.
Files changed (65) hide show
  1. package/dist/knowledge/backendConstraints.js +86 -2
  2. package/dist/knowledge/componentCatalog.js +63 -26
  3. package/dist/knowledge/componentEvents.js +6 -0
  4. package/dist/knowledge/connectDataBind.js +43 -6
  5. package/dist/knowledge/connectDataDefinition.js +74 -3
  6. package/dist/knowledge/connectDataRules.js +14 -0
  7. package/dist/knowledge/mobileComponentCatalog.js +66 -7
  8. package/dist/knowledge/mobileStore.js +61 -2
  9. package/dist/knowledge/platform/mobile.js +1 -1
  10. package/dist/knowledge/platform/mobileRules.js +2 -1
  11. package/dist/knowledge/platform/mobileTabs.js +31 -2
  12. package/dist/knowledge/platform/web.js +1 -1
  13. package/dist/knowledge/rules.js +195 -4
  14. package/dist/knowledge/textHooks.js +434 -0
  15. package/dist/platform/capture/capture.js +1 -1
  16. package/dist/platform/capture/readiness.js +4 -0
  17. package/dist/platform/errors.js +22 -2
  18. package/dist/prompts/mobilePublish.js +21 -0
  19. package/dist/resources/examples/flow-biometric-confirm.json +199 -0
  20. package/dist/resources/examples/microfunction-node-dependencies.json +19 -0
  21. package/dist/resources/guides/access.md +3 -3
  22. package/dist/resources/guides/component.md +20 -4
  23. package/dist/resources/guides/deployment.md +98 -0
  24. package/dist/resources/guides/entity.md +1 -1
  25. package/dist/resources/guides/expressions.md +5 -1
  26. package/dist/resources/guides/external-component.md +6 -4
  27. package/dist/resources/guides/merge.md +81 -4
  28. package/dist/resources/guides/microfunction.md +104 -9
  29. package/dist/resources/guides/microservice.md +34 -5
  30. package/dist/resources/guides/mobile-connect-data.md +70 -0
  31. package/dist/resources/guides/mobile-flow.md +64 -0
  32. package/dist/resources/guides/mobile-publish.md +161 -16
  33. package/dist/resources/guides/mobile-steps.md +17 -0
  34. package/dist/resources/guides/mobile.md +41 -23
  35. package/dist/resources/guides/page.md +11 -5
  36. package/dist/resources/guides/translation.md +95 -0
  37. package/dist/resources/knowledge.js +3 -1
  38. package/dist/resources/prompts/mobile-publish-prepare.md +89 -0
  39. package/dist/resources/schema-fingerprint.json +4 -4
  40. package/dist/resources/schemas/ApplyMicrofunctionArchiveChangesCommand.json +76 -0
  41. package/dist/resources/schemas/ConnectDataDescribeDto.json +44 -0
  42. package/dist/resources/schemas/ConnectDataResultDto.json +10 -0
  43. package/dist/resources/schemas/CreateMicrofunctionCommand.json +8 -0
  44. package/dist/resources/schemas/InvokeMicrofunctionCommand.json +0 -4
  45. package/dist/resources/schemas/MobileStorePreflightScope.json +13 -0
  46. package/dist/resources/schemas/StartMobileBuildCommand.json +35 -1
  47. package/dist/resources/schemas/UpdateMicrofunctionCommand.json +8 -0
  48. package/dist/resources/schemas/UpsertMobileStoreSettingsCommand.json +75 -0
  49. package/dist/server.js +2 -0
  50. package/dist/tools/common.js +6 -0
  51. package/dist/tools/components.js +19 -6
  52. package/dist/tools/connectData.js +9 -4
  53. package/dist/tools/deployments.js +1 -1
  54. package/dist/tools/designSchemaPatch.js +16 -4
  55. package/dist/tools/environments.js +3 -3
  56. package/dist/tools/files.js +1 -1
  57. package/dist/tools/flows.js +29 -3
  58. package/dist/tools/layouts.js +32 -12
  59. package/dist/tools/merges.js +8 -8
  60. package/dist/tools/microfunctions.js +53 -3
  61. package/dist/tools/mobileStore.js +83 -21
  62. package/dist/tools/pages.js +59 -24
  63. package/dist/tools/platformInfo.js +4 -2
  64. package/dist/tools/textHookGuard.js +116 -0
  65. 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
- 3. **Ekranlar.** `page_schema_patch` ile bileşen ekle, akış bağla (`flow_create` → `set_event`).
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** (FlutterFlow D listesi): `datatable` web ikizidir — kolon biçimi, sıralama ve sayfa hesabı web'in
123
- modülünden, akış sözleşmesi aynı (sıralama/sayfa değişince `sortField`/`sortType`/`offset` düğüme yazılır ve
124
- `mount` yeniden koşar; satır eylemi `selectedRow`u yazıp eylemin akışını koşturur). Mobile özgü `variant`:
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 geri tuşu, app-bar geri düğmesi, tarayıcı geri) önceki ekrana döner. Göreli yol uygulama
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": "<page_list id>", "label": "Profil", "icon": "user" }
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), tekrar yok; `style: 'floating'` köşe `pill` + gölge `md`
389
- çizer. Çubuğun rengi ayarda YOKTUR: zemin `surface`, seçili `accent-primary`, seçilmemiş
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); üç sayfalık liste → detay → form akışı:
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
- ve `ad-show`'un mobildeki davranışı, argümanları, `Steps.<adım>` sonucu; bildirim, izin, reklam ve konum
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
- ## Cihazda önizleme
527
+ ## Studio'da ne görünür
523
528
 
524
- Expo uygulaması (`apps/mobile-runtime`) aynı sayfayı native çizer. Derin bağlantı
525
- `zeyrek://open/{proje}/{uygulama}/{sayfa}?env=<ortam>` **token taşımaz**: cihazdaki uygulama zaten giriş
526
- yapmış olmalıdır. Canlı önizleme sayfa şeması değişikliğini (`/hubs/page-schema`) dinler; yazdığın
527
- yama cihazda yenilenir.
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-11), derleme hata kodları ve insanın Studio › Yayın'da
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.durum, color: r.durum === 'İptal' ? 'error' : 'success' } }); })" } }
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": "ba18a5111614d9b1e63e0d50f1a06a4dce1081b3d482c88e7620ca4bda9a466b",
3
- "generatedAt": "2026-10-14T08:45:02.944Z",
4
- "types": 337,
5
- "files": 167,
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": {
@@ -70,6 +70,14 @@
70
70
  },
71
71
  "nullable": true
72
72
  },
73
+ "dependencies": {
74
+ "type": "string",
75
+ "nullable": true
76
+ },
77
+ "testArguments": {
78
+ "type": "string",
79
+ "nullable": true
80
+ },
73
81
  "publish": {
74
82
  "type": "boolean"
75
83
  }
@@ -7,10 +7,6 @@
7
7
  "format": "uuid"
8
8
  },
9
9
  "args": {
10
- "type": "object",
11
- "additionalProperties": {
12
- "nullable": true
13
- },
14
10
  "nullable": true
15
11
  },
16
12
  "preview": {