@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.
- package/.env.example +27 -8
- package/.env.production.example +44 -0
- package/README.md +254 -186
- package/dist/config.js +113 -47
- package/dist/knowledge/componentCatalog.js +474 -31
- package/dist/knowledge/componentEvents.js +150 -12
- package/dist/knowledge/errorPath.js +64 -0
- package/dist/knowledge/normalize.js +12 -1
- package/dist/knowledge/outlines.js +6 -0
- package/dist/knowledge/rules.js +184 -3
- package/dist/knowledge/styleResolve.js +485 -0
- package/dist/observability/trace.js +4 -0
- package/dist/platform/http.js +3 -0
- package/dist/platform/responses.js +80 -4
- package/dist/platform/screenshot.js +106 -0
- package/dist/resources/examples/layout-app-shell.json +368 -0
- package/dist/resources/examples/microservice-table-list.json +1 -0
- package/dist/resources/examples/middleware-authenticate.json +243 -47
- package/dist/resources/examples/workflow-basic.json +24 -2
- package/dist/resources/guides/component.md +6 -3
- package/dist/resources/guides/external-component.md +129 -0
- package/dist/resources/guides/layout.md +147 -0
- package/dist/resources/guides/microservice.md +35 -0
- package/dist/resources/guides/middleware.md +10 -0
- package/dist/resources/guides/page.md +132 -14
- package/dist/resources/guides/workflow.md +127 -2
- package/dist/server.js +2 -0
- package/dist/tools/externalComponents.js +285 -0
- package/dist/tools/layouts.js +48 -6
- package/dist/tools/microservices.js +2 -2
- package/dist/tools/pages.js +98 -30
- package/dist/tools/platformInfo.js +2 -2
- package/dist/tools/screens.js +36 -0
- package/dist/tools/workflows.js +3 -3
- package/package.json +5 -2
package/dist/config.js
CHANGED
|
@@ -1,35 +1,62 @@
|
|
|
1
|
-
import { z } from
|
|
1
|
+
import { z } from "zod";
|
|
2
2
|
export const moduleNames = [
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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: [
|
|
31
|
-
|
|
32
|
-
|
|
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(
|
|
56
|
-
DEFAULT_ENVIRONMENT: z.string().min(1)
|
|
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([
|
|
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([
|
|
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([
|
|
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 ===
|
|
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
|
|
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 ===
|
|
96
|
-
|
|
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 ===
|
|
99
|
-
|
|
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(
|
|
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(
|
|
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
|
}
|