@j0hanz/filesystem-context-mcp 1.0.10 → 1.2.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/README.md +112 -22
- package/dist/__tests__/lib/errors.test.js +3 -23
- package/dist/__tests__/lib/errors.test.js.map +1 -1
- package/dist/__tests__/lib/file-operations.test.js +34 -0
- package/dist/__tests__/lib/file-operations.test.js.map +1 -1
- package/dist/__tests__/lib/path-validation.test.js +8 -0
- package/dist/__tests__/lib/path-validation.test.js.map +1 -1
- package/dist/__tests__/schemas/validators.test.js +130 -124
- package/dist/__tests__/schemas/validators.test.js.map +1 -1
- package/dist/__tests__/security/filesystem-boundary.test.js +1 -1
- package/dist/__tests__/security/filesystem-boundary.test.js.map +1 -1
- package/dist/config/types.d.ts +1 -58
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +0 -2
- package/dist/config/types.js.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/instructions.md +1 -2
- package/dist/lib/constants.d.ts +9 -7
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +89 -298
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/errors.d.ts +25 -1
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +4 -112
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/file-operations/analyze-directory.d.ts +8 -0
- package/dist/lib/file-operations/analyze-directory.d.ts.map +1 -0
- package/dist/lib/file-operations/analyze-directory.js +117 -0
- package/dist/lib/file-operations/analyze-directory.js.map +1 -0
- package/dist/lib/file-operations/directory-items.d.ts +20 -0
- package/dist/lib/file-operations/directory-items.d.ts.map +1 -0
- package/dist/lib/file-operations/directory-items.js +85 -0
- package/dist/lib/file-operations/directory-items.js.map +1 -0
- package/dist/lib/file-operations/directory-iteration.d.ts +17 -0
- package/dist/lib/file-operations/directory-iteration.d.ts.map +1 -0
- package/dist/lib/file-operations/directory-iteration.js +55 -0
- package/dist/lib/file-operations/directory-iteration.js.map +1 -0
- package/dist/lib/file-operations/directory-tree.d.ts +9 -0
- package/dist/lib/file-operations/directory-tree.d.ts.map +1 -0
- package/dist/lib/file-operations/directory-tree.js +175 -0
- package/dist/lib/file-operations/directory-tree.js.map +1 -0
- package/dist/lib/file-operations/file-info.d.ts +3 -0
- package/dist/lib/file-operations/file-info.d.ts.map +1 -0
- package/dist/lib/file-operations/file-info.js +56 -0
- package/dist/lib/file-operations/file-info.js.map +1 -0
- package/dist/lib/file-operations/list-directory.d.ts +10 -0
- package/dist/lib/file-operations/list-directory.d.ts.map +1 -0
- package/dist/lib/file-operations/list-directory.js +189 -0
- package/dist/lib/file-operations/list-directory.js.map +1 -0
- package/dist/lib/file-operations/read-media-file.d.ts +5 -0
- package/dist/lib/file-operations/read-media-file.d.ts.map +1 -0
- package/dist/lib/file-operations/read-media-file.js +31 -0
- package/dist/lib/file-operations/read-media-file.js.map +1 -0
- package/dist/lib/file-operations/read-multiple-files.d.ts +16 -0
- package/dist/lib/file-operations/read-multiple-files.d.ts.map +1 -0
- package/dist/lib/file-operations/read-multiple-files.js +98 -0
- package/dist/lib/file-operations/read-multiple-files.js.map +1 -0
- package/dist/lib/file-operations/search-content.d.ts +16 -0
- package/dist/lib/file-operations/search-content.d.ts.map +1 -0
- package/dist/lib/file-operations/search-content.js +431 -0
- package/dist/lib/file-operations/search-content.js.map +1 -0
- package/dist/lib/file-operations/search-files.d.ts +9 -0
- package/dist/lib/file-operations/search-files.d.ts.map +1 -0
- package/dist/lib/file-operations/search-files.js +139 -0
- package/dist/lib/file-operations/search-files.js.map +1 -0
- package/dist/lib/file-operations/sorting.d.ts +12 -0
- package/dist/lib/file-operations/sorting.d.ts.map +1 -0
- package/dist/lib/file-operations/sorting.js +24 -0
- package/dist/lib/file-operations/sorting.js.map +1 -0
- package/dist/lib/file-operations.d.ts +9 -57
- package/dist/lib/file-operations.d.ts.map +1 -1
- package/dist/lib/file-operations.js +9 -733
- package/dist/lib/file-operations.js.map +1 -1
- package/dist/lib/fs-helpers/binary-detect.d.ts +3 -0
- package/dist/lib/fs-helpers/binary-detect.d.ts.map +1 -0
- package/dist/lib/fs-helpers/binary-detect.js +54 -0
- package/dist/lib/fs-helpers/binary-detect.js.map +1 -0
- package/dist/lib/fs-helpers/concurrency.d.ts +11 -0
- package/dist/lib/fs-helpers/concurrency.d.ts.map +1 -0
- package/dist/lib/fs-helpers/concurrency.js +95 -0
- package/dist/lib/fs-helpers/concurrency.js.map +1 -0
- package/dist/lib/fs-helpers/fs-utils.d.ts +5 -0
- package/dist/lib/fs-helpers/fs-utils.d.ts.map +1 -0
- package/dist/lib/fs-helpers/fs-utils.js +13 -0
- package/dist/lib/fs-helpers/fs-utils.js.map +1 -0
- package/dist/lib/fs-helpers/readers/head-file.d.ts +2 -0
- package/dist/lib/fs-helpers/readers/head-file.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/head-file.js +73 -0
- package/dist/lib/fs-helpers/readers/head-file.js.map +1 -0
- package/dist/lib/fs-helpers/readers/line-range.d.ts +7 -0
- package/dist/lib/fs-helpers/readers/line-range.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/line-range.js +46 -0
- package/dist/lib/fs-helpers/readers/line-range.js.map +1 -0
- package/dist/lib/fs-helpers/readers/read-file.d.ts +16 -0
- package/dist/lib/fs-helpers/readers/read-file.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/read-file.js +87 -0
- package/dist/lib/fs-helpers/readers/read-file.js.map +1 -0
- package/dist/lib/fs-helpers/readers/tail-file.d.ts +2 -0
- package/dist/lib/fs-helpers/readers/tail-file.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/tail-file.js +98 -0
- package/dist/lib/fs-helpers/readers/tail-file.js.map +1 -0
- package/dist/lib/fs-helpers/readers/utf8.d.ts +3 -0
- package/dist/lib/fs-helpers/readers/utf8.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/utf8.js +22 -0
- package/dist/lib/fs-helpers/readers/utf8.js.map +1 -0
- package/dist/lib/fs-helpers/readers.d.ts +4 -0
- package/dist/lib/fs-helpers/readers.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers.js +4 -0
- package/dist/lib/fs-helpers/readers.js.map +1 -0
- package/dist/lib/fs-helpers.d.ts +4 -25
- package/dist/lib/fs-helpers.d.ts.map +1 -1
- package/dist/lib/fs-helpers.js +4 -350
- package/dist/lib/fs-helpers.js.map +1 -1
- package/dist/lib/path-utils.d.ts.map +1 -1
- package/dist/lib/path-utils.js +0 -2
- package/dist/lib/path-utils.js.map +1 -1
- package/dist/lib/path-validation/allowed-directories.d.ts +9 -0
- package/dist/lib/path-validation/allowed-directories.d.ts.map +1 -0
- package/dist/lib/path-validation/allowed-directories.js +94 -0
- package/dist/lib/path-validation/allowed-directories.js.map +1 -0
- package/dist/lib/path-validation/errors.d.ts +5 -0
- package/dist/lib/path-validation/errors.d.ts.map +1 -0
- package/dist/lib/path-validation/errors.js +33 -0
- package/dist/lib/path-validation/errors.js.map +1 -0
- package/dist/lib/path-validation/roots.d.ts +3 -0
- package/dist/lib/path-validation/roots.d.ts.map +1 -0
- package/dist/lib/path-validation/roots.js +49 -0
- package/dist/lib/path-validation/roots.js.map +1 -0
- package/dist/lib/path-validation/validators.d.ts +9 -0
- package/dist/lib/path-validation/validators.d.ts.map +1 -0
- package/dist/lib/path-validation/validators.js +70 -0
- package/dist/lib/path-validation/validators.js.map +1 -0
- package/dist/lib/path-validation.d.ts +3 -7
- package/dist/lib/path-validation.d.ts.map +1 -1
- package/dist/lib/path-validation.js +3 -124
- package/dist/lib/path-validation.js.map +1 -1
- package/dist/schemas/input-helpers.d.ts +8 -0
- package/dist/schemas/input-helpers.d.ts.map +1 -0
- package/dist/schemas/input-helpers.js +44 -0
- package/dist/schemas/input-helpers.js.map +1 -0
- package/dist/schemas/inputs.d.ts +8 -5
- package/dist/schemas/inputs.d.ts.map +1 -1
- package/dist/schemas/inputs.js +41 -64
- package/dist/schemas/inputs.js.map +1 -1
- package/dist/schemas/output-helpers.d.ts +24 -0
- package/dist/schemas/output-helpers.d.ts.map +1 -0
- package/dist/schemas/output-helpers.js +13 -0
- package/dist/schemas/output-helpers.js.map +1 -0
- package/dist/schemas/outputs.d.ts +480 -46
- package/dist/schemas/outputs.d.ts.map +1 -1
- package/dist/schemas/outputs.js +26 -41
- package/dist/schemas/outputs.js.map +1 -1
- package/dist/server.d.ts +9 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +29 -57
- package/dist/server.js.map +1 -1
- package/dist/tools/analyze-directory.d.ts.map +1 -1
- package/dist/tools/analyze-directory.js +116 -54
- package/dist/tools/analyze-directory.js.map +1 -1
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +86 -49
- package/dist/tools/directory-tree.js.map +1 -1
- package/dist/tools/get-file-info.d.ts.map +1 -1
- package/dist/tools/get-file-info.js +71 -37
- package/dist/tools/get-file-info.js.map +1 -1
- package/dist/tools/list-allowed-dirs.d.ts.map +1 -1
- package/dist/tools/list-allowed-dirs.js +48 -35
- package/dist/tools/list-allowed-dirs.js.map +1 -1
- package/dist/tools/list-directory.d.ts.map +1 -1
- package/dist/tools/list-directory.js +131 -60
- package/dist/tools/list-directory.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +70 -56
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-media-file.d.ts.map +1 -1
- package/dist/tools/read-media-file.js +39 -41
- package/dist/tools/read-media-file.js.map +1 -1
- package/dist/tools/read-multiple-files.d.ts.map +1 -1
- package/dist/tools/read-multiple-files.js +57 -50
- package/dist/tools/read-multiple-files.js.map +1 -1
- package/dist/tools/search-content.d.ts.map +1 -1
- package/dist/tools/search-content.js +147 -95
- package/dist/tools/search-content.js.map +1 -1
- package/dist/tools/search-files.d.ts.map +1 -1
- package/dist/tools/search-files.js +122 -51
- package/dist/tools/search-files.js.map +1 -1
- package/dist/tools/tool-response.d.ts +9 -0
- package/dist/tools/tool-response.d.ts.map +1 -0
- package/dist/tools/tool-response.js +7 -0
- package/dist/tools/tool-response.js.map +1 -0
- package/package.json +2 -1
- package/dist/__tests__/errors.test.d.ts +0 -2
- package/dist/__tests__/errors.test.d.ts.map +0 -1
- package/dist/__tests__/errors.test.js +0 -88
- package/dist/__tests__/errors.test.js.map +0 -1
- package/dist/__tests__/file-operations.test.d.ts +0 -2
- package/dist/__tests__/file-operations.test.d.ts.map +0 -1
- package/dist/__tests__/file-operations.test.js +0 -230
- package/dist/__tests__/file-operations.test.js.map +0 -1
- package/dist/__tests__/lib/formatters.test.d.ts +0 -2
- package/dist/__tests__/lib/formatters.test.d.ts.map +0 -1
- package/dist/__tests__/lib/formatters.test.js +0 -248
- package/dist/__tests__/lib/formatters.test.js.map +0 -1
- package/dist/__tests__/lib/image-parsing.test.d.ts +0 -2
- package/dist/__tests__/lib/image-parsing.test.d.ts.map +0 -1
- package/dist/__tests__/lib/image-parsing.test.js +0 -262
- package/dist/__tests__/lib/image-parsing.test.js.map +0 -1
- package/dist/__tests__/path-validation.test.d.ts +0 -2
- package/dist/__tests__/path-validation.test.d.ts.map +0 -1
- package/dist/__tests__/path-validation.test.js +0 -92
- package/dist/__tests__/path-validation.test.js.map +0 -1
- package/dist/lib/directory-helpers.d.ts +0 -4
- package/dist/lib/directory-helpers.d.ts.map +0 -1
- package/dist/lib/directory-helpers.js +0 -36
- package/dist/lib/directory-helpers.js.map +0 -1
- package/dist/lib/formatters.d.ts +0 -21
- package/dist/lib/formatters.d.ts.map +0 -1
- package/dist/lib/formatters.js +0 -206
- package/dist/lib/formatters.js.map +0 -1
- package/dist/lib/image-parsing.d.ts +0 -4
- package/dist/lib/image-parsing.d.ts.map +0 -1
- package/dist/lib/image-parsing.js +0 -130
- package/dist/lib/image-parsing.js.map +0 -1
- package/dist/lib/mcp-logger.d.ts +0 -11
- package/dist/lib/mcp-logger.d.ts.map +0 -1
- package/dist/lib/mcp-logger.js +0 -49
- package/dist/lib/mcp-logger.js.map +0 -1
- package/dist/lib/roots-utils.d.ts +0 -7
- package/dist/lib/roots-utils.d.ts.map +0 -1
- package/dist/lib/roots-utils.js +0 -39
- package/dist/lib/roots-utils.js.map +0 -1
- package/dist/lib/search-helpers.d.ts +0 -13
- package/dist/lib/search-helpers.d.ts.map +0 -1
- package/dist/lib/search-helpers.js +0 -205
- package/dist/lib/search-helpers.js.map +0 -1
- package/dist/lib/sorting.d.ts +0 -12
- package/dist/lib/sorting.d.ts.map +0 -1
- package/dist/lib/sorting.js +0 -41
- package/dist/lib/sorting.js.map +0 -1
- package/dist/lib/types.d.ts +0 -6
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js +0 -2
- package/dist/lib/types.js.map +0 -1
- package/dist/prompts/analyze-codebase.d.ts +0 -3
- package/dist/prompts/analyze-codebase.d.ts.map +0 -1
- package/dist/prompts/analyze-codebase.js +0 -144
- package/dist/prompts/analyze-codebase.js.map +0 -1
- package/dist/prompts/filesystem-query.d.ts +0 -3
- package/dist/prompts/filesystem-query.d.ts.map +0 -1
- package/dist/prompts/filesystem-query.js +0 -168
- package/dist/prompts/filesystem-query.js.map +0 -1
- package/dist/prompts/find-duplicates.d.ts +0 -3
- package/dist/prompts/find-duplicates.d.ts.map +0 -1
- package/dist/prompts/find-duplicates.js +0 -77
- package/dist/prompts/find-duplicates.js.map +0 -1
- package/dist/prompts/index.d.ts +0 -3
- package/dist/prompts/index.d.ts.map +0 -1
- package/dist/prompts/index.js +0 -13
- package/dist/prompts/index.js.map +0 -1
- package/dist/prompts/project-overview.d.ts +0 -3
- package/dist/prompts/project-overview.d.ts.map +0 -1
- package/dist/prompts/project-overview.js +0 -122
- package/dist/prompts/project-overview.js.map +0 -1
- package/dist/prompts/search-and-replace.d.ts +0 -3
- package/dist/prompts/search-and-replace.d.ts.map +0 -1
- package/dist/prompts/search-and-replace.js +0 -130
- package/dist/prompts/search-and-replace.js.map +0 -1
- package/dist/prompts/shared.d.ts +0 -11
- package/dist/prompts/shared.d.ts.map +0 -1
- package/dist/prompts/shared.js +0 -32
- package/dist/prompts/shared.js.map +0 -1
- package/dist/resources/index.d.ts +0 -3
- package/dist/resources/index.d.ts.map +0 -1
- package/dist/resources/index.js +0 -54
- package/dist/resources/index.js.map +0 -1
- package/dist/schemas/validators.d.ts +0 -12
- package/dist/schemas/validators.d.ts.map +0 -1
- package/dist/schemas/validators.js +0 -35
- package/dist/schemas/validators.js.map +0 -1
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -2
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/response-helpers.d.ts +0 -22
- package/dist/utils/response-helpers.d.ts.map +0 -1
- package/dist/utils/response-helpers.js +0 -24
- package/dist/utils/response-helpers.js.map +0 -1
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import * as readline from 'node:readline';
|
|
2
|
-
import { createReadStream } from 'node:fs';
|
|
3
|
-
import { MAX_LINE_CONTENT_LENGTH, REGEX_MATCH_TIMEOUT_MS, } from './constants.js';
|
|
4
|
-
// Circular buffer to hold context lines before a match
|
|
5
|
-
class CircularLineBuffer {
|
|
6
|
-
capacity;
|
|
7
|
-
buffer;
|
|
8
|
-
writeIndex = 0;
|
|
9
|
-
count = 0;
|
|
10
|
-
constructor(capacity) {
|
|
11
|
-
this.capacity = capacity;
|
|
12
|
-
this.buffer = new Array(capacity);
|
|
13
|
-
}
|
|
14
|
-
push(line) {
|
|
15
|
-
// Defensive truncation (should already be handled by caller)
|
|
16
|
-
const truncatedLine = line.length > MAX_LINE_CONTENT_LENGTH
|
|
17
|
-
? line.substring(0, MAX_LINE_CONTENT_LENGTH)
|
|
18
|
-
: line;
|
|
19
|
-
this.buffer[this.writeIndex] = truncatedLine;
|
|
20
|
-
this.writeIndex = (this.writeIndex + 1) % this.capacity;
|
|
21
|
-
if (this.count < this.capacity)
|
|
22
|
-
this.count++;
|
|
23
|
-
}
|
|
24
|
-
toArray() {
|
|
25
|
-
if (this.count === 0)
|
|
26
|
-
return [];
|
|
27
|
-
if (this.count < this.capacity) {
|
|
28
|
-
return this.buffer.slice(0, this.count);
|
|
29
|
-
}
|
|
30
|
-
// Buffer is full - return in correct order with single allocation
|
|
31
|
-
// Avoids multiple spread/slice allocations for better GC performance
|
|
32
|
-
const result = new Array(this.capacity);
|
|
33
|
-
let writeIdx = 0;
|
|
34
|
-
for (let i = this.writeIndex; i < this.capacity; i++) {
|
|
35
|
-
result[writeIdx++] = this.buffer[i] ?? '';
|
|
36
|
-
}
|
|
37
|
-
for (let i = 0; i < this.writeIndex; i++) {
|
|
38
|
-
result[writeIdx++] = this.buffer[i] ?? '';
|
|
39
|
-
}
|
|
40
|
-
return result;
|
|
41
|
-
}
|
|
42
|
-
clear() {
|
|
43
|
-
this.count = 0;
|
|
44
|
-
this.writeIndex = 0;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
// Count regex matches with timeout protection (returns -1 on timeout)
|
|
48
|
-
function countRegexMatches(line, regex, timeoutMs = REGEX_MATCH_TIMEOUT_MS) {
|
|
49
|
-
// Safety check for empty line
|
|
50
|
-
if (line.length === 0)
|
|
51
|
-
return 0;
|
|
52
|
-
regex.lastIndex = 0;
|
|
53
|
-
let count = 0;
|
|
54
|
-
const deadline = Date.now() + timeoutMs;
|
|
55
|
-
// Hard cap prevents issues with extremely long lines (e.g., minified JS)
|
|
56
|
-
const maxIterations = Math.min(line.length * 2, 10000);
|
|
57
|
-
let iterations = 0;
|
|
58
|
-
let lastIndex = 0;
|
|
59
|
-
let match;
|
|
60
|
-
while ((match = regex.exec(line)) !== null) {
|
|
61
|
-
count++;
|
|
62
|
-
iterations++;
|
|
63
|
-
// Prevent infinite loops on zero-width matches
|
|
64
|
-
if (match[0] === '') {
|
|
65
|
-
const { lastIndex: newIndex } = regex;
|
|
66
|
-
regex.lastIndex++;
|
|
67
|
-
lastIndex = newIndex + 1;
|
|
68
|
-
// Prevent advancing beyond string length
|
|
69
|
-
if (regex.lastIndex > line.length)
|
|
70
|
-
break;
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
const { lastIndex: currentIndex } = regex;
|
|
74
|
-
// Detect if regex is stuck (lastIndex not advancing)
|
|
75
|
-
if (currentIndex === lastIndex) {
|
|
76
|
-
return -1; // Regex not making progress
|
|
77
|
-
}
|
|
78
|
-
lastIndex = currentIndex;
|
|
79
|
-
}
|
|
80
|
-
// Hybrid timeout check for both fast and slow regex patterns
|
|
81
|
-
const shouldCheckTimeout = (count > 0 && count % 10 === 0) ||
|
|
82
|
-
(iterations > 0 && iterations % 50 === 0);
|
|
83
|
-
if (shouldCheckTimeout && Date.now() > deadline) {
|
|
84
|
-
return -1; // Signal timeout
|
|
85
|
-
}
|
|
86
|
-
// Safety check for runaway regex
|
|
87
|
-
if (iterations > maxIterations) {
|
|
88
|
-
return -1; // Signal runaway regex
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return count;
|
|
92
|
-
}
|
|
93
|
-
// Check if regex is simple enough to be safe without full ReDoS check
|
|
94
|
-
export function isSimpleSafePattern(pattern) {
|
|
95
|
-
// Validate input
|
|
96
|
-
if (typeof pattern !== 'string' || pattern.length === 0) {
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
|
-
// Patterns with nested quantifiers are the main ReDoS concern
|
|
100
|
-
const nestedQuantifierPattern = /[+*?}]\s*\)\s*[+*?{]/;
|
|
101
|
-
if (nestedQuantifierPattern.test(pattern)) {
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
// Check for high repetition counts that safe-regex2 would flag (default limit is 25)
|
|
105
|
-
const highRepetitionPattern = /\{(\d+)(?:,\d*)?\}/g;
|
|
106
|
-
let match;
|
|
107
|
-
while ((match = highRepetitionPattern.exec(pattern)) !== null) {
|
|
108
|
-
const countStr = match[1];
|
|
109
|
-
if (countStr === undefined)
|
|
110
|
-
continue;
|
|
111
|
-
const count = parseInt(countStr, 10);
|
|
112
|
-
// Check for NaN and high values
|
|
113
|
-
if (Number.isNaN(count) || count >= 25) {
|
|
114
|
-
return false;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return true;
|
|
118
|
-
}
|
|
119
|
-
// Process pending matches to add context-after lines
|
|
120
|
-
function updatePendingMatches(pendingMatches, trimmedLine) {
|
|
121
|
-
for (const pending of pendingMatches) {
|
|
122
|
-
if (pending.afterNeeded > 0) {
|
|
123
|
-
pending.match.contextAfter ??= [];
|
|
124
|
-
pending.match.contextAfter.push(trimmedLine);
|
|
125
|
-
pending.afterNeeded--;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
// Remove completed pending matches from the front
|
|
129
|
-
while (pendingMatches.length > 0 && pendingMatches[0]?.afterNeeded === 0) {
|
|
130
|
-
pendingMatches.shift();
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// Trim and truncate line content for storage
|
|
134
|
-
function prepareTrimmedLine(line) {
|
|
135
|
-
return line.trim().substring(0, MAX_LINE_CONTENT_LENGTH);
|
|
136
|
-
}
|
|
137
|
-
// Prepare final search pattern with optional literal escaping and word boundaries
|
|
138
|
-
export function prepareSearchPattern(searchPattern, options) {
|
|
139
|
-
let finalPattern = searchPattern;
|
|
140
|
-
if (options.isLiteral) {
|
|
141
|
-
finalPattern = finalPattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
142
|
-
}
|
|
143
|
-
if (options.wholeWord) {
|
|
144
|
-
finalPattern = `\\b${finalPattern}\\b`;
|
|
145
|
-
}
|
|
146
|
-
return finalPattern;
|
|
147
|
-
}
|
|
148
|
-
export async function scanFileForContent(filePath, regex, options) {
|
|
149
|
-
const { maxResults, contextLines, deadlineMs, currentMatchCount } = options;
|
|
150
|
-
const matches = [];
|
|
151
|
-
let linesSkippedDueToRegexTimeout = 0;
|
|
152
|
-
let fileHadMatches = false;
|
|
153
|
-
const fileStream = createReadStream(filePath, { encoding: 'utf-8' });
|
|
154
|
-
const rl = readline.createInterface({
|
|
155
|
-
input: fileStream,
|
|
156
|
-
crlfDelay: Infinity,
|
|
157
|
-
});
|
|
158
|
-
let lineNumber = 0;
|
|
159
|
-
const lineBuffer = contextLines > 0 ? new CircularLineBuffer(contextLines) : null;
|
|
160
|
-
const pendingMatches = [];
|
|
161
|
-
try {
|
|
162
|
-
for await (const line of rl) {
|
|
163
|
-
lineNumber++;
|
|
164
|
-
if (deadlineMs !== undefined && Date.now() > deadlineMs)
|
|
165
|
-
break;
|
|
166
|
-
if (currentMatchCount + matches.length >= maxResults)
|
|
167
|
-
break;
|
|
168
|
-
const trimmedLine = prepareTrimmedLine(line);
|
|
169
|
-
updatePendingMatches(pendingMatches, trimmedLine);
|
|
170
|
-
const matchCount = countRegexMatches(line, regex);
|
|
171
|
-
if (matchCount < 0) {
|
|
172
|
-
linesSkippedDueToRegexTimeout++;
|
|
173
|
-
lineBuffer?.push(trimmedLine);
|
|
174
|
-
continue;
|
|
175
|
-
}
|
|
176
|
-
if (matchCount > 0) {
|
|
177
|
-
fileHadMatches = true;
|
|
178
|
-
const newMatch = {
|
|
179
|
-
file: filePath,
|
|
180
|
-
line: lineNumber,
|
|
181
|
-
content: trimmedLine,
|
|
182
|
-
matchCount,
|
|
183
|
-
};
|
|
184
|
-
const contextBefore = lineBuffer?.toArray();
|
|
185
|
-
if (contextBefore?.length) {
|
|
186
|
-
newMatch.contextBefore = contextBefore;
|
|
187
|
-
}
|
|
188
|
-
matches.push(newMatch);
|
|
189
|
-
if (contextLines > 0) {
|
|
190
|
-
pendingMatches.push({
|
|
191
|
-
match: newMatch,
|
|
192
|
-
afterNeeded: contextLines,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
lineBuffer?.push(trimmedLine);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
finally {
|
|
200
|
-
rl.close();
|
|
201
|
-
fileStream.destroy();
|
|
202
|
-
}
|
|
203
|
-
return { matches, linesSkippedDueToRegexTimeout, fileHadMatches };
|
|
204
|
-
}
|
|
205
|
-
//# sourceMappingURL=search-helpers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-helpers.js","sourceRoot":"","sources":["../../src/lib/search-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/sorting.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { FileType } from '../config/types.js';
|
|
2
|
-
interface SortableEntry {
|
|
3
|
-
name?: string;
|
|
4
|
-
size?: number;
|
|
5
|
-
modified?: Date;
|
|
6
|
-
type?: FileType;
|
|
7
|
-
path?: string;
|
|
8
|
-
}
|
|
9
|
-
export declare function createSorter<T extends SortableEntry>(sortBy: 'name' | 'size' | 'modified' | 'type' | 'path'): (a: T, b: T) => number;
|
|
10
|
-
export declare function createSearchResultSorter(sortBy: 'name' | 'size' | 'modified' | 'path'): (a: SortableEntry, b: SortableEntry) => number;
|
|
11
|
-
export {};
|
|
12
|
-
//# sourceMappingURL=sorting.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sorting.d.ts","sourceRoot":"","sources":["../../src/lib/sorting.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGnD,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,wBAAgB,YAAY,CAAC,CAAC,SAAS,aAAa,EAClD,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GACrD,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAmBxB;AAGD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAC5C,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,KAAK,MAAM,CAgBhD"}
|
package/dist/lib/sorting.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import * as path from 'node:path';
|
|
2
|
-
// Create a reusable comparator function based on sort criteria
|
|
3
|
-
export function createSorter(sortBy) {
|
|
4
|
-
return (a, b) => {
|
|
5
|
-
switch (sortBy) {
|
|
6
|
-
case 'size':
|
|
7
|
-
return (b.size ?? 0) - (a.size ?? 0);
|
|
8
|
-
case 'modified':
|
|
9
|
-
return (b.modified?.getTime() ?? 0) - (a.modified?.getTime() ?? 0);
|
|
10
|
-
case 'type':
|
|
11
|
-
if (a.type !== b.type) {
|
|
12
|
-
return a.type === 'directory' ? -1 : 1;
|
|
13
|
-
}
|
|
14
|
-
return (a.name ?? '').localeCompare(b.name ?? '');
|
|
15
|
-
case 'path':
|
|
16
|
-
return (a.path ?? '').localeCompare(b.path ?? '');
|
|
17
|
-
case 'name':
|
|
18
|
-
default:
|
|
19
|
-
return (a.name ?? '').localeCompare(b.name ?? '');
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
// Specialized sorter for search results that extracts basename for name sorting
|
|
24
|
-
export function createSearchResultSorter(sortBy) {
|
|
25
|
-
return (a, b) => {
|
|
26
|
-
switch (sortBy) {
|
|
27
|
-
case 'size':
|
|
28
|
-
return (b.size ?? 0) - (a.size ?? 0);
|
|
29
|
-
case 'modified':
|
|
30
|
-
return (b.modified?.getTime() ?? 0) - (a.modified?.getTime() ?? 0);
|
|
31
|
-
case 'name':
|
|
32
|
-
return path
|
|
33
|
-
.basename(a.path ?? '')
|
|
34
|
-
.localeCompare(path.basename(b.path ?? ''));
|
|
35
|
-
case 'path':
|
|
36
|
-
default:
|
|
37
|
-
return (a.path ?? '').localeCompare(b.path ?? '');
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=sorting.js.map
|
package/dist/lib/sorting.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sorting.js","sourceRoot":"","sources":["../../src/lib/sorting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAalC,+DAA+D;AAC/D,MAAM,UAAU,YAAY,CAC1B,MAAsD;IAEtD,OAAO,CAAC,CAAI,EAAE,CAAI,EAAU,EAAE;QAC5B,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACvC,KAAK,UAAU;gBACb,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACrE,KAAK,MAAM;gBACT,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;oBACtB,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzC,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACpD,KAAK,MAAM;gBACT,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACpD,KAAK,MAAM,CAAC;YACZ;gBACE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,wBAAwB,CACtC,MAA6C;IAE7C,OAAO,CAAC,CAAgB,EAAE,CAAgB,EAAU,EAAE;QACpD,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACvC,KAAK,UAAU;gBACb,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACrE,KAAK,MAAM;gBACT,OAAO,IAAI;qBACR,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;qBACtB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YAChD,KAAK,MAAM,CAAC;YACZ;gBACE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/lib/types.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @deprecated Import types directly from '../config/types.js' instead.
|
|
3
|
-
* This re-export exists only for backward compatibility.
|
|
4
|
-
*/
|
|
5
|
-
export type { AnalyzeDirectoryResult, ContentMatch, DetailedError, DirectoryAnalysis, DirectoryEntry, DirectoryTreeResult, ErrorCode, ErrorResponse, FileInfo, FileType, ListDirectoryResult, MediaFileResult, SearchContentResult, SearchFilesResult, SearchResult, TreeEntry, } from '../config/types.js';
|
|
6
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/lib/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,YAAY,EACV,sBAAsB,EACtB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,SAAS,GACV,MAAM,oBAAoB,CAAC"}
|
package/dist/lib/types.js
DELETED
package/dist/lib/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-codebase.d.ts","sourceRoot":"","sources":["../../src/prompts/analyze-codebase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8EzE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4FrE"}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { completable } from '@modelcontextprotocol/sdk/server/completable.js';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { buildExcludes, pathCompleter } from './shared.js';
|
|
4
|
-
// Extended excludes for codebase analysis (adds minified files)
|
|
5
|
-
const ANALYZE_EXCLUDES = buildExcludes('minified');
|
|
6
|
-
const FOCUS_CONFIG = {
|
|
7
|
-
architecture: {
|
|
8
|
-
patterns: [
|
|
9
|
-
'export (class|interface|type|function) \\w+',
|
|
10
|
-
'^import .+ from',
|
|
11
|
-
'@module|@package|@namespace',
|
|
12
|
-
],
|
|
13
|
-
deliverables: [
|
|
14
|
-
'Module organization & boundaries',
|
|
15
|
-
'Dependency graph (imports/exports)',
|
|
16
|
-
'Layer violations & circular deps',
|
|
17
|
-
'Entry points & public API surface',
|
|
18
|
-
],
|
|
19
|
-
maxResults: 100,
|
|
20
|
-
},
|
|
21
|
-
patterns: {
|
|
22
|
-
patterns: [
|
|
23
|
-
'class \\w+Factory|create\\w+\\(',
|
|
24
|
-
'getInstance\\(|private constructor',
|
|
25
|
-
'subscribe\\(|addEventListener\\(|on[A-Z]\\w+\\(',
|
|
26
|
-
'implements \\w+(Strategy|Handler|Provider)',
|
|
27
|
-
],
|
|
28
|
-
deliverables: [
|
|
29
|
-
'Design patterns identified (Factory, Singleton, Observer, Strategy)',
|
|
30
|
-
'Pattern usage frequency & locations',
|
|
31
|
-
'Anti-patterns & code smells',
|
|
32
|
-
'Refactoring opportunities',
|
|
33
|
-
],
|
|
34
|
-
maxResults: 50,
|
|
35
|
-
},
|
|
36
|
-
quality: {
|
|
37
|
-
patterns: [
|
|
38
|
-
'TODO|FIXME|HACK|XXX|BUG',
|
|
39
|
-
'@deprecated|@obsolete|@legacy',
|
|
40
|
-
'console\\.(log|warn|error|debug)',
|
|
41
|
-
'eslint-disable|@ts-ignore|@ts-expect-error',
|
|
42
|
-
],
|
|
43
|
-
deliverables: [
|
|
44
|
-
'Technical debt inventory with severity',
|
|
45
|
-
'Debug/console statements left behind',
|
|
46
|
-
'Suppressed linting rules',
|
|
47
|
-
'Documentation coverage gaps',
|
|
48
|
-
],
|
|
49
|
-
maxResults: 100,
|
|
50
|
-
},
|
|
51
|
-
security: {
|
|
52
|
-
patterns: [
|
|
53
|
-
'eval\\(|new Function\\(|exec\\(',
|
|
54
|
-
'password|secret|api_?key|token|credential',
|
|
55
|
-
'innerHTML|dangerouslySetInnerHTML|outerHTML',
|
|
56
|
-
'process\\.env\\.|\\$\\{.*SECRET|\\$\\{.*KEY',
|
|
57
|
-
],
|
|
58
|
-
deliverables: [
|
|
59
|
-
'Potential code injection vulnerabilities',
|
|
60
|
-
'Hardcoded secrets & credentials',
|
|
61
|
-
'Unsafe DOM manipulation',
|
|
62
|
-
'Environment variable exposure',
|
|
63
|
-
],
|
|
64
|
-
maxResults: 50,
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
export function registerAnalyzeCodebasePrompt(server) {
|
|
68
|
-
server.registerPrompt('analyze-codebase', {
|
|
69
|
-
description: 'Deep code analysis: architecture, patterns, quality, or security',
|
|
70
|
-
argsSchema: {
|
|
71
|
-
path: completable(z.string().min(1).describe('Codebase root path'), pathCompleter),
|
|
72
|
-
focus: z
|
|
73
|
-
.enum(['architecture', 'patterns', 'quality', 'security', 'all'])
|
|
74
|
-
.optional()
|
|
75
|
-
.default('all')
|
|
76
|
-
.describe('Focus: architecture, patterns, quality, security, or all'),
|
|
77
|
-
filePattern: z
|
|
78
|
-
.string()
|
|
79
|
-
.optional()
|
|
80
|
-
.default('**/*.{ts,js,tsx,jsx,py,java,go,rs}')
|
|
81
|
-
.describe('Source file glob pattern'),
|
|
82
|
-
maxDepth: z
|
|
83
|
-
.number()
|
|
84
|
-
.int()
|
|
85
|
-
.min(1)
|
|
86
|
-
.max(20)
|
|
87
|
-
.optional()
|
|
88
|
-
.default(10)
|
|
89
|
-
.describe('Maximum directory depth (default: 10)'),
|
|
90
|
-
},
|
|
91
|
-
}, ({ path, focus, filePattern, maxDepth }) => {
|
|
92
|
-
const focusAreas = focus === 'all' ? Object.keys(FOCUS_CONFIG) : [focus];
|
|
93
|
-
const allPatterns = focusAreas.flatMap((f) => FOCUS_CONFIG[f]?.patterns ?? []);
|
|
94
|
-
const allDeliverables = focusAreas.flatMap((f) => FOCUS_CONFIG[f]?.deliverables ?? []);
|
|
95
|
-
const maxResults = Math.min(...focusAreas.map((f) => FOCUS_CONFIG[f]?.maxResults ?? 100));
|
|
96
|
-
const excludesJson = JSON.stringify(ANALYZE_EXCLUDES);
|
|
97
|
-
// Build search instructions for each focus area
|
|
98
|
-
const searchInstructions = focusAreas
|
|
99
|
-
.map((f) => {
|
|
100
|
-
const config = FOCUS_CONFIG[f];
|
|
101
|
-
if (!config)
|
|
102
|
-
return '';
|
|
103
|
-
return ` - **${f}**: \`${config.patterns.slice(0, 2).join('` or `')}\``;
|
|
104
|
-
})
|
|
105
|
-
.filter(Boolean)
|
|
106
|
-
.join('\n');
|
|
107
|
-
return {
|
|
108
|
-
messages: [
|
|
109
|
-
{
|
|
110
|
-
role: 'user',
|
|
111
|
-
content: {
|
|
112
|
-
type: 'text',
|
|
113
|
-
text: `Analyze codebase at "${path}" (focus: **${focus}**).
|
|
114
|
-
|
|
115
|
-
⚠️ First run \`list_allowed_directories\` to verify path is accessible.
|
|
116
|
-
|
|
117
|
-
**Default excludes:** ${ANALYZE_EXCLUDES.slice(0, 4).join(', ')}
|
|
118
|
-
|
|
119
|
-
**Workflow:**
|
|
120
|
-
1. \`directory_tree\` maxDepth=${maxDepth} excludePatterns=${excludesJson} → structure overview
|
|
121
|
-
2. \`search_files\` pattern="${filePattern}" excludePatterns=${excludesJson} → find source files
|
|
122
|
-
3. \`analyze_directory\` maxDepth=${maxDepth} excludePatterns=${excludesJson} → stats & hotspots
|
|
123
|
-
4. \`search_content\` contextLines=2 maxResults=${maxResults} excludePatterns=${excludesJson} → search for:
|
|
124
|
-
${searchInstructions}
|
|
125
|
-
5. \`read_multiple_files\` → batch examine key files (most efficient)
|
|
126
|
-
|
|
127
|
-
**Regex patterns to search:**
|
|
128
|
-
${allPatterns.map((p) => `- \`${p}\``).join('\n')}
|
|
129
|
-
|
|
130
|
-
**Deliverables:**
|
|
131
|
-
${allDeliverables.map((d) => `- ${d}`).join('\n')}
|
|
132
|
-
|
|
133
|
-
**Final Report:**
|
|
134
|
-
- Executive summary (1-2 paragraphs)
|
|
135
|
-
- Findings by category with file:line references
|
|
136
|
-
- Prioritized recommendations (High/Medium/Low)
|
|
137
|
-
- Quick wins vs long-term improvements`,
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
],
|
|
141
|
-
};
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
//# sourceMappingURL=analyze-codebase.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-codebase.js","sourceRoot":"","sources":["../../src/prompts/analyze-codebase.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-query.d.ts","sourceRoot":"","sources":["../../src/prompts/filesystem-query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyEzE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6HrE"}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { completable } from '@modelcontextprotocol/sdk/server/completable.js';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { DEFAULT_EXCLUDES, pathCompleter } from './shared.js';
|
|
4
|
-
const OPERATIONS = {
|
|
5
|
-
explore: {
|
|
6
|
-
tools: `1. \`directory_tree\` maxDepth={depth} excludePatterns={excludes} → hierarchy
|
|
7
|
-
2. \`analyze_directory\` excludePatterns={excludes} → stats
|
|
8
|
-
3. \`list_directory\` sortBy="modified" → recent activity`,
|
|
9
|
-
deliverables: `- Structure overview & folder purposes
|
|
10
|
-
- File distribution by type
|
|
11
|
-
- Key config/entry files
|
|
12
|
-
- Notable findings`,
|
|
13
|
-
requiresPattern: false,
|
|
14
|
-
usesDepth: true,
|
|
15
|
-
},
|
|
16
|
-
'find-files': {
|
|
17
|
-
tools: `1. \`search_files\` pattern="{pattern}" excludePatterns={excludes} maxResults=100 → find matches
|
|
18
|
-
2. \`read_multiple_files\` → batch examine contents
|
|
19
|
-
3. \`get_file_info\` → metadata if needed`,
|
|
20
|
-
deliverables: `- Matched files with sizes (up to 100 results)
|
|
21
|
-
- Content summary of key files
|
|
22
|
-
- Related pattern suggestions`,
|
|
23
|
-
requiresPattern: true,
|
|
24
|
-
usesDepth: true,
|
|
25
|
-
maxResults: 100,
|
|
26
|
-
},
|
|
27
|
-
'search-code': {
|
|
28
|
-
tools: `1. \`search_content\` pattern="{pattern}" contextLines=2 maxResults=50 excludePatterns={excludes} → find matches
|
|
29
|
-
2. \`read_multiple_files\` → batch read for full context`,
|
|
30
|
-
deliverables: `- Match count & files affected (up to 50 matches)
|
|
31
|
-
- Key matches with surrounding context
|
|
32
|
-
- Pattern usage analysis
|
|
33
|
-
- Suggested refactoring if duplicates found`,
|
|
34
|
-
requiresPattern: true,
|
|
35
|
-
usesDepth: false,
|
|
36
|
-
maxResults: 50,
|
|
37
|
-
},
|
|
38
|
-
'analyze-size': {
|
|
39
|
-
tools: `1. \`analyze_directory\` maxDepth={depth} excludePatterns={excludes} → size stats
|
|
40
|
-
2. \`directory_tree\` includeSize=true maxDepth={depth} excludePatterns={excludes} → visualize
|
|
41
|
-
3. \`search_files\` sortBy="size" maxResults=20 → largest files`,
|
|
42
|
-
deliverables: `- Total size & file counts
|
|
43
|
-
- Top 10 largest files with paths
|
|
44
|
-
- Size breakdown by extension
|
|
45
|
-
- Cleanup suggestions (large/unused files)`,
|
|
46
|
-
requiresPattern: false,
|
|
47
|
-
usesDepth: true,
|
|
48
|
-
},
|
|
49
|
-
'recent-changes': {
|
|
50
|
-
tools: `1. \`analyze_directory\` maxDepth={depth} excludePatterns={excludes} → recentlyModified
|
|
51
|
-
2. \`list_directory\` sortBy="modified" recursive=true maxDepth={depth}
|
|
52
|
-
3. \`read_multiple_files\` → batch examine recent files`,
|
|
53
|
-
deliverables: `- Recent activity timeline (last 24h, 7d, 30d)
|
|
54
|
-
- Most active directories
|
|
55
|
-
- Change patterns & hot spots
|
|
56
|
-
- Files to review`,
|
|
57
|
-
requiresPattern: false,
|
|
58
|
-
usesDepth: true,
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
export function registerFilesystemQueryPrompt(server) {
|
|
62
|
-
server.registerPrompt('filesystem-query', {
|
|
63
|
-
description: 'Guided filesystem operations: explore, find, search, size, changes',
|
|
64
|
-
argsSchema: {
|
|
65
|
-
path: completable(z.string().min(1).describe('Target path'), pathCompleter),
|
|
66
|
-
operation: z
|
|
67
|
-
.enum([
|
|
68
|
-
'explore',
|
|
69
|
-
'find-files',
|
|
70
|
-
'search-code',
|
|
71
|
-
'analyze-size',
|
|
72
|
-
'recent-changes',
|
|
73
|
-
])
|
|
74
|
-
.describe('Operation type'),
|
|
75
|
-
pattern: z
|
|
76
|
-
.string()
|
|
77
|
-
.optional()
|
|
78
|
-
.describe('Search pattern (glob for find-files, regex for search-code)'),
|
|
79
|
-
depth: z
|
|
80
|
-
.number()
|
|
81
|
-
.int()
|
|
82
|
-
.min(1)
|
|
83
|
-
.max(20)
|
|
84
|
-
.optional()
|
|
85
|
-
.default(5)
|
|
86
|
-
.describe('Max depth (1-20, default: 5)'),
|
|
87
|
-
caseSensitive: z
|
|
88
|
-
.boolean()
|
|
89
|
-
.optional()
|
|
90
|
-
.default(false)
|
|
91
|
-
.describe('Case-sensitive search (search-code only)'),
|
|
92
|
-
},
|
|
93
|
-
}, ({ path, operation, pattern, depth, caseSensitive }) => {
|
|
94
|
-
const config = OPERATIONS[operation];
|
|
95
|
-
// Type guard - should never happen with enum validation, but TypeScript needs this
|
|
96
|
-
if (!config) {
|
|
97
|
-
return {
|
|
98
|
-
messages: [
|
|
99
|
-
{
|
|
100
|
-
role: 'user',
|
|
101
|
-
content: {
|
|
102
|
-
type: 'text',
|
|
103
|
-
text: `Unknown operation: "${operation}". Valid operations: ${Object.keys(OPERATIONS).join(', ')}`,
|
|
104
|
-
},
|
|
105
|
-
},
|
|
106
|
-
],
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
const excludesJson = JSON.stringify(DEFAULT_EXCLUDES);
|
|
110
|
-
// Validate pattern requirement
|
|
111
|
-
if (config.requiresPattern && !pattern) {
|
|
112
|
-
return {
|
|
113
|
-
messages: [
|
|
114
|
-
{
|
|
115
|
-
role: 'user',
|
|
116
|
-
content: {
|
|
117
|
-
type: 'text',
|
|
118
|
-
text: `⚠️ The "${operation}" operation requires a pattern.
|
|
119
|
-
|
|
120
|
-
Please provide:
|
|
121
|
-
- For **find-files**: a glob pattern (e.g., "**/*.ts", "src/**/*.json")
|
|
122
|
-
- For **search-code**: a regex pattern (e.g., "TODO|FIXME", "function\\s+\\w+")`,
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
],
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
// Build tools section with substitutions
|
|
129
|
-
const tools = config.tools
|
|
130
|
-
.replace(/{depth}/g, String(depth))
|
|
131
|
-
.replace(/{excludes}/g, excludesJson)
|
|
132
|
-
.replace(/{pattern}/g, pattern ?? '*');
|
|
133
|
-
// Build search options for search-code
|
|
134
|
-
const searchOptions = operation === 'search-code'
|
|
135
|
-
? ` caseSensitive=${String(caseSensitive)}`
|
|
136
|
-
: '';
|
|
137
|
-
const patternInfo = pattern ? ` pattern="${pattern}"` : '';
|
|
138
|
-
const depthInfo = config.usesDepth ? ` maxDepth=${String(depth)}` : '';
|
|
139
|
-
const promptText = `**${operation.charAt(0).toUpperCase() + operation.slice(1)}** "${path}"${patternInfo}${depthInfo}${searchOptions}
|
|
140
|
-
|
|
141
|
-
⚠️ First run \`list_allowed_directories\` to verify path is accessible.
|
|
142
|
-
|
|
143
|
-
**Default excludes:** ${DEFAULT_EXCLUDES.join(', ')}
|
|
144
|
-
|
|
145
|
-
**Tools:**
|
|
146
|
-
${tools}
|
|
147
|
-
|
|
148
|
-
**Deliverables:**
|
|
149
|
-
${config.deliverables}
|
|
150
|
-
|
|
151
|
-
**Best Practices:**
|
|
152
|
-
- Use \`read_multiple_files\` to batch read (more efficient than sequential reads)
|
|
153
|
-
- Stop early if results are sufficient
|
|
154
|
-
- Report any inaccessible paths encountered`;
|
|
155
|
-
return {
|
|
156
|
-
messages: [
|
|
157
|
-
{
|
|
158
|
-
role: 'user',
|
|
159
|
-
content: {
|
|
160
|
-
type: 'text',
|
|
161
|
-
text: promptText,
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
],
|
|
165
|
-
};
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
//# sourceMappingURL=filesystem-query.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-query.js","sourceRoot":"","sources":["../../src/prompts/filesystem-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AAG9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAW9D,MAAM,UAAU,GAAoC;IAClD,OAAO,EAAE;QACP,KAAK,EAAE;;0DAE+C;QACtD,YAAY,EAAE;;;mBAGC;QACf,eAAe,EAAE,KAAK;QACtB,SAAS,EAAE,IAAI;KAChB;IACD,YAAY,EAAE;QACZ,KAAK,EAAE;;0CAE+B;QACtC,YAAY,EAAE;;8BAEY;QAC1B,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,GAAG;KAChB;IACD,aAAa,EAAE;QACb,KAAK,EAAE;yDAC8C;QACrD,YAAY,EAAE;;;4CAG0B;QACxC,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,EAAE;KACf;IACD,cAAc,EAAE;QACd,KAAK,EAAE;;gEAEqD;QAC5D,YAAY,EAAE;;;2CAGyB;QACvC,eAAe,EAAE,KAAK;QACtB,SAAS,EAAE,IAAI;KAChB;IACD,gBAAgB,EAAE;QAChB,KAAK,EAAE;;wDAE6C;QACpD,YAAY,EAAE;;;kBAGA;QACd,eAAe,EAAE,KAAK;QACtB,SAAS,EAAE,IAAI;KAChB;CACF,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,MAAM,CAAC,cAAc,CACnB,kBAAkB,EAClB;QACE,WAAW,EACT,oEAAoE;QACtE,UAAU,EAAE;YACV,IAAI,EAAE,WAAW,CACf,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EACzC,aAAa,CACd;YACD,SAAS,EAAE,CAAC;iBACT,IAAI,CAAC;gBACJ,SAAS;gBACT,YAAY;gBACZ,aAAa;gBACb,cAAc;gBACd,gBAAgB;aACjB,CAAC;iBACD,QAAQ,CAAC,gBAAgB,CAAC;YAC7B,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,6DAA6D,CAC9D;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,OAAO,CAAC,CAAC,CAAC;iBACV,QAAQ,CAAC,8BAA8B,CAAC;YAC3C,aAAa,EAAE,CAAC;iBACb,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,0CAA0C,CAAC;SACxD;KACF,EACD,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAErC,mFAAmF;QACnF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,uBAAuB,SAAS,wBAAwB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;yBACnG;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAEtD,+BAA+B;QAC/B,IAAI,MAAM,CAAC,eAAe,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,WAAW,SAAS;;;;gFAIsC;yBACjE;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,yCAAyC;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK;aACvB,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;aAClC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC;aACpC,OAAO,CAAC,YAAY,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;QAEzC,uCAAuC;QACvC,MAAM,aAAa,GACjB,SAAS,KAAK,aAAa;YACzB,CAAC,CAAC,kBAAkB,MAAM,CAAC,aAAa,CAAC,EAAE;YAC3C,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEvE,MAAM,UAAU,GAAG,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,WAAW,GAAG,SAAS,GAAG,aAAa;;;;wBAIlH,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAGjD,KAAK;;;EAGL,MAAM,CAAC,YAAY;;;;;4CAKuB,CAAC;QAEvC,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU;qBACjB;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"find-duplicates.d.ts","sourceRoot":"","sources":["../../src/prompts/find-duplicates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgFpE"}
|