mcp-code-context 3.9.2 → 7.0.1
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 +72 -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 +97 -95
- 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,31 @@
|
|
|
1
|
+
import { modelToTable, type TableSchema, type ProjectDbSchema } from "./railsSchema.js";
|
|
2
|
+
export { type TableSchema, type ProjectDbSchema, modelToTable };
|
|
3
|
+
/**
|
|
4
|
+
* Extract virtual database schema from Laravel database/migrations
|
|
5
|
+
*/
|
|
6
|
+
export declare function loadLaravelSchema(projectRoot: string): Promise<ProjectDbSchema | null>;
|
|
7
|
+
export declare function parseLaravelMigration(content: string, schema?: ProjectDbSchema): ProjectDbSchema;
|
|
8
|
+
/**
|
|
9
|
+
* Extract virtual database schema from Django models.py files
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadDjangoSchema(projectRoot: string): Promise<ProjectDbSchema | null>;
|
|
12
|
+
export declare function parseDjangoModels(content: string, schema?: ProjectDbSchema): ProjectDbSchema;
|
|
13
|
+
/**
|
|
14
|
+
* Extract virtual database schema from Prisma schema.prisma files
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadPrismaSchema(projectRoot: string): Promise<ProjectDbSchema | null>;
|
|
17
|
+
export declare function parsePrismaSchema(content: string, schema?: ProjectDbSchema): ProjectDbSchema;
|
|
18
|
+
/**
|
|
19
|
+
* Extract virtual database schema from Drizzle ORM schema files
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadDrizzleSchema(projectRoot: string): Promise<ProjectDbSchema | null>;
|
|
22
|
+
export declare function parseDrizzleSchema(content: string, schema?: ProjectDbSchema): ProjectDbSchema;
|
|
23
|
+
export type SupportedVirtualFramework = "ActiveRecord" | "Eloquent" | "Django" | "Prisma" | "Drizzle";
|
|
24
|
+
/**
|
|
25
|
+
* Unified virtual schema loader supporting Rails, Laravel, Django, Prisma & Drizzle
|
|
26
|
+
*/
|
|
27
|
+
export declare function loadUnifiedVirtualSchema(projectRoot: string, fileExtension?: string): Promise<{
|
|
28
|
+
framework: SupportedVirtualFramework;
|
|
29
|
+
schema: ProjectDbSchema;
|
|
30
|
+
} | null>;
|
|
31
|
+
export declare function formatUnifiedSchemaAnnotation(framework: SupportedVirtualFramework, tableName: string, columns: TableSchema): string;
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { loadRailsSchema, modelToTable } from "./railsSchema.js";
|
|
4
|
+
export { modelToTable };
|
|
5
|
+
// Cache for Laravel schemas
|
|
6
|
+
const laravelCache = new Map();
|
|
7
|
+
// Cache for Django schemas
|
|
8
|
+
const djangoCache = new Map();
|
|
9
|
+
// Cache for Prisma schemas
|
|
10
|
+
const prismaCache = new Map();
|
|
11
|
+
// Cache for Drizzle schemas
|
|
12
|
+
const drizzleCache = new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Extract virtual database schema from Laravel database/migrations
|
|
15
|
+
*/
|
|
16
|
+
export async function loadLaravelSchema(projectRoot) {
|
|
17
|
+
const migrationsDir = path.join(projectRoot, "database", "migrations");
|
|
18
|
+
let migrationFiles;
|
|
19
|
+
try {
|
|
20
|
+
const entries = await fs.readdir(migrationsDir, { withFileTypes: true });
|
|
21
|
+
migrationFiles = entries
|
|
22
|
+
.filter(e => e.isFile() && e.name.endsWith(".php"))
|
|
23
|
+
.map(e => path.join(migrationsDir, e.name));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null; // Not a Laravel project with migrations
|
|
27
|
+
}
|
|
28
|
+
if (migrationFiles.length === 0)
|
|
29
|
+
return null;
|
|
30
|
+
// Compute aggregate mtime of migrations
|
|
31
|
+
let aggregateMtime = 0;
|
|
32
|
+
for (const file of migrationFiles) {
|
|
33
|
+
try {
|
|
34
|
+
const stat = await fs.stat(file);
|
|
35
|
+
aggregateMtime += stat.mtimeMs;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// ignore stat failures
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const cached = laravelCache.get(projectRoot);
|
|
42
|
+
if (cached && cached.mtime === aggregateMtime)
|
|
43
|
+
return cached.schema;
|
|
44
|
+
const schema = {};
|
|
45
|
+
for (const file of migrationFiles) {
|
|
46
|
+
try {
|
|
47
|
+
const content = await fs.readFile(file, "utf-8");
|
|
48
|
+
parseLaravelMigration(content, schema);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Skip unreadable files
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
laravelCache.set(projectRoot, { schema, mtime: aggregateMtime });
|
|
55
|
+
return Object.keys(schema).length > 0 ? schema : null;
|
|
56
|
+
}
|
|
57
|
+
export function parseLaravelMigration(content, schema = {}) {
|
|
58
|
+
// Matches Schema::create('table_name', function (Blueprint $table) { ... })
|
|
59
|
+
const createTableRe = /Schema::create\s*\(\s*['"]([^'"]+)['"]\s*,\s*function\s*\([^)]*\)\s*\{([\s\S]*?)\}\s*\);/g;
|
|
60
|
+
let match;
|
|
61
|
+
while ((match = createTableRe.exec(content)) !== null) {
|
|
62
|
+
const tableName = match[1];
|
|
63
|
+
const body = match[2];
|
|
64
|
+
const columns = schema[tableName] || {};
|
|
65
|
+
const colRe = /\$table->(\w+)\s*\(\s*(?:['"]([^'"]+)['"])?/g;
|
|
66
|
+
let colMatch;
|
|
67
|
+
while ((colMatch = colRe.exec(body)) !== null) {
|
|
68
|
+
const colType = colMatch[1];
|
|
69
|
+
const colName = colMatch[2];
|
|
70
|
+
if (colType === "id" || colType === "bigIncrements" || colType === "increments") {
|
|
71
|
+
columns[colName || "id"] = "bigint primary key";
|
|
72
|
+
}
|
|
73
|
+
else if (colType === "timestamps" || colType === "timestampsTz") {
|
|
74
|
+
columns["created_at"] = "timestamp";
|
|
75
|
+
columns["updated_at"] = "timestamp";
|
|
76
|
+
}
|
|
77
|
+
else if (colType === "softDeletes") {
|
|
78
|
+
columns["deleted_at"] = "timestamp nullable";
|
|
79
|
+
}
|
|
80
|
+
else if (colType === "rememberToken") {
|
|
81
|
+
columns["remember_token"] = "string(100)";
|
|
82
|
+
}
|
|
83
|
+
else if (colName) {
|
|
84
|
+
columns[colName] = colType;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
schema[tableName] = columns;
|
|
88
|
+
}
|
|
89
|
+
return schema;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Extract virtual database schema from Django models.py files
|
|
93
|
+
*/
|
|
94
|
+
export async function loadDjangoSchema(projectRoot) {
|
|
95
|
+
const schema = {};
|
|
96
|
+
const foundModels = await findDjangoModelFiles(projectRoot);
|
|
97
|
+
if (foundModels.length === 0)
|
|
98
|
+
return null;
|
|
99
|
+
let aggregateMtime = 0;
|
|
100
|
+
for (const file of foundModels) {
|
|
101
|
+
try {
|
|
102
|
+
const stat = await fs.stat(file);
|
|
103
|
+
aggregateMtime += stat.mtimeMs;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// ignore
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const cached = djangoCache.get(projectRoot);
|
|
110
|
+
if (cached && cached.mtime === aggregateMtime)
|
|
111
|
+
return cached.schema;
|
|
112
|
+
for (const file of foundModels) {
|
|
113
|
+
try {
|
|
114
|
+
const content = await fs.readFile(file, "utf-8");
|
|
115
|
+
parseDjangoModels(content, schema);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// skip
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
djangoCache.set(projectRoot, { schema, mtime: aggregateMtime });
|
|
122
|
+
return Object.keys(schema).length > 0 ? schema : null;
|
|
123
|
+
}
|
|
124
|
+
async function findDjangoModelFiles(dir, depth = 0) {
|
|
125
|
+
if (depth > 4)
|
|
126
|
+
return [];
|
|
127
|
+
const results = [];
|
|
128
|
+
try {
|
|
129
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
if (entry.isDirectory()) {
|
|
132
|
+
if (["node_modules", ".git", "venv", ".venv", "env", "__pycache__"].includes(entry.name)) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const sub = await findDjangoModelFiles(path.join(dir, entry.name), depth + 1);
|
|
136
|
+
results.push(...sub);
|
|
137
|
+
}
|
|
138
|
+
else if (entry.isFile() && (entry.name === "models.py" || entry.name.endsWith("_models.py"))) {
|
|
139
|
+
results.push(path.join(dir, entry.name));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Ignore read errors
|
|
145
|
+
}
|
|
146
|
+
return results;
|
|
147
|
+
}
|
|
148
|
+
export function parseDjangoModels(content, schema = {}) {
|
|
149
|
+
// Matches class ModelName(models.Model):
|
|
150
|
+
const classRe = /class\s+(\w+)\s*\([^)]*models\.Model[^)]*\):([\s\S]*?)(?=\nclass\s|\n[^\s#]|$)/g;
|
|
151
|
+
let match;
|
|
152
|
+
while ((match = classRe.exec(content)) !== null) {
|
|
153
|
+
const className = match[1];
|
|
154
|
+
const body = match[2];
|
|
155
|
+
const tableName = modelToTable(className);
|
|
156
|
+
const columns = schema[tableName] || { id: "AutoField(primary_key=True)" };
|
|
157
|
+
// Matches field_name = models.FieldType(...)
|
|
158
|
+
const fieldRe = /^\s{4,8}(\w+)\s*=\s*models\.(\w+Field|\w+)\(([^)]*)\)/gm;
|
|
159
|
+
let fieldMatch;
|
|
160
|
+
while ((fieldMatch = fieldRe.exec(body)) !== null) {
|
|
161
|
+
const fieldName = fieldMatch[1];
|
|
162
|
+
const fieldType = fieldMatch[2];
|
|
163
|
+
columns[fieldName] = fieldType;
|
|
164
|
+
}
|
|
165
|
+
schema[tableName] = columns;
|
|
166
|
+
}
|
|
167
|
+
return schema;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Extract virtual database schema from Prisma schema.prisma files
|
|
171
|
+
*/
|
|
172
|
+
export async function loadPrismaSchema(projectRoot) {
|
|
173
|
+
const possiblePaths = [
|
|
174
|
+
path.join(projectRoot, "prisma", "schema.prisma"),
|
|
175
|
+
path.join(projectRoot, "schema.prisma"),
|
|
176
|
+
];
|
|
177
|
+
let schemaPath = null;
|
|
178
|
+
for (const p of possiblePaths) {
|
|
179
|
+
try {
|
|
180
|
+
await fs.access(p);
|
|
181
|
+
schemaPath = p;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// continue
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (!schemaPath)
|
|
189
|
+
return null;
|
|
190
|
+
try {
|
|
191
|
+
const stat = await fs.stat(schemaPath);
|
|
192
|
+
const cached = prismaCache.get(projectRoot);
|
|
193
|
+
if (cached && cached.mtime === stat.mtimeMs)
|
|
194
|
+
return cached.schema;
|
|
195
|
+
const content = await fs.readFile(schemaPath, "utf-8");
|
|
196
|
+
const schema = parsePrismaSchema(content);
|
|
197
|
+
prismaCache.set(projectRoot, { schema, mtime: stat.mtimeMs });
|
|
198
|
+
return Object.keys(schema).length > 0 ? schema : null;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export function parsePrismaSchema(content, schema = {}) {
|
|
205
|
+
const modelRe = /model\s+(\w+)\s*\{([\s\S]*?)\}/g;
|
|
206
|
+
let match;
|
|
207
|
+
while ((match = modelRe.exec(content)) !== null) {
|
|
208
|
+
const modelName = match[1];
|
|
209
|
+
const body = match[2];
|
|
210
|
+
const mapMatch = body.match(/@@map\s*\(\s*["']([^"']+)["']\s*\)/);
|
|
211
|
+
const tableName = mapMatch ? mapMatch[1] : modelToTable(modelName);
|
|
212
|
+
const columns = schema[tableName] || {};
|
|
213
|
+
const lines = body.split("\n");
|
|
214
|
+
for (const line of lines) {
|
|
215
|
+
const trimmed = line.trim();
|
|
216
|
+
if (!trimmed || trimmed.startsWith("//") || trimmed.startsWith("@@"))
|
|
217
|
+
continue;
|
|
218
|
+
const fieldMatch = trimmed.match(/^(\w+)\s+([A-Za-z0-9_?\[\]]+)(?:\s+(.*))?$/);
|
|
219
|
+
if (fieldMatch) {
|
|
220
|
+
const fieldName = fieldMatch[1];
|
|
221
|
+
const fieldType = fieldMatch[2];
|
|
222
|
+
const attributes = fieldMatch[3] ? ` ${fieldMatch[3].trim()}` : "";
|
|
223
|
+
columns[fieldName] = `${fieldType}${attributes}`;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
schema[tableName] = columns;
|
|
227
|
+
if (tableName !== modelName.toLowerCase()) {
|
|
228
|
+
schema[modelName.toLowerCase()] = columns;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return schema;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Extract virtual database schema from Drizzle ORM schema files
|
|
235
|
+
*/
|
|
236
|
+
export async function loadDrizzleSchema(projectRoot) {
|
|
237
|
+
const possiblePaths = [
|
|
238
|
+
path.join(projectRoot, "src", "db", "schema.ts"),
|
|
239
|
+
path.join(projectRoot, "src", "schema.ts"),
|
|
240
|
+
path.join(projectRoot, "db", "schema.ts"),
|
|
241
|
+
path.join(projectRoot, "schema.ts"),
|
|
242
|
+
];
|
|
243
|
+
const foundFiles = [];
|
|
244
|
+
for (const p of possiblePaths) {
|
|
245
|
+
try {
|
|
246
|
+
await fs.access(p);
|
|
247
|
+
foundFiles.push(p);
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// continue
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const schemaDir = path.join(projectRoot, "src", "db", "schema");
|
|
254
|
+
try {
|
|
255
|
+
const entries = await fs.readdir(schemaDir, { withFileTypes: true });
|
|
256
|
+
for (const e of entries) {
|
|
257
|
+
if (e.isFile() && (e.name.endsWith(".ts") || e.name.endsWith(".js"))) {
|
|
258
|
+
foundFiles.push(path.join(schemaDir, e.name));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
// ignore
|
|
264
|
+
}
|
|
265
|
+
if (foundFiles.length === 0)
|
|
266
|
+
return null;
|
|
267
|
+
let aggregateMtime = 0;
|
|
268
|
+
for (const file of foundFiles) {
|
|
269
|
+
try {
|
|
270
|
+
const stat = await fs.stat(file);
|
|
271
|
+
aggregateMtime += stat.mtimeMs;
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
// ignore
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const cached = drizzleCache.get(projectRoot);
|
|
278
|
+
if (cached && cached.mtime === aggregateMtime)
|
|
279
|
+
return cached.schema;
|
|
280
|
+
const schema = {};
|
|
281
|
+
for (const file of foundFiles) {
|
|
282
|
+
try {
|
|
283
|
+
const content = await fs.readFile(file, "utf-8");
|
|
284
|
+
parseDrizzleSchema(content, schema);
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
// ignore
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
drizzleCache.set(projectRoot, { schema, mtime: aggregateMtime });
|
|
291
|
+
return Object.keys(schema).length > 0 ? schema : null;
|
|
292
|
+
}
|
|
293
|
+
export function parseDrizzleSchema(content, schema = {}) {
|
|
294
|
+
const tableDeclRe = /(?:export\s+const\s+(\w+)\s*=\s*)?(?:pgTable|mysqlTable|sqliteTable)\s*\(\s*["']([^"']+)["']\s*,\s*\{/g;
|
|
295
|
+
let match;
|
|
296
|
+
while ((match = tableDeclRe.exec(content)) !== null) {
|
|
297
|
+
const constName = match[1];
|
|
298
|
+
const tableName = match[2];
|
|
299
|
+
const startIndex = match.index + match[0].length;
|
|
300
|
+
let depth = 1;
|
|
301
|
+
let endIndex = startIndex;
|
|
302
|
+
while (endIndex < content.length && depth > 0) {
|
|
303
|
+
const char = content[endIndex];
|
|
304
|
+
if (char === "{")
|
|
305
|
+
depth++;
|
|
306
|
+
else if (char === "}")
|
|
307
|
+
depth--;
|
|
308
|
+
endIndex++;
|
|
309
|
+
}
|
|
310
|
+
const body = content.slice(startIndex, endIndex - 1);
|
|
311
|
+
const columns = schema[tableName] || {};
|
|
312
|
+
const colRe = /(\w+)\s*:\s*([a-zA-Z0-9_]+)\s*\(([\s\S]*?)\)((?:\.[a-zA-Z0-9_]+(?:\([^)]*\))?)*)/g;
|
|
313
|
+
let colMatch;
|
|
314
|
+
while ((colMatch = colRe.exec(body)) !== null) {
|
|
315
|
+
const colName = colMatch[1];
|
|
316
|
+
const colType = colMatch[2];
|
|
317
|
+
const modifiers = colMatch[4] ? colMatch[4].trim() : "";
|
|
318
|
+
columns[colName] = `${colType}${modifiers}`;
|
|
319
|
+
}
|
|
320
|
+
schema[tableName] = columns;
|
|
321
|
+
if (constName && constName !== tableName) {
|
|
322
|
+
schema[constName] = columns;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return schema;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Unified virtual schema loader supporting Rails, Laravel, Django, Prisma & Drizzle
|
|
329
|
+
*/
|
|
330
|
+
export async function loadUnifiedVirtualSchema(projectRoot, fileExtension) {
|
|
331
|
+
if (!fileExtension || fileExtension === ".rb") {
|
|
332
|
+
const rails = await loadRailsSchema(projectRoot).catch(() => null);
|
|
333
|
+
if (rails && Object.keys(rails).length > 0) {
|
|
334
|
+
return { framework: "ActiveRecord", schema: rails };
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
if (!fileExtension || fileExtension === ".php") {
|
|
338
|
+
const laravel = await loadLaravelSchema(projectRoot).catch(() => null);
|
|
339
|
+
if (laravel && Object.keys(laravel).length > 0) {
|
|
340
|
+
return { framework: "Eloquent", schema: laravel };
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (!fileExtension || fileExtension === ".py") {
|
|
344
|
+
const django = await loadDjangoSchema(projectRoot).catch(() => null);
|
|
345
|
+
if (django && Object.keys(django).length > 0) {
|
|
346
|
+
return { framework: "Django", schema: django };
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (!fileExtension || fileExtension === ".ts" || fileExtension === ".tsx" || fileExtension === ".js" || fileExtension === ".prisma") {
|
|
350
|
+
const prisma = await loadPrismaSchema(projectRoot).catch(() => null);
|
|
351
|
+
if (prisma && Object.keys(prisma).length > 0) {
|
|
352
|
+
return { framework: "Prisma", schema: prisma };
|
|
353
|
+
}
|
|
354
|
+
const drizzle = await loadDrizzleSchema(projectRoot).catch(() => null);
|
|
355
|
+
if (drizzle && Object.keys(drizzle).length > 0) {
|
|
356
|
+
return { framework: "Drizzle", schema: drizzle };
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return null;
|
|
360
|
+
}
|
|
361
|
+
export function formatUnifiedSchemaAnnotation(framework, tableName, columns) {
|
|
362
|
+
const cols = Object.entries(columns)
|
|
363
|
+
.map(([col, type]) => ` <column name="${col}" type="${type}" />`)
|
|
364
|
+
.join("\n");
|
|
365
|
+
return `<!-- ${framework} Virtual Schema: ${tableName}\n${cols}\n-->`;
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=virtualSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtualSchema.js","sourceRoot":"","sources":["../../../src/utils/virtualSchema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,YAAY,EAA0C,MAAM,kBAAkB,CAAC;AAEzG,OAAO,EAA0C,YAAY,EAAE,CAAC;AAEhE,4BAA4B;AAC5B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsD,CAAC;AACnF,2BAA2B;AAC3B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsD,CAAC;AAClF,2BAA2B;AAC3B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsD,CAAC;AAClF,4BAA4B;AAC5B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsD,CAAC;AAEnF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IACvE,IAAI,cAAwB,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,cAAc,GAAG,OAAO;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aAClD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,wCAAwC;IACvD,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7C,wCAAwC;IACxC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,cAAc,IAAI,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,cAAc;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAEpE,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjD,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,SAA0B,EAAE;IACjF,4EAA4E;IAC5E,MAAM,aAAa,GAAG,2FAA2F,CAAC;IAClH,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,OAAO,GAAgB,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,KAAK,GAAG,8CAA8C,CAAC;QAC7D,IAAI,QAAgC,CAAC;QAErC,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAE5B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,eAAe,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;gBAChF,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,oBAAoB,CAAC;YAClD,CAAC;iBAAM,IAAI,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;gBAClE,OAAO,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC;gBACpC,OAAO,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC;YACtC,CAAC;iBAAM,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;gBACrC,OAAO,CAAC,YAAY,CAAC,GAAG,oBAAoB,CAAC;YAC/C,CAAC;iBAAM,IAAI,OAAO,KAAK,eAAe,EAAE,CAAC;gBACvC,OAAO,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAC;YAC5C,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IAC9B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAE5D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,cAAc,IAAI,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,cAAc;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAEpE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjD,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;IACH,CAAC;IAED,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,GAAW,EAAE,KAAK,GAAG,CAAC;IACxD,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzF,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC9E,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;gBAC/F,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,SAA0B,EAAE;IAC7E,yCAAyC;IACzC,MAAM,OAAO,GAAG,iFAAiF,CAAC;IAClG,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAgB,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,6BAA6B,EAAE,CAAC;QAExF,6CAA6C;QAC7C,MAAM,OAAO,GAAG,yDAAyD,CAAC;QAC1E,IAAI,UAAkC,CAAC;QAEvC,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;QACjC,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IAC9B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,MAAM,aAAa,GAAG;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,eAAe,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC;KACxC,CAAC;IAEF,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnB,UAAU,GAAG,CAAC,CAAC;YACf,MAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC;QAElE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC1C,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,SAA0B,EAAE;IAC7E,MAAM,OAAO,GAAG,iCAAiC,CAAC;IAClD,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAEnE,MAAM,OAAO,GAAgB,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,SAAS;YAE/E,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC/E,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,SAAS,GAAG,UAAU,EAAE,CAAC;YACnD,CAAC;QACH,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;QAC5B,IAAI,SAAS,KAAK,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,OAAO,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,MAAM,aAAa,GAAG;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC;KACpC,CAAC;IAEF,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACrE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,cAAc,IAAI,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,cAAc;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAEpE,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjD,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,SAA0B,EAAE;IAC9E,MAAM,WAAW,GAAG,wGAAwG,CAAC;IAC7H,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAEjD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,UAAU,CAAC;QAC1B,OAAO,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,IAAI,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;iBACrB,IAAI,IAAI,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;YAC/B,QAAQ,EAAE,CAAC;QACb,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAgB,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,KAAK,GAAG,mFAAmF,CAAC;QAClG,IAAI,QAAgC,CAAC;QAErC,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;QAC5B,IAAI,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAID;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,WAAmB,EACnB,aAAsB;IAEtB,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,KAAK,IAAI,aAAa,KAAK,MAAM,IAAI,aAAa,KAAK,KAAK,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QACpI,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACjD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,SAAoC,EACpC,SAAiB,EACjB,OAAoB;IAEpB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,mBAAmB,GAAG,WAAW,IAAI,MAAM,CAAC;SACjE,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,QAAQ,SAAS,oBAAoB,SAAS,KAAK,IAAI,OAAO,CAAC;AACxE,CAAC"}
|
package/llms.txt
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
# mcp-code-context
|
|
1
|
+
# mcp-code-context v7.0.1
|
|
2
2
|
|
|
3
3
|
> A Model Context Protocol (MCP) server with **Tree-sitter WASM parsers** for 100% AST accuracy. Zero native dependencies. Production-ready with middleware pipeline, session-scoped state, and crash recovery.
|
|
4
4
|
|
|
5
|
-
## What's New in
|
|
5
|
+
## What's New in v7.0.0 (Enterprise Polyglot)
|
|
6
|
+
|
|
7
|
+
🧬 **53 Pure AST WebAssembly Tools Suite**:
|
|
8
|
+
- ✅ **Full Polyglot Suite**: 53 pure AST tools with zero native compilation dependencies across 10 major languages.
|
|
9
|
+
- ✅ **Structural S-Expression DSL**: `query_code_ast` with syntax-highlighted tree queries.
|
|
10
|
+
- ✅ **Incremental Tree Diffing**: `incremental_ast_diff` with `tree.edit()`.
|
|
11
|
+
- ✅ **Static Complexity & Scope**: `get_ast_complexity_matrix`, `detect_dead_ast_symbols`, `resolve_lexical_scope`.
|
|
12
|
+
- ✅ **Security & Architecture**: `sql_ast_validator`, `ast_codemod_transpile`, `detect_async_eventloop_blockers`, `verify_env_contract_drift`, `audit_error_handling_contracts`, `extract_api_route_matrix`, `flatten_class_hierarchy`, `detect_circular_dependencies`.
|
|
13
|
+
- ✅ **Startup Diagnostics Signature**: Emits `[mcp-code-context] v7.0.1 running on stdio` on startup.
|
|
14
|
+
|
|
15
|
+
## Previously Added in v3.9.2
|
|
6
16
|
|
|
7
17
|
🛡️ **Project Root Fallback & Schema Freedom Release**:
|
|
8
18
|
- ✅ **Smart Project Root Discovery**: `resolveProjectRoot` & `findProjectRoot` walk up directory trees detecting `.git`, `package.json`, `composer.json`, `pyproject.toml`, etc. Eliminates false-positive `outside project boundary ".../undefined"` security errors.
|
|
@@ -468,6 +478,6 @@ No additional configuration is needed beyond adding the MCP server definition. S
|
|
|
468
478
|
|
|
469
479
|
---
|
|
470
480
|
|
|
471
|
-
**Version**:
|
|
481
|
+
**Version**: 7.0.1
|
|
472
482
|
**Last Updated**: June 8, 2026
|
|
473
483
|
**Status**: Production-ready with session-scoped state and crash recovery
|
package/package.json
CHANGED
|
@@ -1,95 +1,97 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "mcp-code-context",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist/src/index.js",
|
|
7
|
-
"bin": {
|
|
8
|
-
"mcp-code-context": "dist/src/index.js"
|
|
9
|
-
},
|
|
10
|
-
"scripts": {
|
|
11
|
-
"build": "tsc && node -e \"require('fs').copyFileSync('src/utils/gemDescriptions.json', 'dist/src/utils/gemDescriptions.json')\"",
|
|
12
|
-
"test": "npm run build && npm run build:tests && node dist-tests/tests/test-security.js && node dist-tests/tests/test-file-lock.js && node dist-tests/tests/test-rate-limiter.js && node dist-tests/tests/test-v3.4.js && node dist-tests/tests/test-backup-manager.js && node dist-tests/tests/test-index-manager.js && node dist-tests/tests/test-wasm-parsers.js",
|
|
13
|
-
"test:ui": "vitest --ui",
|
|
14
|
-
"test:run": "vitest run",
|
|
15
|
-
"test:coverage": "vitest run --coverage",
|
|
16
|
-
"test:watch": "vitest --watch",
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
"@types/
|
|
84
|
-
"@types/
|
|
85
|
-
"@types/
|
|
86
|
-
"@
|
|
87
|
-
"@
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-code-context",
|
|
3
|
+
"version": "7.0.1",
|
|
4
|
+
"description": "Enterprise Polyglot MCP server with Tree-sitter WASM parsers for 100% AST accuracy. Zero native dependencies. Dual transport: Stdio + Streamable HTTP/SSE. Production-ready with persistent caching, Test Impact Analysis (TIA), 3-hop Call Hierarchy with Mermaid export, Virtual ORM, Cross-Language Wire Contract validation, Offline Conceptual Vector Search, Native S-Expression Tree-sitter Query DSL (query_code_ast), O(log N) Incremental Re-Parsing (incremental_ast_diff), Cognitive & Cyclomatic AST Profiler (get_ast_complexity_matrix), Zero-Hallucination Mock Generator (generate_ast_mocks), Zombie Export Eliminator (detect_dead_ast_symbols), Scope-Aware Semantic Renamer (resolve_lexical_scope), Embedded SQL Validator (sql_ast_validator), Lossless CST Codemods (ast_codemod_transpile), Async Event-Loop Blocker Detector (detect_async_eventloop_blockers), Env Var AST Drift Verifier (verify_env_contract_drift), Exception Swallowing Guard (audit_error_handling_contracts), Zero-Runtime Route Matrix Extractor (extract_api_route_matrix), Trait & Mixin Hierarchy Flattener (flatten_class_hierarchy), and Tarjan Circular Import Detector (detect_circular_dependencies). Supports TypeScript, JavaScript, PHP, Python, Ruby, Java, Go, C#, Rust, and Kotlin.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/src/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"mcp-code-context": "dist/src/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc && node -e \"require('fs').copyFileSync('src/utils/gemDescriptions.json', 'dist/src/utils/gemDescriptions.json')\"",
|
|
12
|
+
"test": "npm run build && npm run build:tests && node dist-tests/tests/test-security.js && node dist-tests/tests/test-file-lock.js && node dist-tests/tests/test-rate-limiter.js && node dist-tests/tests/test-v3.4.js && node dist-tests/tests/test-backup-manager.js && node dist-tests/tests/test-index-manager.js && node dist-tests/tests/test-wasm-parsers.js",
|
|
13
|
+
"test:ui": "vitest --ui",
|
|
14
|
+
"test:run": "vitest run",
|
|
15
|
+
"test:coverage": "vitest run --coverage",
|
|
16
|
+
"test:watch": "vitest --watch",
|
|
17
|
+
"test:vectors": "vitest run tests/unit/vectors/vectors.spec.ts",
|
|
18
|
+
"test:e2e-provider": "node tests/e2e_local_provider_test.mjs",
|
|
19
|
+
"build:tests": "tsc -p tsconfig.tests.json",
|
|
20
|
+
"start": "node dist/src/index.js",
|
|
21
|
+
"dev": "npm run build && node dist/src/index.js",
|
|
22
|
+
"clean": "rimraf dist dist-tests",
|
|
23
|
+
"rebuild": "npm run clean && npm run build",
|
|
24
|
+
"prepublishOnly": "npm run rebuild"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"mcp",
|
|
28
|
+
"model-context-protocol",
|
|
29
|
+
"semantic-compression",
|
|
30
|
+
"llm",
|
|
31
|
+
"code-analysis",
|
|
32
|
+
"ast",
|
|
33
|
+
"repository-map",
|
|
34
|
+
"claude",
|
|
35
|
+
"cursor",
|
|
36
|
+
"windsurf",
|
|
37
|
+
"copilot",
|
|
38
|
+
"amazon-q",
|
|
39
|
+
"code-context",
|
|
40
|
+
"typescript",
|
|
41
|
+
"php",
|
|
42
|
+
"dart",
|
|
43
|
+
"python",
|
|
44
|
+
"ruby",
|
|
45
|
+
"rails",
|
|
46
|
+
"activerecord"
|
|
47
|
+
],
|
|
48
|
+
"author": "Alejandro Chataing <a.chataing.a@gmail.com>",
|
|
49
|
+
"license": "MIT",
|
|
50
|
+
"repository": {
|
|
51
|
+
"type": "git",
|
|
52
|
+
"url": "git+https://github.com/achatainga/mcp-code-context.git"
|
|
53
|
+
},
|
|
54
|
+
"funding": [
|
|
55
|
+
{
|
|
56
|
+
"type": "ko-fi",
|
|
57
|
+
"url": "https://ko-fi.com/achatainga"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"type": "paypal",
|
|
61
|
+
"url": "https://paypal.me/achatainga"
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"homepage": "https://github.com/achatainga/mcp-code-context#readme",
|
|
65
|
+
"bugs": {
|
|
66
|
+
"url": "https://github.com/achatainga/mcp-code-context/issues",
|
|
67
|
+
"email": "a.chataing.a@gmail.com"
|
|
68
|
+
},
|
|
69
|
+
"dependencies": {
|
|
70
|
+
"@modelcontextprotocol/sdk": "^1.32.2",
|
|
71
|
+
"chokidar": "5.0.0",
|
|
72
|
+
"diff-match-patch": "1.0.5",
|
|
73
|
+
"fuse.js": "7.3.0",
|
|
74
|
+
"ignore": "6.0.2",
|
|
75
|
+
"pino": "10.3.1",
|
|
76
|
+
"pino-pretty": "13.1.3",
|
|
77
|
+
"proper-lockfile": "4.1.2",
|
|
78
|
+
"sql.js": "1.14.1",
|
|
79
|
+
"tree-sitter-wasms": "0.1.13",
|
|
80
|
+
"web-tree-sitter": "0.25.1"
|
|
81
|
+
},
|
|
82
|
+
"devDependencies": {
|
|
83
|
+
"@types/chokidar": "1.7.5",
|
|
84
|
+
"@types/diff-match-patch": "1.0.36",
|
|
85
|
+
"@types/node": "22.19.17",
|
|
86
|
+
"@types/proper-lockfile": "4.1.4",
|
|
87
|
+
"@types/sql.js": "1.4.11",
|
|
88
|
+
"@vitest/coverage-v8": "4.1.5",
|
|
89
|
+
"@vitest/ui": "4.1.5",
|
|
90
|
+
"rimraf": "6.0.1",
|
|
91
|
+
"typescript": "5.7.2",
|
|
92
|
+
"vitest": "4.1.5"
|
|
93
|
+
},
|
|
94
|
+
"engines": {
|
|
95
|
+
"node": ">=18.0.0"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
Binary file
|