@appaflytech/zeyrek-ai-mcp 0.0.31 → 0.0.32

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 (205) hide show
  1. package/.env.example +0 -15
  2. package/README.md +5 -5
  3. package/dist/config.js +0 -37
  4. package/dist/index.js +0 -2
  5. package/dist/knowledge/backendConstraints.js +1 -18
  6. package/dist/knowledge/boxSections.js +184 -0
  7. package/dist/knowledge/componentCatalog.js +233 -568
  8. package/dist/knowledge/componentEvents.js +21 -141
  9. package/dist/knowledge/layoutSummary.js +2 -140
  10. package/dist/knowledge/normalize.js +67 -236
  11. package/dist/knowledge/outlines.js +0 -36
  12. package/dist/knowledge/policy.js +4 -18
  13. package/dist/knowledge/reservedTables.js +0 -79
  14. package/dist/knowledge/rules.js +21 -366
  15. package/dist/knowledge/schemaGuard.js +0 -11
  16. package/dist/knowledge/styleResolve.js +38 -55
  17. package/dist/knowledge/themeResolve.js +3 -3
  18. package/dist/observability/trace.js +3 -6
  19. package/dist/platform/diagnostics.js +4 -10
  20. package/dist/platform/domSummary.js +1 -1
  21. package/dist/platform/errors.js +10 -162
  22. package/dist/platform/http.js +8 -29
  23. package/dist/platform/responses.js +5 -39
  24. package/dist/platform/{capture/capture.js → screenshot.js} +519 -105
  25. package/dist/platform/secrets.js +1 -17
  26. package/dist/platform/strictArguments.js +12 -68
  27. package/dist/platform/tokenVault.js +4 -187
  28. package/dist/resources/examples/layout-app-shell.json +707 -229
  29. package/dist/resources/examples/middleware-authenticate.json +1 -1
  30. package/dist/resources/examples/page-detail-profile.json +1 -2
  31. package/dist/resources/examples/page-dynamic-form.json +2 -3
  32. package/dist/resources/examples/page-flex-sections.json +1 -1
  33. package/dist/resources/examples/page-html-embed.json +1 -1
  34. package/dist/resources/examples/workflow-basic.json +2 -8
  35. package/dist/resources/guides/component.md +5 -92
  36. package/dist/resources/guides/entity.md +8 -50
  37. package/dist/resources/guides/expressions.md +5 -14
  38. package/dist/resources/guides/functions.md +1 -1
  39. package/dist/resources/guides/getting-started.md +1 -38
  40. package/dist/resources/guides/layout.md +58 -55
  41. package/dist/resources/guides/merge.md +3 -37
  42. package/dist/resources/guides/microservice.md +2 -87
  43. package/dist/resources/guides/middleware.md +4 -68
  44. package/dist/resources/guides/page.md +75 -456
  45. package/dist/resources/guides/theme.md +2 -8
  46. package/dist/resources/guides/translation.md +1 -1
  47. package/dist/resources/guides/workflow.md +1 -58
  48. package/dist/resources/rules.js +5 -11
  49. package/dist/resources/schema-fingerprint.json +5 -7
  50. package/dist/resources/schemas/CreateEntityCommand.json +0 -118
  51. package/dist/resources/schemas/CreateMicroserviceCommand.json +1 -13
  52. package/dist/resources/schemas/CreateQueryCommand.json +0 -4
  53. package/dist/resources/schemas/CreateWorkflowCommand.json +1 -146
  54. package/dist/resources/schemas/DataJobDto.json +1 -6
  55. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +1 -21
  56. package/dist/resources/schemas/MicroserviceDto.json +3 -15
  57. package/dist/resources/schemas/PreviewMicroserviceCommand.json +1 -10
  58. package/dist/resources/schemas/PreviewWorkflowCommand.json +1 -25
  59. package/dist/resources/schemas/StepDto.json +1 -25
  60. package/dist/resources/schemas/UpdateEntityCommand.json +0 -118
  61. package/dist/resources/schemas/UpdateMicroserviceCommand.json +1 -13
  62. package/dist/resources/schemas/UpdateQueryCommand.json +0 -4
  63. package/dist/resources/schemas/UpdateViewCommand.json +2 -0
  64. package/dist/resources/schemas/UpdateWorkflowCommand.json +1 -146
  65. package/dist/server.js +1 -27
  66. package/dist/tools/access.js +2 -369
  67. package/dist/tools/applications.js +3 -60
  68. package/dist/tools/common.js +0 -7
  69. package/dist/tools/components.js +14 -118
  70. package/dist/tools/datasources.js +3 -3
  71. package/dist/tools/dependencies.js +1 -1
  72. package/dist/tools/deployments.js +3 -38
  73. package/dist/tools/designSchemaPatch.js +18 -34
  74. package/dist/tools/dtos.js +5 -36
  75. package/dist/tools/entities.js +12 -79
  76. package/dist/tools/externalComponents.js +5 -26
  77. package/dist/tools/flows.js +14 -122
  78. package/dist/tools/folders.js +1 -1
  79. package/dist/tools/imports.js +2 -5
  80. package/dist/tools/layouts.js +17 -50
  81. package/dist/tools/merges.js +2 -2
  82. package/dist/tools/microservices.js +25 -77
  83. package/dist/tools/pages.js +112 -465
  84. package/dist/tools/platformInfo.js +8 -27
  85. package/dist/tools/projects.js +9 -71
  86. package/dist/tools/rows.js +13 -69
  87. package/dist/tools/schemaOps.js +1 -61
  88. package/dist/tools/screenWrite.js +8 -37
  89. package/dist/tools/screens.js +5 -95
  90. package/dist/tools/templates.js +1 -26
  91. package/dist/tools/translations.js +1 -1
  92. package/dist/tools/variables.js +5 -11
  93. package/dist/tools/workflows.js +5 -10
  94. package/package.json +1 -1
  95. package/dist/knowledge/access.js +0 -802
  96. package/dist/knowledge/case.js +0 -41
  97. package/dist/knowledge/connectDataBind.js +0 -819
  98. package/dist/knowledge/connectDataDefinition.js +0 -341
  99. package/dist/knowledge/connectDataExecute.js +0 -93
  100. package/dist/knowledge/connectDataRules.js +0 -128
  101. package/dist/knowledge/decision.js +0 -121
  102. package/dist/knowledge/expressionPrelude.js +0 -59
  103. package/dist/knowledge/microserviceParameters.js +0 -58
  104. package/dist/knowledge/mining.js +0 -94
  105. package/dist/knowledge/mobileComponentCatalog.js +0 -859
  106. package/dist/knowledge/mobileComponentEvents.js +0 -239
  107. package/dist/knowledge/platform/lint.js +0 -385
  108. package/dist/knowledge/platform/mobile.js +0 -142
  109. package/dist/knowledge/platform/mobileLayoutLint.js +0 -324
  110. package/dist/knowledge/platform/mobileRules.js +0 -231
  111. package/dist/knowledge/platform/mobileSpacing.js +0 -82
  112. package/dist/knowledge/platform/mobileTabs.js +0 -108
  113. package/dist/knowledge/platform/nativeBoxModel.js +0 -44
  114. package/dist/knowledge/platform/profile.js +0 -25
  115. package/dist/knowledge/platform/resolve.js +0 -122
  116. package/dist/knowledge/platform/web.js +0 -39
  117. package/dist/knowledge/process.js +0 -510
  118. package/dist/knowledge/rowFilter.js +0 -43
  119. package/dist/knowledge/styleResolveNative.js +0 -527
  120. package/dist/platform/argumentAliases.js +0 -128
  121. package/dist/platform/bodyFile.js +0 -103
  122. package/dist/platform/capture/actions.js +0 -333
  123. package/dist/platform/capture/browser.js +0 -1
  124. package/dist/platform/capture/console-log.js +0 -122
  125. package/dist/platform/capture/index.js +0 -11
  126. package/dist/platform/capture/readiness.js +0 -103
  127. package/dist/platform/capture/summary.js +0 -77
  128. package/dist/platform/capture/target.js +0 -5
  129. package/dist/platform/capture/targets/studio-mobile.js +0 -15
  130. package/dist/platform/capture/targets/studio-web.js +0 -5
  131. package/dist/platform/impersonation.js +0 -45
  132. package/dist/platform/jsonArray.js +0 -24
  133. package/dist/platform/schemaReadMemory.js +0 -60
  134. package/dist/resources/examples/bpm-gorev-kontrol.json +0 -294
  135. package/dist/resources/examples/bpm-iso-dokuman.json +0 -228
  136. package/dist/resources/examples/bpm-satinalma.json +0 -376
  137. package/dist/resources/examples/connect-data-convert-verify.json +0 -107
  138. package/dist/resources/examples/connect-data-dropdown-roles.json +0 -66
  139. package/dist/resources/examples/connect-data-edit-m2m.json +0 -73
  140. package/dist/resources/examples/connect-data-query-params.json +0 -50
  141. package/dist/resources/examples/connect-data-table-entity.json +0 -147
  142. package/dist/resources/examples/connect-data-workflow-microservice.json +0 -65
  143. package/dist/resources/examples/mobile-app-shell-drawer.json +0 -243
  144. package/dist/resources/examples/mobile-app-shell-stack.json +0 -157
  145. package/dist/resources/examples/mobile-app-shell-tab.json +0 -208
  146. package/dist/resources/examples/mobile-form-screen.json +0 -365
  147. package/dist/resources/examples/mobile-list-detail-form.json +0 -672
  148. package/dist/resources/guides/access.md +0 -810
  149. package/dist/resources/guides/bpm.md +0 -691
  150. package/dist/resources/guides/case.md +0 -153
  151. package/dist/resources/guides/decision.md +0 -185
  152. package/dist/resources/guides/mobile-layout.md +0 -193
  153. package/dist/resources/guides/mobile.md +0 -495
  154. package/dist/resources/read.js +0 -41
  155. package/dist/resources/schemas/AccessExplanationDto.json +0 -144
  156. package/dist/resources/schemas/AccessMatrixDto.json +0 -170
  157. package/dist/resources/schemas/AccessPermissionDto.json +0 -57
  158. package/dist/resources/schemas/AccessPolicyDto.json +0 -223
  159. package/dist/resources/schemas/AccessResourceDto.json +0 -86
  160. package/dist/resources/schemas/AppSessionDto.json +0 -53
  161. package/dist/resources/schemas/ConnectDataDescribeDto.json +0 -344
  162. package/dist/resources/schemas/ConnectDataRequestModel.json +0 -202
  163. package/dist/resources/schemas/ConnectDataResultDto.json +0 -421
  164. package/dist/resources/schemas/ConnectorCredentialDto.json +0 -70
  165. package/dist/resources/schemas/ConvertConnectDataToMicroserviceCommand.json +0 -37
  166. package/dist/resources/schemas/CreateAccessPolicyCommand.json +0 -209
  167. package/dist/resources/schemas/CreateDecisionCommand.json +0 -221
  168. package/dist/resources/schemas/CreateProcessDefinitionCommand.json +0 -1337
  169. package/dist/resources/schemas/DecisionDto.json +0 -302
  170. package/dist/resources/schemas/DetachConnectDataMicroserviceCommand.json +0 -28
  171. package/dist/resources/schemas/ExplainAccessQuery.json +0 -33
  172. package/dist/resources/schemas/GenerateProcessDocumentCommand.json +0 -116
  173. package/dist/resources/schemas/OrganizationProjectDto.json +0 -335
  174. package/dist/resources/schemas/OrganizationSchemaDto.json +0 -196
  175. package/dist/resources/schemas/OrganizationSchemaVersionDto.json +0 -207
  176. package/dist/resources/schemas/PatchProcessDefinitionCommand.json +0 -76
  177. package/dist/resources/schemas/ProcessDefinitionDto.json +0 -1480
  178. package/dist/resources/schemas/ProcessSimulationDto.json +0 -96
  179. package/dist/resources/schemas/SaveConnectorCredentialCommand.json +0 -90
  180. package/dist/resources/schemas/SaveProcessEventSourceCommand.json +0 -61
  181. package/dist/resources/schemas/SaveProcessMailSourceCommand.json +0 -89
  182. package/dist/resources/schemas/SignProcessTaskCommand.json +0 -73
  183. package/dist/resources/schemas/SimulateProcessDefinitionQuery.json +0 -92
  184. package/dist/resources/schemas/UpdateAccessPolicyCommand.json +0 -209
  185. package/dist/resources/schemas/UpdateDecisionCommand.json +0 -216
  186. package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +0 -1357
  187. package/dist/resources/schemas/ValidateProcessDefinitionQuery.json +0 -1339
  188. package/dist/tools/accessOperations.js +0 -135
  189. package/dist/tools/accessPolicies.js +0 -170
  190. package/dist/tools/accessRuntime.js +0 -203
  191. package/dist/tools/bpm.js +0 -343
  192. package/dist/tools/bpmGovernance.js +0 -266
  193. package/dist/tools/bpmOperations.js +0 -230
  194. package/dist/tools/bpmReporting.js +0 -154
  195. package/dist/tools/bpmRouting.js +0 -150
  196. package/dist/tools/bpmRuntime.js +0 -396
  197. package/dist/tools/case.js +0 -178
  198. package/dist/tools/caseRuntime.js +0 -89
  199. package/dist/tools/connectData.js +0 -449
  200. package/dist/tools/connectors.js +0 -193
  201. package/dist/tools/decisions.js +0 -206
  202. package/dist/tools/mobile.js +0 -221
  203. package/dist/tools/modules.js +0 -48
  204. package/dist/tools/organizationStructure.js +0 -137
  205. package/dist/tools/profileWrite.js +0 -92
