mcp-code-context 2.5.1 → 3.0.4
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 +92 -236
- package/README.md +304 -298
- package/dist/src/core/engine.d.ts +21 -0
- package/dist/src/core/engine.js +68 -0
- package/dist/src/core/engine.js.map +1 -0
- package/dist/src/core/validator.d.ts +15 -0
- package/dist/src/core/validator.js +44 -0
- package/dist/src/core/validator.js.map +1 -0
- package/dist/src/index.d.ts +7 -11
- package/dist/src/index.js +182 -397
- package/dist/src/index.js.map +1 -1
- package/dist/src/operations/write.d.ts +51 -0
- package/dist/src/operations/write.js +169 -0
- package/dist/src/operations/write.js.map +1 -0
- package/dist/src/parsers/base.d.ts +28 -0
- package/dist/src/parsers/base.js +27 -0
- package/dist/src/parsers/base.js.map +1 -0
- package/dist/src/parsers/dartTreeSitter.d.ts +13 -0
- package/dist/src/parsers/dartTreeSitter.js +91 -0
- package/dist/src/parsers/dartTreeSitter.js.map +1 -0
- package/dist/src/parsers/php.d.ts +12 -0
- package/dist/src/parsers/php.js +86 -0
- package/dist/src/parsers/php.js.map +1 -0
- package/dist/src/parsers/python.d.ts +12 -0
- package/dist/src/parsers/python.js +86 -0
- package/dist/src/parsers/python.js.map +1 -0
- package/dist/src/parsers/registry.d.ts +15 -0
- package/dist/src/parsers/registry.js +70 -0
- package/dist/src/parsers/registry.js.map +1 -0
- package/dist/src/parsers/typescript.d.ts +13 -0
- package/dist/src/parsers/typescript.js +98 -0
- package/dist/src/parsers/typescript.js.map +1 -0
- package/llms.txt +246 -234
- package/mcp-code-context-3.0.2.tgz +0 -0
- package/package.json +59 -57
- package/tsconfig.tests.json +27 -0
- package/.io/RULES.md +0 -12
- package/CONTRIBUTING.md +0 -243
- package/PLAN_v2.5.0.md +0 -407
- package/TROUBLESHOOTING.md +0 -38
- package/dist/src/ast/dartCompressor.d.ts +0 -27
- package/dist/src/ast/dartCompressor.js +0 -859
- package/dist/src/ast/dartCompressor.js.map +0 -1
- package/dist/src/ast/phpCompressor.d.ts +0 -24
- package/dist/src/ast/phpCompressor.js +0 -634
- package/dist/src/ast/phpCompressor.js.map +0 -1
- package/dist/src/ast/semanticCompressor.d.ts +0 -22
- package/dist/src/ast/semanticCompressor.js +0 -677
- package/dist/src/ast/semanticCompressor.js.map +0 -1
- package/dist/src/ast/writers/dartWriter.d.ts +0 -37
- package/dist/src/ast/writers/dartWriter.js +0 -544
- package/dist/src/ast/writers/dartWriter.js.map +0 -1
- package/dist/src/ast/writers/phpWriter.d.ts +0 -37
- package/dist/src/ast/writers/phpWriter.js +0 -411
- package/dist/src/ast/writers/phpWriter.js.map +0 -1
- package/dist/src/ast/writers/pyWriter.d.ts +0 -37
- package/dist/src/ast/writers/pyWriter.js +0 -355
- package/dist/src/ast/writers/pyWriter.js.map +0 -1
- package/dist/src/ast/writers/safeRename.d.ts +0 -14
- package/dist/src/ast/writers/safeRename.js +0 -258
- package/dist/src/ast/writers/safeRename.js.map +0 -1
- package/dist/src/ast/writers/symbolWriter.d.ts +0 -64
- package/dist/src/ast/writers/symbolWriter.js +0 -174
- package/dist/src/ast/writers/symbolWriter.js.map +0 -1
- package/dist/src/ast/writers/tsWriter.d.ts +0 -38
- package/dist/src/ast/writers/tsWriter.js +0 -344
- package/dist/src/ast/writers/tsWriter.js.map +0 -1
- package/dist/src/cache/astCache.d.ts +0 -39
- package/dist/src/cache/astCache.js +0 -169
- package/dist/src/cache/astCache.js.map +0 -1
- package/dist/src/handlers/readHandlers.d.ts +0 -70
- package/dist/src/handlers/readHandlers.js +0 -455
- package/dist/src/handlers/readHandlers.js.map +0 -1
- package/dist/src/handlers/utilHandlers.d.ts +0 -31
- package/dist/src/handlers/utilHandlers.js +0 -69
- package/dist/src/handlers/utilHandlers.js.map +0 -1
- package/dist/src/handlers/writeHandlers.d.ts +0 -57
- package/dist/src/handlers/writeHandlers.js +0 -499
- package/dist/src/handlers/writeHandlers.js.map +0 -1
- package/dist/src/tools/readFileLines.d.ts +0 -26
- package/dist/src/tools/readFileLines.js +0 -77
- package/dist/src/tools/readFileLines.js.map +0 -1
- package/dist/src/tools/searchCodePattern.d.ts +0 -37
- package/dist/src/tools/searchCodePattern.js +0 -144
- package/dist/src/tools/searchCodePattern.js.map +0 -1
- package/dist/src/utils/arrayUtils.d.ts +0 -12
- package/dist/src/utils/arrayUtils.js +0 -27
- package/dist/src/utils/arrayUtils.js.map +0 -1
- package/dist/src/utils/backupManager.d.ts +0 -31
- package/dist/src/utils/backupManager.js +0 -124
- package/dist/src/utils/backupManager.js.map +0 -1
- package/dist/src/utils/confirmationCache.d.ts +0 -16
- package/dist/src/utils/confirmationCache.js +0 -40
- package/dist/src/utils/confirmationCache.js.map +0 -1
- package/dist/src/utils/constants.d.ts +0 -46
- package/dist/src/utils/constants.js +0 -112
- package/dist/src/utils/constants.js.map +0 -1
- package/dist/src/utils/dependencyChecker.d.ts +0 -1
- package/dist/src/utils/dependencyChecker.js +0 -55
- package/dist/src/utils/dependencyChecker.js.map +0 -1
- package/dist/src/utils/diffEngine.d.ts +0 -21
- package/dist/src/utils/diffEngine.js +0 -163
- package/dist/src/utils/diffEngine.js.map +0 -1
- package/dist/src/utils/fuzzyMatch.d.ts +0 -8
- package/dist/src/utils/fuzzyMatch.js +0 -69
- package/dist/src/utils/fuzzyMatch.js.map +0 -1
- package/dist/src/utils/ignoreManager.d.ts +0 -30
- package/dist/src/utils/ignoreManager.js +0 -186
- package/dist/src/utils/ignoreManager.js.map +0 -1
- package/dist/src/utils/normalization.d.ts +0 -49
- package/dist/src/utils/normalization.js +0 -173
- package/dist/src/utils/normalization.js.map +0 -1
- package/dist/src/utils/projectRoot.d.ts +0 -17
- package/dist/src/utils/projectRoot.js +0 -42
- package/dist/src/utils/projectRoot.js.map +0 -1
- package/dist/src/utils/secureValidation.d.ts +0 -15
- package/dist/src/utils/secureValidation.js +0 -41
- package/dist/src/utils/secureValidation.js.map +0 -1
- package/dist/src/utils/syntaxValidator.d.ts +0 -15
- package/dist/src/utils/syntaxValidator.js +0 -218
- package/dist/src/utils/syntaxValidator.js.map +0 -1
- package/dist/src/utils/transactionManager.d.ts +0 -46
- package/dist/src/utils/transactionManager.js +0 -123
- package/dist/src/utils/transactionManager.js.map +0 -1
- package/dist/src/utils/validation.d.ts +0 -87
- package/dist/src/utils/validation.js +0 -231
- package/dist/src/utils/validation.js.map +0 -1
- package/docs/ARCHITECTURE.md +0 -300
- package/docs/architecture/ADR-001-modular-handlers.md +0 -119
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import * as ts from "typescript";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
export async function checkSymbolUsage(filePath, content, symbolName) {
|
|
4
|
-
const ext = path.extname(filePath).toLowerCase();
|
|
5
|
-
if ([".ts", ".tsx", ".js", ".jsx", ".mts", ".mjs"].includes(ext)) {
|
|
6
|
-
return checkTSSymbolUsage(content, symbolName);
|
|
7
|
-
}
|
|
8
|
-
if ([".php", ".phtml"].includes(ext)) {
|
|
9
|
-
return await checkPHPSymbolUsage(content, symbolName);
|
|
10
|
-
}
|
|
11
|
-
const escaped = symbolName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
12
|
-
const regex = new RegExp(`(?<=^|[^a-zA-Z0-9_$])(${escaped})(?=[^a-zA-Z0-9_$]|$)`);
|
|
13
|
-
return regex.test(content);
|
|
14
|
-
}
|
|
15
|
-
function checkTSSymbolUsage(content, symbolName) {
|
|
16
|
-
try {
|
|
17
|
-
const sourceFile = ts.createSourceFile("temp.ts", content, ts.ScriptTarget.Latest, true);
|
|
18
|
-
let found = false;
|
|
19
|
-
function visit(node) {
|
|
20
|
-
if (ts.isIdentifier(node) && node.text === symbolName) {
|
|
21
|
-
found = true;
|
|
22
|
-
}
|
|
23
|
-
if (!found)
|
|
24
|
-
ts.forEachChild(node, visit);
|
|
25
|
-
}
|
|
26
|
-
visit(sourceFile);
|
|
27
|
-
return found;
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
async function checkPHPSymbolUsage(content, symbolName) {
|
|
34
|
-
try {
|
|
35
|
-
const phpParserModule = await import("php-parser");
|
|
36
|
-
const phpParser = phpParserModule.default || phpParserModule;
|
|
37
|
-
const parser = new phpParser.Engine({});
|
|
38
|
-
const ast = parser.parseCode(content, "temp.php");
|
|
39
|
-
let found = false;
|
|
40
|
-
function visit(node) {
|
|
41
|
-
if (node?.kind === "identifier" && node.name === symbolName)
|
|
42
|
-
found = true;
|
|
43
|
-
if (!found && node?.children) {
|
|
44
|
-
for (const child of node.children)
|
|
45
|
-
visit(child);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
visit(ast);
|
|
49
|
-
return found;
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
//# sourceMappingURL=dependencyChecker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dependencyChecker.js","sourceRoot":"","sources":["../../../src/utils/dependencyChecker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,OAAe,EAAE,UAAkB;IAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAEjD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACjE,OAAO,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,MAAM,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,yBAAyB,OAAO,uBAAuB,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe,EAAE,UAAkB;IAC7D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzF,IAAI,KAAK,GAAG,KAAK,CAAC;QAElB,SAAS,KAAK,CAAC,IAAa;YAC1B,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACtD,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,IAAI,CAAC,KAAK;gBAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,OAAe,EAAE,UAAkB;IACpE,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,IAAI,eAAe,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAElD,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,SAAS,KAAK,CAAC,IAAS;YACtB,IAAI,IAAI,EAAE,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;gBAAE,KAAK,GAAG,IAAI,CAAC;YAC1E,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;oBAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* diffEngine.ts — Unified Diff Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates human-readable unified diffs (like `git diff`) for dry-run reports
|
|
5
|
-
* and post-write summaries. Uses a simple Myers-style diff algorithm.
|
|
6
|
-
* No external dependencies.
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Generate a unified diff between two versions of a single file.
|
|
10
|
-
* Returns a string formatted like `git diff --unified=3`.
|
|
11
|
-
*/
|
|
12
|
-
export declare function generateDiff(oldContent: string, newContent: string, filePath: string, contextLines?: number): string;
|
|
13
|
-
/**
|
|
14
|
-
* Generate a combined diff across multiple files.
|
|
15
|
-
* Returns a single string with all file diffs separated by blank lines.
|
|
16
|
-
*/
|
|
17
|
-
export declare function generateMultiFileDiff(changes: Array<{
|
|
18
|
-
filePath: string;
|
|
19
|
-
oldContent: string;
|
|
20
|
-
newContent: string;
|
|
21
|
-
}>): string;
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* diffEngine.ts — Unified Diff Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates human-readable unified diffs (like `git diff`) for dry-run reports
|
|
5
|
-
* and post-write summaries. Uses a simple Myers-style diff algorithm.
|
|
6
|
-
* No external dependencies.
|
|
7
|
-
*/
|
|
8
|
-
// ─── Public API ─────────────────────────────────────────────────────
|
|
9
|
-
/**
|
|
10
|
-
* Generate a unified diff between two versions of a single file.
|
|
11
|
-
* Returns a string formatted like `git diff --unified=3`.
|
|
12
|
-
*/
|
|
13
|
-
export function generateDiff(oldContent, newContent, filePath, contextLines = 3) {
|
|
14
|
-
const oldLines = oldContent.split("\n");
|
|
15
|
-
const newLines = newContent.split("\n");
|
|
16
|
-
const hunks = computeHunks(oldLines, newLines, contextLines);
|
|
17
|
-
if (hunks.length === 0) {
|
|
18
|
-
return `--- ${filePath}\n+++ ${filePath}\n(no changes)\n`;
|
|
19
|
-
}
|
|
20
|
-
const header = [
|
|
21
|
-
`--- a/${normalizedPath(filePath)}`,
|
|
22
|
-
`+++ b/${normalizedPath(filePath)}`,
|
|
23
|
-
];
|
|
24
|
-
const hunkTexts = hunks.map((hunk) => {
|
|
25
|
-
const hunkHeader = `@@ -${hunk.oldStart},${hunk.oldCount} +${hunk.newStart},${hunk.newCount} @@`;
|
|
26
|
-
return [hunkHeader, ...hunk.lines].join("\n");
|
|
27
|
-
});
|
|
28
|
-
return [...header, ...hunkTexts].join("\n") + "\n";
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Generate a combined diff across multiple files.
|
|
32
|
-
* Returns a single string with all file diffs separated by blank lines.
|
|
33
|
-
*/
|
|
34
|
-
export function generateMultiFileDiff(changes) {
|
|
35
|
-
const diffs = [];
|
|
36
|
-
for (const change of changes) {
|
|
37
|
-
const diff = generateDiff(change.oldContent, change.newContent, change.filePath);
|
|
38
|
-
diffs.push(diff);
|
|
39
|
-
}
|
|
40
|
-
return diffs.join("\n");
|
|
41
|
-
}
|
|
42
|
-
// ─── Diff Algorithm ─────────────────────────────────────────────────
|
|
43
|
-
/**
|
|
44
|
-
* Compute the Longest Common Subsequence table for two arrays of strings.
|
|
45
|
-
*/
|
|
46
|
-
function computeLCS(a, b) {
|
|
47
|
-
const m = a.length;
|
|
48
|
-
const n = b.length;
|
|
49
|
-
// Use a 2D array for the LCS table
|
|
50
|
-
const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
|
|
51
|
-
for (let i = 1; i <= m; i++) {
|
|
52
|
-
for (let j = 1; j <= n; j++) {
|
|
53
|
-
if (a[i - 1] === b[j - 1]) {
|
|
54
|
-
dp[i][j] = dp[i - 1][j - 1] + 1;
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return dp;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Backtrack through the LCS table to produce a list of diff operations.
|
|
65
|
-
*/
|
|
66
|
-
function backtrackDiff(dp, a, b) {
|
|
67
|
-
const result = [];
|
|
68
|
-
let i = a.length;
|
|
69
|
-
let j = b.length;
|
|
70
|
-
while (i > 0 || j > 0) {
|
|
71
|
-
if (i > 0 && j > 0 && a[i - 1] === b[j - 1]) {
|
|
72
|
-
result.unshift({ type: "keep", line: a[i - 1] });
|
|
73
|
-
i--;
|
|
74
|
-
j--;
|
|
75
|
-
}
|
|
76
|
-
else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
|
|
77
|
-
result.unshift({ type: "add", line: b[j - 1] });
|
|
78
|
-
j--;
|
|
79
|
-
}
|
|
80
|
-
else if (i > 0) {
|
|
81
|
-
result.unshift({ type: "remove", line: a[i - 1] });
|
|
82
|
-
i--;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return result;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Group diff operations into hunks with surrounding context.
|
|
89
|
-
*/
|
|
90
|
-
function computeHunks(oldLines, newLines, contextLines) {
|
|
91
|
-
const dp = computeLCS(oldLines, newLines);
|
|
92
|
-
const ops = backtrackDiff(dp, oldLines, newLines);
|
|
93
|
-
// Find ranges of changes (non-"keep" operations)
|
|
94
|
-
const changeIndices = [];
|
|
95
|
-
for (let i = 0; i < ops.length; i++) {
|
|
96
|
-
if (ops[i].type !== "keep") {
|
|
97
|
-
changeIndices.push(i);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
if (changeIndices.length === 0)
|
|
101
|
-
return [];
|
|
102
|
-
// Group nearby changes into hunks
|
|
103
|
-
const groups = [];
|
|
104
|
-
let groupStart = changeIndices[0];
|
|
105
|
-
let groupEnd = changeIndices[0];
|
|
106
|
-
for (let k = 1; k < changeIndices.length; k++) {
|
|
107
|
-
if (changeIndices[k] - groupEnd <= contextLines * 2 + 1) {
|
|
108
|
-
// Merge into current group
|
|
109
|
-
groupEnd = changeIndices[k];
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
groups.push({ start: groupStart, end: groupEnd });
|
|
113
|
-
groupStart = changeIndices[k];
|
|
114
|
-
groupEnd = changeIndices[k];
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
groups.push({ start: groupStart, end: groupEnd });
|
|
118
|
-
// Build hunks with context
|
|
119
|
-
const hunks = [];
|
|
120
|
-
for (const group of groups) {
|
|
121
|
-
const hunkStart = Math.max(0, group.start - contextLines);
|
|
122
|
-
const hunkEnd = Math.min(ops.length - 1, group.end + contextLines);
|
|
123
|
-
const lines = [];
|
|
124
|
-
let oldLineNum = 0;
|
|
125
|
-
let newLineNum = 0;
|
|
126
|
-
// Count lines before hunk start to get correct line numbers
|
|
127
|
-
for (let i = 0; i < hunkStart; i++) {
|
|
128
|
-
if (ops[i].type === "keep" || ops[i].type === "remove")
|
|
129
|
-
oldLineNum++;
|
|
130
|
-
if (ops[i].type === "keep" || ops[i].type === "add")
|
|
131
|
-
newLineNum++;
|
|
132
|
-
}
|
|
133
|
-
const oldStart = oldLineNum + 1;
|
|
134
|
-
const newStart = newLineNum + 1;
|
|
135
|
-
let oldCount = 0;
|
|
136
|
-
let newCount = 0;
|
|
137
|
-
for (let i = hunkStart; i <= hunkEnd; i++) {
|
|
138
|
-
const op = ops[i];
|
|
139
|
-
switch (op.type) {
|
|
140
|
-
case "keep":
|
|
141
|
-
lines.push(` ${op.line}`);
|
|
142
|
-
oldCount++;
|
|
143
|
-
newCount++;
|
|
144
|
-
break;
|
|
145
|
-
case "remove":
|
|
146
|
-
lines.push(`-${op.line}`);
|
|
147
|
-
oldCount++;
|
|
148
|
-
break;
|
|
149
|
-
case "add":
|
|
150
|
-
lines.push(`+${op.line}`);
|
|
151
|
-
newCount++;
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
hunks.push({ oldStart, oldCount, newStart, newCount, lines });
|
|
156
|
-
}
|
|
157
|
-
return hunks;
|
|
158
|
-
}
|
|
159
|
-
// ─── Utilities ──────────────────────────────────────────────────────
|
|
160
|
-
function normalizedPath(filePath) {
|
|
161
|
-
return filePath.replace(/\\/g, "/");
|
|
162
|
-
}
|
|
163
|
-
//# sourceMappingURL=diffEngine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"diffEngine.js","sourceRoot":"","sources":["../../../src/utils/diffEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export interface SymbolInfo {
|
|
2
|
-
name: string;
|
|
3
|
-
type: string;
|
|
4
|
-
className?: string;
|
|
5
|
-
}
|
|
6
|
-
export declare function levenshteinDistance(a: string, b: string): number;
|
|
7
|
-
export declare function findClosestSymbols(target: string, symbols: SymbolInfo[], limit?: number): SymbolInfo[];
|
|
8
|
-
export declare function extractFallbackSymbols(content: string): SymbolInfo[];
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
export function levenshteinDistance(a, b) {
|
|
2
|
-
const matrix = [];
|
|
3
|
-
let i, j;
|
|
4
|
-
if (a.length === 0)
|
|
5
|
-
return b.length;
|
|
6
|
-
if (b.length === 0)
|
|
7
|
-
return a.length;
|
|
8
|
-
for (i = 0; i <= b.length; i++) {
|
|
9
|
-
matrix[i] = [i];
|
|
10
|
-
}
|
|
11
|
-
for (j = 0; j <= a.length; j++) {
|
|
12
|
-
matrix[0][j] = j;
|
|
13
|
-
}
|
|
14
|
-
for (i = 1; i <= b.length; i++) {
|
|
15
|
-
for (j = 1; j <= a.length; j++) {
|
|
16
|
-
if (b.charAt(i - 1) === a.charAt(j - 1)) {
|
|
17
|
-
matrix[i][j] = matrix[i - 1][j - 1];
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, Math.min(matrix[i][j - 1] + 1, matrix[i - 1][j] + 1));
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return matrix[b.length][a.length];
|
|
25
|
-
}
|
|
26
|
-
export function findClosestSymbols(target, symbols, limit = 5) {
|
|
27
|
-
return symbols
|
|
28
|
-
.map((sym) => ({
|
|
29
|
-
...sym,
|
|
30
|
-
distance: levenshteinDistance(target.toLowerCase(), sym.name.toLowerCase()),
|
|
31
|
-
}))
|
|
32
|
-
.sort((a, b) => a.distance - b.distance)
|
|
33
|
-
.slice(0, limit);
|
|
34
|
-
}
|
|
35
|
-
// A simple regex-based extractor to get available symbols when the AST parsing fails
|
|
36
|
-
export function extractFallbackSymbols(content) {
|
|
37
|
-
const symbols = [];
|
|
38
|
-
const lines = content.split('\\n');
|
|
39
|
-
let currentClass = undefined;
|
|
40
|
-
for (let i = 0; i < lines.length; i++) {
|
|
41
|
-
const line = lines[i].trim();
|
|
42
|
-
// Check for class definitions (multi-language approx)
|
|
43
|
-
const classMatch = line.match(/^\s*(?:export\s+|abstract\s+|final\s+)?class\s+([_a-zA-Z0-9]+)/);
|
|
44
|
-
if (classMatch) {
|
|
45
|
-
currentClass = classMatch[1];
|
|
46
|
-
symbols.push({ name: currentClass, type: 'class' });
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
// Check for function / method definitions
|
|
50
|
-
// JS/TS: function foo() | foo() { | async foo()
|
|
51
|
-
// Python: def foo()
|
|
52
|
-
// PHP: function foo()
|
|
53
|
-
// Dart: type foo()
|
|
54
|
-
const funcMatch = line.match(/^\s*(?:export\s+|async\s+|public\s+|private\s+|protected\s+|static\s+|def\s+|function\s+)*([_a-zA-Z0-9]+)\s*\(/);
|
|
55
|
-
if (funcMatch && !['if', 'else', 'for', 'while', 'switch', 'catch'].includes(funcMatch[1])) {
|
|
56
|
-
symbols.push({
|
|
57
|
-
name: funcMatch[1],
|
|
58
|
-
type: currentClass ? 'method' : 'function',
|
|
59
|
-
className: currentClass,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
// Basic assumption: closing brace at start of line might end a class
|
|
63
|
-
if (line === '}') {
|
|
64
|
-
currentClass = undefined;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return symbols;
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=fuzzyMatch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fuzzyMatch.js","sourceRoot":"","sources":["../../../src/utils/fuzzyMatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IgnoreManager — Reads .gitignore / .repomixignore and walks directories
|
|
3
|
-
* filtering out ignored paths. Always excludes common heavy directories.
|
|
4
|
-
*/
|
|
5
|
-
export declare class IgnoreManager {
|
|
6
|
-
private ig;
|
|
7
|
-
private rootDir;
|
|
8
|
-
constructor(rootDir: string);
|
|
9
|
-
/**
|
|
10
|
-
* Reads an ignore-pattern file and adds its rules to the filter.
|
|
11
|
-
* Silently skips if the file doesn't exist or is unreadable.
|
|
12
|
-
*/
|
|
13
|
-
private loadIgnoreFile;
|
|
14
|
-
/** Check if a relative path should be ignored. */
|
|
15
|
-
isIgnored(relativePath: string): boolean;
|
|
16
|
-
/**
|
|
17
|
-
* Recursively walk a directory, returning absolute paths to all
|
|
18
|
-
* non-ignored files.
|
|
19
|
-
*/
|
|
20
|
-
walkDirectory(dir?: string): string[];
|
|
21
|
-
/**
|
|
22
|
-
* Async version of walkDirectory - non-blocking for large repos
|
|
23
|
-
*/
|
|
24
|
-
walkDirectoryAsync(dir?: string, signal?: AbortSignal): Promise<string[]>;
|
|
25
|
-
/**
|
|
26
|
-
* Async recursive walk implementation
|
|
27
|
-
*/
|
|
28
|
-
private walkAsync;
|
|
29
|
-
private walk;
|
|
30
|
-
}
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IgnoreManager — Reads .gitignore / .repomixignore and walks directories
|
|
3
|
-
* filtering out ignored paths. Always excludes common heavy directories.
|
|
4
|
-
*/
|
|
5
|
-
import * as fs from "node:fs";
|
|
6
|
-
import * as path from "node:path";
|
|
7
|
-
import { createRequire } from "node:module";
|
|
8
|
-
// CJS interop: 'ignore' uses module.exports which doesn't resolve
|
|
9
|
-
// as a callable default export under Node16 module resolution.
|
|
10
|
-
const require = createRequire(import.meta.url);
|
|
11
|
-
const ignore = require("ignore");
|
|
12
|
-
/** Directories and patterns that are ALWAYS excluded regardless of .gitignore */
|
|
13
|
-
const ALWAYS_IGNORE = [
|
|
14
|
-
"node_modules",
|
|
15
|
-
".git",
|
|
16
|
-
"dist",
|
|
17
|
-
"build",
|
|
18
|
-
"vendor",
|
|
19
|
-
".next",
|
|
20
|
-
".nuxt",
|
|
21
|
-
".output",
|
|
22
|
-
"__pycache__",
|
|
23
|
-
".pytest_cache",
|
|
24
|
-
"coverage",
|
|
25
|
-
".nyc_output",
|
|
26
|
-
".turbo",
|
|
27
|
-
".cache",
|
|
28
|
-
".parcel-cache",
|
|
29
|
-
".venv",
|
|
30
|
-
"venv",
|
|
31
|
-
"env",
|
|
32
|
-
".env.local",
|
|
33
|
-
".tsbuildinfo",
|
|
34
|
-
"*.lock",
|
|
35
|
-
"package-lock.json",
|
|
36
|
-
"yarn.lock",
|
|
37
|
-
"pnpm-lock.yaml",
|
|
38
|
-
"bun.lockb",
|
|
39
|
-
"*.min.js",
|
|
40
|
-
"*.min.css",
|
|
41
|
-
"*.map",
|
|
42
|
-
"*.chunk.js",
|
|
43
|
-
"*.bundle.js",
|
|
44
|
-
];
|
|
45
|
-
/** Max file size to read (512 KB). Files larger than this are skipped. */
|
|
46
|
-
const MAX_FILE_SIZE_BYTES = 512 * 1024;
|
|
47
|
-
export class IgnoreManager {
|
|
48
|
-
ig;
|
|
49
|
-
rootDir;
|
|
50
|
-
constructor(rootDir) {
|
|
51
|
-
this.rootDir = path.resolve(rootDir);
|
|
52
|
-
this.ig = ignore();
|
|
53
|
-
// Load hardcoded ignores first
|
|
54
|
-
this.ig.add(ALWAYS_IGNORE);
|
|
55
|
-
// Load .gitignore
|
|
56
|
-
this.loadIgnoreFile(path.join(this.rootDir, ".gitignore"));
|
|
57
|
-
// Load .repomixignore (Repomix-style overrides)
|
|
58
|
-
this.loadIgnoreFile(path.join(this.rootDir, ".repomixignore"));
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Reads an ignore-pattern file and adds its rules to the filter.
|
|
62
|
-
* Silently skips if the file doesn't exist or is unreadable.
|
|
63
|
-
*/
|
|
64
|
-
loadIgnoreFile(filePath) {
|
|
65
|
-
try {
|
|
66
|
-
if (!fs.existsSync(filePath))
|
|
67
|
-
return;
|
|
68
|
-
const content = fs.readFileSync(filePath, "utf-8");
|
|
69
|
-
const patterns = content
|
|
70
|
-
.split("\n")
|
|
71
|
-
.map((line) => line.trim())
|
|
72
|
-
.filter((line) => line.length > 0 && !line.startsWith("#"));
|
|
73
|
-
if (patterns.length > 0) {
|
|
74
|
-
this.ig.add(patterns);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
// File unreadable — skip silently
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/** Check if a relative path should be ignored. */
|
|
82
|
-
isIgnored(relativePath) {
|
|
83
|
-
if (!relativePath)
|
|
84
|
-
return false;
|
|
85
|
-
return this.ig.ignores(relativePath);
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Recursively walk a directory, returning absolute paths to all
|
|
89
|
-
* non-ignored files.
|
|
90
|
-
*/
|
|
91
|
-
walkDirectory(dir) {
|
|
92
|
-
const baseDir = dir ? path.resolve(dir) : this.rootDir;
|
|
93
|
-
const files = [];
|
|
94
|
-
this.walk(baseDir, files);
|
|
95
|
-
return files;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Async version of walkDirectory - non-blocking for large repos
|
|
99
|
-
*/
|
|
100
|
-
async walkDirectoryAsync(dir, signal) {
|
|
101
|
-
const baseDir = dir ? path.resolve(dir) : this.rootDir;
|
|
102
|
-
const files = [];
|
|
103
|
-
await this.walkAsync(baseDir, files, signal);
|
|
104
|
-
return files;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Async recursive walk implementation
|
|
108
|
-
*/
|
|
109
|
-
async walkAsync(currentDir, collected, signal) {
|
|
110
|
-
if (signal?.aborted)
|
|
111
|
-
throw new Error("Operation cancelled");
|
|
112
|
-
let entries;
|
|
113
|
-
try {
|
|
114
|
-
entries = await fs.promises.readdir(currentDir, { withFileTypes: true });
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
return; // Permission denied, broken symlink, etc.
|
|
118
|
-
}
|
|
119
|
-
for (const entry of entries) {
|
|
120
|
-
const fullPath = path.join(currentDir, entry.name);
|
|
121
|
-
const relativePath = path
|
|
122
|
-
.relative(this.rootDir, fullPath)
|
|
123
|
-
.replace(/\\/g, "/");
|
|
124
|
-
// Check ignore rules
|
|
125
|
-
if (this.isIgnored(relativePath))
|
|
126
|
-
continue;
|
|
127
|
-
if (entry.isDirectory()) {
|
|
128
|
-
// Also test with trailing slash for directory-level patterns
|
|
129
|
-
if (this.isIgnored(relativePath + "/"))
|
|
130
|
-
continue;
|
|
131
|
-
await this.walkAsync(fullPath, collected, signal);
|
|
132
|
-
}
|
|
133
|
-
else if (entry.isFile()) {
|
|
134
|
-
// Skip files that are too large
|
|
135
|
-
try {
|
|
136
|
-
const stat = await fs.promises.stat(fullPath);
|
|
137
|
-
if (stat.size > MAX_FILE_SIZE_BYTES)
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
catch {
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
collected.push(fullPath);
|
|
144
|
-
}
|
|
145
|
-
// Symlinks and other entries are silently skipped
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
walk(currentDir, collected) {
|
|
149
|
-
let entries;
|
|
150
|
-
try {
|
|
151
|
-
entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
152
|
-
}
|
|
153
|
-
catch {
|
|
154
|
-
return; // Permission denied, broken symlink, etc.
|
|
155
|
-
}
|
|
156
|
-
for (const entry of entries) {
|
|
157
|
-
const fullPath = path.join(currentDir, entry.name);
|
|
158
|
-
const relativePath = path
|
|
159
|
-
.relative(this.rootDir, fullPath)
|
|
160
|
-
.replace(/\\/g, "/");
|
|
161
|
-
// Check ignore rules
|
|
162
|
-
if (this.isIgnored(relativePath))
|
|
163
|
-
continue;
|
|
164
|
-
if (entry.isDirectory()) {
|
|
165
|
-
// Also test with trailing slash for directory-level patterns
|
|
166
|
-
if (this.isIgnored(relativePath + "/"))
|
|
167
|
-
continue;
|
|
168
|
-
this.walk(fullPath, collected);
|
|
169
|
-
}
|
|
170
|
-
else if (entry.isFile()) {
|
|
171
|
-
// Skip files that are too large
|
|
172
|
-
try {
|
|
173
|
-
const stat = fs.statSync(fullPath);
|
|
174
|
-
if (stat.size > MAX_FILE_SIZE_BYTES)
|
|
175
|
-
continue;
|
|
176
|
-
}
|
|
177
|
-
catch {
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
collected.push(fullPath);
|
|
181
|
-
}
|
|
182
|
-
// Symlinks and other entries are silently skipped
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=ignoreManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ignoreManager.js","sourceRoot":"","sources":["../../../src/utils/ignoreManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* normalization.ts — Code Normalization Utilities
|
|
3
|
-
*
|
|
4
|
-
* Centralizes line ending normalization and indentation logic
|
|
5
|
-
* to eliminate duplication across writer modules.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Normalize line endings to LF (\n) for consistent processing.
|
|
9
|
-
* Handles CRLF (\r\n), CR (\r), and mixed line endings.
|
|
10
|
-
*
|
|
11
|
-
* Why: Windows files use CRLF, which breaks brace-counting and line-based
|
|
12
|
-
* operations. Normalizing to LF ensures consistent behavior across platforms.
|
|
13
|
-
*/
|
|
14
|
-
export declare function normalizeLineEndings(content: string): string;
|
|
15
|
-
/**
|
|
16
|
-
* Extract the leading whitespace from a line.
|
|
17
|
-
*/
|
|
18
|
-
export declare function getIndent(line: string): string;
|
|
19
|
-
/**
|
|
20
|
-
* Measure the indentation level of a line (number of spaces/tabs).
|
|
21
|
-
*/
|
|
22
|
-
export declare function measureIndent(line: string): number;
|
|
23
|
-
/**
|
|
24
|
-
* Detect the predominant indentation style in a file.
|
|
25
|
-
* Returns the most common indentation string (e.g., " ", " ", "\t").
|
|
26
|
-
*/
|
|
27
|
-
export declare function detectIndentStyle(content: string): string;
|
|
28
|
-
/**
|
|
29
|
-
* Reindent code to match a target indentation level.
|
|
30
|
-
* Preserves relative indentation between lines.
|
|
31
|
-
*
|
|
32
|
-
* @param code - The code to reindent
|
|
33
|
-
* @param targetIndent - The base indentation to apply
|
|
34
|
-
* @param language - Optional language hint for default indent style
|
|
35
|
-
*/
|
|
36
|
-
export declare function reindentCode(code: string, targetIndent: string, language?: "dart" | "typescript" | "php" | "python"): string;
|
|
37
|
-
/**
|
|
38
|
-
* Reindent code for Python (indentation-aware language).
|
|
39
|
-
* Handles Python's strict indentation requirements.
|
|
40
|
-
*/
|
|
41
|
-
export declare function reindentPython(code: string, targetIndent: string): string;
|
|
42
|
-
/**
|
|
43
|
-
* Remove excessive blank lines (more than 2 consecutive).
|
|
44
|
-
*/
|
|
45
|
-
export declare function normalizeBlankLines(content: string): string;
|
|
46
|
-
/**
|
|
47
|
-
* Ensure file ends with a single newline (POSIX standard).
|
|
48
|
-
*/
|
|
49
|
-
export declare function ensureTrailingNewline(content: string): string;
|