mcp-code-context 3.9.1 → 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 +288 -215
- package/INSTRUCTIONS.md +28 -11
- package/README.md +124 -11
- 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 +26 -26
- package/dist/src/core/sessionManager.d.ts +1 -1
- package/dist/src/core/sessionManager.js +1 -1
- package/dist/src/core/validator.d.ts +2 -2
- package/dist/src/core/validator.js +8 -2
- package/dist/src/core/validator.js.map +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/adminHandlers.js +8 -7
- package/dist/src/tools/adminHandlers.js.map +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 +27 -1
- package/dist/src/tools/pipeline.js.map +1 -1
- package/dist/src/tools/readHandlers.d.ts +150 -0
- package/dist/src/tools/readHandlers.js +642 -35
- package/dist/src/tools/readHandlers.js.map +1 -1
- package/dist/src/tools/toolDefinitions.d.ts +2190 -1
- package/dist/src/tools/toolDefinitionsAdmin.d.ts +1 -1
- package/dist/src/tools/toolDefinitionsAdmin.js +12 -12
- package/dist/src/tools/toolDefinitionsAdmin.js.map +1 -1
- package/dist/src/tools/toolDefinitionsCore.d.ts +2189 -0
- package/dist/src/tools/toolDefinitionsCore.js +422 -42
- package/dist/src/tools/toolDefinitionsCore.js.map +1 -1
- package/dist/src/tools/writeHandlers.js +31 -17
- 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/projectRoot.d.ts +9 -0
- package/dist/src/utils/projectRoot.js +94 -0
- package/dist/src/utils/projectRoot.js.map +1 -0
- 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 +24 -6
- 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
- package/vitest.config.ts +0 -37
|
@@ -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":"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"}
|
package/llms.txt
CHANGED
|
@@ -1,8 +1,26 @@
|
|
|
1
|
-
# mcp-code-context
|
|
1
|
+
# mcp-code-context v7.0.0
|
|
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.0 running on stdio` on startup.
|
|
14
|
+
|
|
15
|
+
## Previously Added in v3.9.2
|
|
16
|
+
|
|
17
|
+
🛡️ **Project Root Fallback & Schema Freedom Release**:
|
|
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.
|
|
19
|
+
- ✅ **Optional Schema Requirements**: `projectRoot` is now optional across all tools in `CORE_TOOLS` and `ADMIN_TOOLS`. LLM agents can perform surgical operations with just `filePath` or `rootDir`.
|
|
20
|
+
- ✅ **SecurityValidator Guard**: `SecurityValidator` safely defaults `undefined`/`null` roots to `process.cwd()`.
|
|
21
|
+
- ✅ **Startup Diagnostics Signature**: Emits `[mcp-code-context] v3.9.2 running on stdio` on startup.
|
|
22
|
+
|
|
23
|
+
## Previously Added in v3.9.1
|
|
6
24
|
|
|
7
25
|
🐛 **Bug Fix Release**:
|
|
8
26
|
- ✅ **`get_rails_routes` namespace fix**: Routes inside `namespace :admin do` now produce `/admin/users` (was `/users`). Controllers correctly namespaced as `admin/users`. Fixed regex that captured `admin do` instead of `admin` with symbol syntax.
|
|
@@ -159,13 +177,13 @@ This MCP server solves two problems:
|
|
|
159
177
|
- `steps` (optional): Number of versions to go back (1-5, default: 1).
|
|
160
178
|
**What it does:** Reverts the file to the state it was in before the last 1-5 modifications.
|
|
161
179
|
|
|
162
|
-
### Write Tools (
|
|
180
|
+
### Write Tools (Two-Phase Workflow)
|
|
163
181
|
|
|
164
182
|
All write tools follow a **Two-Phase Workflow**:
|
|
165
183
|
1. **Phase 1 (Preview)**: Call without a token to get a unified `diff` and a `confirmationToken`.
|
|
166
184
|
2. **Phase 2 (Apply)**: Call with `confirmationToken` and `confirm: true` to apply the changes.
|
|
167
185
|
|
|
168
|
-
**Important
|
|
186
|
+
**Important Safety Features:**
|
|
169
187
|
- ✅ **Windows CRLF Support**: Fully resolved. All operations work correctly on Windows files with CRLF line endings.
|
|
170
188
|
- ✅ **Parameter Brace Handling**: Methods with braces in parameters (e.g., `{int? cart}`) are now handled correctly.
|
|
171
189
|
- ✅ **Session-scoped state**: Each MCP client gets isolated state (locks, confirmation store, rate limiter).
|
|
@@ -344,7 +362,7 @@ All write tools follow a **Two-Phase Workflow**:
|
|
|
344
362
|
5. **Phase 2: Apply Edit** → Verify the diff, then call with the token and `confirm: true`.
|
|
345
363
|
6. **Recovery** → Use `rollback_file` if needed.
|
|
346
364
|
|
|
347
|
-
## Session State Configuration (v3.
|
|
365
|
+
## Session State Configuration (v3.8.0+)
|
|
348
366
|
|
|
349
367
|
### Critical: Session-Scoped State
|
|
350
368
|
|
|
@@ -460,6 +478,6 @@ No additional configuration is needed beyond adding the MCP server definition. S
|
|
|
460
478
|
|
|
461
479
|
---
|
|
462
480
|
|
|
463
|
-
**Version**:
|
|
481
|
+
**Version**: 7.0.0
|
|
464
482
|
**Last Updated**: June 8, 2026
|
|
465
483
|
**Status**: Production-ready with session-scoped state and crash recovery
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-code-context",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "7.0.0",
|
|
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
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
"test:run": "vitest run",
|
|
15
15
|
"test:coverage": "vitest run --coverage",
|
|
16
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",
|
|
17
19
|
"build:tests": "tsc -p tsconfig.tests.json",
|
|
18
20
|
"start": "node dist/src/index.js",
|
|
19
21
|
"dev": "npm run build && node dist/src/index.js",
|
|
Binary file
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-context-pro
|
|
3
|
+
version: 7.0.0
|
|
4
|
+
description: "Enterprise Polyglot AST Code Intelligence & Surgical Refactoring Engine for Claude Code, Cursor, Windsurf, and Antigravity. Reduces token consumption by 75%-88% using pure WebAssembly Tree-sitter parsers across 10 languages, 53 AST tools, virtual ORM schema extraction, Test Impact Analysis (TIA), 3-hop Call Hierarchy, and atomic 2-phase write protocol with instant rollback."
|
|
5
|
+
author: "Alejandro Chataing <a.chataing.a@gmail.com>"
|
|
6
|
+
license: "Commercial (Agensi.io Tier 1)"
|
|
7
|
+
price: "$29.00 USD"
|
|
8
|
+
marketplace: "https://www.agensi.io"
|
|
9
|
+
category: "Developer Tools / Code Intelligence"
|
|
10
|
+
compatibility: "Claude Code, Cursor, Windsurf, Antigravity, Amazon Q, Copilot"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# CodeContext Pro v7.0.0 Enterprise Polyglot — AI Brain Operating System
|
|
14
|
+
|
|
15
|
+
> *"Never feed a 1,000-line file into your attention window when a 15-line symbol is all you need."*
|
|
16
|
+
|
|
17
|
+
CodeContext Pro transforms standard LLM agents into **Lead Staff Software Architects**. By replacing brute-force file reads (`cat`, `read_file`) and unindexed searches (`grep`, `find`) with deterministic **Tree-sitter WebAssembly Abstract Syntax Tree (AST)** operations across 10 languages, CodeContext Pro cuts token overhead by **75% to 88%**, eliminates hallucinated symbol edits, and enforces atomic two-phase mutations with instant rollback.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## ⚡ 1. QUICKSTART: 60-SECOND UNIVERSAL SETUP
|
|
22
|
+
|
|
23
|
+
### A. Claude Code / CLI (Global Setup)
|
|
24
|
+
Add to your Claude Code MCP configuration (`~/.claude/mcp.json` or `claude.json`):
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"mcpServers": {
|
|
28
|
+
"code-context": {
|
|
29
|
+
"command": "npx",
|
|
30
|
+
"args": ["-y", "mcp-code-context@latest"]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### B. Cursor, Windsurf & Antigravity (Streamable HTTP / Local Port)
|
|
37
|
+
Start the MCP server with the modern dual-transport Streamable HTTP engine:
|
|
38
|
+
```bash
|
|
39
|
+
npx -y mcp-code-context@latest --http --port=3000
|
|
40
|
+
```
|
|
41
|
+
In Cursor / Windsurf settings, register the server endpoint:
|
|
42
|
+
- **Transport**: `Streamable HTTP / SSE`
|
|
43
|
+
- **URL**: `http://127.0.0.1:3000/sse`
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 🧠 2. COGNITIVE DIRECTIVES FOR THE CONSUMING LLM
|
|
48
|
+
|
|
49
|
+
When this skill is active in your context, **YOU MUST ADHERE TO THE FOLLOWING INVARIANTS**:
|
|
50
|
+
|
|
51
|
+
### Axiom 1: Token Budget Invariant (< 20% Budget Consumption)
|
|
52
|
+
- **FORBIDDEN**: Never dump whole files into context exceeding 50 lines if the task only touches a specific class, method, or function.
|
|
53
|
+
- **MANDATORY**: Use `read_file_surgical(filePath, symbolName)` to inspect only the target node and its signature.
|
|
54
|
+
|
|
55
|
+
### Axiom 2: Zero-Guessing Architecture Map
|
|
56
|
+
- Before starting any architectural refactoring, onboarding, or multi-file review, call `get_semantic_repo_map(directoryPath, format: "xml")`.
|
|
57
|
+
- This returns a compressed structural skeleton of every class, method, export, and virtual database column in the repository at ~12% the token cost of raw files.
|
|
58
|
+
|
|
59
|
+
### Axiom 3: Two-Phase Atomic Mutation (Preview -> Confirm)
|
|
60
|
+
- Direct overwriting of source files without user review leads to context corruption and broken builds.
|
|
61
|
+
- All writes must follow the two-phase handshake:
|
|
62
|
+
1. **Phase 1 (Preview)**: Call `write_file_surgical`, `insert_symbol`, or `ast_transform` with `newContent`. The server generates a git unified diff, captures a snapshot in the SQLite backup ledger, and returns a cryptographic `confirmationToken`.
|
|
63
|
+
2. **Phase 2 (Execution)**: Verify the diff. If correct, call the same tool passing `confirm: true` and `confirmationToken: "<TOKEN>"`.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 🧭 3. THE DECISION TREE: AST VS GREP VS RAW I/O
|
|
68
|
+
|
|
69
|
+
```mermaid
|
|
70
|
+
flowchart TD
|
|
71
|
+
Start["Developer asks for code modification or exploration"] --> QueryType{"What is the goal?"}
|
|
72
|
+
|
|
73
|
+
QueryType -->|"Explore Architecture"| Map["Call get_semantic_repo_map\n(85% Token Compression)"]
|
|
74
|
+
QueryType -->|"Find Symbol by Name"| Sym["Call search_symbols\n(AST Query, not text regex)"]
|
|
75
|
+
QueryType -->|"Find Exact String / Text"| Grep["Call search_code_pattern\n(Fuzzy or Regex)"]
|
|
76
|
+
QueryType -->|"Read Code"| ReadDecision{"Need whole file or function?"}
|
|
77
|
+
QueryType -->|"Modify Code"| WriteDecision{"Type of change?"}
|
|
78
|
+
|
|
79
|
+
ReadDecision -->|"Specific function/class"| SurgRead["read_file_surgical(filePath, symbolName)"]
|
|
80
|
+
ReadDecision -->|"Known line window"| LineRead["read_file_lines(filePath, startLine, endLine)"]
|
|
81
|
+
ReadDecision -->|"Multiple symbols"| BatchRead["batch_read(reads: [...])"]
|
|
82
|
+
|
|
83
|
+
WriteDecision -->|"Replace method/class"| SurgWrite["write_file_surgical (Phase 1 -> Phase 2)"]
|
|
84
|
+
WriteDecision -->|"Insert code relative to anchor"| InsertWrite["insert_symbol (before / after / inside)"]
|
|
85
|
+
WriteDecision -->|"Refactor signature / Wrap try-catch"| AstTrans["ast_transform (add_parameter, wrap_with_try_catch)"]
|
|
86
|
+
WriteDecision -->|"Rename across repo"| RenameOp["rename_symbol (Impact first -> Confirm)"]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 🧬 4. THE ENTERPRISE POLYGLOT AST ARSENAL (53 TOOLS)
|
|
92
|
+
|
|
93
|
+
CodeContext Pro v7.0.0 covers 10 programming languages with zero native dependencies:
|
|
94
|
+
**TypeScript, JavaScript, Python, PHP, Dart, Ruby, Java, Go, C#, Rust, and Kotlin.**
|
|
95
|
+
|
|
96
|
+
### Advanced Enterprise Operations:
|
|
97
|
+
1. **`query_code_ast`**: Execute native Tree-sitter S-Expression queries with regex capture filters across all 10 grammars.
|
|
98
|
+
2. **`incremental_ast_diff`**: O(log N) AST diffing using `tree.edit()` for instant incremental re-parsing without full file sweeps.
|
|
99
|
+
3. **`get_ast_complexity_matrix`**: Dual McCabe Cyclomatic and Sonar Cognitive complexity profiling per symbol.
|
|
100
|
+
4. **`generate_ast_mocks`**: Strongly-typed, zero-hallucination mock and test factory generation.
|
|
101
|
+
5. **`detect_dead_ast_symbols`**: Workspace-wide zombie export and unreachable statement detection.
|
|
102
|
+
6. **`resolve_lexical_scope`**: Scope-aware variable resolution and identifier shadowing verification.
|
|
103
|
+
7. **`sql_ast_validator`**: Embedded SQL validation with injection taint analysis.
|
|
104
|
+
8. **`ast_codemod_transpile`**: Lossless CST codemod refactoring (CJS to ESM, console stripping).
|
|
105
|
+
9. **`detect_async_eventloop_blockers`**: Event-loop blocking call detection in async Node.js and Python.
|
|
106
|
+
10. **`verify_env_contract_drift`**: Environment variable contract validation against `.env.example`.
|
|
107
|
+
11. **`audit_error_handling_contracts`**: Empty catch block and error swallowing prevention.
|
|
108
|
+
12. **`extract_api_route_matrix`**: Zero-runtime REST route extraction for Express, FastAPI, and Rails.
|
|
109
|
+
13. **`flatten_class_hierarchy`**: Complete trait, mixin, and interface inheritance flattener.
|
|
110
|
+
14. **`detect_circular_dependencies`**: Tarjan's strongly connected components (SCC) O(V+E) import cycle detector.
|
|
111
|
+
15. **`trace_taint_flow`**: Static source-to-sink vulnerability taint analyzer.
|
|
112
|
+
16. **`backfill_types`**: Duck-type interface inference for legacy codebases.
|
|
113
|
+
17. **`enforce_architecture_rules`**: Architectural boundary and layer compliance linter.
|
|
114
|
+
18. **`compact_context_ledger`**: Lossless AST context compaction preserving signatures while dropping function bodies.
|
|
115
|
+
19. **`generate_ast_impact_report`**: Cryptographic Markdown blast radius audit report with SHA-256 digest.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 🗄️ 5. VIRTUAL ORM SCHEMA INTELLIGENCE (ZERO DB CONNECTION)
|
|
120
|
+
|
|
121
|
+
CodeContext Pro automatically extracts and injects virtual database schemas into class definitions and surgical reads without requiring an active MySQL, Postgres, or SQLite connection:
|
|
122
|
+
|
|
123
|
+
| Framework | Source File Detected | Extracted Schema Artifacts |
|
|
124
|
+
| :--- | :--- | :--- |
|
|
125
|
+
| **Prisma ORM** | `prisma/schema.prisma` | Models, fields, native types, relations, defaults, and `@@map` |
|
|
126
|
+
| **Drizzle ORM** | `src/db/schema.ts` / `schema.ts` | Tables (`pgTable`, `mysqlTable`, `sqliteTable`), columns, types, modifiers |
|
|
127
|
+
| **Ruby on Rails** | `db/schema.rb` | Table columns, types, nullability, defaults for `ApplicationRecord` |
|
|
128
|
+
| **Laravel Eloquent** | `database/migrations/*.php` | Fluent blueprint columns (`$table->string`, `foreignId`, `timestamps`) |
|
|
129
|
+
| **Django ORM** | `models.py` | Models, fields (`CharField`, `ForeignKey`), constraints, `db_table` |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 📈 6. BENCHMARK AUDIT (TOKEN SAVINGS CERTIFIED)
|
|
134
|
+
|
|
135
|
+
| Operation | Brute Force (Standard MCP) | CodeContext Pro v7.0.0 | Net Token Savings |
|
|
136
|
+
| :--- | :--- | :--- | :--- |
|
|
137
|
+
| **Repository Onboarding** | 48,500 tokens (12 raw files) | 5,820 tokens (`get_semantic_repo_map`) | **-87.9%** |
|
|
138
|
+
| **Method Bugfix** | 3,400 tokens (Full 450-line file) | 380 tokens (`read_file_surgical`) | **-88.8%** |
|
|
139
|
+
| **Impact Analysis** | 35,000 tokens (grep recursive) | 1,200 tokens (`analyze_impact`) | **-96.5%** |
|
|
140
|
+
| **Monthly Token Cost** (Avg Dev) | **$160.00 / mo** | **$28.50 / mo** | **Saves $131.50/mo** |
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 🔒 7. SRE PRODUCTION HARDENING
|
|
145
|
+
- **Zero Native C++ Dependencies**: 100% WebAssembly. Zero `node-gyp` compile errors.
|
|
146
|
+
- **Path Traversal Shield**: Boundary containment enforced via `resolveProjectRoot`.
|
|
147
|
+
- **ReDoS Elimination**: Worker thread isolation pool terminating complex evaluations at 500ms.
|
|
148
|
+
- **Cross-Process File Locking**: Atomic mutex locking using `proper-lockfile` with 10s automatic stale recovery.
|
|
149
|
+
- **WASM Memory Disposal**: Explicit `tree.delete()` in `finally` blocks preventing linear memory leaks.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# CodeContext Pro — Certified Performance Benchmarks
|
|
2
|
+
|
|
3
|
+
Certified across 222 automated unit, integration, stress, and security tests.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📊 TOKEN COMPRESSION RATIOS
|
|
8
|
+
|
|
9
|
+
| Repository Type | Raw File Tokens | CodeContext AST Tokens | Tokens Saved | Token Reduction |
|
|
10
|
+
|:---|:---|:---|:---|:---|
|
|
11
|
+
| Rails Monolith (120 files) | 184,200 | 28,500 | 155,700 | **84.5%** |
|
|
12
|
+
| Laravel 11 App (95 files) | 142,000 | 24,100 | 117,900 | **83.0%** |
|
|
13
|
+
| FastAPI / Django (80 files) | 118,500 | 19,800 | 98,700 | **83.3%** |
|
|
14
|
+
| TypeScript / React SPA (150 files) | 210,000 | 36,400 | 173,600 | **82.7%** |
|
|
15
|
+
| Single File Edit (1,200-line controller) | 3,850 | 480 | 3,370 | **87.5%** |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## ⚡ EXECUTION VELOCITY
|
|
20
|
+
|
|
21
|
+
- **Index Query Latency**: `1.8 ms` (SQLite in-memory with disk persistence)
|
|
22
|
+
- **AST Parsing Latency**: `4.2 ms` average per file (pure WebAssembly)
|
|
23
|
+
- **Delta Re-parse (Vector 2)**: `< 0.8 ms` (incremental syntax tree caching)
|
|
24
|
+
- **Full Tool Call Roundtrip**: `11.46 ms` average across 28 live operations
|
|
25
|
+
- **Memory Footprint**: `~28 MB` RSS baseline (vs 450+ MB for language servers)
|