@appaflytech/zeyrek-ai-mcp 0.0.3 → 0.0.5

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 (35) hide show
  1. package/.env.example +27 -8
  2. package/.env.production.example +44 -0
  3. package/README.md +254 -186
  4. package/dist/config.js +113 -47
  5. package/dist/knowledge/componentCatalog.js +474 -31
  6. package/dist/knowledge/componentEvents.js +150 -12
  7. package/dist/knowledge/errorPath.js +64 -0
  8. package/dist/knowledge/normalize.js +12 -1
  9. package/dist/knowledge/outlines.js +6 -0
  10. package/dist/knowledge/rules.js +184 -3
  11. package/dist/knowledge/styleResolve.js +485 -0
  12. package/dist/observability/trace.js +4 -0
  13. package/dist/platform/http.js +3 -0
  14. package/dist/platform/responses.js +80 -4
  15. package/dist/platform/screenshot.js +106 -0
  16. package/dist/resources/examples/layout-app-shell.json +368 -0
  17. package/dist/resources/examples/microservice-table-list.json +1 -0
  18. package/dist/resources/examples/middleware-authenticate.json +243 -47
  19. package/dist/resources/examples/workflow-basic.json +24 -2
  20. package/dist/resources/guides/component.md +6 -3
  21. package/dist/resources/guides/external-component.md +129 -0
  22. package/dist/resources/guides/layout.md +147 -0
  23. package/dist/resources/guides/microservice.md +35 -0
  24. package/dist/resources/guides/middleware.md +10 -0
  25. package/dist/resources/guides/page.md +132 -14
  26. package/dist/resources/guides/workflow.md +127 -2
  27. package/dist/server.js +2 -0
  28. package/dist/tools/externalComponents.js +285 -0
  29. package/dist/tools/layouts.js +48 -6
  30. package/dist/tools/microservices.js +2 -2
  31. package/dist/tools/pages.js +98 -30
  32. package/dist/tools/platformInfo.js +2 -2
  33. package/dist/tools/screens.js +36 -0
  34. package/dist/tools/workflows.js +3 -3
  35. package/package.json +5 -2
package/dist/config.js CHANGED
@@ -1,35 +1,62 @@
1
- import { z } from 'zod';
1
+ import { z } from "zod";
2
2
  export const moduleNames = [
3
- 'platform',
4
- 'project',
5
- 'application',
6
- 'datasource',
7
- 'entity',
8
- 'row',
9
- 'microservice',
10
- 'query',
11
- 'workflow',
12
- 'automation',
13
- 'dto',
14
- 'view',
15
- 'page',
16
- 'component',
17
- 'flow',
18
- 'layout',
19
- 'variable',
20
- 'folder',
21
- 'file',
22
- 'access',
23
- 'translation',
24
- 'template',
25
- 'organization',
26
- 'dependency',
27
- 'deployment'
3
+ "platform",
4
+ "project",
5
+ "application",
6
+ "datasource",
7
+ "entity",
8
+ "row",
9
+ "microservice",
10
+ "query",
11
+ "workflow",
12
+ "automation",
13
+ "dto",
14
+ "view",
15
+ "page",
16
+ "component",
17
+ "externalComponent",
18
+ "flow",
19
+ "layout",
20
+ "variable",
21
+ "folder",
22
+ "file",
23
+ "access",
24
+ "translation",
25
+ "template",
26
+ "organization",
27
+ "dependency",
28
+ "deployment",
28
29
  ];
29
30
  export const modulePresets = {
30
- core: ['platform', 'project', 'application', 'datasource', 'entity', 'row', 'microservice', 'query', 'workflow', 'automation', 'dto', 'view', 'dependency'],
31
- studio: ['platform', 'page', 'component', 'flow', 'layout', 'variable', 'folder', 'file', 'access', 'translation'],
32
- admin: ['platform', 'template', 'organization', 'deployment']
31
+ core: [
32
+ "platform",
33
+ "project",
34
+ "application",
35
+ "datasource",
36
+ "entity",
37
+ "row",
38
+ "microservice",
39
+ "query",
40
+ "workflow",
41
+ "automation",
42
+ "dto",
43
+ "view",
44
+ "dependency",
45
+ ],
46
+ studio: [
47
+ "platform",
48
+ "page",
49
+ "component",
50
+ "externalComponent",
51
+ "flow",
52
+ "layout",
53
+ "variable",
54
+ "folder",
55
+ "file",
56
+ "access",
57
+ "translation",
58
+ ],
59
+ admin: ["platform", "template", "organization", "deployment"],
33
60
  };
