@web-marketing-hr/azure-devops-mcp 2.3.14 → 2.3.15

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.
@@ -0,0 +1,730 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { z } from "zod";
4
+ import { logger } from "../logger.js";
5
+ // ─── Tool names ──────────────────────────────────────────────────────────────
6
+ export const ARCHITECTURE_SCAN = "project_architecture_scan";
7
+ export const ARCHITECTURE_READ_FILE = "project_architecture_read_file";
8
+ // ─── Layer heuristics ─────────────────────────────────────────────────────────
9
+ const LAYER_PATTERNS = [
10
+ [/controller/i, "Prezentacijski sloj"],
11
+ [/usercontrol/i, "Prezentacijski sloj"],
12
+ [/pagepart/i, "Prezentacijski sloj"],
13
+ [/usercontrol/i, "Prezentacijski sloj"],
14
+ [/handler/i, "Integracijski sloj"],
15
+ [/api/i, "Integracijski sloj"],
16
+ [/apiextend/i, "Integracijski sloj"],
17
+ [/cubisadapt/i, "Integracijski sloj"],
18
+ [/wienerclient/i, "Integracijski sloj"],
19
+ [/wingclient/i, "Integracijski sloj"],
20
+ [/service/i, "Poslovni sloj"],
21
+ [/engine/i, "Poslovni sloj"],
22
+ [/manager/i, "Poslovni sloj"],
23
+ [/worker/i, "Poslovni sloj"],
24
+ [/scraper/i, "Poslovni sloj"],
25
+ [/ticketing/i, "Poslovni sloj"],
26
+ [/chatbot/i, "Poslovni sloj"],
27
+ [/repository/i, "Sloj podataka"],
28
+ [/data/i, "Sloj podataka"],
29
+ [/context/i, "Sloj podataka"],
30
+ [/migration/i, "Sloj podataka"],
31
+ [/cache/i, "Sloj podataka"],
32
+ [/model/i, "Modeli i entiteti"],
33
+ [/entity/i, "Modeli i entiteti"],
34
+ [/dto/i, "Modeli i entiteti"],
35
+ [/domain/i, "Modeli i entiteti"],
36
+ [/intranet/i, "Modeli i entiteti"],
37
+ [/test/i, "Testovi"],
38
+ [/spec/i, "Testovi"],
39
+ [/uitest/i, "UI Testovi"],
40
+ [/unittest/i, "Unit Testovi"],
41
+ [/util/i, "Pomoćni alati"],
42
+ [/helper/i, "Pomoćni alati"],
43
+ [/extension/i, "Pomoćni alati"],
44
+ [/extender/i, "Pomoćni alati"],
45
+ [/config/i, "Konfiguracija"],
46
+ [/setting/i, "Konfiguracija"],
47
+ [/shared/i, "Dijeljene komponente"],
48
+ [/common/i, "Dijeljene komponente"],
49
+ [/infrastructure/i, "Infrastruktura"],
50
+ [/sso/i, "Infrastruktura"],
51
+ [/auth/i, "Infrastruktura"],
52
+ ];
53
+ function inferLayer(name) {
54
+ for (const [pattern, layer] of LAYER_PATTERNS) {
55
+ if (pattern.test(name))
56
+ return layer;
57
+ }
58
+ return "Nesvrstano";
59
+ }
60
+ // ─── Skip logic ───────────────────────────────────────────────────────────────
61
+ // Directories to always skip regardless of depth
62
+ const ALWAYS_SKIP = new Set([
63
+ ".git",
64
+ ".vs",
65
+ ".github",
66
+ "node_modules",
67
+ "TestResults",
68
+ "EasyEditCmsSync", // tool project inside EasyEdit
69
+ ]);
70
+ // Directories to skip only at shallow depth (root or one level deep)
71
+ const SHALLOW_SKIP = new Set(["bin", "obj", "packages"]);
72
+ function shouldSkipDir(name, depth) {
73
+ if (name.startsWith("."))
74
+ return true;
75
+ if (ALWAYS_SKIP.has(name))
76
+ return true;
77
+ // bin/obj/packages at depth 0 (root) and depth 1 (e.g. Common/bin)
78
+ // but NOT at depth 2+ (e.g. UiTest/bin/Debug has useful chromedriver info)
79
+ if (SHALLOW_SKIP.has(name) && depth <= 1)
80
+ return true;
81
+ return false;
82
+ }
83
+ // ─── Filesystem walker ────────────────────────────────────────────────────────
84
+ function walkDirectory(dirPath, rootPath, depth, maxDepth) {
85
+ const name = path.basename(dirPath);
86
+ const node = {
87
+ name,
88
+ relativePath: path.relative(rootPath, dirPath) || ".",
89
+ inferredLayer: inferLayer(name),
90
+ fileCount: 0,
91
+ filesByExtension: {},
92
+ children: [],
93
+ };
94
+ let entries;
95
+ try {
96
+ entries = fs.readdirSync(dirPath, { withFileTypes: true });
97
+ }
98
+ catch {
99
+ return node;
100
+ }
101
+ for (const entry of entries) {
102
+ if (entry.name.startsWith("."))
103
+ continue;
104
+ const fullPath = path.join(dirPath, entry.name);
105
+ if (entry.isDirectory()) {
106
+ if (shouldSkipDir(entry.name, depth))
107
+ continue;
108
+ if (depth < maxDepth) {
109
+ const child = walkDirectory(fullPath, rootPath, depth + 1, maxDepth);
110
+ node.fileCount += child.fileCount;
111
+ for (const [ext, count] of Object.entries(child.filesByExtension)) {
112
+ node.filesByExtension[ext] = (node.filesByExtension[ext] ?? 0) + count;
113
+ }
114
+ node.children.push(child);
115
+ }
116
+ }
117
+ else {
118
+ const ext = path.extname(entry.name) || "(bez ekstenzije)";
119
+ node.filesByExtension[ext] = (node.filesByExtension[ext] ?? 0) + 1;
120
+ node.fileCount++;
121
+ }
122
+ }
123
+ return node;
124
+ }
125
+ // ─── File finder ──────────────────────────────────────────────────────────────
126
+ function findFiles(dir, predicate, skipDirFn, depth = 0) {
127
+ const results = [];
128
+ let entries;
129
+ try {
130
+ entries = fs.readdirSync(dir, { withFileTypes: true });
131
+ }
132
+ catch {
133
+ return results;
134
+ }
135
+ for (const entry of entries) {
136
+ if (entry.name.startsWith("."))
137
+ continue;
138
+ const fullPath = path.join(dir, entry.name);
139
+ if (entry.isDirectory()) {
140
+ const skip = skipDirFn ? skipDirFn(entry.name, depth) : shouldSkipDir(entry.name, depth);
141
+ if (!skip) {
142
+ results.push(...findFiles(fullPath, predicate, skipDirFn, depth + 1));
143
+ }
144
+ }
145
+ else if (predicate(entry.name)) {
146
+ results.push(fullPath);
147
+ }
148
+ }
149
+ return results;
150
+ }
151
+ // ─── Project type detector ────────────────────────────────────────────────────
152
+ function detectProjectType(rootPath) {
153
+ const hasSrc = fs.existsSync(path.join(rootPath, "src"));
154
+ const hasServices = fs.existsSync(path.join(rootPath, "src", "Services.Interfaces"));
155
+ if (hasSrc && hasServices)
156
+ return "WEM EasyEditCms Framework";
157
+ const hasEasyEdit = fs.existsSync(path.join(rootPath, "EasyEdit"));
158
+ const hasUserControls = fs.existsSync(path.join(rootPath, "UserControls"));
159
+ if (hasEasyEdit && hasUserControls)
160
+ return "WEM EasyEditCms Site";
161
+ return "Unknown";
162
+ }
163
+ // ─── Key files map ────────────────────────────────────────────────────────────
164
+ function buildKeyFiles(rootPath) {
165
+ const candidates = {
166
+ "Global.asax startup": "Global.asax.cs",
167
+ "DI registracija servisa": "ServicesRegistration.cs",
168
+ "Web konfiguracija": "Web.config",
169
+ "NuGet paketi (root)": "packages.config",
170
+ "NuGet paketi (Common)": path.join("Common", "packages.config"),
171
+ "Common csproj": (() => {
172
+ try {
173
+ const found = fs.readdirSync(path.join(rootPath, "Common")).find((f) => f.endsWith(".csproj"));
174
+ return found ? `Common${path.sep}${found}` : "";
175
+ }
176
+ catch {
177
+ return "";
178
+ }
179
+ })(),
180
+ };
181
+ const result = {};
182
+ for (const [label, rel] of Object.entries(candidates)) {
183
+ if (rel && fs.existsSync(path.join(rootPath, rel))) {
184
+ result[label] = rel;
185
+ }
186
+ }
187
+ // UiTest XML docs
188
+ const uiTestXml = findFiles(rootPath, (n) => n === "WEM.EasyEditCms.Common.UiTest.xml", (name, depth) => shouldSkipDir(name, depth));
189
+ if (uiTestXml.length > 0) {
190
+ result["UiTest BaseUiTest XML dokumentacija"] = path.relative(rootPath, uiTestXml[0]);
191
+ }
192
+ return result;
193
+ }
194
+ // ─── .csproj parser ───────────────────────────────────────────────────────────
195
+ function parseCsproj(filePath, rootPath) {
196
+ let content = "";
197
+ try {
198
+ content = fs.readFileSync(filePath, "utf-8");
199
+ }
200
+ catch { }
201
+ const projectRefs = [...content.matchAll(/<ProjectReference\s+Include="([^"]+)"/g)].map((m) => path.basename(m[1], ".csproj"));
202
+ const packageRefs = [...content.matchAll(/<PackageReference\s+Include="([^"]+)"[^>]*(?:Version="([^"]*)")?/g)].map((m) => ({ name: m[1], version: m[2] ?? "" }));
203
+ return {
204
+ name: path.basename(filePath, ".csproj"),
205
+ relativePath: path.relative(rootPath, filePath),
206
+ targetFramework: content.match(/<TargetFramework[^>]*>([^<]+)<\/TargetFramework>/)?.[1] ?? null,
207
+ outputType: content.match(/<OutputType[^>]*>([^<]+)<\/OutputType>/)?.[1] ?? null,
208
+ projectReferences: projectRefs,
209
+ packageReferences: packageRefs,
210
+ };
211
+ }
212
+ // ─── packages.config parser ───────────────────────────────────────────────────
213
+ function parseAllPackagesConfigs(rootPath) {
214
+ const locations = [
215
+ { file: path.join(rootPath, "packages.config"), source: "root" },
216
+ { file: path.join(rootPath, "Common", "packages.config"), source: "Common" },
217
+ { file: path.join(rootPath, "UnitTest", "packages.config"), source: "UnitTest" },
218
+ ];
219
+ const packages = [];
220
+ for (const { file, source } of locations) {
221
+ try {
222
+ const content = fs.readFileSync(file, "utf-8");
223
+ for (const m of content.matchAll(/<package\s+id="([^"]+)"\s+version="([^"]+)"/g)) {
224
+ packages.push({ id: m[1], version: m[2], source });
225
+ }
226
+ }
227
+ catch { }
228
+ }
229
+ return packages;
230
+ }
231
+ // ─── WEM framework dependency detector ───────────────────────────────────────
232
+ function detectWemFrameworkDeps(rootPath) {
233
+ const sources = [
234
+ { dir: path.join(rootPath, "bin"), source: "root-bin" },
235
+ { dir: path.join(rootPath, "Common", "bin"), source: "common-bin" },
236
+ { dir: path.join(rootPath, "EasyEdit", "bin"), source: "easiedit-bin" },
237
+ ];
238
+ const deps = [];
239
+ for (const { dir, source } of sources) {
240
+ try {
241
+ const dlls = fs.readdirSync(dir).filter((f) => f.endsWith(".dll") && f.startsWith("WEM."));
242
+ for (const dll of dlls) {
243
+ deps.push({ dllName: dll.replace(".dll", ""), source });
244
+ }
245
+ }
246
+ catch { }
247
+ }
248
+ return deps;
249
+ }
250
+ // ─── .cs parser ───────────────────────────────────────────────────────────────
251
+ function parseParameters(raw) {
252
+ if (!raw.trim())
253
+ return [];
254
+ return raw
255
+ .split(",")
256
+ .map((p) => {
257
+ const clean = p.trim().replace(/\s*=\s*[^,]+$/, ""); // strip default values
258
+ const parts = clean.trim().split(/\s+/);
259
+ const name = parts[parts.length - 1]?.replace(/^[@]/, "") ?? "";
260
+ const type = parts.slice(0, -1).join(" ") || "unknown";
261
+ return { name, type };
262
+ })
263
+ .filter((p) => p.name && !["", ")", "("].includes(p.name));
264
+ }
265
+ function parseCsFile(filePath, rootPath) {
266
+ let content = "";
267
+ try {
268
+ content = fs.readFileSync(filePath, "utf-8");
269
+ }
270
+ catch {
271
+ return null;
272
+ }
273
+ // Strip comments
274
+ const stripped = content.replace(/\/\/[^\n]*/g, " ").replace(/\/\*[\s\S]*?\*\//g, " ");
275
+ // Namespace
276
+ const namespace = stripped.match(/namespace\s+([\w.]+)/)?.[1] ?? "(nepoznat)";
277
+ // Type declaration
278
+ const kindMatch = stripped.match(/\b(public|internal|private|protected)?\s*((?:abstract|sealed|static|partial)\s+)*(class|interface|enum|record|struct)\s+(\w+)/);
279
+ if (!kindMatch)
280
+ return null;
281
+ const accessModifier = kindMatch[1] ?? "internal";
282
+ const modifiers = (kindMatch[2] ?? "").toLowerCase();
283
+ const kind = kindMatch[3];
284
+ const name = kindMatch[4];
285
+ // Base types
286
+ const declLine = stripped.match(new RegExp(`(?:${kind})\\s+${name}\\s*(?:<[^>]*>)?\\s*([^{]*)`))?.[1] ?? "";
287
+ const colonPart = declLine.match(/:\s*([^{where]+)/)?.[1] ?? "";
288
+ const allBaseTypes = colonPart
289
+ .split(",")
290
+ .map((s) => s
291
+ .trim()
292
+ .replace(/\s*where\s.*/s, "")
293
+ .trim())
294
+ .filter(Boolean);
295
+ const interfaces = allBaseTypes.filter((t) => /^I[A-Z]/.test(t));
296
+ const baseTypes = allBaseTypes.filter((t) => !interfaces.includes(t));
297
+ // Class attributes (last 3 before the declaration)
298
+ const declIdx = stripped.indexOf(kindMatch[0]);
299
+ const beforeDecl = stripped.substring(Math.max(0, declIdx - 500), declIdx);
300
+ const classAttributes = [...beforeDecl.matchAll(/\[([^\]]+)\]/g)].slice(-3).map((m) => m[1].trim());
301
+ // Enum values
302
+ const enumValues = [];
303
+ if (kind === "enum") {
304
+ const bodyMatch = stripped.match(/enum\s+\w+[^{]*\{([^}]*)\}/s);
305
+ if (bodyMatch) {
306
+ enumValues.push(...bodyMatch[1]
307
+ .split(",")
308
+ .map((v) => v.trim().split(/[\s=]/)[0].trim())
309
+ .filter(Boolean));
310
+ }
311
+ }
312
+ // Constructors
313
+ const constructors = [];
314
+ const ctorRegex = new RegExp(`(public|private|protected|internal)\\s+${name}\\s*\\(([^)]*)\\)\\s*(?::\\s*(base|this)\\s*\\(([^)]*)\\))?`, "g");
315
+ let ctorMatch;
316
+ while ((ctorMatch = ctorRegex.exec(stripped)) !== null) {
317
+ constructors.push({
318
+ accessModifier: ctorMatch[1],
319
+ parameters: parseParameters(ctorMatch[2]),
320
+ callsBase: ctorMatch[3] === "base",
321
+ baseArguments: ctorMatch[4] ?? "",
322
+ });
323
+ }
324
+ // Properties
325
+ const properties = [];
326
+ const propRegex = /(\[[^\]]+\]\s*)*\s*(public|private|protected|internal|protected\s+internal|private\s+protected)\s+((?:static|virtual|override|abstract|new|readonly)\s+)*([\w<>\[\]?,\s]+?)\s+(\w+)\s*\{([^}]*)\}/g;
327
+ let propMatch;
328
+ while ((propMatch = propRegex.exec(stripped)) !== null) {
329
+ const propName = propMatch[5];
330
+ if (["get", "set", "add", "remove", "value", "if", "else", "return"].includes(propName))
331
+ continue;
332
+ const body = propMatch[6];
333
+ const attrBlock = propMatch[1] ?? "";
334
+ const attrs = [...attrBlock.matchAll(/\[([^\]]+)\]/g)].map((m) => m[1].trim());
335
+ properties.push({
336
+ name: propName,
337
+ type: propMatch[4].trim(),
338
+ accessModifier: propMatch[2],
339
+ hasGetter: body.includes("get"),
340
+ hasSetter: body.includes("set"),
341
+ isComputed: body.includes("return") || body.includes("=>"),
342
+ attributes: attrs,
343
+ });
344
+ }
345
+ // Fields
346
+ const fields = [];
347
+ const fieldRegex = /^\s*(public|private|protected|internal|protected\s+internal)\s+(static\s+|readonly\s+|const\s+|static\s+readonly\s+)*([\w<>\[\]?,\s]+?)\s+(_?\w+)\s*(?:=|;)/gm;
348
+ let fieldMatch;
349
+ while ((fieldMatch = fieldRegex.exec(stripped)) !== null) {
350
+ const fieldName = fieldMatch[4];
351
+ if (fieldName === name)
352
+ continue;
353
+ fields.push({
354
+ modifier: (fieldMatch[1] + " " + (fieldMatch[2] ?? "")).trim(),
355
+ type: fieldMatch[3].trim(),
356
+ name: fieldName,
357
+ });
358
+ }
359
+ // Methods
360
+ const methods = [];
361
+ const SKIP_KEYWORDS = new Set(["get", "set", "add", "remove", name, "if", "while", "for", "foreach", "switch", "catch", "using", "return", "new"]);
362
+ const methodRegex = /(\[[^\]]+\]\s*)*\s*(public|private|protected|internal|protected\s+internal)\s+((?:static|virtual|override|abstract|async|sealed|new)\s+)*([\w<>\[\]?,\s]+?)\s+(\w+)\s*\(([^)]*)\)\s*(?:where[^{;]*)?\s*[{;]/g;
363
+ let methodMatch;
364
+ while ((methodMatch = methodRegex.exec(stripped)) !== null) {
365
+ const methodName = methodMatch[5];
366
+ if (SKIP_KEYWORDS.has(methodName))
367
+ continue;
368
+ const modStr = (methodMatch[3] ?? "").toLowerCase();
369
+ const attrBlock = methodMatch[1] ?? "";
370
+ const attrs = [...attrBlock.matchAll(/\[([^\]]+)\]/g)].map((m) => m[1].trim());
371
+ methods.push({
372
+ name: methodName,
373
+ returnType: methodMatch[4].trim(),
374
+ accessModifier: methodMatch[2],
375
+ isStatic: modStr.includes("static"),
376
+ isAsync: modStr.includes("async"),
377
+ isOverride: modStr.includes("override"),
378
+ parameters: parseParameters(methodMatch[6]),
379
+ attributes: attrs,
380
+ });
381
+ }
382
+ return {
383
+ name,
384
+ namespace,
385
+ relativePath: path.relative(rootPath, filePath),
386
+ kind,
387
+ accessModifier,
388
+ isStatic: modifiers.includes("static"),
389
+ isAbstract: modifiers.includes("abstract"),
390
+ isSealed: modifiers.includes("sealed"),
391
+ isPartial: modifiers.includes("partial"),
392
+ baseTypes,
393
+ interfaces,
394
+ classAttributes,
395
+ constructors,
396
+ fields,
397
+ properties,
398
+ methods,
399
+ enumValues,
400
+ };
401
+ }
402
+ // ─── .ashx parser ─────────────────────────────────────────────────────────────
403
+ function parseAshxFile(filePath, rootPath) {
404
+ const name = path.basename(filePath, ".ashx");
405
+ const codeBehindPath = filePath + ".cs";
406
+ let className = null;
407
+ const interfaces = [];
408
+ let hasSessionState = false;
409
+ try {
410
+ const content = fs.readFileSync(codeBehindPath, "utf-8");
411
+ className = content.match(/class\s+(\w+)/)?.[1] ?? null;
412
+ hasSessionState = content.includes("IRequiresSessionState");
413
+ const implMatch = content.match(/class\s+\w+\s*:\s*([^{]+)/);
414
+ if (implMatch) {
415
+ interfaces.push(...implMatch[1]
416
+ .split(",")
417
+ .map((s) => s.trim())
418
+ .filter(Boolean));
419
+ }
420
+ }
421
+ catch { }
422
+ return {
423
+ name,
424
+ relativePath: path.relative(rootPath, filePath),
425
+ className,
426
+ interfaces,
427
+ hasSessionState,
428
+ };
429
+ }
430
+ // ─── ASPX / ASCX parsers ──────────────────────────────────────────────────────
431
+ function parseAspxFiles(files, rootPath) {
432
+ return files.map((f) => {
433
+ const codeBehind = f + ".cs";
434
+ return {
435
+ name: path.basename(f, ".aspx"),
436
+ relativePath: path.relative(rootPath, f),
437
+ codeBehindRelativePath: fs.existsSync(codeBehind) ? path.relative(rootPath, codeBehind) : null,
438
+ hasCodeBehind: fs.existsSync(codeBehind),
439
+ };
440
+ });
441
+ }
442
+ function parseAscxFiles(files, rootPath) {
443
+ return files.map((f) => {
444
+ const codeBehind = f + ".cs";
445
+ return {
446
+ name: path.basename(f, ".ascx"),
447
+ relativePath: path.relative(rootPath, f),
448
+ codeBehindRelativePath: fs.existsSync(codeBehind) ? path.relative(rootPath, codeBehind) : null,
449
+ };
450
+ });
451
+ }
452
+ // ─── Web.config parser ────────────────────────────────────────────────────────
453
+ function parseWebConfig(rootPath) {
454
+ const configPath = path.join(rootPath, "Web.config");
455
+ let content = "";
456
+ try {
457
+ content = fs.readFileSync(configPath, "utf-8");
458
+ }
459
+ catch {
460
+ return [];
461
+ }
462
+ const keys = [];
463
+ for (const m of content.matchAll(/<add\s+key="([^"]+)"\s+value="([^"]*)"/g)) {
464
+ keys.push({
465
+ key: m[1],
466
+ hasValue: m[2].length > 0,
467
+ isCrypted: m[1].toLowerCase().includes("crypt"),
468
+ isConnectionString: false,
469
+ });
470
+ }
471
+ for (const m of content.matchAll(/<add\s+name="([^"]+)"\s+connectionString="([^"]*)"/g)) {
472
+ keys.push({
473
+ key: m[1],
474
+ hasValue: m[2].length > 0,
475
+ isCrypted: false,
476
+ isConnectionString: true,
477
+ });
478
+ }
479
+ return keys;
480
+ }
481
+ // ─── UiTest BaseUiTest API docs ───────────────────────────────────────────────
482
+ function parseUiTestApiDocs(rootPath) {
483
+ const candidates = findFiles(rootPath, (n) => n === "WEM.EasyEditCms.Common.UiTest.xml", (name, depth) => shouldSkipDir(name, depth));
484
+ const methods = [];
485
+ for (const xmlPath of candidates) {
486
+ try {
487
+ const content = fs.readFileSync(xmlPath, "utf-8");
488
+ for (const m of content.matchAll(/<member name="M:([^"]+)">/g)) {
489
+ methods.push(m[1]);
490
+ }
491
+ }
492
+ catch { }
493
+ }
494
+ return methods;
495
+ }
496
+ // ─── Pattern detector ─────────────────────────────────────────────────────────
497
+ function detectPatterns(classes, rootPath) {
498
+ const patterns = [];
499
+ if (classes.some((c) => c.name.endsWith("Controller") || c.baseTypes.some((b) => b.includes("Controller"))))
500
+ patterns.push("MVC / Web Forms Controllers");
501
+ if (classes.some((c) => c.interfaces.some((i) => i.includes("IRequestHandler")) || c.name.endsWith("Handler")))
502
+ patterns.push("HTTP Handler Pattern (ASHX)");
503
+ if (classes.some((c) => c.name.endsWith("Repository") || c.interfaces.some((i) => i.includes("IRepository"))))
504
+ patterns.push("Repository Pattern");
505
+ if (classes.some((c) => c.name.endsWith("Service")))
506
+ patterns.push("Service Layer Pattern");
507
+ if (classes.some((c) => c.name.endsWith("Engine")))
508
+ patterns.push("Engine Pattern");
509
+ if (classes.some((c) => c.name.endsWith("Worker")))
510
+ patterns.push("Worker Pattern");
511
+ if (classes.some((c) => c.name.endsWith("Factory") || c.interfaces.some((i) => i.includes("IFactory"))))
512
+ patterns.push("Factory Pattern");
513
+ if (classes.some((c) => c.classAttributes.some((a) => a.includes("Serializable"))))
514
+ patterns.push("File System Serialization (Cart/Session)");
515
+ if (classes.some((c) => c.interfaces.some((i) => i === "IScraper") || c.name.includes("Scraper")))
516
+ patterns.push("Web Scraper Pattern");
517
+ if (classes.some((c) => c.baseTypes.some((b) => b.includes("CatalogItem")) || c.name.includes("CatalogItemCustom")))
518
+ patterns.push("WEM CatalogItem nasljeđivanje");
519
+ if (classes.some((c) => c.baseTypes.some((b) => b.includes("IntranetUser")) || c.name.includes("IntranetUserCustom")))
520
+ patterns.push("WEM IntranetUser nasljeđivanje");
521
+ if (classes.some((c) => c.baseTypes.some((b) => b.includes("ItemBase"))))
522
+ patterns.push("WEM ItemBase nasljeđivanje");
523
+ if (findFiles(rootPath, (n) => n.endsWith(".razor"), (name, depth) => shouldSkipDir(name, depth)).length > 0)
524
+ patterns.push("Blazor / Razor Components");
525
+ if (fs.existsSync(path.join(rootPath, "Dockerfile")))
526
+ patterns.push("Docker kontejnerizacija");
527
+ return patterns;
528
+ }
529
+ // ─── Main scan handler ────────────────────────────────────────────────────────
530
+ async function handleScan(params) {
531
+ const { rootPath, maxDepth = 5 } = params;
532
+ if (!fs.existsSync(rootPath)) {
533
+ return JSON.stringify({ error: `Putanja ne postoji: ${rootPath}` });
534
+ }
535
+ logger.debug("Pokretanje skeniranja arhitekture", { rootPath, maxDepth });
536
+ // Project type
537
+ const projectType = detectProjectType(rootPath);
538
+ // Folder tree
539
+ const tree = walkDirectory(rootPath, rootPath, 0, maxDepth);
540
+ // .csproj projects
541
+ const csprojFiles = findFiles(rootPath, (n) => n.endsWith(".csproj"), (name, depth) => shouldSkipDir(name, depth));
542
+ const projects = csprojFiles.map((f) => parseCsproj(f, rootPath));
543
+ // NuGet packages (from packages.config files, not NuGet folder)
544
+ const nugetPackages = parseAllPackagesConfigs(rootPath);
545
+ // WEM framework dependencies
546
+ const wemFrameworkDependencies = detectWemFrameworkDeps(rootPath);
547
+ // C# classes — skip Designer files and generated files
548
+ const csFiles = findFiles(rootPath, (n) => n.endsWith(".cs") && !n.endsWith(".Designer.cs") && !n.endsWith(".designer.cs"), (name, depth) => shouldSkipDir(name, depth));
549
+ const classes = csFiles.map((f) => parseCsFile(f, rootPath)).filter((c) => c !== null);
550
+ // HTTP Handlers
551
+ const ashxFiles = findFiles(rootPath, (n) => n.endsWith(".ashx"), (name, depth) => shouldSkipDir(name, depth));
552
+ const httpHandlers = ashxFiles.map((f) => parseAshxFile(f, rootPath));
553
+ // ASPX pages (root level + UserControls, not EasyEdit backend)
554
+ const aspxFiles = findFiles(rootPath, (n) => n.endsWith(".aspx"), (name, depth) => {
555
+ if (name === "EasyEdit" && depth === 0)
556
+ return true; // skip EasyEdit backend aspx
557
+ return shouldSkipDir(name, depth);
558
+ });
559
+ const aspxPages = parseAspxFiles(aspxFiles, rootPath);
560
+ // ASCX controls
561
+ const ascxFiles = findFiles(rootPath, (n) => n.endsWith(".ascx"), (name, depth) => {
562
+ if (name === "EasyEdit" && depth === 0)
563
+ return true;
564
+ return shouldSkipDir(name, depth);
565
+ });
566
+ const ascxControls = parseAscxFiles(ascxFiles, rootPath);
567
+ // Web.config
568
+ const webConfigKeys = parseWebConfig(rootPath);
569
+ // EasyEdit/XML definitions
570
+ const xmlDefPath = path.join(rootPath, "EasyEdit", "XML");
571
+ let xmlDefinitionFiles = [];
572
+ if (fs.existsSync(xmlDefPath)) {
573
+ try {
574
+ xmlDefinitionFiles = fs
575
+ .readdirSync(xmlDefPath)
576
+ .filter((f) => f.endsWith(".xml") || f.endsWith(".json"))
577
+ .sort();
578
+ }
579
+ catch { }
580
+ }
581
+ // UiTest BaseUiTest API docs
582
+ const uiTestBaseApiMethods = parseUiTestApiDocs(rootPath);
583
+ // Detected patterns
584
+ const detectedPatterns = detectPatterns(classes, rootPath);
585
+ // Key files
586
+ const keyFiles = buildKeyFiles(rootPath);
587
+ // Summary
588
+ const hasDocker = fs.existsSync(path.join(rootPath, "Dockerfile"));
589
+ const hasBlazor = findFiles(rootPath, (n) => n.endsWith(".razor"), (name, depth) => shouldSkipDir(name, depth)).length > 0;
590
+ const hasUiTests = fs.existsSync(path.join(rootPath, "UiTest"));
591
+ const hasUnitTests = fs.existsSync(path.join(rootPath, "UnitTest"));
592
+ const hasScraper = classes.some((c) => c.name.includes("Scraper") || c.interfaces.some((i) => i === "IScraper"));
593
+ const configFiles = ["Web.config", "Web.Debug.config", "Web.Release.config", "Web.Sandbox.config", "Web.AutomatedTesting.config", "app.config", "appsettings.json", "packages.config"].filter((f) => fs.existsSync(path.join(rootPath, f)));
594
+ const result = {
595
+ scannedAt: new Date().toISOString(),
596
+ rootPath,
597
+ repoName: path.basename(rootPath),
598
+ projectType,
599
+ summary: {
600
+ totalFiles: tree.fileCount,
601
+ csFiles: csFiles.length,
602
+ csprojFiles: csprojFiles.length,
603
+ ashxFiles: ashxFiles.length,
604
+ aspxFiles: aspxFiles.length,
605
+ ascxFiles: ascxFiles.length,
606
+ xmlDefinitions: xmlDefinitionFiles.length,
607
+ configFiles,
608
+ hasDocker,
609
+ hasBlazor,
610
+ hasUiTests,
611
+ hasUnitTests,
612
+ hasScraper,
613
+ },
614
+ folderTree: tree,
615
+ projects,
616
+ nugetPackages,
617
+ wemFrameworkDependencies,
618
+ classes,
619
+ httpHandlers,
620
+ aspxPages,
621
+ ascxControls,
622
+ webConfigKeys,
623
+ xmlDefinitionFiles,
624
+ uiTestBaseApiMethods,
625
+ detectedPatterns,
626
+ keyFiles,
627
+ };
628
+ logger.debug("Skeniranje završeno", {
629
+ projectType,
630
+ classes: classes.length,
631
+ projects: projects.length,
632
+ handlers: httpHandlers.length,
633
+ nuget: nugetPackages.length,
634
+ });
635
+ return JSON.stringify(result, null, 2);
636
+ }
637
+ // ─── Read file handler ────────────────────────────────────────────────────────
638
+ async function handleReadFile(params) {
639
+ const { rootPath, relativePath, maxLines = 500 } = params;
640
+ const fullPath = path.join(rootPath, relativePath);
641
+ const resolvedRoot = path.resolve(rootPath);
642
+ const resolvedFile = path.resolve(fullPath);
643
+ if (!resolvedFile.startsWith(resolvedRoot)) {
644
+ return JSON.stringify({ error: "Nije dopušten pristup izvan korijenskog direktorija." });
645
+ }
646
+ if (!fs.existsSync(fullPath)) {
647
+ return JSON.stringify({ error: `Datoteka ne postoji: ${relativePath}` });
648
+ }
649
+ const stat = fs.statSync(fullPath);
650
+ if (stat.isDirectory()) {
651
+ return JSON.stringify({ error: `Putanja je direktorij: ${relativePath}` });
652
+ }
653
+ try {
654
+ const content = fs.readFileSync(fullPath, "utf-8");
655
+ const lines = content.split("\n");
656
+ const truncated = lines.length > maxLines;
657
+ return JSON.stringify({
658
+ relativePath,
659
+ totalLines: lines.length,
660
+ truncated,
661
+ truncatedAt: truncated ? maxLines : null,
662
+ content: truncated ? lines.slice(0, maxLines).join("\n") : content,
663
+ });
664
+ }
665
+ catch (e) {
666
+ return JSON.stringify({ error: `Greška pri čitanju: ${e.message}` });
667
+ }
668
+ }
669
+ // ─── Schemas ──────────────────────────────────────────────────────────────────
670
+ const ScanSchema = z.object({
671
+ rootPath: z.string().describe("Apsolutna putanja do korijenskog direktorija repozitorija (npr. C:/dev/WEM.EasyEditCms.Sites.Default)"),
672
+ maxDepth: z.number().default(5).optional().describe("Maksimalna dubina rekurzivnog prolaska kroz direktorije (default: 5)"),
673
+ });
674
+ const ReadFileSchema = z.object({
675
+ rootPath: z.string().describe("Apsolutna putanja do korijenskog direktorija (ista kao pri skeniranju)"),
676
+ relativePath: z
677
+ .string()
678
+ .describe("Relativna putanja do datoteke unutar repozitorija. " +
679
+ "Primjeri: 'Common/Classes/CatalogItemCustom.cs', 'Web.config', " +
680
+ "'Global.asax.cs', 'ServicesRegistration.cs', " +
681
+ "'EasyEdit/XML/CatalogPage.xml', 'Handlers/CartHandler.ashx.cs'"),
682
+ maxLines: z
683
+ .number()
684
+ .default(500)
685
+ .optional()
686
+ .describe("Maksimalni broj linija za čitanje (default: 500). " + "Povećaj na 1000+ za velike datoteke poput CatalogItemCustom.cs."),
687
+ });
688
+ // ─── Registration ─────────────────────────────────────────────────────────────
689
+ export function configureArchitectureTools(server) {
690
+ server.tool(ARCHITECTURE_SCAN, [
691
+ "Skenira arhitekturu WEM EasyEditCms repozitorija i vraća strukturirani JSON koji sadrži:",
692
+ "",
693
+ "• Tip projekta (WEM EasyEditCms Site / Framework)",
694
+ "• Kompletnu strukturu direktorija s inferiranim slojevima na hrvatskom",
695
+ "• Sve .csproj projekte s ovisnostima",
696
+ "• NuGet pakete iz packages.config (ne iz NuGet foldera)",
697
+ "• WEM framework DLL ovisnosti iz bin/ direktorija",
698
+ "• Sve C# klase, sučelja, enume s potpisima metoda i svojstava",
699
+ "• HTTP handlere (.ashx) s implementiranim sučeljima",
700
+ "• ASPX stranice i ASCX user controle (bez EasyEdit backenda)",
701
+ "• Web.config ključeve (bez vrijednosti)",
702
+ "• XML definicije tipova stranica iz EasyEdit/XML/",
703
+ "• API metode BaseUiTest klase (iz XML dokumentacije)",
704
+ "• Detektirane arhitekturalne obrasce",
705
+ "• Ključne datoteke s relativnim putanjama za brzo čitanje",
706
+ "",
707
+ "NAPOMENA: Tool NE čita tijela metoda. Za logiku, DI registracije, Web.config",
708
+ "vrijednosti i startup sekvencu pozovi project_architecture_read_file.",
709
+ ].join("\n"), ScanSchema.shape, async (params) => ({
710
+ content: [{ type: "text", text: await handleScan(params) }],
711
+ }));
712
+ server.tool(ARCHITECTURE_READ_FILE, [
713
+ "Čita sadržaj jedne datoteke iz repozitorija.",
714
+ "Koristi se NAKON project_architecture_scan za detalje koje scan ne pruža:",
715
+ "",
716
+ "• Tijela metoda (getter logika, computed properties, poslovne pravilo)",
717
+ "• Konstruktor logika i DI inicijalizacija polja",
718
+ "• Web.config — sve vrijednosti konfiguracije i connection stringovi",
719
+ "• Global.asax.cs — Application_Start sekvenca i middleware",
720
+ "• ServicesRegistration.cs — redoslijed DI registracija",
721
+ "• Handler .cs datoteke — ProcessRequest logika",
722
+ "• EasyEdit/XML/*.xml — definicije tipova stranica i polja",
723
+ "• Common/Classes/*.cs — pun kod custom klasa",
724
+ "",
725
+ "Relativne putanje dobiveš iz polja 'keyFiles' u scan rezultatu.",
726
+ ].join("\n"), ReadFileSchema.shape, async (params) => ({
727
+ content: [{ type: "text", text: await handleReadFile(params) }],
728
+ }));
729
+ }
730
+ //# sourceMappingURL=architecture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../src/tools/architecture.ts"],"names":[],"mappings":"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"}
package/dist/tools.js CHANGED
@@ -10,6 +10,7 @@ import { configureTestPlanTools } from "./tools/test-plans.js";
10
10
  import { configureWikiTools } from "./tools/wiki.js";
