@appaflytech/zeyrek-ai-mcp 0.0.62 → 0.0.63

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 (41) hide show
  1. package/.env.example +6 -0
  2. package/dist/config.js +2 -0
  3. package/dist/knowledge/backendConstraints.js +2 -2
  4. package/dist/knowledge/mobileStore.js +24 -4
  5. package/dist/knowledge/normalize.js +10 -0
  6. package/dist/knowledge/platform/mobileLayoutLint.js +8 -0
  7. package/dist/knowledge/platform/mobileRules.js +6 -0
  8. package/dist/knowledge/rules.js +89 -0
  9. package/dist/observability/gapSink.js +43 -0
  10. package/dist/platform/argumentAliases.js +6 -0
  11. package/dist/platform/capture/actions.js +71 -2
  12. package/dist/platform/capture/capture.js +5 -2
  13. package/dist/platform/responses.js +5 -2
  14. package/dist/platform/writeDiff.js +52 -1
  15. package/dist/resources/examples/middleware-password-reset.json +1281 -0
  16. package/dist/resources/examples/mobile-reorder-persist.json +33 -7
  17. package/dist/resources/examples/workflow-email-step.json +67 -0
  18. package/dist/resources/guides/deployment.md +13 -1
  19. package/dist/resources/guides/entity.md +7 -0
  20. package/dist/resources/guides/expressions.md +5 -0
  21. package/dist/resources/guides/getting-started.md +15 -30
  22. package/dist/resources/guides/microservice.md +30 -2
  23. package/dist/resources/guides/middleware.md +83 -3
  24. package/dist/resources/guides/mobile-layout.md +35 -3
  25. package/dist/resources/guides/mobile-publish.md +33 -1
  26. package/dist/resources/guides/mobile-steps.md +12 -2
  27. package/dist/resources/guides/mobile.md +11 -8
  28. package/dist/resources/guides/page.md +28 -3
  29. package/dist/resources/guides/workflow.md +30 -1
  30. package/dist/resources/schema-fingerprint.json +2 -2
  31. package/dist/tools/applications.js +6 -3
  32. package/dist/tools/common.js +8 -0
  33. package/dist/tools/designSchemaPatch.js +4 -1
  34. package/dist/tools/flows.js +14 -4
  35. package/dist/tools/layouts.js +3 -1
  36. package/dist/tools/microservices.js +8 -2
  37. package/dist/tools/mobileStore.js +13 -2
  38. package/dist/tools/pages.js +27 -12
  39. package/dist/tools/platformInfo.js +15 -6
  40. package/dist/tools/workflows.js +4 -2
  41. package/package.json +1 -1
@@ -2,6 +2,7 @@ import { listKnowledgeFiles, readKnowledgeFile } from '../resources/knowledge.js
2
2
  import { readToolResource } from '../resources/read.js';
3
3
  import { splitGuideSections } from '../knowledge/guideSections.js';
4
4
  import { PlatformApiError } from '../platform/errors.js';
5
+ import { deliverGapReport } from '../observability/gapSink.js';
5
6
  import { logCapabilityGap } from '../observability/trace.js';
6
7
  import { handle } from '../platform/responses.js';
7
8
  import { readOnly } from './common.js';