34
61
  function expandModuleNames(entries) {
35
62
  const modules = [];
@@ -52,22 +79,24 @@ const environmentSchema = z.object({
52
79
  ORG_API_BASE_URL: z.string().url(),
53
80
  TENANT_API_BASE_URL: z.string().url(),
54
81
  ORGANIZATION: z.string().min(1),
55
- HOST_SUFFIX: z.string().min(1).default('localhost'),
56
- DEFAULT_ENVIRONMENT: z.string().min(1).default('production'),
82
+ HOST_SUFFIX: z.string().min(1).default("localhost"),
83
+ DEFAULT_ENVIRONMENT: z.string().min(1),
57
84
  DEFAULT_PROJECT: z.string().optional(),
58
- AUTH_MODE: z.enum(['local', 'passthrough']).default('local'),
85
+ AUTH_MODE: z.enum(["local", "passthrough"]).default("local"),
59
86
  TOKEN: z.string().optional(),
60
87
  USERNAME: z.string().optional(),
61
88
  PASSWORD: z.string().optional(),
62
- POLICY: z.enum(['strict', 'warn', 'off']).default('strict'),
89
+ POLICY: z.enum(["strict", "warn", "off"]).default("strict"),
63
90
  MAX_RESPONSE_BYTES: z.coerce.number().int().positive().default(262144),
64
91
  REQUEST_TIMEOUT_MS: z.coerce.number().int().positive().default(100000),
65
92
  MODULES: z.string().optional(),
66
- LOG_LEVEL: z.enum(['off', 'summary', 'detail']).default('detail'),
93
+ LOG_LEVEL: z.enum(["off", "summary", "detail"]).default("detail"),
67
94
  LOG_DIR: z.string().min(1).optional(),
68
95
  LOG_FILE: z.string().min(1).optional(),
69
96
  LOG_MAX_BODY_CHARS: z.coerce.number().int().positive().default(2000),
70
- MCP_PORT: z.coerce.number().int().positive().default(5100)
97
+ MCP_PORT: z.coerce.number().int().positive().default(5100),
98
+ STUDIO_BASE_URL: z.string().url().optional(),
99
+ SCREENSHOT_BROWSER_PATH: z.string().min(1).optional(),
71
100
  });
72
101
  export const environmentKeys = Object.keys(environmentSchema.shape);
73
102
  /**
@@ -76,38 +105,73 @@ export const environmentKeys = Object.keys(environmentSchema.shape);
76
105
  * kullanılamazdır: boş string (README §Ayar öncelik sırası: boş = tanımsız) ve genişletilmemiş
77
106
  * `${VAR:-…}` yer tutucusu — Claude Code bu sözdizimini açar, VS Code'un kendi MCP istemcisi
78
107
  * açmadan olduğu gibi geçirir ve düşürülmezse konfigürasyon doğrulaması yer tutucu metinle patlar.
108
+ *
109
+ * Üçüncü hâl `USERNAME`'e özeldir: bu ad işletim sistemine ait. Windows onu HER ZAMAN, macOS
110
+ * kabukları da sık sık oturum açan kullanıcının adıyla tanımlar. dotenv mevcut anahtarı ezmediği
111
+ * için `.env`'deki `USERNAME=admin@…` sessizce yok sayılır ve gateway, kimliği makine kullanıcısı
112
+ * adıyla almaya çalışıp `POST /connect/token` üzerinden 404 alır — hata mesajı da "kayıt
113
+ * bulunamadı" dediği için kimlik ayarına değil, veriye işaret eder. `USERNAME` yalnız işletim
114
+ * sisteminin kullanıcı adıyla AYNIYSA düşürülür: gerçekten o adla giren bir kurulum zaten
115
+ * `.env`/`.mcp.json`'da aynı değeri yazar ve dosyadan geri okunur.
79
116
  */
80
117
  export function dropUnusableEnvironment(env) {
81
118
  for (const key of environmentKeys) {
82
119
  const value = env[key];
83
- if (value === '' || (value !== undefined && /^\$\{[^}]*\}$/.test(value))) {
120
+ if (value === "" || (value !== undefined && /^\$\{[^}]*\}$/.test(value))) {
84
121
  delete env[key];
85
122
  }
86
123
  }
124
+ const osUser = env.USER ?? env.LOGNAME;
125
+ if (env.USERNAME !== undefined && env.USERNAME === osUser) {
126
+ delete env.USERNAME;
127
+ }
128
+ }
129
+ /**
130
+ * "Boş = tanımsız" kuralını `.env`'den gelen değerlere de uygular. `dropUnusableEnvironment`
131
+ * yalnız süreç ortamına, yani dotenv ÖNCESİNE bakar; `.env`'deki `LOG_FILE=` gibi boş bir satırı
132
+ * dotenv sonradan boş string olarak yazar ve `.min(1)` şemaları patlar. `.env.example` bu
133
+ * anahtarları boş gönderdiği için kopyalayan her kurulum açılmayan bir gateway alıyordu.
134
+ * USERNAME kuralı bilerek burada tekrarlanmaz: o, dotenv'den ÖNCE bir kez uygulanmalıdır ki
135
+ * `.env`'deki kimlik işletim sistemininkiyle aynı olduğunda düşürülmesin.
136
+ */
137
+ function withoutEmptyValues(env) {
138
+ const copy = { ...env };
139
+ for (const key of environmentKeys) {
140
+ if (copy[key] === "")
141
+ delete copy[key];
142
+ }
143
+ return copy;
87
144
  }