@@ -1,153 +0,0 @@
1
- # Vaka Rehberi — CMMN 1.1 vaka yönetimi
2
-
3
- Adımları önceden bilinmeyen işler içindir: müşteri şikâyeti, soruşturma, hasar dosyası, uygunsuzluk incelemesi. Süreç tanımı
4
- (`process_definition_*`) sırayı çizer; **vaka** ise aşamaları, isteğe bağlı görevleri ve "şu olunca şu açılır" koşullarını
5
- (sentry) tanımlar, sırayı olaylar ve kişiler belirler. İnsan görevleri süreç görevleriyle **aynı kutuya** düşer
6
- (`kind: case-task`) ve `process_task_update` ile tamamlanır. Süreçten vaka `case` düğümüyle başlatılır (§Süreçten vaka).
7
-
8
- Modüller: `case` (tanım: `case_definition_*`, `case_cmmn_*`) ve `caseRuntime` (`case_execute`, `case_instance_*`).
9
-
10
- ## Başlangıç
11
-
12
- 1. **Modeli yazın** — `case_definition_create { case }`. Taslak sürüm oluşur. Gateway yazmadan önce CASE-001'i denetler
13
- (§Lint); `case_definition_preview { case }` aynı denetimi istek göndermeden yapar.
14
- 2. **Yayınlayın** — `case_definition_publish { id }`. Çalışan vakalar başladıkları sürümde kalır; production'a yayın yok (BPM-001).
15
- 3. **Başlatın** — `case_execute { slug, subjectRowId, caseFile, asUser }`. Yanıt `planItems[]` ve `availableActions[]` taşır.
16
- 4. **Yürütün** — `case_instance_get` → `availableActions` → `case_instance_update { operation, planItemId }`; insan görevleri
17
- `process_task_list` / `process_task_update`.
18
-
19
- Düzeltmede tam modeli yeniden göndermeyin: `case_definition_get` → `case_definition_patch` (`/planItems[id=<öğe>]/…`).
20
- Başka modelleyiciden gelen CMMN için `case_cmmn_update { filePath }`; dışa aktarma `case_cmmn_get { outPath }`.
21
-
22
- ## Model
23
-
24
- ```jsonc
25
- {
26
- "slug": "musteri-sikayeti", "name": { "tr": "Müşteri şikâyeti" }, "description": { "tr": "Şikâyeti inceler ve kapatır." },
27
- "caseFile": [{ "id": "musteriCevabi" }, { "id": "oncelik", "default": "normal" }],
28
- "planItems": [
29
- { "id": "inceleme", "type": "stage", "required": true, "autoComplete": true },
30
- { "id": "sikayeti-incele", "type": "human-task", "parent": "inceleme", "required": true, "assignee": { "rule": "user", "arg": "<kullanıcı id>" } },
31
- { "id": "hukuk-gorusu", "type": "human-task", "parent": "inceleme", "discretionary": true, "assignee": { "rule": "role", "arg": "hukuk" } },
32
- { "id": "yanit-alindi", "type": "milestone", "entry": ["musteri-cevapladi"] },
33
- { "id": "kapanis", "type": "stage", "required": true, "manualActivation": true, "autoComplete": true, "entry": ["musteri-cevapladi"] }
34
- ],
35
- "sentries": [
36
- { "id": "musteri-cevapladi",
37
- "onParts": [{ "source": "inceleme", "event": "complete" }, { "source": "musteriCevabi", "event": "update" }],
38
- "ifPart": "caseFile.musteriCevabi != 'yok'" }
39
- ]
40
- }
41
- ```
42
-
43
- | Alan | Kural (backend `CaseValidator`, hata 422 `CaseInvalid` + bulgu yolu `/planItems[id=x]/alan`) |
44
- |---|---|
45
- | `slug`, plan öğesi ve sentry `id` | kebab-case, benzersiz; ilk yayından sonra slug değişmez (400) |
46
- | `caseFile[].id` | harf, rakam, alt çizgi; `default` herhangi bir JSON |
47
- | `planItems[].type` | `stage` · `human-task` · `milestone` |
48
- | `parent` | yalnız bir `stage`; döngü yasak. `parent` yoksa öğe vaka planının köküdür |
49
- | `required` | aşama tamamlanmadan önce bitmesi gereken öğe; `disable` edilemez |
50
- | `repeatable` | tamamlanınca yeni `occurrence` açılır; giriş sentry'si ister, kilometre taşında olmaz |
51
- | `manualActivation` | koşul sağlanınca `enabled` olur, biri `start` edene kadar bekler |
52
- | `discretionary` | tanımda durur, kişi `add-discretionary` ile ekleyene kadar oluşmaz |
53
- | `autoComplete` | yalnız `stage`: etkin çocuk kalmayınca ve zorunlular bitince kendiliğinden kapanır |
54
- | `assignee` | `human-task` için zorunlu: `user` (`arg` kullanıcı id), `role` (`arg` rol slug'ı, aday kaydı), `initiator` |
55
- | `entry` / `exit` | sentry kimlikleri; girişlerden biri yeter, çıkış öğeyi ve alt ağacını `terminated` yapar |
56
- | `onParts[].event` | kaynak kilometre taşıysa yalnız `occur`; başka plan öğesiyse `complete` · `start` · `terminate`; vaka dosyası öğesiyse `update` |
57
- | `ifPart` | Jint; `caseFile.x` (ya da `vars.x`) vaka dosyasını, `initiator` başlatanı okur |
58
-
59
- Süreç tanımındaki `assignee` sözlüğü (`unit-manager of …`, `position:`) vakada **yoktur**; yalnız üç kural.
60
-
61
- ## Yaşam döngüsü
62
-
63
- Plan öğesi: `available → enabled → active → completed | terminated | disabled`. Vaka: `active → completed | terminated`.
64
-
65
- Her değişiklikten sonra platform yerleşimi sabitlenene kadar yeniden çalıştırır: çıkış sentry'si sağlanan öğe `terminated`;
66
- ebeveyni etkin ve giriş koşulu sağlanan öğe `manualActivation` ise `enabled`, değilse etkin olur (insan görevi görev açar,
67
- kilometre taşı doğrudan `completed`); kökteki her şey bitince vaka `completed`.
68
-
69
- Aşama kapanışı **turun sonunda ve yalnız o turda başka hiçbir öğe hareket etmediyse** denenir — bir çocuk daha açılabiliyorken
70
- aşama kapatılmaz. `autoComplete` aşama etkin çocuğu yokken ve zorunlu çocukları bitmişken kapanır, bekleyen çocuklarını
71
- `terminated` eder. `autoComplete` **olmayan** aşama da kendiliğinden kapanır ama **bütün** çocukları terminal olmalıdır;
72
- bekleyen çocuğu varken bekler ve onları terminale çekmez. Çocuğu olmayan aşama yalnız `autoComplete` ise kendiliğinden kapanır,
73
- değilse elle `complete` bekler (elle `complete` her zaman gevşek koşulu kullanır: etkin çocuk yok + zorunlular bitmiş).
74
-
75
- Sentry **durum tabanlıdır**: `onPart` kaynağın şu anki durumuna bakar (`complete`/`occur` → tamamlanmış, `start` → etkin ya da
76
- tamamlanmış, `update` → vaka dosyası öğesi dolu) ve `ifPart` her turda yeniden çalışır. Bu yüzden vaka dosyasını değiştirmek
77
- (`update-case-file`) bekleyen öğeyi açabilir.
78
-
79
- ## Eylemler
80
-
81
- `case_instance_get` yanıtındaki `availableActions[] { action, itemId, planItemId }` o an yapılabilecekleri listeler:
82
-
83
- | `case_instance_update { operation }` | Ne yapar | Hata |
84
- |---|---|---|
85
- | `start` (`planItemId`) | `enabled` öğeyi başlatır | yanlış durum 409 `InstanceStateTransitionNotAllowed` |
86
- | `complete` (`planItemId`) | etkin aşamayı kapatır (etkin çocuk yok, zorunlular bitmiş); insan görevi görev ucundan kapanır | 409 |
87
- | `disable` (`planItemId`) | zorunlu olmayan `enabled` öğeyi devre dışı bırakır | 409 |
88
- | `enable` (`planItemId`) | `available` öğeyi elle açar; giriş sentry'si **varsa** biri sağlanmalı (sentry'si olmayan öğe koşulsuz açılır) | sentry sağlanmıyorsa **422 `CaseSentryNotSatisfied`**, `available` değilse 409 |
89
- | `add-discretionary` (`itemDefinitionId`) | isteğe bağlı öğeyi ebeveyn aşaması etkinken ekler | aynı öğenin bitmemiş örneği varsa 409 |
90
- | `update-case-file` (`itemId`, `value`) | vaka dosyasına yazar, yerleşimi yeniden çalıştırır | tanımsız öğe 400 |
91
-
92
- `enable` `availableActions`'ta **listelenmez**: yerleşim, giriş sentry'si sağlanan ya da hiç sentry'si olmayan öğeyi zaten açar,
93
- dolayısıyla listede kalan `available` öğe sentry'sini bekliyordur ve ona `enable` 422 döner. Bu bir lint değil çalışma zamanı
94
- kuralıdır — koşulu sağlamak için vaka dosyasını güncelleyin ya da kaynak öğeyi bitirin. Kapanmış vakada her değişiklik 409.
95
-
96
- ## Görevler
97
-
98
- `human-task` etkinleşince `ProcessTask` açılır: `kind: case-task`, `instanceId` = vaka kimliği, `nodeId` = plan öğesi `id`,
99
- `definitionSlug` = vaka slug'ı. `user` ve `initiator` doğrudan atanır; `role` aday kaydı açar ve görev `claim` ister. Tamamlama
100
- `process_task_update { action: complete, payload, asUser }` — plan öğesi `completed` olur, yük vaka defterine yazılır. Vaka
101
- görevi süreç defterine yazmaz; görev yardımcısı (`process_task_get { view: 'assistant' }`) çalışır ama `ai-suggestion` satırı
102
- yalnız öneri tablosuna düşer.
103
-
104
- Görünürlük: vakayı başlatan, görevi atanan ya da tamamlayan kişi `case_instance_get` ile okur; liste (`case_instance_list`)
105
- ve başkalarının vakaları `process.view-all` ister. Başlatma `process.start`, tanım yazımı `process.manage` ister.
106
-
107
- ## Süreçten vaka
108
-
109
- Süreç tanımında `case` düğümü yayındaki vakayı başlatır ve **beklemez** (akış devam eder):
110
-
111
- ```jsonc
112
- { "id": "sikayet-ac", "type": "case", "description": "Şikâyet vakasını açar.", "caseSlug": "musteri-sikayeti",
113
- "input": { "musteriCevabi": "'yok'" }, "output": "vars.sikayetVakasi" }
114
- ```
115
-
116
- Başlatan süreç örneğinin başlatanı, iş satırı süreç konusudur; `output` yoluna vaka kimliği yazılır, süreç defterine
117
- `case-started`. Bilinmeyen ya da yayınlanmamış slug tanım doğrulamasında `CaseUnknown`, çalışma anında düğüm hatası.
118
-
119
- ## CMMN XML
120
-
121
- `case_cmmn_get` CMMN 1.1 XML üretir (`zeyrek:` uzantısı atamayı, çok dilli ad/açıklamayı, varsayılanı ve sırayı taşır);
122
- `case_cmmn_update { xml | filePath }` içe aktarır: aynı slug varsa taslağına yazar, yoksa yeni tanım açar. `stage`, `humanTask`,
123
- `milestone` dışındaki öğeler (`processTask`, `caseTask`, olay dinleyicileri) ve DTD içeren XML 400'dür. Başka araçta
124
- çizilmiş vakanın atamaları uzantı taşımıyorsa içe aktarma sonrası `case_definition_patch` ile ekleyin.
125
-
126
- ## Lint
127
-
128
- | Kural | Ne zaman | Önem |
129
- |---|---|---|
130
- | CASE-001 | `onParts[].source` bir plan öğesi ya da vaka dosyası öğesi değil; `entry`/`exit` tanımsız sentry'ye bakıyor | block |
131
-
132
- Denetim `case_definition_create`, `case_definition_update`, `case_definition_patch`, `case_definition_publish` öncesinde ve
133
- `case_definition_preview`'da çalışır. Diğer model kuralları backend'dedir (422 `CaseInvalid` bulgu listesi).
134
-
135
- ## Hata sözlüğü
136
-
137
- | Kod | Anlamı | Ne yapılır |
138
- |---|---|---|
139
- | `CaseInvalid` (422) | Model kuralı ihlali; `errors[]` yol ve mesaj taşır | yolu `case_definition_patch` ile düzeltin |
140
- | `CaseSentryNotSatisfied` (422) | `enable` edilen öğenin giriş koşulu sağlanmıyor | kaynak öğeyi bitirin ya da `update-case-file` |
141
- | `InstanceStateTransitionNotAllowed` (409) | öğe ya da vaka bu eyleme uygun durumda değil | `case_instance_get` ile `availableActions`'a bakın |
142
- | `CaseUnknown` (422) | süreçteki `case` düğümü yayında olmayan vakaya bakıyor | vakayı yayınlayın |
143
- | `ReferencedByProcess` (422) | silinen vaka tanımına bir süreç `case` düğümüyle başvuruyor | önce süreci güncelleyin |
144
- | `InvalidOperation` (400) | vakası olan tanım silinemez | tanımı yerinde bırakın |
145
-
146
- ## Sık tuzaklar
147
-
148
- - **Sırayı vaka ile çizmek.** Adımlar belliyse süreç tanımı kullanın; vaka bekleme ve dallanmayı sentry'ye çevirir, okunması zorlaşır.
149
- - **`enable`'ı düzeltme sanmak.** 422 aldıysanız koşul sağlanmamıştır; tekrar denemek değil koşulu sağlamak gerekir.
150
- - **`repeatable` öğeyi giriş sentry'siz yazmak.** Model reddedilir; tekrar tetikleyicisiz sonsuz döngü olurdu.
151
- - **Vaka görevini `case_instance_update { complete }` ile kapatmaya çalışmak.** `complete` yalnız aşama içindir; görev
152
- `process_task_update` ile kapanır.
153
- - **`caseFile` öğesini tanımlamadan `ifPart`'ta kullanmak.** Tanımsız değer `undefined` okunur; öğeyi `caseFile[]`'a ekleyin.
@@ -1,185 +0,0 @@
1
- # Karar Rehberi — DMN karar tabloları
2
-
3
- Eşik, seviye, oran, uygunluk gibi **kuralları süreç tanımından ayırır**: iş birimi tabloyu değiştirir, süreç
4
- yeniden yayınlanmaz. Karar bir DMN 1.3 karar tablosu (`kind: table`) ya da tek bir FEEL ifadesidir
5
- (`kind: literal`). Süreçte `decision` düğümüyle çağrılır; tek başına `decision_preview` ile değerlendirilir.
6
- Karar **workflow değildir** (yan etkisi yoktur, veri okumaz — girdileri çağıran verir) ve **süreç değildir**
7
- (beklemez).
8
-
9
- ## Başlangıç
10
-
11
- 1. **Tabloyu yazın** — `decision_create { decision }`. Taslak sürüm oluşur. Gateway yazmadan önce DMN-001 ve
12
- DMN-002 denetimini çalıştırır (§Lint).
13
- 2. **Deneyin** — `decision_preview { id, inputs }`. Her sınır değerini ayrı deneyin (§Deneme).
14
- 3. **Yayınlayın** — `decision_publish { id }`. Motor yalnız aktif sürümü kullanır; production'a yayın yoktur
15
- (BPM-001).
16
- 4. **Süreçte kullanın** — `decision` düğümü (§Süreçte kullanım); tanımı `process_definition_preview` ile doğrulayın
17
- (bilinmeyen `decisionSlug` → `DecisionUnknown`).
18
-
19
- Düzeltmede tam modeli yeniden göndermeyin: `decision_get` → `decision_patch` (`/rules[id=<kural>]/…`).
20
- Başka modelleyiciden (Camunda Modeler, Trisotech) gelen tablo için `decision_dmn_update { filePath }`.
21
-
22
- ## Karar modeli
23
-
24
- ```jsonc
25
- {
26
- "slug": "siparis-onay-limitleri", // tekil; yayından sonra değişmez
27
- "name": { "tr": "Sipariş onay limitleri" },
28
- "variable": "siparisOnayLimitleri", // üst kararların gördüğü ad; yoksa slug'daki '-' → '_'
29
- "kind": "table", // table | literal
30
- "hitPolicy": "unique", // §İsabet politikaları
31
- "aggregation": null, // collect + tek çıktı: sum | min | max | count
32
- "requires": [], // DRD: önce değerlendirilecek alt kararlar (slug)
33
- "inputData": [], // { name, typeRef, source: "authority-limits", category }
34
- "inputs": [
35
- { "id": "tutar", "label": "Tutar", "expression": "tutar", "typeRef": "number" },
36
- { "id": "kategori", "label": "Kategori", "expression": "kategori", "typeRef": "string", "allowedValues": "\"makine\", \"sarf\"" }
37
- ],
38
- "outputs": [
39
- { "id": "seviye", "name": "seviye", "typeRef": "number", "allowedValues": "3, 2, 1", "defaultOutputEntry": "1" }
40
- ],
41
- "rules": [
42
- { "id": "kucuk", "description": "10 binin altı", "inputEntries": ["< 10000", "-"], "outputEntries": ["1"] },
43
- { "id": "orta", "inputEntries": ["[10000..100000)", "-"], "outputEntries": ["2"] },
44
- { "id": "buyuk", "inputEntries": [">= 100000", "-"], "outputEntries": ["3"] }
45
- ]
46
- }
47
- ```
48
-
49
- - `inputEntries[i]` `inputs[i]`'nin **tekli testidir**, `outputEntries[j]` `outputs[j]`'nin **FEEL ifadesidir**.
50
- Sütun sayısı eşleşmezse 422 `DecisionInvalid` (yol `/rules/{i}/inputEntries`).
51
- - `inputs[].expression` girdinin bağlamdaki adıdır ya da ifadesidir (`siparis.tutar`, `tutar * 1.2`).
52
- - Metin değerler FEEL'de **çift tırnaklıdır**: `"makine"`. Tırnaksız `makine` bir değişken adıdır ve `null` olur.
53
- - `typeRef`: `number`, `string`, `boolean`, `date`, `time`, `dateTime`, `dayTimeDuration`,
54
- `yearMonthDuration`, `list`, `context`. Dönüştürme yalnız metin girdiye uygulanır (`"2026-09-17"` → tarih).
55
- - Literal karar: `{ "kind": "literal", "literalExpression": "tutar * oran", "typeRef": "number" }`.
56
-
57
- ## İsabet politikaları
58
-
59
- | Politika | Ne döner | Ne zaman |
60
- |---|---|---|
61
- | `unique` | En çok bir kural; ikisi eşleşirse 422 `DecisionHitPolicyViolated` | Kurallar kesin ayrık (varsayılan) |
62
- | `any` | Eşleşenlerin çıktıları aynı olmalı, yoksa 422 | Aynı sonucu farklı yollardan veren kurallar |
63
- | `first` | Kural sırasındaki ilk eşleşme | "Özel durum önce, genel en sonda" |
64
- | `priority` | Çıktının `allowedValues` sırasına göre en yüksek (ilk yazılan) | Birden çok eşleşmede en katısı kazanır |
65
- | `collect` | Eşleşenlerin listesi; `aggregation` ile tek sayı | Puanlama, kontrol listesi |
66
- | `rule-order` | Eşleşenler kural sırasıyla | Sıralı öneriler |
67
- | `output-order` | Eşleşenler `priority` sırasıyla | Önceliğe göre sıralı liste |
68
-
69
- Tek çıktılı tabloda karar değeri çıktının kendisidir; çok çıktılıda `{ çıktıAdı: değer }`. Çok isabetli
70
- politikada değer listedir. Hiç kural eşleşmezse `defaultOutputEntry` olan çıktılar varsayılanı alır, yoksa `null`
71
- — `null` sonucu süreçte gateway koşulunu sessizce yanlış dala gönderebilir; ya varsayılan verin ya da son kurala
72
- joker (`-`) koyup `first` kullanın.
73
-
74
- ## FEEL
75
-
76
- **Tekli testler** (`inputEntries`):
77
-
78
- | Yazım | Anlamı |
79
- |---|---|
80
- | `-` ya da boş | her şey |
81
- | `< 100` · `>= 5` | karşılaştırma |
82
- | `[10..20)` · `]1..5]` | aralık; `[` `]` dahil, `(` `)` ya da ters köşe hariç |
83
- | `"makine"` · `3` · `null` · `esik` | eşitlik (değer ya da bağlamdaki ad) |
84
- | `"makine", "sarf"` | virgül = VEYA |
85
- | `not("makine", "sarf")` | hiçbiri |
86
- | `? > esik * 2` | `?` girdinin kendisi; ifade mantıksal döner |
87
-
88
- **İfadeler** (`outputEntries`, `expression`, `literalExpression`): `+ - * / **`; `= != < <= > >=`;
89
- `and`/`or` üç değerli (`true and null` → `null`); `x between 1 and 5`; `x in [1..5]`;
90
- `if … then … else …`; `for x in liste return x * 2`; `some x in liste satisfies x > 3`; liste filtresi
91
- `kalemler[tutar > 100]`, indeks `liste[1]` (1'den başlar), `liste[-1]` (son); yol `siparis.musteri.ad`; bağlam
92
- `{ ad: "x", tutar: 5 }`; zamansal değişmez `@"2026-09-17"`, `@"P3D"`.
93
-
94
- **Yerleşik işlevler** (tam liste; başkası DMN-002):
95
- `date`, `time`, `date and time`, `duration`, `years and months duration`, `string length`, `substring`,
96
- `substring before`, `substring after`, `upper case`, `lower case`, `contains`, `starts with`, `ends with`,
97
- `matches`, `replace`, `string`, `number`, `not`, `list contains`, `count`, `sum`, `product`, `min`, `max`, `mean`,
98
- `all`, `any`, `append`, `concatenate`, `flatten`, `reverse`, `distinct values`, `index of`, `get value`, `abs`,
99
- `floor`, `ceiling`, `decimal` (yarıdan çifte yuvarlar), `modulo`, `sqrt`, `odd`, `even`.
100
-
101
- Özellikler: tarihte `year month day weekday`, zamanda `hour minute second`, sürede `days hours minutes seconds`
102
- ve `years months`, aralıkta `start end`.
103
-
104
- **Yok:** `round up/down/half`, `sort`, `now()`/`today()` (bugünü girdi olarak verin), işlev tanımı, adlı
105
- argüman, `instance of`, BKM çağrısı, saat dilimli zaman. Sözdizimi hatası 422 `ExpressionInvalid`; tür uyuşmazlığı,
106
- sıfıra bölme ve tanımsız ad hata değil `null`'dır.
107
-
108
- ## DRD ve girdi verisi
109
-
110
- `requires: ["risk-skoru"]` alt kararı önce değerlendirir ve sonucunu `variable` adıyla (yoksa `risk_skoru`)
111
- bağlama ekler; üst tablonun sütunu `{ "expression": "risk_skoru" }` olur. Döngü yayında 422 `DecisionInvalid`;
112
- alt kararın aktif sürümü yoksa 422 `DecisionUnknown`. Silme: süreç başvuruyorsa 422 `ReferencedByProcess`,
113
- başka karar `requires` ile başvuruyorsa 422 `DecisionInvalid`.
114
-
115
- **Yetki limitleri:** `inputData: [{ "name": "limitler", "typeRef": "list", "source": "authority-limits",
116
- "category": "makine" }]` — girdi verilmezse `process_authority_limit_list` satırları
117
- `[{ subjectKind, subjectId, category, limit, currency }]` listesi olarak yüklenir. Tabloda
118
- `count(limitler[limit >= tutar])` gibi kullanılır.
119
-
120
- ## Süreçte kullanım
121
-
122
- ```jsonc
123
- { "id": "limit", "type": "decision", "description": "Onay seviyesini belirler",
124
- "decisionSlug": "siparis-onay-limitleri",
125
- "binding": "latest", // latest | deployed | "v:2" (sabit sürüm)
126
- "input": { "tutar": "vars.tutar", "kategori": "row.kategori" }, // Jint; yoksa vars + row
127
- "output": "vars.onay" } // yoksa her çıktı vars'a kendi adıyla
128
- ```
129
-
130
- Sonraki gateway'de `vars.onay.seviye >= 2` (çok çıktılı) ya da `vars.onay >= 2` (tek çıktılı). Değerlendirme
131
- hatası örneği `faulted` yapar; `process_instance_get { view: 'timeline' }` → `decision-evaluated`
132
- `{ decisionSlug, version, inputs, matchedRules, outputs }`. Tanım yayını karar yayınını beklemez ama motor
133
- aktif sürüm ister: önce kararı yayınlayın.
134
-
135
- ## Deneme
136
-
137
- `decision_preview { id, inputs, version? }` yan etkisizdir; `version` yoksa taslak (yoksa aktif), alt kararlar da
138
- taslak/son modelle çalışır. Yanıt `{ value, outputs, matchedRules, decisions[] }` — `decisions[]` DRD'deki her
139
- kararın girdisini ve eşleşen kuralını gösterir.
140
-
141
- Her kuralı en az bir kez tetikleyin ve **sınırları** ayrı deneyin: `[10000..100000)` için 9999, 10000, 99999,
142
- 100000. Aralık uçlarındaki `[`/`)` hatası en sık kusurdur; DMN-001 bunu yakalamaz (§Lint).
143
-
144
- ## DMN XML
145
-
146
- - `decision_dmn_get { id, outPath? }` kararı ve alt kararlarını DMN 1.3 XML'e yazar; çok dilli ad, `kind`,
147
- `variable`, `inputData` kaynağı `zeyrek:` uzantısıyla (`https://zeyrek.dev/dmn`) gidiş-dönüş kayıpsızdır.
148
- - `decision_dmn_update { xml | filePath }` DMN 1.3/1.2/1.1 içe aktarır: `decision id` → slug (küçük harf),
149
- var olan slug yeni taslak alır, yoksa oluşturulur; bir karar geçersizse hiçbiri yazılmaz. Kutulu bağlam/ilişki,
150
- BKM ve DMNDI desteklenmez. İçe aktardıktan sonra `decision_preview` — başka motorun FEEL işlevleri (ör.
151
- Camunda `round up`) içe aktarmada 422 ile reddedilir.
152
- - Ortamlar arası taşıma: kararlar deployment/merge zincirinde **yoktur**; dışa aktarıp hedef dalda içe aktarın.
153
-
154
- ## Lint
155
-
156
- | Kural | Ne | Şiddet |
157
- |---|---|---|
158
- | DMN-001 | `unique` tabloda iki kural her girdi sütununda aynı testi ya da `-` taşıyor → aynı girdi ikisini eşler | block (istek gitmez) |
159
- | DMN-002 | FEEL alt kümesinde olmayan işlev çağrısı | warn (istek gider; backend yazımı 422 ile reddeder) |
160
-
161
- DMN-001 temkinlidir: yalnız **kesin** çakışmayı yakalar. `< 20` ile `< 10` ya da `[1..5]` ile `[5..9]` kesişir ama
162
- yakalanmaz — `decision_preview` ile sınır değeri deneyin. Bilinçli istisna `policyOverride: true`.
163
-
164
- ## Hata sözlüğü
165
-
166
- | Kod | Anlamı | Ne yapılır |
167
- |---|---|---|
168
- | 422 `DecisionHitPolicyViolated` | unique/any tabloda çakışan kurallar (yanıtta kural kimlikleri) | Kuralları ayırın ya da politikayı değiştirin |
169
- | 422 `ExpressionInvalid` | FEEL sözdizimi ya da bilinmeyen işlev (yol `/rules/{i}/…`) | §FEEL listesine bakın |
170
- | 422 `DecisionInvalid` | Model hatası (sütun sayısı, politika, döngü) | Yoldaki alanı düzeltin |
171
- | 422 `DecisionUnknown` | `requires` ya da süreç `decisionSlug`'ı aktif kararı bulamadı | Alt kararı yayınlayın |
172
- | 422 `ReferencedByProcess` | Silinmek istenen karara süreç başvuruyor | Önce süreci değiştirin |
173
-
174
- ## Sık tuzaklar
175
-
176
- - **Tırnaksız metin:** `inputEntries: ["makine"]` değil `["\"makine\""]`. Tırnaksız ad bağlamda aranır, `null` olur ve
177
- kural hiç eşleşmez.
178
- - **Sayı metin geliyor:** satırdaki `"180000"` metni `number` sütunda karşılaştırılamaz; `typeRef: "number"` verin ya da
179
- düğüm girdisinde `Number(row.tutar)`.
180
- - **Boşluk bırakan aralıklar:** `< 10000` ve `(10000..100000)` → tam 10000 hiçbir kurala düşmez.
181
- - **`null` sonuç:** eşleşme yoksa varsayılan yoksa `null` döner; süreçte koşul `vars.onay.seviye >= 2` `false`
182
- olur, hata vermez.
183
- - **Bugünün tarihi:** FEEL'de `today()` yok; süreç düğümü girdisinde `{ "bugun": "new Date().toISOString().slice(0, 10)" }`.
184
- - **Taslakla çalıştığını sanmak:** `decision_preview` taslağı, süreç motoru aktif sürümü kullanır — yayınlamayı unutmak
185
- "önizlemede doğruydu, süreçte eski sonuç" demektir.
@@ -1,193 +0,0 @@
1
- # Mobil mizanpaj — uygulamanın her yeri tek dil
2
-
3
- Bir mobil ekran kurmadan önce bunu okuyun. Buradaki kurallar zevk meselesi değildir, **ölçülür**:
4
-
5
- - **Doğru varsayılan.** Gateway iskeleti kendisi doğru kurar (`mobile_app_create`, `page_create`, yeni
6
- düğümlerin boşluğu).
7
- - **Yazımda uyarı.** Yazım yanıtında sözleşme dışı durum `MOB-015…021` olarak gelir (`layoutWarnings`).
8
- - **Çizimde ölçüm.** `page_screenshot({ layoutReport: true })` sonucu sayıyla ölçer (`layoutSummary.alignment`).
9
-
10
- Temel mobil bilgi (flex-only yerleşim, tipli stil, gezinme, adımlar) için `platform_guide('mobile')`.
11
- Altın örnek: `ngapps://examples/mobile-form-screen`.
12
-
13
- ## Sözleşme
14
-
15
- Birim dp. Ölçek **4 · 8 · 16 · 24 · 32**. `gap` jetonları `small` 8, `medium` 16, `large` 24.
16
-
17
- | # | Konu | Kural | Bulgu |
18
- |---|---|---|---|
19
- | S1 | Üst güvenli alan | Tek yerde. Kabuklu uygulamada kabukta (`safe-area` `edges: 'top'` içinde app-bar). Kabuksuz sayfada ilk öğe `safe-area` `top`. Sayfa kabuğun payını ikinci kez vermez | MOB-015 |
20
- | S2 | Alt güvenli alan | Formun gönder düğmesi akışta, formun sonunda durur. Ekrana sabit alt eylem gerekiyorsa `floating-container` (`respectSafeArea`) kullanılır, ayrıntısı §Bileşen dizgisi'nde. Akışın sonunda pay gerekiyorsa `safe-area` `bottom` (`all` değil) | — |
21
- | S3 | Kaydırma | Sayfa kökü kaydırır, `size: 'shrink'`. `scroll-view` yalnız gerekçeyle; iç içe dikey kaydırıcı yok | MOB-016 |
22
- | S4 | Ekran kenarı | Yatayda ve üstte **16**, tek yerde. Kabuklu sayfada slot'un margin'i verir. Kabuksuz sayfada yatayı kökün padding'i verir; üstteki 16, tepedeki `safe-area`'dan sonraki `gap`tir. Bileşenlere yazılmaz | ölçüm `gutter` |
23
- | S5 | Aralık | Kardeşler arası boşluk yalnız ebeveynin `gap`'i; çocuklar `marginType: 'none'`. Bölümler arası `large`, bölüm içi alanlar `medium`, satır içi öğeler `small` | MOB-019, MOB-021 |
24
- | S6 | Saydam sarmalayıcı | Yalnız davranış ekleyen kap (`tooltip`, zeminsiz grup kabı) içeriği içeri itmez: `paddingType: 'none'`, `marginType: 'none'`, `widthType: 'fill'` | MOB-019 |
25
- | S7 | Yüzey | Görünen grup (kart) iç boşluğu 16, yarıçap `lg`, 1 dp kenarlık ya da zemin (ikisi birden değil). Yüzeyin içeriği bilerek içeride durur | MOB-021 |
26
- | S8 | Genişlik | Tam genişlik öğesi (alan, birincil düğme, yüzey) `widthType: 'fill'`. Aynı sütundaki kardeşlerin sol ve sağ kenarı eşittir | MOB-019, MOB-020 |
27
- | S9 | Kap yönü | Dikey grup `direction: 'column'` + `horizontalAlign: 'stretch'`. **Yönü yazılmamış container/form satırdır.** Satır yalnız gerçekten yan yana dizilen öğeler için | MOB-020 |
28
- | S10 | Bileşen içi | Alan yüksekliği, iç boşluk, etiket aralığı ve yarıçap temadan (`--ng-form-*`) gelir; alanlara padding ya da yarıçap yazılmaz | — |
29
- | S11 | Yarıçap, renk, yazı | Yarıçap ölçek adıyla (`sm`, `md`, `lg`, `pill`), renk tanımlı jetonla, yazı boyu `text`'in `type` seviyesiyle (`h1`…`h4`, `p`, `small`, `label`). Ham px yok | MOB-021 |
30
- | S12 | App-bar | Ekranda tek app-bar, ilk çizilen öğe. Kabuk veriyorsa sayfa eklemez; başlık kabuğun app-bar'ına bağlanır | MOB-017 |
31
- | S13 | Boş kap | Çalışma anında boş kalan kap bırakılmaz (tepedeki `safe-area` payı hariç) | MOB-018 |
32
-
33
- ## İskelet ağaçları
34
-
35
- Aşağıdaki iskeleti `mobile_app_create` ile mobil `page_create` kendisi kurar. Elle kuruyorsanız bu biçimi
36
- kullanın.
37
-
38
- **Kabuk (layout).** `shell_root` düz bir `container`'dır. Padding tipi yazılmazsa runtime ona 10 dp verir ve
39
- app-bar kenardan kopar.
40
-
41
- ```
42
- container shell_root direction:column gap:none size:shrink appearance.paddingType:none heightType:fill
43
- ├─ safe-area edges:top
44
- │ └─ app-bar (başlık, leading, menuTarget)
45
- ├─ slot appearance.marginType:custom marginValues:{ top:16, right:16, bottom:0, left:16 } heightType:fill
46
- └─ drawer (çekmeceli kabukta)
47
- ```
48
-
49
- **Kabuklu sayfa.** Pay ve kenar boşluğu kabuktan gelir.
50
-
51
- ```
52
- container page_container direction:column horizontalAlign:stretch size:shrink gap:medium paddingType:none
53
- └─ … içerik
54
- ```
55
-
56
- **Kabuksuz sayfa** (giriş, karşılama, izin). `isWrapper` yalnız margin'i sıfırlar, kökün padding'i çizilir.
57
-
58
- ```
59
- container page_container direction:column horizontalAlign:stretch size:shrink gap:medium
60
- appearance.paddingType:custom paddingValues:{ top:0, right:16, bottom:0, left:16 }
61
- ├─ safe-area edges:top (boş: durum çubuğu payı + gap kadar üst boşluk)
62
- └─ … içerik
63
- ```
64
-
65
- **Form ekranı.** Gönder düğmesi formun içinde, akışın sonundadır. Form doğrulaması yalnız bu yolda koşar.
66
-
67
- ```
68
- page_container
69
- ├─ text type:h2 (başlık)
70
- └─ form direction:column horizontalAlign:stretch gap:large paddingType:none marginType:none widthType:fill
71
- ├─ … bölümler
72
- └─ button type:submit widthType:fill
73
- ```
74
-
75
- ## Bileşen dizgisi
76
-
77
- Bir ekran yukarıdan aşağıya şu sırayla kurulur: **başlık → bölümler → eylem.**
78
-
79
- - **Başlık:** `text` `type: 'h2'`, bölüm başlığı `type: 'h4'`. `typographyStyle.fontSize` yazılmaz.
80
- - **Bölüm iki türlüdür:**
81
- - *Görünen grup (yüzey kabı):* `container` + `surfaceStyle` (zemin ya da kenarlık, `radius: 'lg'`) +
82
- `paddingType: 'custom'` ve `paddingValue: 16`. İçeriği bilerek 16 içeride durur; kabın kendisi kardeşleriyle
83
- hizalıdır.
84
- - *Görünmeyen grup (saydam kap):* `container` `direction: 'column'`, `paddingType: 'none'`,
85
- `marginType: 'none'`. İçerik kardeşleriyle aynı kenarda başlar.
86
-
87
- Başlığı (`title`) olan ama zemini olmayan kap saydam kap gibi davranmalıdır. Varsayılan 10 dp padding'i
88
- içeriği kaydırır (MOB-019). Ya yüzey verin ya da padding'i `none` yapın.
89
- - **`card` çocuk almaz.** Kart görünümlü alan grubu `container` + `surfaceStyle` ile kurulur.
90
- - **`tooltip`** dokunulan içeriği sarar ve saydamdır. Runtime ona varsayılan boşluk vermez; gateway yine de yeni
91
- tooltip'e `paddingType: 'none'` ve `widthType: 'fill'` yazar. 2026-09-29'dan önce derlenmiş uygulamada
92
- boşluksuz tooltip'in içeriği 14 dp içeri kayar ve 28 dp daralır; açık değer onu da korur.
93
- - **Satır (`direction: 'row'`)** yan yana dizilen öğeler içindir: arama kutusu + düğme, ikon + metin,
94
- "Ekle / Sil" düğmeleri. Form alanlarını alt alta dizmek için satır kullanılmaz.
95
- - **Eylem:** birincil düğme tam genişlik (`widthType: 'fill'`). İkincil eylem `variant: 'text'` ya da
96
- `'outline'`; metin görünümlü düğme içerik genişliğinde durabilir.
97
- - **Ekrana sabit eylem** (`floating-container`, `anchor: 'bottom-center'`, `fullWidth`, `respectSafeArea`) iki
98
- şeye dikkat ister:
99
- - *Yerleşim.* `fullWidth` ekran kenarına dayanır; S4 kenarı için içine `paddingType: 'custom'` +
100
- `paddingValues` yatay 16 olan bir kap koyun, `floating-container`'ın kendisine `paddingType: 'none'`
101
- yazın (yoksa akışta 20 dp boş şerit kalır). Sabit düğme uzun formun son alanını örter; akışın sonuna
102
- düğme boyu kadar boşluk bırakın.
103
- - *Gönderim.* Formun dışındaki `type: 'submit'` + `formId` düğmesi formun olayını tetikler ama **form
104
- doğrulamasını koşmaz** (bilinen açık). Doğrulanan form için gönder düğmesi formun içinde kalmalı.
105
-
106
- ## Boşluk
107
-
108
- Aralığın tek kaynağı ebeveynin `gap`'idir. Runtime'ın varsayılanları katmanlarda birikir: margin tipi
109
- yazılmamış her düğüm 4 dp, bırakılabilir düğüm ayrıca 10 dp padding alır. İki kat iç içe zeminsiz kap, içeriği
110
- 28 dp kaydırır.
111
-
112
- - **Gateway yeni düğüme `marginType: 'none'` yazar** (`page_create`, `page_schema_patch`,
113
- `page_schema_validate`) ve bunu `gatewayNormalized`'da söyler.
114
- - Kardeşleri varsayılan margin'le duran eski bir kaba eklenen düğüme dokunulmaz; yeni düğüm eskilerden
115
- 4 dp kayardı. Kabı sözleşmeye taşımak için bütün çocuklarına `marginType: 'none'` yazın.
116
- - `layout_schema_patch` ve `component_schema_patch` bu varsayılanı yazmaz. Kabukta ya da widget'ta eklenen
117
- düğüme boşluğu siz yazın.
118
- - **Ritim:**
119
- - bölümler arası `gap: 'large'` (24);
120
- - bölüm içi alanlar `gap: 'medium'` (16);
121
- - satır içi öğeler `gap: 'small'` (8).
122
-
123
- - **Özel değer** (`custom`) ve sayısal `gap` yalnız ölçekten seçilir: 0, 4, 8, 16, 24, 32 (MOB-021).
124
-
125
- ## Genişlik ve hiza
126
-
127
- - **`horizontalAlign: 'stretch'`** olan sütun, çocuklarını `widthType` yazılmasa da tam genişlik gerer. Öteki
128
- hizalarda tam genişlik öğesine `widthType: 'fill'` yazın. Aynı sütunda bir kısmı `fill`, bir kısmı değilse
129
- sağ kenar hizadan kopar (MOB-020).
130
- - **Yönü yazılmamış `container` ve `form` satırdır.** Alanlar yan yana sıkışır; `direction: 'column'` yazın.
131
- `safe-area` ve `scroll-view` sütun doğar.
132
- - **Ortalanmış ekran** (giriş, boş durum) için sütuna `horizontalAlign: 'center'` verin. Bu kapsamda kenar
133
- eşitliği aranmaz.
134
-
135
- ## Kenarlık, yarıçap, yazı
136
-
137
- - **Yüzey:** `surfaceStyle` ile verilir.
138
- - zemin `background: 'var(--ng-…)'` (temada tanımlı jeton);
139
- - kenarlık `borderTop…borderLeft` 1 dp, renk `border` jetonu;
140
- - yarıçap `radius: 'lg'`.
141
-
142
- Zemin ve kenarlığı birlikte kullanmayın; biri yeter.
143
- - **Yarıçap ölçeği:** kartlar `lg`, çip ve rozetler `pill`, alan ve düğmeler temadan. Ham `'10px'` yazılmaz.
144
- - **Yazı:** `text` `type` seviyesi.
145
- - **Tasarım sistemi çapında görünüm** (bütün kartlar, bütün düğmeler) temadan yönetilir. Ölçekler, adlı ön
146
- ayarlar ve yeni düğümlerin başlangıç değerleri `platform_guide('theme')`'dadır. Aynı değer tek tek düğümlere
147
- kopyalanmaz. Temanın eski `componentStyles` alanı emeklidir.
148
-
149
- ## Kaydırma
150
-
151
- Sayfa kökü her zaman kaydırır: barındırıcı sayfayı bir kaydırıcı içinde çizer.
152
-
153
- `scroll-view` yalnız şu gerekçelerle eklenir:
154
-
155
- - `refreshable` (çekerek yenile);
156
- - `stickyHeader` ya da `states.isSticky` çocuk (yapışkan başlık);
157
- - `horizontal` (yatay şerit);
158
- - `heightType: 'fixed'` (sabit boylu iç liste).
159
-
160
- Gerekçesiz ya da iç içe dikey kaydırıcı jestleri çakıştırır (MOB-016). Kökün `size: 'grow'`'u çocukları ekran
161
- boyunca eşit böler ve kısa içerik üst üste biner. Yapışkan başlık ve ekrana sabit içerik için
162
- `platform_guide('mobile')` §Ekrana sabit içerik.
163
-
164
- ## Doğrulama
165
-
166
- Bir ekranı bitirince iki çağrı yapın:
167
-
168
- 1. **`page_schema_validate`** (kuru koşu): `layoutWarnings`'te MOB-015…021 bulgusu olmamalı.
169
- - Yazım araçları (`page_schema_patch`, `layout_schema_patch`) yalnız o yazımın **getirdiği** bulguyu söyler.
170
- - Sayfanın bütün durumunu kuru koşu verir.
171
- 2. **`page_screenshot({ layoutReport: true })`:** `layoutSummary.alignment` şu değerleri vermeli.
172
-
173
- | Alan | Temiz değer | Anlamı |
174
- |---|---|---|
175
- | `gutter` | 16 | ekran kenarı boşluğu (sol = sağ) |
176
- | `leftEdges` | tek küme | aynı kapsamdaki geniş içeriğin sol kenarları |
177
- | `surfaces` | `[]` | iç hizası bozuk yüzey kabı yok |
178
- | `widthOutliers` | `[]` | sağ kenarı sapan geniş öğe yok (`insetLeft`/`insetRight` dp) |
179
- | `offScaleGaps` | `[]` | ardışık öğeler arası boşluk ölçekte |
180
-
181
- İki kaynak aynı şeyi söyler. MOB-019'un şemadan öngördüğü dp farkı, `leftEdges` kümeleri arasındaki farktır.
182
-
183
- ## Bulgu → reçete
184
-
185
- | Kod | Ne diyor | Ne yapılır |
186
- |---|---|---|
187
- | MOB-015 | Üst pay eksik ya da çift | Kabuksuz sayfaya `safe-area` `top`. Kabuğu payı vermiyorsa kabukta app-bar'ı `safe-area` `top` içine alın. Kabuk veriyorsa sayfadaki `top`/`all` güvenli alanı kaldırın |
188
- | MOB-016 | Kaydırma tek yerde değil | Kök `size: 'shrink'`. Gerekçesiz `scroll-view`'ı kaldırın ya da gerekçesini verin. İç içe olanda içtekine `fixed` boy verin |
189
- | MOB-017 | İkinci ya da yanlış yerde app-bar | Kabuk veriyorsa sayfadakini silin, başlığı kabuğa bağlayın. Kabuksuzda app-bar'ı ilk sıraya (ya da tepedeki `safe-area`'nın içine) taşıyın |
190
- | MOB-018 | Boş kap | İçeriğini ekleyin ya da silin |
191
- | MOB-019 | Kenar kayması (dp) | Bulgunun hedefi içeriği iten kaptır. Görünen grup olacaksa yüzey verin, olmayacaksa `paddingType: 'none'` + `marginType: 'none'`. Hedef öğenin kendisiyse margin'ini kardeşleriyle aynı yapın |
192
- | MOB-020 | Genişlik tutarsız | Öğeye `widthType: 'fill'`. Yönü yazılmamış kaba `direction: 'column'` + `horizontalAlign: 'stretch'` |
193
- | MOB-021 | Ölçek dışı değer | Boşluğu ve sayısal gap'i 0/4/8/16/24/32'den, yarıçapı `sm`/`md`/`lg`/`pill`'den, yazı boyunu `text` `type`'tan seçin |