mcp-code-context 3.9.2 → 7.0.0
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/CHANGELOG.md +61 -0
- package/INSTRUCTIONS.md +15 -4
- package/README.md +109 -5
- package/dist/src/core/engine.d.ts +1 -1
- package/dist/src/core/engine.js +1 -1
- package/dist/src/core/indexManager.d.ts +1 -1
- package/dist/src/core/indexManager.js +1 -1
- package/dist/src/core/sessionManager.d.ts +1 -1
- package/dist/src/core/sessionManager.js +1 -1
- package/dist/src/core/validator.d.ts +1 -1
- package/dist/src/core/validator.js +1 -1
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.js +119 -14
- package/dist/src/index.js.map +1 -1
- package/dist/src/operations/apiRoutes.d.ts +31 -0
- package/dist/src/operations/apiRoutes.js +170 -0
- package/dist/src/operations/apiRoutes.js.map +1 -0
- package/dist/src/operations/architectureLinter.d.ts +45 -0
- package/dist/src/operations/architectureLinter.js +223 -0
- package/dist/src/operations/architectureLinter.js.map +1 -0
- package/dist/src/operations/astComplexity.d.ts +38 -0
- package/dist/src/operations/astComplexity.js +243 -0
- package/dist/src/operations/astComplexity.js.map +1 -0
- package/dist/src/operations/astMockGenerator.d.ts +34 -0
- package/dist/src/operations/astMockGenerator.js +203 -0
- package/dist/src/operations/astMockGenerator.js.map +1 -0
- package/dist/src/operations/astQuery.d.ts +47 -0
- package/dist/src/operations/astQuery.js +169 -0
- package/dist/src/operations/astQuery.js.map +1 -0
- package/dist/src/operations/astTransform.d.ts +1 -1
- package/dist/src/operations/astTransform.js +11 -2
- package/dist/src/operations/astTransform.js.map +1 -1
- package/dist/src/operations/asyncBlockers.d.ts +33 -0
- package/dist/src/operations/asyncBlockers.js +162 -0
- package/dist/src/operations/asyncBlockers.js.map +1 -0
- package/dist/src/operations/blastRadiusReport.d.ts +43 -0
- package/dist/src/operations/blastRadiusReport.js +236 -0
- package/dist/src/operations/blastRadiusReport.js.map +1 -0
- package/dist/src/operations/callHierarchy.d.ts +28 -0
- package/dist/src/operations/callHierarchy.js +166 -0
- package/dist/src/operations/callHierarchy.js.map +1 -0
- package/dist/src/operations/circularDependencies.d.ts +28 -0
- package/dist/src/operations/circularDependencies.js +201 -0
- package/dist/src/operations/circularDependencies.js.map +1 -0
- package/dist/src/operations/classHierarchyFlattener.d.ts +35 -0
- package/dist/src/operations/classHierarchyFlattener.js +185 -0
- package/dist/src/operations/classHierarchyFlattener.js.map +1 -0
- package/dist/src/operations/compress.d.ts +2 -2
- package/dist/src/operations/compress.js +154 -20
- package/dist/src/operations/compress.js.map +1 -1
- package/dist/src/operations/conceptSearch.d.ts +19 -0
- package/dist/src/operations/conceptSearch.js +176 -0
- package/dist/src/operations/conceptSearch.js.map +1 -0
- package/dist/src/operations/confirmationStore.d.ts +1 -1
- package/dist/src/operations/confirmationStore.js +1 -1
- package/dist/src/operations/conflictPredictor.d.ts +21 -0
- package/dist/src/operations/conflictPredictor.js +139 -0
- package/dist/src/operations/conflictPredictor.js.map +1 -0
- package/dist/src/operations/contextCompactor.d.ts +38 -0
- package/dist/src/operations/contextCompactor.js +348 -0
- package/dist/src/operations/contextCompactor.js.map +1 -0
- package/dist/src/operations/cstCodemod.d.ts +34 -0
- package/dist/src/operations/cstCodemod.js +205 -0
- package/dist/src/operations/cstCodemod.js.map +1 -0
- package/dist/src/operations/deadSymbols.d.ts +32 -0
- package/dist/src/operations/deadSymbols.js +178 -0
- package/dist/src/operations/deadSymbols.js.map +1 -0
- package/dist/src/operations/envContract.d.ts +35 -0
- package/dist/src/operations/envContract.js +194 -0
- package/dist/src/operations/envContract.js.map +1 -0
- package/dist/src/operations/errorAudit.d.ts +36 -0
- package/dist/src/operations/errorAudit.js +201 -0
- package/dist/src/operations/errorAudit.js.map +1 -0
- package/dist/src/operations/importIntegrity.d.ts +48 -0
- package/dist/src/operations/importIntegrity.js +395 -0
- package/dist/src/operations/importIntegrity.js.map +1 -0
- package/dist/src/operations/incrementalDiff.d.ts +47 -0
- package/dist/src/operations/incrementalDiff.js +216 -0
- package/dist/src/operations/incrementalDiff.js.map +1 -0
- package/dist/src/operations/lexicalScope.d.ts +51 -0
- package/dist/src/operations/lexicalScope.js +212 -0
- package/dist/src/operations/lexicalScope.js.map +1 -0
- package/dist/src/operations/read.d.ts +21 -0
- package/dist/src/operations/read.js +21 -0
- package/dist/src/operations/read.js.map +1 -1
- package/dist/src/operations/readCore.js +37 -17
- package/dist/src/operations/readCore.js.map +1 -1
- package/dist/src/operations/rename.js +35 -24
- package/dist/src/operations/rename.js.map +1 -1
- package/dist/src/operations/sqlValidator.d.ts +36 -0
- package/dist/src/operations/sqlValidator.js +202 -0
- package/dist/src/operations/sqlValidator.js.map +1 -0
- package/dist/src/operations/symbolQuery.js +112 -23
- package/dist/src/operations/symbolQuery.js.map +1 -1
- package/dist/src/operations/taintAnalysis.d.ts +46 -0
- package/dist/src/operations/taintAnalysis.js +220 -0
- package/dist/src/operations/taintAnalysis.js.map +1 -0
- package/dist/src/operations/testImpact.d.ts +31 -0
- package/dist/src/operations/testImpact.js +179 -0
- package/dist/src/operations/testImpact.js.map +1 -0
- package/dist/src/operations/typeInference.d.ts +54 -0
- package/dist/src/operations/typeInference.js +565 -0
- package/dist/src/operations/typeInference.js.map +1 -0
- package/dist/src/operations/wireContract.d.ts +34 -0
- package/dist/src/operations/wireContract.js +185 -0
- package/dist/src/operations/wireContract.js.map +1 -0
- package/dist/src/operations/write.d.ts +2 -2
- package/dist/src/operations/write.js +151 -82
- package/dist/src/operations/write.js.map +1 -1
- package/dist/src/parsers/base.d.ts +9 -1
- package/dist/src/parsers/base.js +61 -1
- package/dist/src/parsers/base.js.map +1 -1
- package/dist/src/parsers/csharp.d.ts +1 -1
- package/dist/src/parsers/csharp.js +1 -1
- package/dist/src/parsers/dartTreeSitter.d.ts +1 -1
- package/dist/src/parsers/dartTreeSitter.js +1 -1
- package/dist/src/parsers/go.d.ts +1 -1
- package/dist/src/parsers/go.js +1 -1
- package/dist/src/parsers/java.d.ts +1 -1
- package/dist/src/parsers/java.js +1 -1
- package/dist/src/parsers/kotlin.d.ts +1 -1
- package/dist/src/parsers/kotlin.js +1 -1
- package/dist/src/parsers/php.d.ts +1 -1
- package/dist/src/parsers/php.js +1 -1
- package/dist/src/parsers/python.d.ts +1 -1
- package/dist/src/parsers/python.js +1 -1
- package/dist/src/parsers/registry.d.ts +1 -1
- package/dist/src/parsers/registry.js +1 -1
- package/dist/src/parsers/ruby.d.ts +1 -1
- package/dist/src/parsers/ruby.js +1 -1
- package/dist/src/parsers/rust.d.ts +1 -1
- package/dist/src/parsers/rust.js +1 -1
- package/dist/src/parsers/typescript.d.ts +1 -1
- package/dist/src/parsers/typescript.js +1 -1
- package/dist/src/tools/context.d.ts +4 -0
- package/dist/src/tools/context.js +14 -0
- package/dist/src/tools/context.js.map +1 -1
- package/dist/src/tools/pipeline.js +26 -0
- package/dist/src/tools/pipeline.js.map +1 -1
- package/dist/src/tools/readHandlers.d.ts +150 -0
- package/dist/src/tools/readHandlers.js +622 -17
- package/dist/src/tools/readHandlers.js.map +1 -1
- package/dist/src/tools/toolDefinitions.d.ts +2184 -0
- package/dist/src/tools/toolDefinitionsCore.d.ts +2184 -0
- package/dist/src/tools/toolDefinitionsCore.js +381 -1
- package/dist/src/tools/toolDefinitionsCore.js.map +1 -1
- package/dist/src/tools/writeHandlers.js +3 -1
- package/dist/src/tools/writeHandlers.js.map +1 -1
- package/dist/src/utils/appDir.d.ts +1 -1
- package/dist/src/utils/appDir.js +1 -1
- package/dist/src/utils/auditLogger.d.ts +1 -1
- package/dist/src/utils/auditLogger.js +1 -1
- package/dist/src/utils/backupManager.d.ts +1 -1
- package/dist/src/utils/backupManager.js +1 -1
- package/dist/src/utils/conceptEngine.d.ts +56 -0
- package/dist/src/utils/conceptEngine.js +234 -0
- package/dist/src/utils/conceptEngine.js.map +1 -0
- package/dist/src/utils/constants.d.ts +1 -1
- package/dist/src/utils/constants.js +2 -1
- package/dist/src/utils/constants.js.map +1 -1
- package/dist/src/utils/diff.d.ts +1 -1
- package/dist/src/utils/diff.js +1 -1
- package/dist/src/utils/fileLock.d.ts +1 -1
- package/dist/src/utils/fileLock.js +1 -1
- package/dist/src/utils/fileWalker.d.ts +1 -1
- package/dist/src/utils/fileWalker.js +1 -1
- package/dist/src/utils/fileWatcher.d.ts +1 -1
- package/dist/src/utils/fileWatcher.js +1 -1
- package/dist/src/utils/fuzzySearch.d.ts +1 -1
- package/dist/src/utils/fuzzySearch.js +1 -1
- package/dist/src/utils/gemfileParser.d.ts +1 -1
- package/dist/src/utils/gemfileParser.js +1 -1
- package/dist/src/utils/logger.d.ts +1 -1
- package/dist/src/utils/logger.js +1 -1
- package/dist/src/utils/metaprogramming.d.ts +1 -1
- package/dist/src/utils/metaprogramming.js +1 -1
- package/dist/src/utils/railsRoutes.d.ts +1 -1
- package/dist/src/utils/railsRoutes.js +1 -1
- package/dist/src/utils/rateLimiter.d.ts +26 -1
- package/dist/src/utils/rateLimiter.js +26 -1
- package/dist/src/utils/rateLimiter.js.map +1 -1
- package/dist/src/utils/streaming.d.ts +1 -1
- package/dist/src/utils/streaming.js +1 -1
- package/dist/src/utils/telemetry.d.ts +1 -1
- package/dist/src/utils/telemetry.js +1 -1
- package/dist/src/utils/virtualSchema.d.ts +31 -0
- package/dist/src/utils/virtualSchema.js +367 -0
- package/dist/src/utils/virtualSchema.js.map +1 -0
- package/llms.txt +13 -3
- package/package.json +4 -2
- package/skills/code-context-logo.png +0 -0
- package/skills/code-context-pro/SKILL.md +149 -0
- package/skills/code-context-pro/references/benchmarks.md +25 -0
- package/skills/code-context-pro/references/decision-tree.md +32 -0
- package/skills/code-context-pro/references/multi-ide-setup.md +104 -0
- package/skills/code-context-pro.zip +0 -0
- package/HIRE_ME.md +0 -234
- package/SPONSORS.md +0 -104
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zero-Runtime REST / FastAPI / Express Route Extractor
|
|
3
|
+
* v7.0.0 Enterprise AST Intelligence
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from "node:fs/promises";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import { existsSync } from "node:fs";
|
|
8
|
+
import { ParserRegistry } from "../parsers/registry.js";
|
|
9
|
+
import { CodeContextEngine } from "../core/engine.js";
|
|
10
|
+
/**
|
|
11
|
+
* Extracts route parameters like :id (Express) or {id} (FastAPI/OpenAPI)
|
|
12
|
+
*/
|
|
13
|
+
function extractPathParams(routePath) {
|
|
14
|
+
const params = [];
|
|
15
|
+
// Express style :param
|
|
16
|
+
const expressMatches = routePath.match(/:([a-zA-Z0-9_]+)/g);
|
|
17
|
+
if (expressMatches) {
|
|
18
|
+
for (const m of expressMatches)
|
|
19
|
+
params.push(m.slice(1));
|
|
20
|
+
}
|
|
21
|
+
// OpenAPI / FastAPI style {param}
|
|
22
|
+
const fastApiMatches = routePath.match(/{([a-zA-Z0-9_]+)}/g);
|
|
23
|
+
if (fastApiMatches) {
|
|
24
|
+
for (const m of fastApiMatches)
|
|
25
|
+
params.push(m.slice(1, -1));
|
|
26
|
+
}
|
|
27
|
+
return params;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Normalizes HTTP method string
|
|
31
|
+
*/
|
|
32
|
+
function normalizeMethod(raw) {
|
|
33
|
+
const m = raw.toUpperCase();
|
|
34
|
+
if (m === "GET")
|
|
35
|
+
return "GET";
|
|
36
|
+
if (m === "POST")
|
|
37
|
+
return "POST";
|
|
38
|
+
if (m === "PUT")
|
|
39
|
+
return "PUT";
|
|
40
|
+
if (m === "DELETE")
|
|
41
|
+
return "DELETE";
|
|
42
|
+
if (m === "PATCH")
|
|
43
|
+
return "PATCH";
|
|
44
|
+
if (m === "ALL" || m === "USE")
|
|
45
|
+
return "ALL";
|
|
46
|
+
return "CUSTOM";
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Extracts API routes from AST
|
|
50
|
+
*/
|
|
51
|
+
export async function extractApiRouteMatrix(params) {
|
|
52
|
+
let tree = null;
|
|
53
|
+
try {
|
|
54
|
+
const targetPath = params.filePath || "in_memory.ts";
|
|
55
|
+
let content = params.code ?? params.content;
|
|
56
|
+
if (content === undefined) {
|
|
57
|
+
if (params.filePath && existsSync(params.filePath)) {
|
|
58
|
+
content = await fs.readFile(params.filePath, "utf-8");
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
return {
|
|
62
|
+
success: false,
|
|
63
|
+
error: `File does not exist: ${params.filePath || "none"}`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const ext = path.extname(targetPath).toLowerCase();
|
|
68
|
+
let registry = params.registry;
|
|
69
|
+
if (!registry) {
|
|
70
|
+
const engine = new CodeContextEngine();
|
|
71
|
+
await engine.init();
|
|
72
|
+
registry = new ParserRegistry(engine);
|
|
73
|
+
await registry.init();
|
|
74
|
+
}
|
|
75
|
+
const parser = registry.getParser(ext === ".py" ? ".py" : ".ts");
|
|
76
|
+
if (!parser) {
|
|
77
|
+
return {
|
|
78
|
+
success: false,
|
|
79
|
+
error: `No parser available for extension: ${ext}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
tree = parser.parse(content);
|
|
83
|
+
const routes = [];
|
|
84
|
+
function walkAST(n) {
|
|
85
|
+
// 1. Python FastAPI / Flask decorators: @app.get("/path"), @router.post("/path")
|
|
86
|
+
if (n.type === "decorated_definition") {
|
|
87
|
+
for (let i = 0; i < n.namedChildCount; i++) {
|
|
88
|
+
const child = n.namedChild(i);
|
|
89
|
+
if (child && child.type === "decorator") {
|
|
90
|
+
const decText = child.text;
|
|
91
|
+
const match = decText.match(/@(app|router|api|blueprint)\.(get|post|put|delete|patch)\((["'])(.*?)\3/i);
|
|
92
|
+
if (match) {
|
|
93
|
+
const method = normalizeMethod(match[2]);
|
|
94
|
+
const routePath = match[4];
|
|
95
|
+
const fnDef = n.childForFieldName("definition") || n.namedChild(n.namedChildCount - 1);
|
|
96
|
+
const handlerName = fnDef?.childForFieldName("name")?.text || "anonymous_handler";
|
|
97
|
+
routes.push({
|
|
98
|
+
method,
|
|
99
|
+
path: routePath,
|
|
100
|
+
handlerName,
|
|
101
|
+
line: child.startPosition.row + 1,
|
|
102
|
+
framework: "FastAPI",
|
|
103
|
+
pathParams: extractPathParams(routePath),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// 2. TypeScript / Express call_expression: app.get("/path", ...), router.post("/path", ...)
|
|
110
|
+
if (n.type === "call_expression") {
|
|
111
|
+
const fnExpr = n.childForFieldName("function");
|
|
112
|
+
if (fnExpr && fnExpr.type === "member_expression") {
|
|
113
|
+
const obj = fnExpr.childForFieldName("object")?.text || "";
|
|
114
|
+
const prop = fnExpr.childForFieldName("property")?.text?.toLowerCase() || "";
|
|
115
|
+
if ((obj === "app" || obj === "router" || obj.endsWith("Router") || obj.endsWith("App")) &&
|
|
116
|
+
["get", "post", "put", "delete", "patch", "all", "use"].includes(prop)) {
|
|
117
|
+
const args = n.childForFieldName("arguments");
|
|
118
|
+
const firstArg = args?.namedChild(0);
|
|
119
|
+
if (firstArg && (firstArg.type === "string" || firstArg.type === "string_literal" || firstArg.type === "template_string")) {
|
|
120
|
+
const routePath = firstArg.text.replace(/^["'`]|["'`]$/g, "");
|
|
121
|
+
const handlerNode = args?.namedChild(1);
|
|
122
|
+
const handlerName = handlerNode?.text?.split("(")[0]?.trim() || "anonymous";
|
|
123
|
+
routes.push({
|
|
124
|
+
method: normalizeMethod(prop),
|
|
125
|
+
path: routePath,
|
|
126
|
+
handlerName,
|
|
127
|
+
line: n.startPosition.row + 1,
|
|
128
|
+
framework: "Express",
|
|
129
|
+
pathParams: extractPathParams(routePath),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
for (let i = 0; i < n.namedChildCount; i++) {
|
|
136
|
+
const child = n.namedChild(i);
|
|
137
|
+
if (child)
|
|
138
|
+
walkAST(child);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
walkAST(tree.rootNode);
|
|
142
|
+
const report = {
|
|
143
|
+
filePath: params.filePath,
|
|
144
|
+
totalRoutesFound: routes.length,
|
|
145
|
+
routes,
|
|
146
|
+
summary: `Discovered ${routes.length} HTTP routes across AST without runtime execution.`,
|
|
147
|
+
};
|
|
148
|
+
return {
|
|
149
|
+
success: true,
|
|
150
|
+
content: JSON.stringify(report, null, 2),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
return {
|
|
155
|
+
success: false,
|
|
156
|
+
error: `extract_api_route_matrix failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
if (tree) {
|
|
161
|
+
try {
|
|
162
|
+
tree.delete();
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// ignore
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=apiRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiRoutes.js","sourceRoot":"","sources":["../../../src/operations/apiRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Architectural Boundary Guardrails Engine (v4.6.0)
|
|
3
|
+
*
|
|
4
|
+
* Enforces clean architecture / hexagonal boundary rules by analyzing import statements
|
|
5
|
+
* across layers (e.g. domain entities cannot import infrastructure/database drivers;
|
|
6
|
+
* React UI components cannot import raw Prisma/ORM models; use cases cannot import Express/HTTP controllers).
|
|
7
|
+
*/
|
|
8
|
+
import type { ReadResult } from "./readCore.js";
|
|
9
|
+
export interface ArchitectureRule {
|
|
10
|
+
layer: string;
|
|
11
|
+
pattern: string;
|
|
12
|
+
disallow: string[];
|
|
13
|
+
description?: string;
|
|
14
|
+
suggestion?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ArchitectureViolation {
|
|
17
|
+
filePath: string;
|
|
18
|
+
line: number;
|
|
19
|
+
layer: string;
|
|
20
|
+
rulePattern: string;
|
|
21
|
+
disallowedSource: string;
|
|
22
|
+
matchedRule: string;
|
|
23
|
+
message: string;
|
|
24
|
+
suggestion: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ArchitectureComplianceReport {
|
|
27
|
+
compliant: boolean;
|
|
28
|
+
violationsCount: number;
|
|
29
|
+
filesChecked: number;
|
|
30
|
+
violations: ArchitectureViolation[];
|
|
31
|
+
rulesApplied: ArchitectureRule[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Standard Clean / Hexagonal Architecture Defaults
|
|
35
|
+
*/
|
|
36
|
+
export declare const DEFAULT_ARCHITECTURE_RULES: ArchitectureRule[];
|
|
37
|
+
/**
|
|
38
|
+
* Enforces architecture rules across a single file or project directory
|
|
39
|
+
*/
|
|
40
|
+
export declare function enforceArchitectureRules(params: {
|
|
41
|
+
filePath?: string;
|
|
42
|
+
projectRoot: string;
|
|
43
|
+
rules?: ArchitectureRule[];
|
|
44
|
+
content?: string;
|
|
45
|
+
}): Promise<ReadResult>;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Architectural Boundary Guardrails Engine (v4.6.0)
|
|
3
|
+
*
|
|
4
|
+
* Enforces clean architecture / hexagonal boundary rules by analyzing import statements
|
|
5
|
+
* across layers (e.g. domain entities cannot import infrastructure/database drivers;
|
|
6
|
+
* React UI components cannot import raw Prisma/ORM models; use cases cannot import Express/HTTP controllers).
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from "node:fs/promises";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { existsSync } from "node:fs";
|
|
11
|
+
import { extractImportStatements } from "./importIntegrity.js";
|
|
12
|
+
/**
|
|
13
|
+
* Standard Clean / Hexagonal Architecture Defaults
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_ARCHITECTURE_RULES = [
|
|
16
|
+
{
|
|
17
|
+
layer: "domain",
|
|
18
|
+
pattern: "**/domain/**",
|
|
19
|
+
disallow: [
|
|
20
|
+
"**/infra/**",
|
|
21
|
+
"**/infrastructure/**",
|
|
22
|
+
"**/adapters/**",
|
|
23
|
+
"**/controllers/**",
|
|
24
|
+
"**/api/**",
|
|
25
|
+
"express",
|
|
26
|
+
"fastify",
|
|
27
|
+
"@nestjs/common",
|
|
28
|
+
"react",
|
|
29
|
+
"next",
|
|
30
|
+
"next/**",
|
|
31
|
+
"@prisma/client",
|
|
32
|
+
"typeorm",
|
|
33
|
+
"mongoose",
|
|
34
|
+
"knex",
|
|
35
|
+
"pg",
|
|
36
|
+
"mysql2"
|
|
37
|
+
],
|
|
38
|
+
description: "Domain layer must remain pure business logic and cannot import infrastructure, database drivers, web frameworks, or UI.",
|
|
39
|
+
suggestion: "Define an interface/port in the domain layer and implement it in an infrastructure adapter."
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
layer: "ui",
|
|
43
|
+
pattern: "**/components/**",
|
|
44
|
+
disallow: [
|
|
45
|
+
"**/db/**",
|
|
46
|
+
"**/database/**",
|
|
47
|
+
"**/models/**",
|
|
48
|
+
"@prisma/client",
|
|
49
|
+
"typeorm",
|
|
50
|
+
"mongoose",
|
|
51
|
+
"knex",
|
|
52
|
+
"pg",
|
|
53
|
+
"mysql2",
|
|
54
|
+
"sqlite3"
|
|
55
|
+
],
|
|
56
|
+
description: "UI presentation layer cannot directly import database drivers, queries, or raw ORM models.",
|
|
57
|
+
suggestion: "Fetch data via Server Actions, API routes, or pass DTOs via component props."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
layer: "use_cases",
|
|
61
|
+
pattern: "**/use-cases/**",
|
|
62
|
+
disallow: [
|
|
63
|
+
"**/controllers/**",
|
|
64
|
+
"**/views/**",
|
|
65
|
+
"express",
|
|
66
|
+
"fastify",
|
|
67
|
+
"react"
|
|
68
|
+
],
|
|
69
|
+
description: "Application use cases cannot depend on transport controllers, HTTP request objects, or UI views.",
|
|
70
|
+
suggestion: "Accept pure input DTOs and return result objects without HTTP-specific concepts."
|
|
71
|
+
}
|
|
72
|
+
];
|
|
73
|
+
/**
|
|
74
|
+
* Converts a glob-like pattern into a regular expression
|
|
75
|
+
*/
|
|
76
|
+
function globToRegex(glob) {
|
|
77
|
+
const normalized = glob.replace(/\\/g, "/");
|
|
78
|
+
let reStr = normalized
|
|
79
|
+
.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")
|
|
80
|
+
.replace(/\\\*\\\*/g, ".*")
|
|
81
|
+
.replace(/(?<!\.)\\\*/g, "[^/]*");
|
|
82
|
+
return new RegExp(`^${reStr}$`, "i");
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Matches a relative path or package name against a pattern
|
|
86
|
+
*/
|
|
87
|
+
function matchesPattern(target, pattern) {
|
|
88
|
+
const normTarget = target.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
89
|
+
const normPattern = pattern.replace(/\\/g, "/");
|
|
90
|
+
// Direct exact match
|
|
91
|
+
if (normTarget === normPattern)
|
|
92
|
+
return true;
|
|
93
|
+
// Package prefix match (e.g. "next/**" matches "next/server")
|
|
94
|
+
if (normPattern.endsWith("/**")) {
|
|
95
|
+
const prefix = normPattern.slice(0, -3);
|
|
96
|
+
if (normTarget === prefix || normTarget.startsWith(prefix + "/"))
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
// Regex glob match
|
|
100
|
+
try {
|
|
101
|
+
const rx = globToRegex(normPattern);
|
|
102
|
+
if (rx.test(normTarget))
|
|
103
|
+
return true;
|
|
104
|
+
// Check with leading wildcards if pattern didn't specify
|
|
105
|
+
if (!normPattern.startsWith("**/") && !normPattern.startsWith("/")) {
|
|
106
|
+
const wildcardRx = globToRegex(`**/${normPattern}`);
|
|
107
|
+
if (wildcardRx.test(normTarget))
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Ignore regex compilation issues
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Loads architecture configuration from disk if available
|
|
118
|
+
*/
|
|
119
|
+
async function loadArchitectureConfig(projectRoot) {
|
|
120
|
+
const configNames = [
|
|
121
|
+
".architecturerc.json",
|
|
122
|
+
".architecturerc",
|
|
123
|
+
"architecture.json",
|
|
124
|
+
".architecture.json"
|
|
125
|
+
];
|
|
126
|
+
for (const name of configNames) {
|
|
127
|
+
const fullPath = path.join(projectRoot, name);
|
|
128
|
+
if (existsSync(fullPath)) {
|
|
129
|
+
try {
|
|
130
|
+
const raw = await fs.readFile(fullPath, "utf-8");
|
|
131
|
+
const parsed = JSON.parse(raw);
|
|
132
|
+
if (Array.isArray(parsed)) {
|
|
133
|
+
return parsed;
|
|
134
|
+
}
|
|
135
|
+
if (parsed.rules && Array.isArray(parsed.rules)) {
|
|
136
|
+
return parsed.rules;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Fall back to next or default
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return DEFAULT_ARCHITECTURE_RULES;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Enforces architecture rules across a single file or project directory
|
|
148
|
+
*/
|
|
149
|
+
export async function enforceArchitectureRules(params) {
|
|
150
|
+
try {
|
|
151
|
+
const rules = params.rules && params.rules.length > 0
|
|
152
|
+
? params.rules
|
|
153
|
+
: await loadArchitectureConfig(params.projectRoot);
|
|
154
|
+
const violations = [];
|
|
155
|
+
let filesChecked = 0;
|
|
156
|
+
// Mode 1: Single file check (or proposed in-memory content)
|
|
157
|
+
if (params.filePath) {
|
|
158
|
+
const relPath = path.relative(params.projectRoot, params.filePath).replace(/\\/g, "/");
|
|
159
|
+
let content = params.content;
|
|
160
|
+
if (!content) {
|
|
161
|
+
if (!existsSync(params.filePath)) {
|
|
162
|
+
return {
|
|
163
|
+
success: false,
|
|
164
|
+
error: `File does not exist: ${params.filePath}`,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
content = await fs.readFile(params.filePath, "utf-8");
|
|
168
|
+
}
|
|
169
|
+
filesChecked++;
|
|
170
|
+
const ext = path.extname(params.filePath).toLowerCase();
|
|
171
|
+
const rawImports = extractImportStatements(content, ext);
|
|
172
|
+
// Check applicable rules for this file's path
|
|
173
|
+
for (const rule of rules) {
|
|
174
|
+
if (matchesPattern(relPath, rule.pattern)) {
|
|
175
|
+
for (const imp of rawImports) {
|
|
176
|
+
let resolvedSource = imp.source;
|
|
177
|
+
// If it's a relative import, resolve it relative to projectRoot
|
|
178
|
+
if (imp.source.startsWith("./") || imp.source.startsWith("../")) {
|
|
179
|
+
const fileDir = path.dirname(params.filePath);
|
|
180
|
+
const resolvedAbs = path.resolve(fileDir, imp.source);
|
|
181
|
+
resolvedSource = path.relative(params.projectRoot, resolvedAbs).replace(/\\/g, "/");
|
|
182
|
+
}
|
|
183
|
+
for (const disallowed of rule.disallow) {
|
|
184
|
+
if (matchesPattern(resolvedSource, disallowed) || matchesPattern(imp.source, disallowed)) {
|
|
185
|
+
violations.push({
|
|
186
|
+
filePath: relPath,
|
|
187
|
+
line: imp.line,
|
|
188
|
+
layer: rule.layer,
|
|
189
|
+
rulePattern: rule.pattern,
|
|
190
|
+
disallowedSource: imp.source,
|
|
191
|
+
matchedRule: disallowed,
|
|
192
|
+
message: `Layer '${rule.layer}' (${rule.pattern}) is forbidden from importing '${imp.source}'. ${rule.description || ""}`.trim(),
|
|
193
|
+
suggestion: rule.suggestion || "Decouple layer dependencies using interfaces, ports, or DTOs.",
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const report = {
|
|
202
|
+
compliant: violations.length === 0,
|
|
203
|
+
violationsCount: violations.length,
|
|
204
|
+
filesChecked,
|
|
205
|
+
violations,
|
|
206
|
+
rulesApplied: rules,
|
|
207
|
+
};
|
|
208
|
+
const footer = violations.length === 0
|
|
209
|
+
? "\n\n✅ Architectural Boundary Guardrails: 100% Compliant (Zero Layer Violations)."
|
|
210
|
+
: `\n\n⚠️ Architectural Boundary Violations: Found ${violations.length} illegal layer imports!`;
|
|
211
|
+
return {
|
|
212
|
+
success: true,
|
|
213
|
+
content: JSON.stringify(report, null, 2) + footer,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
return {
|
|
218
|
+
success: false,
|
|
219
|
+
error: `enforce_architecture_rules failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=architectureLinter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architectureLinter.js","sourceRoot":"","sources":["../../../src/operations/architectureLinter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AA8B/D;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAuB;IAC5D;QACE,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE;YACR,aAAa;YACb,sBAAsB;YACtB,gBAAgB;YAChB,mBAAmB;YACnB,WAAW;YACX,SAAS;YACT,SAAS;YACT,gBAAgB;YAChB,OAAO;YACP,MAAM;YACN,SAAS;YACT,gBAAgB;YAChB,SAAS;YACT,UAAU;YACV,MAAM;YACN,IAAI;YACJ,QAAQ;SACT;QACD,WAAW,EAAE,yHAAyH;QACtI,UAAU,EAAE,6FAA6F;KAC1G;IACD;QACE,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE;YACR,UAAU;YACV,gBAAgB;YAChB,cAAc;YACd,gBAAgB;YAChB,SAAS;YACT,UAAU;YACV,MAAM;YACN,IAAI;YACJ,QAAQ;YACR,SAAS;SACV;QACD,WAAW,EAAE,4FAA4F;QACzG,UAAU,EAAE,8EAA8E;KAC3F;IACD;QACE,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,iBAAiB;QAC1B,QAAQ,EAAE;YACR,mBAAmB;YACnB,aAAa;YACb,SAAS;YACT,SAAS;YACT,OAAO;SACR;QACD,WAAW,EAAE,kGAAkG;QAC/G,UAAU,EAAE,kFAAkF;KAC/F;CACF,CAAC;AAEF;;GAEG;AACH,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,KAAK,GAAG,UAAU;SACnB,OAAO,CAAC,qCAAqC,EAAE,MAAM,CAAC;SACtD,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;SAC1B,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAEpC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,MAAc,EAAE,OAAe;IACrD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEhD,qBAAqB;IACrB,IAAI,UAAU,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAE5C,8DAA8D;IAC9D,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAChF,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAErC,yDAAyD;QACzD,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACnE,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC;YACpD,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB,CAAC,WAAmB;IACvD,MAAM,WAAW,GAAG;QAClB,sBAAsB;QACtB,iBAAiB;QACjB,mBAAmB;QACnB,oBAAoB;KACrB,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1B,OAAO,MAA4B,CAAC;gBACtC,CAAC;gBACD,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChD,OAAO,MAAM,CAAC,KAA2B,CAAC;gBAC5C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,+BAA+B;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,0BAA0B,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAK9C;IACC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACnD,CAAC,CAAC,MAAM,CAAC,KAAK;YACd,CAAC,CAAC,MAAM,sBAAsB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAErD,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,4DAA4D;QAC5D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACvF,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACjC,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,wBAAwB,MAAM,CAAC,QAAQ,EAAE;qBACjD,CAAC;gBACJ,CAAC;gBACD,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACxD,CAAC;YAED,YAAY,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACxD,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAEzD,8CAA8C;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;wBAC7B,IAAI,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC;wBAEhC,gEAAgE;wBAChE,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;4BAChE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;4BAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;4BACtD,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;wBACtF,CAAC;wBAED,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;4BACvC,IAAI,cAAc,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;gCACzF,UAAU,CAAC,IAAI,CAAC;oCACd,QAAQ,EAAE,OAAO;oCACjB,IAAI,EAAE,GAAG,CAAC,IAAI;oCACd,KAAK,EAAE,IAAI,CAAC,KAAK;oCACjB,WAAW,EAAE,IAAI,CAAC,OAAO;oCACzB,gBAAgB,EAAE,GAAG,CAAC,MAAM;oCAC5B,WAAW,EAAE,UAAU;oCACvB,OAAO,EAAE,UAAU,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,OAAO,kCAAkC,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;oCAChI,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,+DAA+D;iCAC/F,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAiC;YAC3C,SAAS,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;YAClC,eAAe,EAAE,UAAU,CAAC,MAAM;YAClC,YAAY;YACZ,UAAU;YACV,YAAY,EAAE,KAAK;SACpB,CAAC;QAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC;YACpC,CAAC,CAAC,kFAAkF;YACpF,CAAC,CAAC,mDAAmD,UAAU,CAAC,MAAM,yBAAyB,CAAC;QAElG,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,MAAM;SAClD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,sCAAsC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACtG,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Complexity Matrix (McCabe Cyclomatic & Sonar Cognitive Complexity)
|
|
3
|
+
* v5.6.0 Enterprise AST Intelligence
|
|
4
|
+
*/
|
|
5
|
+
import { ParserRegistry } from "../parsers/registry.js";
|
|
6
|
+
import type { ReadResult } from "./readCore.js";
|
|
7
|
+
export interface FunctionComplexityMetric {
|
|
8
|
+
name: string;
|
|
9
|
+
kind: "function" | "method" | "arrow_function";
|
|
10
|
+
startLine: number;
|
|
11
|
+
endLine: number;
|
|
12
|
+
cyclomaticComplexity: number;
|
|
13
|
+
cognitiveComplexity: number;
|
|
14
|
+
maxNestingDepth: number;
|
|
15
|
+
riskLevel: "LOW" | "MODERATE" | "HIGH" | "CRITICAL";
|
|
16
|
+
recommendation: string;
|
|
17
|
+
}
|
|
18
|
+
export interface AstComplexityReport {
|
|
19
|
+
filePath?: string;
|
|
20
|
+
totalFunctionsAnalyzed: number;
|
|
21
|
+
averageCyclomatic: number;
|
|
22
|
+
averageCognitive: number;
|
|
23
|
+
highestCognitiveFunction?: string;
|
|
24
|
+
metrics: FunctionComplexityMetric[];
|
|
25
|
+
summary: string;
|
|
26
|
+
}
|
|
27
|
+
export interface AstComplexityOptions {
|
|
28
|
+
filePath?: string;
|
|
29
|
+
code?: string;
|
|
30
|
+
content?: string;
|
|
31
|
+
threshold?: number;
|
|
32
|
+
projectRoot?: string;
|
|
33
|
+
registry?: ParserRegistry;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Computes the AST complexity matrix for a file
|
|
37
|
+
*/
|
|
38
|
+
export declare function getAstComplexityMatrix(params: AstComplexityOptions): Promise<ReadResult>;
|