88
145
  export function loadConfig(env) {
89
- const parsed = environmentSchema.safeParse(env);
146
+ const parsed = environmentSchema.safeParse(withoutEmptyValues(env));
90
147
  if (!parsed.success) {
91
- const missing = parsed.error.issues.map(issue => `${issue.path.join('.')}: ${issue.message}`).join('; ');
148
+ const missing = parsed.error.issues
149
+ .map((issue) => `${issue.path.join(".")}: ${issue.message}`)
150
+ .join("; ");
92
151
  throw new Error(`Gateway konfigürasyonu geçersiz — ${missing}. Gerekli değişkenler için zeyrek-mcp/.env.example dosyasına bakın.`);
93
152
  }
94
153
  const values = parsed.data;
95
- if (values.AUTH_MODE === 'local' && !values.TOKEN && (!values.USERNAME || !values.PASSWORD)) {
96
- throw new Error('AUTH_MODE=local için TOKEN ya da USERNAME + PASSWORD zorunludur.');
154
+ if (values.AUTH_MODE === "local" &&
155
+ !values.TOKEN &&
156
+ (!values.USERNAME || !values.PASSWORD)) {
157
+ throw new Error("AUTH_MODE=local için TOKEN ya da USERNAME + PASSWORD zorunludur.");
97
158
  }
98
- if (values.AUTH_MODE === 'passthrough' && (values.TOKEN || values.USERNAME || values.PASSWORD)) {
99
- throw new Error('AUTH_MODE=passthrough iken TOKEN/USERNAME/PASSWORD tanımlanamaz — kimlik istemciden gelir.');
159
+ if (values.AUTH_MODE === "passthrough" &&
160
+ (values.TOKEN || values.USERNAME || values.PASSWORD)) {
161
+ throw new Error("AUTH_MODE=passthrough iken TOKEN/USERNAME/PASSWORD tanımlanamaz — kimlik istemciden gelir.");
100
162
  }
101
163
  const requested = values.MODULES
102
- ? values.MODULES.split(',').map(name => name.trim()).filter(name => name.length > 0)
164
+ ? values.MODULES.split(",")
165
+ .map((name) => name.trim())
166
+ .filter((name) => name.length > 0)
103
167
  : [...moduleNames];
104
168
  const { modules, unknown: unknownModules } = expandModuleNames(requested);
105
169
  if (unknownModules.length > 0) {
106
- throw new Error(`MODULES bilinmeyen modül/küme içeriyor: ${unknownModules.join(', ')}. Kümeler: ${Object.keys(modulePresets).join(', ')}. Modüller: ${moduleNames.join(', ')}.`);
170
+ throw new Error(`MODULES bilinmeyen modül/küme içeriyor: ${unknownModules.join(", ")}. Kümeler: ${Object.keys(modulePresets).join(", ")}. Modüller: ${moduleNames.join(", ")}.`);
107
171
  }
108
172
  return {
109
- orgApiBaseUrl: values.ORG_API_BASE_URL.replace(/\/+$/, ''),
110
- tenantApiBaseUrl: values.TENANT_API_BASE_URL.replace(/\/+$/, ''),
173
+ orgApiBaseUrl: values.ORG_API_BASE_URL.replace(/\/+$/, ""),
174
+ tenantApiBaseUrl: values.TENANT_API_BASE_URL.replace(/\/+$/, ""),
111
175
  organization: values.ORGANIZATION,
112
176
  hostSuffix: values.HOST_SUFFIX,
113
177
  defaultEnvironment: values.DEFAULT_ENVIRONMENT,
@@ -124,6 +188,8 @@ export function loadConfig(env) {
124
188
  logDirectory: values.LOG_DIR,
125
189
  logFile: values.LOG_FILE,
126
190
  logMaxBodyChars: values.LOG_MAX_BODY_CHARS,
127
- port: values.MCP_PORT
191
+ port: values.MCP_PORT,
192
+ studioBaseUrl: values.STUDIO_BASE_URL?.replace(/\/+$/, ""),
193
+ screenshotBrowserPath: values.SCREENSHOT_BROWSER_PATH,
128
194
  };
129
195
  }