@gemini-designer/mcp-server 0.1.39 → 0.1.41
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/dist/context/builder.d.ts.map +1 -1
- package/dist/context/builder.js +29 -28
- package/dist/context/builder.js.map +1 -1
- package/dist/output/file-bundle.d.ts +1 -1
- package/dist/tools/catalog-components.d.ts.map +1 -1
- package/dist/tools/catalog-components.js +29 -3
- package/dist/tools/catalog-components.js.map +1 -1
- package/dist/tools/detect-ui-stack.d.ts.map +1 -1
- package/dist/tools/detect-ui-stack.js +45 -14
- package/dist/tools/detect-ui-stack.js.map +1 -1
- package/dist/tools/repo-search.d.ts.map +1 -1
- package/dist/tools/repo-search.js +26 -120
- package/dist/tools/repo-search.js.map +1 -1
- package/dist/tools/repo-tree.d.ts.map +1 -1
- package/dist/tools/repo-tree.js +44 -19
- package/dist/tools/repo-tree.js.map +1 -1
- package/dist/utils/concurrency.d.ts +2 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +16 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/ripgrep.d.ts +45 -0
- package/dist/utils/ripgrep.d.ts.map +1 -0
- package/dist/utils/ripgrep.js +312 -0
- package/dist/utils/ripgrep.js.map +1 -0
- package/dist/utils/walk.d.ts +1 -0
- package/dist/utils/walk.d.ts.map +1 -1
- package/dist/utils/walk.js +2 -1
- package/dist/utils/walk.js.map +1 -1
- package/package.json +2 -1
- package/src/__tests__/ripgrep.test.ts +136 -0
- package/src/context/builder.ts +27 -30
- package/src/tools/catalog-components.ts +28 -3
- package/src/tools/detect-ui-stack.ts +51 -14
- package/src/tools/repo-search.ts +27 -121
- package/src/tools/repo-tree.ts +44 -17
- package/src/utils/concurrency.ts +21 -0
- package/src/utils/ripgrep.ts +360 -0
- package/src/utils/walk.ts +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/context/builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/context/builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAU5C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,aAAa,CAAC,CAsExB;AAgDD;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyC1F"}
|
package/dist/context/builder.js
CHANGED
|
@@ -9,6 +9,7 @@ import * as fs from 'node:fs';
|
|
|
9
9
|
import * as path from 'node:path';
|
|
10
10
|
import { isPathAllowed, isSensitiveFile, sanitizeContent } from './filter.js';
|
|
11
11
|
import { assertReadablePath } from './guards.js';
|
|
12
|
+
import { ripgrepListFiles } from '../utils/ripgrep.js';
|
|
12
13
|
// Token estimation: ~4 characters per token for English text/code
|
|
13
14
|
const CHARS_PER_TOKEN = 4;
|
|
14
15
|
const MAX_CONTEXT_TOKENS = 12500; // ~50k chars
|
|
@@ -146,36 +147,36 @@ export async function discoverUIFiles(directory, config) {
|
|
|
146
147
|
/design[-_]?tokens?\./,
|
|
147
148
|
/tailwind\.config\./,
|
|
148
149
|
];
|
|
150
|
+
const excludedDirs = ['node_modules', '.git', 'dist', 'build', '.next', '.nuxt'];
|
|
151
|
+
const excludeGlobs = excludedDirs.map((d) => `!**/${d}/**`);
|
|
152
|
+
let list;
|
|
153
|
+
try {
|
|
154
|
+
list = await ripgrepListFiles({
|
|
155
|
+
cwd: directory,
|
|
156
|
+
includeHidden: true,
|
|
157
|
+
noIgnore: true,
|
|
158
|
+
maxFiles: 5000,
|
|
159
|
+
maxDepth: 3,
|
|
160
|
+
globs: excludeGlobs,
|
|
161
|
+
cacheTtlMs: 1500,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Fall back to empty on rg failures; caller can still operate without auto-discovery.
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
149
168
|
const files = [];
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
continue;
|
|
161
|
-
}
|
|
162
|
-
scan(fullPath, depth + 1);
|
|
163
|
-
}
|
|
164
|
-
else if (entry.isFile()) {
|
|
165
|
-
// Check if matches UI patterns
|
|
166
|
-
if (uiPatterns.some((pattern) => pattern.test(entry.name))) {
|
|
167
|
-
if (isPathAllowed(fullPath, config.allowedPaths) && !isSensitiveFile(fullPath)) {
|
|
168
|
-
files.push(fullPath);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
// Skip directories we can't read
|
|
176
|
-
}
|
|
169
|
+
for (const rel of list.files) {
|
|
170
|
+
const name = path.basename(rel);
|
|
171
|
+
if (!uiPatterns.some((pattern) => pattern.test(name)))
|
|
172
|
+
continue;
|
|
173
|
+
const abs = path.resolve(directory, rel);
|
|
174
|
+
if (!isPathAllowed(abs, config.allowedPaths))
|
|
175
|
+
continue;
|
|
176
|
+
if (isSensitiveFile(abs))
|
|
177
|
+
continue;
|
|
178
|
+
files.push(abs);
|
|
177
179
|
}
|
|
178
|
-
scan(directory);
|
|
179
180
|
// Sort by relevance
|
|
180
181
|
return sortByRelevance(files);
|
|
181
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/context/builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/context/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,7 +64,6 @@ export declare const FileBundleSchema: z.ZodObject<{
|
|
|
64
64
|
suggestedCommands?: string[] | undefined;
|
|
65
65
|
metadata?: Record<string, any> | undefined;
|
|
66
66
|
}, {
|
|
67
|
-
warnings?: string[] | undefined;
|
|
68
67
|
files?: {
|
|
69
68
|
path: string;
|
|
70
69
|
content?: string | undefined;
|
|
@@ -72,6 +71,7 @@ export declare const FileBundleSchema: z.ZodObject<{
|
|
|
72
71
|
op?: "create" | "update" | "delete" | undefined;
|
|
73
72
|
baseSha256?: string | undefined;
|
|
74
73
|
}[] | undefined;
|
|
74
|
+
warnings?: string[] | undefined;
|
|
75
75
|
suggestedCommands?: string[] | undefined;
|
|
76
76
|
metadata?: Record<string, any> | undefined;
|
|
77
77
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-components.d.ts","sourceRoot":"","sources":["../../src/tools/catalog-components.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog-components.d.ts","sourceRoot":"","sources":["../../src/tools/catalog-components.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA2B5C,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA6FjF"}
|
|
@@ -12,7 +12,8 @@ import { z } from 'zod';
|
|
|
12
12
|
import * as path from 'node:path';
|
|
13
13
|
import { assertReadableDir } from '../context/guards.js';
|
|
14
14
|
import { getProjectRootAbs } from '../context/project-root.js';
|
|
15
|
-
import {
|
|
15
|
+
import { DEFAULT_EXCLUDE_DIR_NAMES, toPosixPath } from '../utils/walk.js';
|
|
16
|
+
import { extensionGlob, ripgrepListFiles } from '../utils/ripgrep.js';
|
|
16
17
|
import { buildComponentCatalog } from '../components/catalog.js';
|
|
17
18
|
import { resolveWithinProjectRoot } from '../output/path-resolve.js';
|
|
18
19
|
const inputSchema = {
|
|
@@ -62,8 +63,33 @@ export function registerCatalogComponents(server, config) {
|
|
|
62
63
|
}
|
|
63
64
|
const allFiles = [];
|
|
64
65
|
for (const r of safeRoots) {
|
|
65
|
-
const
|
|
66
|
-
|
|
66
|
+
const extGlob = extensionGlob(extensions);
|
|
67
|
+
const globs = [];
|
|
68
|
+
for (const d of DEFAULT_EXCLUDE_DIR_NAMES)
|
|
69
|
+
globs.push(`!**/${d}/**`);
|
|
70
|
+
if (extGlob)
|
|
71
|
+
globs.push(extGlob);
|
|
72
|
+
let found;
|
|
73
|
+
try {
|
|
74
|
+
found = await ripgrepListFiles({
|
|
75
|
+
cwd: r,
|
|
76
|
+
includeHidden: true,
|
|
77
|
+
noIgnore: true,
|
|
78
|
+
maxFiles,
|
|
79
|
+
globs,
|
|
80
|
+
cacheTtlMs: 2500,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
const message = error instanceof Error ? error.message : 'ripgrep failed';
|
|
85
|
+
return {
|
|
86
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
87
|
+
isError: true,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
for (const rel of found.files) {
|
|
91
|
+
allFiles.push(path.resolve(r, rel));
|
|
92
|
+
}
|
|
67
93
|
}
|
|
68
94
|
// Use projectRoot (when provided) so paths are stable for agents in monorepos
|
|
69
95
|
const root = path.resolve(projectRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-components.js","sourceRoot":"","sources":["../../src/tools/catalog-components.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"catalog-components.js","sourceRoot":"","sources":["../../src/tools/catalog-components.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-ui-stack.d.ts","sourceRoot":"","sources":["../../src/tools/detect-ui-stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"detect-ui-stack.d.ts","sourceRoot":"","sources":["../../src/tools/detect-ui-stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAiG5C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA0D7E"}
|
|
@@ -14,6 +14,7 @@ import * as fs from 'node:fs';
|
|
|
14
14
|
import * as path from 'node:path';
|
|
15
15
|
import { assertReadableDir } from '../context/guards.js';
|
|
16
16
|
import { detectUiStack } from '../stack/detect.js';
|
|
17
|
+
import { ripgrepListFiles } from '../utils/ripgrep.js';
|
|
17
18
|
const inputSchema = {
|
|
18
19
|
root: z
|
|
19
20
|
.string()
|
|
@@ -21,19 +22,24 @@ const inputSchema = {
|
|
|
21
22
|
.describe('Project root directory (defaults to current working directory)')
|
|
22
23
|
.default(process.cwd()),
|
|
23
24
|
};
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
25
|
+
const PACKAGE_JSON_DENY_DIRS = [
|
|
26
|
+
'node_modules',
|
|
27
|
+
'.git',
|
|
28
|
+
'.next',
|
|
29
|
+
'dist',
|
|
30
|
+
'build',
|
|
31
|
+
'out',
|
|
32
|
+
'coverage',
|
|
33
|
+
'.turbo',
|
|
34
|
+
'.cache',
|
|
35
|
+
'tmp',
|
|
36
|
+
];
|
|
37
|
+
function isWithinPath(parent, child) {
|
|
38
|
+
const rel = path.relative(parent, child);
|
|
39
|
+
return rel === '' || (!rel.startsWith(`..${path.sep}`) && rel !== '..' && !path.isAbsolute(rel));
|
|
40
|
+
}
|
|
41
|
+
function findPackageJsonRootsFs(rootDir, maxDepth) {
|
|
42
|
+
const deny = new Set(PACKAGE_JSON_DENY_DIRS);
|
|
37
43
|
const out = [];
|
|
38
44
|
const q = [{ dir: rootDir, depth: 0 }];
|
|
39
45
|
while (q.length) {
|
|
@@ -67,6 +73,31 @@ function findPackageJsonRoots(rootDir, maxDepth) {
|
|
|
67
73
|
}
|
|
68
74
|
return out.sort();
|
|
69
75
|
}
|
|
76
|
+
async function findPackageJsonRootsRg(rootDir, maxDepth) {
|
|
77
|
+
const globs = PACKAGE_JSON_DENY_DIRS.map((d) => `!**/${d}/**`);
|
|
78
|
+
// Match previous behavior: don't descend into dot-directories.
|
|
79
|
+
globs.push('!**/.*/**');
|
|
80
|
+
globs.push('**/package.json');
|
|
81
|
+
const files = await ripgrepListFiles({
|
|
82
|
+
cwd: rootDir,
|
|
83
|
+
includeHidden: true,
|
|
84
|
+
noIgnore: true,
|
|
85
|
+
maxFiles: 2000,
|
|
86
|
+
maxDepth,
|
|
87
|
+
globs,
|
|
88
|
+
cacheTtlMs: 2500,
|
|
89
|
+
});
|
|
90
|
+
const absDirs = [...new Set(files.files.map((p) => path.dirname(p)).filter((d) => d !== '.' && d !== ''))]
|
|
91
|
+
.map((d) => path.resolve(rootDir, d))
|
|
92
|
+
.sort((a, b) => a.length - b.length);
|
|
93
|
+
const kept = [];
|
|
94
|
+
for (const d of absDirs) {
|
|
95
|
+
if (kept.some((k) => isWithinPath(k, d)))
|
|
96
|
+
continue;
|
|
97
|
+
kept.push(d);
|
|
98
|
+
}
|
|
99
|
+
return kept.sort();
|
|
100
|
+
}
|
|
70
101
|
export function registerDetectUIStack(server, config) {
|
|
71
102
|
server.registerTool('detect_ui_stack', {
|
|
72
103
|
title: 'Detect UI Stack',
|
|
@@ -91,7 +122,7 @@ export function registerDetectUIStack(server, config) {
|
|
|
91
122
|
// try to find subprojects and either auto-select or guide the user.
|
|
92
123
|
const missingPkg = result.warnings.some((w) => w.includes('package.json not found'));
|
|
93
124
|
if (missingPkg) {
|
|
94
|
-
const candidates =
|
|
125
|
+
const candidates = await findPackageJsonRootsRg(safeRoot, 3).catch(() => findPackageJsonRootsFs(safeRoot, 3));
|
|
95
126
|
if (candidates.length === 1) {
|
|
96
127
|
effectiveRoot = candidates[0];
|
|
97
128
|
result = detectUiStack(effectiveRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-ui-stack.js","sourceRoot":"","sources":["../../src/tools/detect-ui-stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"detect-ui-stack.js","sourceRoot":"","sources":["../../src/tools/detect-ui-stack.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-search.d.ts","sourceRoot":"","sources":["../../src/tools/repo-search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"repo-search.d.ts","sourceRoot":"","sources":["../../src/tools/repo-search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAuC5C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA2D3E"}
|
|
@@ -5,17 +5,17 @@
|
|
|
5
5
|
* Returns matches with file path + line/column + preview.
|
|
6
6
|
*/
|
|
7
7
|
import { z } from 'zod';
|
|
8
|
-
import * as fs from 'node:fs';
|
|
9
8
|
import * as path from 'node:path';
|
|
10
9
|
import { getProjectRootAbs } from '../context/project-root.js';
|
|
11
10
|
import { isSensitiveFile } from '../context/filter.js';
|
|
11
|
+
import { ripgrepJsonSearch } from '../utils/ripgrep.js';
|
|
12
12
|
const inputSchema = {
|
|
13
13
|
projectRoot: z
|
|
14
14
|
.string()
|
|
15
15
|
.optional()
|
|
16
16
|
.describe('Optional project root to search (defaults to cwd).'),
|
|
17
17
|
pattern: z.string().min(1).describe('String pattern to search for.'),
|
|
18
|
-
regex: z.boolean().default(false).describe('Treat pattern as a
|
|
18
|
+
regex: z.boolean().default(false).describe('Treat pattern as a ripgrep regex (PCRE2).'),
|
|
19
19
|
caseSensitive: z.boolean().default(false).describe('Case-sensitive search (default: false).'),
|
|
20
20
|
maxResults: z.number().int().min(1).max(2000).default(200).describe('Maximum matches to return.'),
|
|
21
21
|
maxFileBytes: z
|
|
@@ -28,7 +28,7 @@ const inputSchema = {
|
|
|
28
28
|
includePreview: z.boolean().default(true).describe('Include a one-line preview for each match.'),
|
|
29
29
|
includeBinary: z.boolean().default(false).describe('If true, attempt to search binary files (not recommended).'),
|
|
30
30
|
};
|
|
31
|
-
const DEFAULT_IGNORED_DIRS =
|
|
31
|
+
const DEFAULT_IGNORED_DIRS = [
|
|
32
32
|
'node_modules',
|
|
33
33
|
'.git',
|
|
34
34
|
'dist',
|
|
@@ -40,65 +40,7 @@ const DEFAULT_IGNORED_DIRS = new Set([
|
|
|
40
40
|
'coverage',
|
|
41
41
|
'.cache',
|
|
42
42
|
'.gemini-designer',
|
|
43
|
-
]
|
|
44
|
-
const TEXT_EXTENSIONS = new Set([
|
|
45
|
-
'.ts',
|
|
46
|
-
'.tsx',
|
|
47
|
-
'.js',
|
|
48
|
-
'.jsx',
|
|
49
|
-
'.mjs',
|
|
50
|
-
'.cjs',
|
|
51
|
-
'.json',
|
|
52
|
-
'.md',
|
|
53
|
-
'.html',
|
|
54
|
-
'.css',
|
|
55
|
-
'.scss',
|
|
56
|
-
'.sass',
|
|
57
|
-
'.less',
|
|
58
|
-
'.styl',
|
|
59
|
-
'.vue',
|
|
60
|
-
'.svelte',
|
|
61
|
-
'.astro',
|
|
62
|
-
'.yml',
|
|
63
|
-
'.yaml',
|
|
64
|
-
'.toml',
|
|
65
|
-
'.txt',
|
|
66
|
-
]);
|
|
67
|
-
function isBinaryBuffer(buf) {
|
|
68
|
-
// Heuristic: if it contains a NUL byte, treat as binary.
|
|
69
|
-
return buf.includes(0);
|
|
70
|
-
}
|
|
71
|
-
function normalizeRel(root, abs) {
|
|
72
|
-
return path.relative(root, abs).replace(/\\/g, '/');
|
|
73
|
-
}
|
|
74
|
-
function walkFiles(root, maxFiles = 50_000) {
|
|
75
|
-
const out = [];
|
|
76
|
-
const stack = [root];
|
|
77
|
-
while (stack.length) {
|
|
78
|
-
const dir = stack.pop();
|
|
79
|
-
let entries;
|
|
80
|
-
try {
|
|
81
|
-
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
82
|
-
}
|
|
83
|
-
catch {
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
for (const e of entries) {
|
|
87
|
-
if (out.length >= maxFiles)
|
|
88
|
-
return out;
|
|
89
|
-
const abs = path.join(dir, e.name);
|
|
90
|
-
if (e.isDirectory()) {
|
|
91
|
-
if (DEFAULT_IGNORED_DIRS.has(e.name))
|
|
92
|
-
continue;
|
|
93
|
-
stack.push(abs);
|
|
94
|
-
}
|
|
95
|
-
else if (e.isFile()) {
|
|
96
|
-
out.push(abs);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return out;
|
|
101
|
-
}
|
|
43
|
+
];
|
|
102
44
|
export function registerRepoSearch(server, _config) {
|
|
103
45
|
server.registerTool('repo_search', {
|
|
104
46
|
title: 'Repo Search',
|
|
@@ -115,74 +57,38 @@ export function registerRepoSearch(server, _config) {
|
|
|
115
57
|
const maxFileBytes = args.maxFileBytes || 600_000;
|
|
116
58
|
const includePreview = args.includePreview !== false;
|
|
117
59
|
const includeBinary = args.includeBinary === true;
|
|
118
|
-
|
|
60
|
+
const ignoredDirGlobs = DEFAULT_IGNORED_DIRS.map((d) => `!**/${d}/**`);
|
|
61
|
+
let res;
|
|
119
62
|
try {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
63
|
+
res = await ripgrepJsonSearch({
|
|
64
|
+
cwd: projectRootAbs,
|
|
65
|
+
pattern,
|
|
66
|
+
fixedStrings: !regex,
|
|
67
|
+
caseSensitive,
|
|
68
|
+
includeHidden: true,
|
|
69
|
+
includeBinary,
|
|
70
|
+
maxFileBytes,
|
|
71
|
+
maxResults,
|
|
72
|
+
globs: ignoredDirGlobs,
|
|
73
|
+
usePcre2: regex,
|
|
74
|
+
shouldIgnorePath: (abs) => isSensitiveFile(abs),
|
|
75
|
+
includePreview,
|
|
76
|
+
previewMaxChars: 240,
|
|
77
|
+
});
|
|
123
78
|
}
|
|
124
79
|
catch (e) {
|
|
125
80
|
const msg = e instanceof Error ? e.message : String(e);
|
|
126
|
-
return { content: [{ type: 'text', text: `Error:
|
|
127
|
-
}
|
|
128
|
-
const matches = [];
|
|
129
|
-
const scannedFiles = [];
|
|
130
|
-
const files = walkFiles(projectRootAbs);
|
|
131
|
-
for (const abs of files) {
|
|
132
|
-
if (matches.length >= maxResults)
|
|
133
|
-
break;
|
|
134
|
-
if (isSensitiveFile(abs))
|
|
135
|
-
continue;
|
|
136
|
-
const ext = path.extname(abs).toLowerCase();
|
|
137
|
-
if (!includeBinary && !TEXT_EXTENSIONS.has(ext))
|
|
138
|
-
continue;
|
|
139
|
-
let st;
|
|
140
|
-
try {
|
|
141
|
-
st = fs.statSync(abs);
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
if (st.size > maxFileBytes)
|
|
147
|
-
continue;
|
|
148
|
-
let buf;
|
|
149
|
-
try {
|
|
150
|
-
buf = fs.readFileSync(abs);
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
if (!includeBinary && isBinaryBuffer(buf))
|
|
156
|
-
continue;
|
|
157
|
-
const text = buf.toString('utf-8');
|
|
158
|
-
scannedFiles.push(normalizeRel(projectRootAbs, abs));
|
|
159
|
-
const lines = text.split(/\r?\n/);
|
|
160
|
-
for (let i = 0; i < lines.length; i++) {
|
|
161
|
-
if (matches.length >= maxResults)
|
|
162
|
-
break;
|
|
163
|
-
const line = lines[i];
|
|
164
|
-
re.lastIndex = 0;
|
|
165
|
-
let m;
|
|
166
|
-
while ((m = re.exec(line)) && matches.length < maxResults) {
|
|
167
|
-
matches.push({
|
|
168
|
-
path: normalizeRel(projectRootAbs, abs),
|
|
169
|
-
line: i + 1,
|
|
170
|
-
column: (m.index || 0) + 1,
|
|
171
|
-
preview: includePreview ? line.slice(0, 240) : undefined,
|
|
172
|
-
});
|
|
173
|
-
if (m.index === re.lastIndex)
|
|
174
|
-
re.lastIndex++; // avoid infinite loops
|
|
175
|
-
}
|
|
176
|
-
}
|
|
81
|
+
return { content: [{ type: 'text', text: `Error: ripgrep search failed: ${msg}` }], isError: true };
|
|
177
82
|
}
|
|
178
83
|
const out = {
|
|
179
84
|
projectRoot: path.basename(projectRootAbs),
|
|
180
85
|
pattern,
|
|
181
86
|
regex,
|
|
182
87
|
caseSensitive,
|
|
183
|
-
matchCount: matches.length,
|
|
184
|
-
matches,
|
|
185
|
-
scannedFilesCount:
|
|
88
|
+
matchCount: res.matches.length,
|
|
89
|
+
matches: res.matches,
|
|
90
|
+
scannedFilesCount: res.scannedFilesCount,
|
|
91
|
+
truncated: res.truncated,
|
|
186
92
|
};
|
|
187
93
|
return { content: [{ type: 'text', text: JSON.stringify(out, null, 2) }] };
|
|
188
94
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-search.js","sourceRoot":"","sources":["../../src/tools/repo-search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"repo-search.js","sourceRoot":"","sources":["../../src/tools/repo-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-tree.d.ts","sourceRoot":"","sources":["../../src/tools/repo-tree.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"repo-tree.d.ts","sourceRoot":"","sources":["../../src/tools/repo-tree.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAkC5C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAwExE"}
|
package/dist/tools/repo-tree.js
CHANGED
|
@@ -9,7 +9,9 @@ import * as path from 'node:path';
|
|
|
9
9
|
import { getProjectRootAbs } from '../context/project-root.js';
|
|
10
10
|
import { assertReadableDir } from '../context/guards.js';
|
|
11
11
|
import { isSensitiveFile } from '../context/filter.js';
|
|
12
|
-
import {
|
|
12
|
+
import { toPosixPath } from '../utils/walk.js';
|
|
13
|
+
import { extensionGlob, ripgrepListFiles } from '../utils/ripgrep.js';
|
|
14
|
+
import { mapWithConcurrency } from '../utils/concurrency.js';
|
|
13
15
|
const inputSchema = {
|
|
14
16
|
projectRoot: z
|
|
15
17
|
.string()
|
|
@@ -48,30 +50,53 @@ export function registerRepoTree(server, config) {
|
|
|
48
50
|
const excludeDirNames = args.excludeDirNames || [];
|
|
49
51
|
const maxFiles = args.maxFiles || 10_000;
|
|
50
52
|
const includeMeta = args.includeMeta === true;
|
|
51
|
-
const
|
|
53
|
+
const defaultExcludedDirs = ['node_modules', '.git', 'dist', 'build', '.next', '.nuxt', 'coverage', '.cache'];
|
|
54
|
+
const excludeGlobs = [...new Set([...defaultExcludedDirs, ...excludeDirNames])]
|
|
55
|
+
.map((d) => d.trim())
|
|
56
|
+
.filter(Boolean)
|
|
57
|
+
.map((d) => `!**/${d}/**`);
|
|
58
|
+
const extGlob = extensionGlob(includeExtensions);
|
|
59
|
+
const includeGlobs = extGlob ? [extGlob] : [];
|
|
60
|
+
let list;
|
|
61
|
+
try {
|
|
62
|
+
list = await ripgrepListFiles({
|
|
63
|
+
cwd: safeRoot,
|
|
64
|
+
includeHidden: true,
|
|
65
|
+
noIgnore: true,
|
|
66
|
+
maxFiles,
|
|
67
|
+
globs: [...excludeGlobs, ...includeGlobs],
|
|
68
|
+
cacheTtlMs: 1500,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const message = error instanceof Error ? error.message : 'ripgrep failed';
|
|
73
|
+
return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
|
|
74
|
+
}
|
|
75
|
+
const relFiles = list.files
|
|
76
|
+
.map((rel) => toPosixPath(rel))
|
|
77
|
+
.filter((rel) => rel && !rel.startsWith('..') && !isSensitiveFile(rel));
|
|
52
78
|
const files = [];
|
|
53
|
-
|
|
54
|
-
const rel
|
|
55
|
-
if (!rel || rel.startsWith('..'))
|
|
56
|
-
continue;
|
|
57
|
-
if (isSensitiveFile(rel))
|
|
58
|
-
continue;
|
|
59
|
-
if (!includeMeta) {
|
|
79
|
+
if (!includeMeta) {
|
|
80
|
+
for (const rel of relFiles)
|
|
60
81
|
files.push({ path: rel });
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
const meta = await mapWithConcurrency(relFiles, 32, async (rel) => {
|
|
85
|
+
const abs = path.join(safeRoot, rel);
|
|
86
|
+
try {
|
|
87
|
+
const st = await fs.promises.stat(abs);
|
|
88
|
+
return { path: rel, sizeBytes: st.size, mtimeMs: st.mtimeMs };
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return { path: rel };
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
files.push(...meta);
|
|
70
95
|
}
|
|
71
96
|
const out = {
|
|
72
97
|
root: safeRoot,
|
|
73
98
|
count: files.length,
|
|
74
|
-
truncated:
|
|
99
|
+
truncated: list.truncated,
|
|
75
100
|
files,
|
|
76
101
|
};
|
|
77
102
|
return { content: [{ type: 'text', text: JSON.stringify(out, null, 2) }] };
|