11
11
  import { configureWorkTools } from "./tools/work.js";
12
12
  import { configureWorkItemTools } from "./tools/work-items.js";
13
+ import { configureArchitectureTools } from "./tools/architecture.js";
13
14
  function configureAllTools(server, tokenProvider, connectionProvider, userAgentProvider, enabledDomains) {
14
15
  const configureIfDomainEnabled = (domain, configureFn) => {
15
16
  if (enabledDomains.has(domain)) {
@@ -25,6 +26,7 @@ function configureAllTools(server, tokenProvider, connectionProvider, userAgentP
25
26
  configureIfDomainEnabled(Domain.TEST_PLANS, () => configureTestPlanTools(server, tokenProvider, connectionProvider));
26
27
  configureIfDomainEnabled(Domain.SEARCH, () => configureSearchTools(server, tokenProvider, connectionProvider, userAgentProvider));
27
28
  configureIfDomainEnabled(Domain.ADVANCED_SECURITY, () => configureAdvSecTools(server, tokenProvider, connectionProvider));
29
+ configureArchitectureTools(server);
28
30
  }
29
31
  export { configureAllTools };
30
32
  //# sourceMappingURL=tools.js.map
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAKlC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,SAAS,iBAAiB,CAAC,MAAiB,EAAE,aAAoC,EAAE,kBAAyC,EAAE,iBAA+B,EAAE,cAA2B;IACzL,MAAM,wBAAwB,GAAG,CAAC,MAAc,EAAE,WAAuB,EAAE,EAAE;QAC3E,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,wBAAwB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC9H,wBAAwB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC3G,wBAAwB,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACvI,wBAAwB,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACtI,wBAAwB,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACxI,wBAAwB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC9H,wBAAwB,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACrH,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAClI,wBAAwB,CAAC,MAAM,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAC5H,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAKlC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,SAAS,iBAAiB,CAAC,MAAiB,EAAE,aAAoC,EAAE,kBAAyC,EAAE,iBAA+B,EAAE,cAA2B;IACzL,MAAM,wBAAwB,GAAG,CAAC,MAAc,EAAE,WAAuB,EAAE,EAAE;QAC3E,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,wBAAwB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC9H,wBAAwB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC3G,wBAAwB,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACvI,wBAAwB,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACtI,wBAAwB,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACxI,wBAAwB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC9H,wBAAwB,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACrH,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAClI,wBAAwB,CAAC,MAAM,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC1H,0BAA0B,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const packageVersion = "2.3.14";
1
+ export const packageVersion = "2.3.15";
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@web-marketing-hr/azure-devops-mcp",
3
- "version": "2.3.14",
3
+ "version": "2.3.15",
4
4
  "description": "MCP server for interacting with Azure DevOps (on-premises) WEM fork",
5
5
  "license": "MIT",
6
6
  "author": "Microsoft Corporation, WEB Marketing d.o.o. Fork",