@@ -174,9 +175,9 @@ export function registerPlatformTools(server, platform) {
174
175
  // hoşgörülüdür; çeviri yapıldığında yanıt bunu normalizedFrom ile söyler.
175
176
  server.registerTool('platform_gap_report', {
176
177
  title: 'Kabiliyet boşluğu bildir',
177
- description: "Yapmak İSTEDİĞİNİZ ama platform desteklemediği için yapamadığınız her noktada BUNU ÇAĞIRIN — tasarımı sessizce küçültmeyin. Bu çağrı platforma gitmez, yalnızca günlüğe 'KABİLİYET BOŞLUĞU' bloğu yazar; hata günlüğünde görünmeyen bu kayıtlar ürün yol haritasının girdisidir. Önce rehbere bakıp (platform_guide; hazır komponent yetmiyorsa tek seferlik için 'html' kaçış kapısı, kalıcı bir ihtiyaç içinse 'external-component' — kendi komponentinizi yazıp yayınlayabilirsiniz) gerçekten desteklenmediğinden emin olun: desteklenen bir şeyi 'yok' diye bildirmek yanlış yol haritası üretir.",
178
+ description: "Yapmak İSTEDİĞİNİZ ama platform desteklemediği için yapamadığınız her noktada BUNU ÇAĞIRIN — tasarımı sessizce küçültmeyin. Bu çağrı platform API'sine gitmez: günlüğe 'KABİLİYET BOŞLUĞU' bloğu yazar ve GAP_REPORT_WEBHOOK_URL tanımlıysa kaydı ekibin webhook'una gönderir; yanıttaki delivered kaydın ekibe ulaşıp ulaşmadığını söyler (webhook · log-only · webhook-failed). Hata günlüğünde görünmeyen bu kayıtlar ürün yol haritasının girdisidir. Önce rehbere bakıp (platform_guide; hazır komponent yetmiyorsa tek seferlik için 'html' kaçış kapısı, kalıcı bir ihtiyaç içinse 'external-component' — kendi komponentinizi yazıp yayınlayabilirsiniz) gerçekten desteklenmediğinden emin olun: desteklenen bir şeyi 'yok' diye bildirmek yanlış yol haritası üretir.",
178
179
  inputSchema: {
179
- project: z.string().min(1).optional().describe("Boşluğun görüldüğü proje (ad ya da slug); kayda yazılır. Bu çağrı platforma gitmez, proje yalnız bağlamdır"),
180
+ project: z.string().min(1).optional().describe("Boşluğun görüldüğü proje (ad ya da slug); kayda yazılır. Platform API'sine gitmez, proje yalnız bağlamdır"),
180
181
  goal: z.string().min(1).optional().describe('Ne yapmak istediniz — kullanıcıya görünen sonuç olarak yazın ("randevu listesini hasta adına göre süzmek"). Eşanlamlı kabul edilir: title · summary · what.'),
181
182
  blocker: z.string().min(1).optional().describe('Neden yapamadınız — hangi kabiliyetin eksik olduğu ("uçta X yok", "komponentte Y prop\'u yok"). Eşanlamlı kabul edilir: reason · problem · missing · description.'),
182
183
  severity: z.string().optional().describe("YOL HARİTASINDAKİ SIRAYI BU ALAN BELİRLER, doldurun. blocker: özellik hiç yapılamadı · workaround: daha kötü bir yolla yapıldı · cosmetic: yalnız görsel/ergonomik kayıp. Eşanlamlılar çevrilir (critical/high/blocking→blocker, medium/major→workaround, low/minor/nit→cosmetic). TANINMAYAN değer reddedilir; verilmezse kayıt düşer ama yanıt 'incomplete' ile uyarır ve bildirim orta kovaya yazılır."),
@@ -191,22 +192,30 @@ export function registerPlatformTools(server, platform) {
191
192
  missing: z.string().optional().describe('blocker ile aynı alan (eşanlamlı)'),
192
193
  description: z.string().optional().describe('blocker ile aynı alan (eşanlamlı)')
193
194
  },
194
- annotations: readOnly
195
+ annotations: { ...readOnly, openWorldHint: true }
195
196
  }, handle(config, async (input) => {
196
197
  const gap = normalizeGapReport(input);
197
- logCapabilityGap({ goal: gap.goal, blocker: gap.blocker, severity: gap.severity, module: gap.module, attempted: gap.attempted, workaround: gap.workaround, project: input.project });
198
+ const record = { goal: gap.goal, blocker: gap.blocker, severity: gap.severity, module: gap.module, attempted: gap.attempted, workaround: gap.workaround, project: input.project };
199
+ logCapabilityGap(record);
200
+ const delivered = await deliverGapReport(config.gapReportWebhookUrl, record);
201
+ const deliveryNote = {
202
+ webhook: 'Günlüğe yazıldı ve ekibe iletildi.',
203
+ 'log-only': 'Yalnız bu makinedeki günlüğe yazıldı — ekibe ulaşmadı (GAP_REPORT_WEBHOOK_URL tanımlı değil).',
204
+ 'webhook-failed': "Ekibin webhook'una ulaşılamadı, kayıt bu makinedeki günlükte duruyor."
205
+ }[delivered];
198
206
  return {
199
207
  recorded: true,
208
+ delivered,
200
209
  ...(input.project ? { project: input.project } : {}),
201
210
  severity: gap.severity,
202
211
  module: gap.module ?? null,
203
212
  ...(Object.keys(gap.normalizedFrom).length > 0 ? { normalizedFrom: gap.normalizedFrom } : {}),
204
213
  ...(gap.incomplete.length > 0 ? { incomplete: gap.incomplete } : {}),
205
214
  note: gap.incomplete.length > 0
206
- ? `Günlüğe yazıldı ama eksik: ${gap.incomplete.join(', ')}.`
215
+ ? `${deliveryNote} Kayıt eksik: ${gap.incomplete.join(', ')}.`
207
216
  + (gap.incomplete.includes('severity') ? ` Şiddet verilmediği için kayıt '${gap.severity}' olarak düştü — yol haritasındaki sırayı bu alan belirler, blocker'sa bunu açıkça yazın.` : '')
208
217
  + ' Bir sonraki bildirimde bu alanları da doldurun — eksik kayıt yol haritasında sırasını kaybeder. Kullanıcıya da tek cümleyle söyleyin: neyi yapamadınız ve yerine ne yaptınız.'
209
- : 'Günlüğe yazıldı. Kullanıcıya da tek cümleyle söyleyin: neyi yapamadınız ve yerine ne yaptınız.'
218
+ : `${deliveryNote} Kullanıcıya da tek cümleyle söyleyin: neyi yapamadınız ve yerine ne yaptınız.`
210
219
  };
211
220
  }));
212
221
  }
@@ -1,4 +1,4 @@
1
- import { guid, projectParam, environmentParam, definitionParam, pagingParams, readOnly, writes, updates, destructive, microOps, languageParam } from './common.js';
1
+ import { guid, projectParam, environmentParam, definitionParam, pagingParams, readOnly, writes, updates, destructive, microOps, languageParam, unchangedPatch } from './common.js';
2
2
  import { normalizeWorkflowDefinition, withNormalization } from '../knowledge/normalize.js';
3
3
  import { evaluatePolicy, enforcePolicy, attachFindings } from '../knowledge/policy.js';
4
4
  import { workflowOutline, resolvePart, resolvePatchOperations } from '../knowledge/outlines.js';
@@ -224,6 +224,8 @@ export function registerWorkflowTools(server, platform) {
224
224
  // Gövde değil FARK gönderilir: gateway normalizasyonları da op'a çevrilsin diye net diff
225
225
  // okunan kayıt ile son hâl arasından hesaplanır (tam PUT yok, yalnız değişen alanlar yazılır).
226
226
  const netOps = fastJsonPatch.compare(definition, patched);
227
+ if (netOps.length === 0)
228
+ return attachFindings(unchangedPatch(operations.length), findings);
227
229
  const saved = await platform.tenant('PATCH', project, `/workflows/${applicationId}/${id}`, {
228
230
  environment,
229
231
  body: { baseVersion: baseVersionOf(definition, 'workflow_get'), ops: netOps }
@@ -272,7 +274,7 @@ export function registerWorkflowTools(server, platform) {
272
274
  }));
273
275
  server.registerTool('workflow_step_schema', {
274
276
  title: 'Step şeması üret',
275
- description: "Verilen step tanımı için girdi/çıktı şemasını üretir (parameterScheme / returnScheme); step yazarken definition'ı doğrulamanın en hızlı yolu. type:'workflow' adımında (rule.workflowId) çağrılan akışın parametre ve dönüş DTO'sunu döner — alt akışa girdi YALNIZ rule.expression ile geçer, nesne literalinin anahtarları bu parameterScheme'in alanlarıdır (WF-032; platform_guide('workflow') §Workflow adımı). 'workflow' adımında returnBehavior çağrılan akışın dönüş biçimidir (array → liste). returnScheme adımın GÖVDESİDİR; koşumda her adım { data, meta, error } zarfındadır — 'http' adımında gövde tipsizdir (<adım>.data), durum kodu <adım>.meta.httpStatusCode. ŞEMA ALAN ADLARINI VERİR, HANGİ ALANIN ÇALIŞTIĞINI DEĞİL — iki ölçülmüş sapma (2026-09-16): (1) 'workflow' adımında workflowId boşken parameterScheme/returnScheme boş döner ve şema girdinin rule.expression ile bağlandığını söylemez; (2) 'email' adımında şemanın gösterdiği alıcı adı çalışmaz (36/W-6). Sözleşmenin ölçülmüş hâli: ngapps://examples/workflow-http-step · workflow-call-workflow · workflow-loop-step ve platform_guide('workflow').",
277
+ description: "Verilen step tanımı için girdi/çıktı şemasını üretir (parameterScheme / returnScheme); step yazarken definition'ı doğrulamanın en hızlı yolu. type:'workflow' adımında (rule.workflowId) çağrılan akışın parametre ve dönüş DTO'sunu döner — alt akışa girdi YALNIZ rule.expression ile geçer, nesne literalinin anahtarları bu parameterScheme'in alanlarıdır (WF-032; platform_guide('workflow') §Workflow adımı). 'workflow' adımında returnBehavior çağrılan akışın dönüş biçimidir (array → liste). returnScheme adımın GÖVDESİDİR; koşumda her adım { data, meta, error } zarfındadır — 'http' adımında gövde tipsizdir (<adım>.data), durum kodu <adım>.meta.httpStatusCode. ŞEMA ALAN ADLARINI VERİR, HANGİ ALANIN ÇALIŞTIĞINI DEĞİL — iki ölçülmüş sapma (2026-09-16): (1) 'workflow' adımında workflowId boşken parameterScheme/returnScheme boş döner ve şema girdinin rule.expression ile bağlandığını söylemez; (2) 'email' adımında alıcı YALNIZ rule.expression ile verilir ve { to, cc, bcc } adres dizgisi listeleri döndürür — \"({ to: [input.email] })\"; şemadaki expression.to/cc/bcc bu ifadenin döndürdüğü şekildir, kural düzeyinde send/toMail/sendTo yazılırsa platform atar (WF-037; platform_guide('workflow') §Email adımı). Sözleşmenin ölçülmüş hâli: ngapps://examples/workflow-http-step · workflow-call-workflow · workflow-loop-step · workflow-email-step ve platform_guide('workflow').",
276
278
  inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, id: guid, step: definitionParam },
277
279
  annotations: readOnly
278
280
  }, handle(config, ({ project, environment, applicationId, id, step }) => platform.tenant('POST', project, `/workflows/${applicationId}/${id}/steps/schema`, { environment, body: step })));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appaflytech/zeyrek-ai-mcp",
3
- "version": "0.0.62",
3
+ "version": "0.0.63",
4
4
  "type": "module",
5
5
  "description": "Zeyrek (NgApps) platform APIs as MCP tools — data, logic and Studio design surface in one gateway",
6
6
  "license": "UNLICENSED",