@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":"repo-tree.js","sourceRoot":"","sources":["../../src/tools/repo-tree.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"repo-tree.js","sourceRoot":"","sources":["../../src/tools/repo-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,CAAC,EAAE,EACV,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,CAed"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export async function mapWithConcurrency(items, concurrency, mapper) {
|
|
2
|
+
const limit = Math.max(1, Math.floor(concurrency));
|
|
3
|
+
const results = new Array(items.length);
|
|
4
|
+
let nextIndex = 0;
|
|
5
|
+
const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
|
|
6
|
+
while (true) {
|
|
7
|
+
const idx = nextIndex++;
|
|
8
|
+
if (idx >= items.length)
|
|
9
|
+
break;
|
|
10
|
+
results[idx] = await mapper(items[idx], idx);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
await Promise.all(workers);
|
|
14
|
+
return results;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=concurrency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAU,EACV,WAAmB,EACnB,MAA8C;IAE9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;QAC/E,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;YACxB,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM;gBAAE,MAAM;YAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare function resolveRipgrepPath(): Promise<string>;
|
|
2
|
+
export interface RipgrepMatch {
|
|
3
|
+
path: string;
|
|
4
|
+
line: number;
|
|
5
|
+
column: number;
|
|
6
|
+
preview?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface RipgrepSearchOptions {
|
|
9
|
+
cwd: string;
|
|
10
|
+
pattern: string;
|
|
11
|
+
fixedStrings: boolean;
|
|
12
|
+
caseSensitive: boolean;
|
|
13
|
+
includeHidden: boolean;
|
|
14
|
+
includeBinary: boolean;
|
|
15
|
+
maxFileBytes: number;
|
|
16
|
+
maxResults: number;
|
|
17
|
+
globs?: string[];
|
|
18
|
+
usePcre2?: boolean;
|
|
19
|
+
shouldIgnorePath?: (absPath: string) => boolean;
|
|
20
|
+
includePreview?: boolean;
|
|
21
|
+
previewMaxChars?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface RipgrepSearchResult {
|
|
24
|
+
matches: RipgrepMatch[];
|
|
25
|
+
scannedFilesCount: number;
|
|
26
|
+
truncated: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface RipgrepListFilesOptions {
|
|
29
|
+
cwd: string;
|
|
30
|
+
includeHidden: boolean;
|
|
31
|
+
noIgnore: boolean;
|
|
32
|
+
maxFiles: number;
|
|
33
|
+
maxDepth?: number;
|
|
34
|
+
globs?: string[];
|
|
35
|
+
shouldIgnorePath?: (absPath: string) => boolean;
|
|
36
|
+
cacheTtlMs?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface RipgrepListFilesResult {
|
|
39
|
+
files: string[];
|
|
40
|
+
truncated: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare function ripgrepListFiles(opts: RipgrepListFilesOptions): Promise<RipgrepListFilesResult>;
|
|
43
|
+
export declare function extensionGlob(extensions: string[]): string | null;
|
|
44
|
+
export declare function ripgrepJsonSearch(opts: RipgrepSearchOptions): Promise<RipgrepSearchResult>;
|
|
45
|
+
//# sourceMappingURL=ripgrep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ripgrep.d.ts","sourceRoot":"","sources":["../../src/utils/ripgrep.ts"],"names":[],"mappings":"AAyBA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAc1D;AAsCD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAwFD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAarG;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAOjE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA+HhG"}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as readline from 'node:readline';
|
|
4
|
+
let rgPathPromise;
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return typeof value === 'object' && value !== null;
|
|
7
|
+
}
|
|
8
|
+
function extractRgPath(mod) {
|
|
9
|
+
if (!isRecord(mod))
|
|
10
|
+
return undefined;
|
|
11
|
+
const direct = mod.rgPath;
|
|
12
|
+
if (typeof direct === 'string' && direct.length > 0)
|
|
13
|
+
return direct;
|
|
14
|
+
const def = mod.default;
|
|
15
|
+
if (isRecord(def)) {
|
|
16
|
+
const nested = def.rgPath;
|
|
17
|
+
if (typeof nested === 'string' && nested.length > 0)
|
|
18
|
+
return nested;
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
export async function resolveRipgrepPath() {
|
|
23
|
+
if (!rgPathPromise) {
|
|
24
|
+
rgPathPromise = (async () => {
|
|
25
|
+
try {
|
|
26
|
+
const mod = (await import('@vscode/ripgrep'));
|
|
27
|
+
const rgPath = extractRgPath(mod);
|
|
28
|
+
if (typeof rgPath === 'string' && rgPath.length > 0)
|
|
29
|
+
return rgPath;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Fall back to system rg.
|
|
33
|
+
}
|
|
34
|
+
return 'rg';
|
|
35
|
+
})();
|
|
36
|
+
}
|
|
37
|
+
return rgPathPromise;
|
|
38
|
+
}
|
|
39
|
+
function getPathText(data) {
|
|
40
|
+
if (!isRecord(data))
|
|
41
|
+
return undefined;
|
|
42
|
+
const p = data.path;
|
|
43
|
+
if (!isRecord(p))
|
|
44
|
+
return undefined;
|
|
45
|
+
const t = p.text;
|
|
46
|
+
return typeof t === 'string' && t.length > 0 ? t : undefined;
|
|
47
|
+
}
|
|
48
|
+
function getLineNumber(data) {
|
|
49
|
+
if (!isRecord(data))
|
|
50
|
+
return undefined;
|
|
51
|
+
const n = data.line_number;
|
|
52
|
+
return typeof n === 'number' && Number.isFinite(n) ? n : undefined;
|
|
53
|
+
}
|
|
54
|
+
function getLineText(data) {
|
|
55
|
+
if (!isRecord(data))
|
|
56
|
+
return '';
|
|
57
|
+
const lines = data.lines;
|
|
58
|
+
if (!isRecord(lines))
|
|
59
|
+
return '';
|
|
60
|
+
return typeof lines.text === 'string' ? lines.text : '';
|
|
61
|
+
}
|
|
62
|
+
function getSubmatchStarts(data) {
|
|
63
|
+
if (!isRecord(data))
|
|
64
|
+
return [];
|
|
65
|
+
const subs = data.submatches;
|
|
66
|
+
if (!Array.isArray(subs))
|
|
67
|
+
return [];
|
|
68
|
+
const out = [];
|
|
69
|
+
for (const sm of subs) {
|
|
70
|
+
if (!isRecord(sm))
|
|
71
|
+
continue;
|
|
72
|
+
const start = sm.start;
|
|
73
|
+
if (typeof start === 'number' && Number.isFinite(start))
|
|
74
|
+
out.push(start);
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
const filesCache = new Map();
|
|
79
|
+
function makeFilesCacheKey(opts) {
|
|
80
|
+
return JSON.stringify({
|
|
81
|
+
cwd: opts.cwd,
|
|
82
|
+
includeHidden: opts.includeHidden,
|
|
83
|
+
noIgnore: opts.noIgnore,
|
|
84
|
+
maxFiles: opts.maxFiles,
|
|
85
|
+
maxDepth: opts.maxDepth ?? null,
|
|
86
|
+
globs: opts.globs || [],
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function pruneFilesCache(now, maxEntries = 50) {
|
|
90
|
+
for (const [k, v] of filesCache) {
|
|
91
|
+
if (v.expiresAt <= now)
|
|
92
|
+
filesCache.delete(k);
|
|
93
|
+
}
|
|
94
|
+
if (filesCache.size <= maxEntries)
|
|
95
|
+
return;
|
|
96
|
+
const entries = [...filesCache.entries()].sort((a, b) => a[1].expiresAt - b[1].expiresAt);
|
|
97
|
+
for (let i = 0; i < entries.length - maxEntries; i++) {
|
|
98
|
+
filesCache.delete(entries[i][0]);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function ripgrepListFilesUncached(opts) {
|
|
102
|
+
const rgPath = await resolveRipgrepPath();
|
|
103
|
+
const args = ['--no-config', '--files', '--no-messages'];
|
|
104
|
+
if (opts.includeHidden)
|
|
105
|
+
args.push('--hidden');
|
|
106
|
+
if (opts.noIgnore)
|
|
107
|
+
args.push('--no-ignore');
|
|
108
|
+
if (typeof opts.maxDepth === 'number')
|
|
109
|
+
args.push('--max-depth', String(opts.maxDepth));
|
|
110
|
+
for (const g of opts.globs || [])
|
|
111
|
+
args.push('--glob', g);
|
|
112
|
+
const child = spawn(rgPath, args, {
|
|
113
|
+
cwd: opts.cwd,
|
|
114
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
115
|
+
windowsHide: true,
|
|
116
|
+
});
|
|
117
|
+
const files = [];
|
|
118
|
+
let truncated = false;
|
|
119
|
+
const stderrChunks = [];
|
|
120
|
+
child.stderr.setEncoding('utf8');
|
|
121
|
+
child.stderr.on('data', (d) => stderrChunks.push(String(d)));
|
|
122
|
+
const rl = readline.createInterface({ input: child.stdout });
|
|
123
|
+
const stopEarly = () => {
|
|
124
|
+
if (truncated)
|
|
125
|
+
return;
|
|
126
|
+
truncated = true;
|
|
127
|
+
try {
|
|
128
|
+
child.kill();
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// ignore
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
rl.close();
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// ignore
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
rl.on('line', (line) => {
|
|
141
|
+
if (truncated)
|
|
142
|
+
return;
|
|
143
|
+
const rel = line.replace(/\r?\n$/, '').trim();
|
|
144
|
+
if (!rel)
|
|
145
|
+
return;
|
|
146
|
+
const abs = path.resolve(opts.cwd, rel);
|
|
147
|
+
if (opts.shouldIgnorePath?.(abs))
|
|
148
|
+
return;
|
|
149
|
+
files.push(rel.replace(/\\/g, '/'));
|
|
150
|
+
if (files.length >= opts.maxFiles)
|
|
151
|
+
stopEarly();
|
|
152
|
+
});
|
|
153
|
+
const exit = await new Promise((resolve) => {
|
|
154
|
+
child.on('close', (code, signal) => resolve({ code, signal }));
|
|
155
|
+
});
|
|
156
|
+
if (!truncated && exit.code === 2) {
|
|
157
|
+
const stderr = stderrChunks.join('').trim();
|
|
158
|
+
const msg = stderr.length > 0 ? stderr : 'ripgrep failed';
|
|
159
|
+
throw new Error(msg);
|
|
160
|
+
}
|
|
161
|
+
return { files, truncated };
|
|
162
|
+
}
|
|
163
|
+
export async function ripgrepListFiles(opts) {
|
|
164
|
+
const ttlMs = opts.cacheTtlMs ?? 0;
|
|
165
|
+
if (ttlMs <= 0)
|
|
166
|
+
return ripgrepListFilesUncached(opts);
|
|
167
|
+
const now = Date.now();
|
|
168
|
+
pruneFilesCache(now);
|
|
169
|
+
const key = makeFilesCacheKey(opts);
|
|
170
|
+
const cached = filesCache.get(key);
|
|
171
|
+
if (cached && cached.expiresAt > now)
|
|
172
|
+
return cached.promise;
|
|
173
|
+
const promise = ripgrepListFilesUncached({ ...opts, cacheTtlMs: 0 });
|
|
174
|
+
filesCache.set(key, { expiresAt: now + ttlMs, promise });
|
|
175
|
+
return promise;
|
|
176
|
+
}
|
|
177
|
+
export function extensionGlob(extensions) {
|
|
178
|
+
const cleaned = [...new Set(extensions.map((e) => e.trim()).filter(Boolean))]
|
|
179
|
+
.map((e) => (e.startsWith('.') ? e.slice(1) : e))
|
|
180
|
+
.filter(Boolean);
|
|
181
|
+
if (cleaned.length === 0)
|
|
182
|
+
return null;
|
|
183
|
+
if (cleaned.length === 1)
|
|
184
|
+
return `**/*.${cleaned[0]}`;
|
|
185
|
+
return `**/*.{${cleaned.join(',')}}`;
|
|
186
|
+
}
|
|
187
|
+
export async function ripgrepJsonSearch(opts) {
|
|
188
|
+
const rgPath = await resolveRipgrepPath();
|
|
189
|
+
const args = ['--no-config', '--json', '--no-messages'];
|
|
190
|
+
if (opts.includeHidden)
|
|
191
|
+
args.push('--hidden');
|
|
192
|
+
if (opts.includeBinary)
|
|
193
|
+
args.push('--text');
|
|
194
|
+
if (!opts.caseSensitive)
|
|
195
|
+
args.push('-i');
|
|
196
|
+
if (opts.fixedStrings)
|
|
197
|
+
args.push('--fixed-strings');
|
|
198
|
+
if (opts.usePcre2 && !opts.fixedStrings)
|
|
199
|
+
args.push('--pcre2');
|
|
200
|
+
args.push('--max-filesize', String(opts.maxFileBytes));
|
|
201
|
+
for (const g of opts.globs || []) {
|
|
202
|
+
args.push('--glob', g);
|
|
203
|
+
}
|
|
204
|
+
args.push(opts.pattern);
|
|
205
|
+
const child = spawn(rgPath, args, {
|
|
206
|
+
cwd: opts.cwd,
|
|
207
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
208
|
+
windowsHide: true,
|
|
209
|
+
});
|
|
210
|
+
const matches = [];
|
|
211
|
+
const scanned = new Set();
|
|
212
|
+
const ignoredRelPaths = new Set();
|
|
213
|
+
let truncated = false;
|
|
214
|
+
const includePreview = opts.includePreview !== false;
|
|
215
|
+
const previewMaxChars = opts.previewMaxChars ?? 240;
|
|
216
|
+
const stderrChunks = [];
|
|
217
|
+
child.stderr.setEncoding('utf8');
|
|
218
|
+
child.stderr.on('data', (d) => stderrChunks.push(String(d)));
|
|
219
|
+
const rl = readline.createInterface({ input: child.stdout });
|
|
220
|
+
const stopEarly = () => {
|
|
221
|
+
if (truncated)
|
|
222
|
+
return;
|
|
223
|
+
truncated = true;
|
|
224
|
+
try {
|
|
225
|
+
child.kill();
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// ignore
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
rl.close();
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// ignore
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
rl.on('line', (line) => {
|
|
238
|
+
if (truncated)
|
|
239
|
+
return;
|
|
240
|
+
let evt;
|
|
241
|
+
try {
|
|
242
|
+
const parsed = JSON.parse(line);
|
|
243
|
+
if (!isRecord(parsed) || typeof parsed.type !== 'string')
|
|
244
|
+
return;
|
|
245
|
+
evt = parsed;
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
// If we terminate early, the last line can be truncated; ignore parse failures.
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
if (!evt)
|
|
252
|
+
return;
|
|
253
|
+
if (evt.type === 'begin') {
|
|
254
|
+
const rel = getPathText(evt.data);
|
|
255
|
+
if (!rel)
|
|
256
|
+
return;
|
|
257
|
+
const abs = path.resolve(opts.cwd, rel);
|
|
258
|
+
if (opts.shouldIgnorePath?.(abs)) {
|
|
259
|
+
ignoredRelPaths.add(rel);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
scanned.add(rel);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (evt.type === 'match') {
|
|
266
|
+
const rel = getPathText(evt.data);
|
|
267
|
+
if (!rel)
|
|
268
|
+
return;
|
|
269
|
+
if (ignoredRelPaths.has(rel))
|
|
270
|
+
return;
|
|
271
|
+
const abs = path.resolve(opts.cwd, rel);
|
|
272
|
+
if (opts.shouldIgnorePath?.(abs)) {
|
|
273
|
+
ignoredRelPaths.add(rel);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const lineNumber = getLineNumber(evt.data);
|
|
277
|
+
if (!lineNumber)
|
|
278
|
+
return;
|
|
279
|
+
const rawLine = getLineText(evt.data);
|
|
280
|
+
const preview = includePreview ? rawLine.replace(/\r?\n$/, '').slice(0, previewMaxChars) : undefined;
|
|
281
|
+
const starts = getSubmatchStarts(evt.data);
|
|
282
|
+
if (starts.length === 0) {
|
|
283
|
+
if (matches.length < opts.maxResults) {
|
|
284
|
+
matches.push({ path: rel.replace(/\\/g, '/'), line: lineNumber, column: 1, preview });
|
|
285
|
+
if (matches.length >= opts.maxResults)
|
|
286
|
+
stopEarly();
|
|
287
|
+
}
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
for (const start of starts) {
|
|
291
|
+
if (matches.length >= opts.maxResults) {
|
|
292
|
+
stopEarly();
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
matches.push({ path: rel.replace(/\\/g, '/'), line: lineNumber, column: start + 1, preview });
|
|
296
|
+
}
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
const exit = await new Promise((resolve) => {
|
|
301
|
+
child.on('close', (code, signal) => resolve({ code, signal }));
|
|
302
|
+
});
|
|
303
|
+
// rg exit codes:
|
|
304
|
+
// 0 = match found, 1 = no matches, 2 = error.
|
|
305
|
+
if (!truncated && exit.code === 2) {
|
|
306
|
+
const stderr = stderrChunks.join('').trim();
|
|
307
|
+
const msg = stderr.length > 0 ? stderr : 'ripgrep failed';
|
|
308
|
+
throw new Error(msg);
|
|
309
|
+
}
|
|
310
|
+
return { matches, scannedFilesCount: scanned.size, truncated };
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=ripgrep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ripgrep.js","sourceRoot":"","sources":["../../src/utils/ripgrep.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/walk.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export interface WalkOptions {
|
|
|
10
10
|
excludeDirNames?: string[];
|
|
11
11
|
maxFiles?: number;
|
|
12
12
|
}
|
|
13
|
+
export declare const DEFAULT_EXCLUDE_DIR_NAMES: string[];
|
|
13
14
|
export declare function walkFiles(rootDir: string, options?: WalkOptions): string[];
|
|
14
15
|
export declare function toPosixPath(p: string): string;
|
|
15
16
|
//# sourceMappingURL=walk.d.ts.map
|
package/dist/utils/walk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../src/utils/walk.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,WAAW;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../src/utils/walk.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,WAAW;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,eAAO,MAAM,yBAAyB,UAAuB,CAAC;AAE9D,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,EAAE,CAyC9E;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C"}
|
package/dist/utils/walk.js
CHANGED
|
@@ -18,9 +18,10 @@ const DEFAULT_EXCLUDE_DIRS = [
|
|
|
18
18
|
'.cache',
|
|
19
19
|
'coverage',
|
|
20
20
|
];
|
|
21
|
+
export const DEFAULT_EXCLUDE_DIR_NAMES = DEFAULT_EXCLUDE_DIRS;
|
|
21
22
|
export function walkFiles(rootDir, options = {}) {
|
|
22
23
|
const includeExtensions = (options.includeExtensions || []).map((e) => e.toLowerCase());
|
|
23
|
-
const exclude = new Set((options.excludeDirNames ||
|
|
24
|
+
const exclude = new Set((options.excludeDirNames || DEFAULT_EXCLUDE_DIR_NAMES).map((d) => d.toLowerCase()));
|
|
24
25
|
const maxFiles = typeof options.maxFiles === 'number' ? options.maxFiles : 10_000;
|
|
25
26
|
const results = [];
|
|
26
27
|
const queue = [rootDir];
|
package/dist/utils/walk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/utils/walk.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAQlC,MAAM,oBAAoB,GAAG;IAC3B,cAAc;IACd,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;CACX,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,UAAuB,EAAE;IAClE,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/utils/walk.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAQlC,MAAM,oBAAoB,GAAG;IAC3B,cAAc;IACd,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,oBAAoB,CAAC;AAE9D,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,UAAuB,EAAE;IAClE,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,IAAI,yBAAyB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC5G,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAElF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAa,CAAC,OAAO,CAAC,CAAC;IAElC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC7B,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;gBAAE,OAAO,OAAO,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAEzC,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;oBAAE,SAAS;gBAClD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,SAAS;YACX,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;gBAAE,SAAS;YAC5B,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClB,SAAS;YACX,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gemini-designer/mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.41",
|
|
4
4
|
"description": "MCP server for AI-powered UI design and code generation with Gemini",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"@google/generative-ai": "^0.21.0",
|
|
43
43
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
44
|
+
"@vscode/ripgrep": "^1.17.0",
|
|
44
45
|
"prettier": "^3.4.0",
|
|
45
46
|
"typescript": "^5.7.0",
|
|
46
47
|
"zod": "^3.24.0"
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { extensionGlob, ripgrepJsonSearch, ripgrepListFiles } from '../utils/ripgrep.js';
|
|
6
|
+
import { isSensitiveFile } from '../context/filter.js';
|
|
7
|
+
|
|
8
|
+
function mkTmpDir(): string {
|
|
9
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), 'gd-rg-'));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
describe('ripgrepJsonSearch', () => {
|
|
13
|
+
it('finds matches with line/column and preview', async () => {
|
|
14
|
+
const dir = mkTmpDir();
|
|
15
|
+
fs.mkdirSync(path.join(dir, 'src'), { recursive: true });
|
|
16
|
+
fs.writeFileSync(path.join(dir, 'src', 'a.ts'), 'hello world\nsecond line\nhello again\n', 'utf8');
|
|
17
|
+
|
|
18
|
+
const res = await ripgrepJsonSearch({
|
|
19
|
+
cwd: dir,
|
|
20
|
+
pattern: 'hello',
|
|
21
|
+
fixedStrings: true,
|
|
22
|
+
caseSensitive: true,
|
|
23
|
+
includeHidden: true,
|
|
24
|
+
includeBinary: false,
|
|
25
|
+
maxFileBytes: 1_000_000,
|
|
26
|
+
maxResults: 50,
|
|
27
|
+
shouldIgnorePath: (abs) => isSensitiveFile(abs),
|
|
28
|
+
includePreview: true,
|
|
29
|
+
previewMaxChars: 240,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
expect(res.matches.length).toBeGreaterThanOrEqual(2);
|
|
33
|
+
expect(res.matches.every((m) => m.path === 'src/a.ts')).toBe(true);
|
|
34
|
+
expect(res.matches[0].line).toBeGreaterThanOrEqual(1);
|
|
35
|
+
expect(res.matches[0].column).toBeGreaterThanOrEqual(1);
|
|
36
|
+
expect(typeof res.matches[0].preview).toBe('string');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('filters sensitive paths via shouldIgnorePath', async () => {
|
|
40
|
+
const dir = mkTmpDir();
|
|
41
|
+
fs.mkdirSync(path.join(dir, 'api'), { recursive: true });
|
|
42
|
+
fs.writeFileSync(path.join(dir, 'api', 'secret.txt'), 'do not leak\nhello\n', 'utf8');
|
|
43
|
+
|
|
44
|
+
const res = await ripgrepJsonSearch({
|
|
45
|
+
cwd: dir,
|
|
46
|
+
pattern: 'hello',
|
|
47
|
+
fixedStrings: true,
|
|
48
|
+
caseSensitive: true,
|
|
49
|
+
includeHidden: true,
|
|
50
|
+
includeBinary: false,
|
|
51
|
+
maxFileBytes: 1_000_000,
|
|
52
|
+
maxResults: 50,
|
|
53
|
+
shouldIgnorePath: (abs) => isSensitiveFile(abs),
|
|
54
|
+
includePreview: true,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
expect(res.matches).toHaveLength(0);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('sets truncated when maxResults is hit', async () => {
|
|
61
|
+
const dir = mkTmpDir();
|
|
62
|
+
fs.writeFileSync(path.join(dir, 'a.txt'), 'x x x x x x x x x x\n', 'utf8');
|
|
63
|
+
|
|
64
|
+
const res = await ripgrepJsonSearch({
|
|
65
|
+
cwd: dir,
|
|
66
|
+
pattern: 'x',
|
|
67
|
+
fixedStrings: true,
|
|
68
|
+
caseSensitive: true,
|
|
69
|
+
includeHidden: true,
|
|
70
|
+
includeBinary: false,
|
|
71
|
+
maxFileBytes: 1_000_000,
|
|
72
|
+
maxResults: 1,
|
|
73
|
+
includePreview: true,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
expect(res.matches).toHaveLength(1);
|
|
77
|
+
expect(res.truncated).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe('ripgrepListFiles', () => {
|
|
82
|
+
it('lists files with maxDepth and globs', async () => {
|
|
83
|
+
const dir = mkTmpDir();
|
|
84
|
+
fs.mkdirSync(path.join(dir, 'a', 'b', 'c'), { recursive: true });
|
|
85
|
+
fs.writeFileSync(path.join(dir, 'root.txt'), 'x', 'utf8');
|
|
86
|
+
fs.writeFileSync(path.join(dir, 'a', 'a.tsx'), 'x', 'utf8');
|
|
87
|
+
fs.writeFileSync(path.join(dir, 'a', 'b', 'deep.tsx'), 'x', 'utf8');
|
|
88
|
+
fs.writeFileSync(path.join(dir, 'a', 'b', 'c', 'too-deep.tsx'), 'x', 'utf8');
|
|
89
|
+
|
|
90
|
+
const files = await ripgrepListFiles({
|
|
91
|
+
cwd: dir,
|
|
92
|
+
includeHidden: true,
|
|
93
|
+
noIgnore: true,
|
|
94
|
+
maxFiles: 100,
|
|
95
|
+
maxDepth: 3,
|
|
96
|
+
globs: [extensionGlob(['.tsx'])!],
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
expect(files.files).toContain('a/a.tsx');
|
|
100
|
+
expect(files.files).toContain('a/b/deep.tsx');
|
|
101
|
+
expect(files.files).not.toContain('a/b/c/too-deep.tsx');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('supports shouldIgnorePath filtering', async () => {
|
|
105
|
+
const dir = mkTmpDir();
|
|
106
|
+
fs.mkdirSync(path.join(dir, 'api'), { recursive: true });
|
|
107
|
+
fs.writeFileSync(path.join(dir, 'api', 'secret.txt'), 'x', 'utf8');
|
|
108
|
+
fs.writeFileSync(path.join(dir, 'ok.txt'), 'x', 'utf8');
|
|
109
|
+
|
|
110
|
+
const files = await ripgrepListFiles({
|
|
111
|
+
cwd: dir,
|
|
112
|
+
includeHidden: true,
|
|
113
|
+
noIgnore: true,
|
|
114
|
+
maxFiles: 100,
|
|
115
|
+
shouldIgnorePath: (abs) => isSensitiveFile(abs),
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
expect(files.files).toContain('ok.txt');
|
|
119
|
+
expect(files.files.some((p) => p.includes('api/'))).toBe(false);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('sets truncated when maxFiles is hit', async () => {
|
|
123
|
+
const dir = mkTmpDir();
|
|
124
|
+
for (let i = 0; i < 20; i++) fs.writeFileSync(path.join(dir, `f${i}.txt`), 'x', 'utf8');
|
|
125
|
+
|
|
126
|
+
const files = await ripgrepListFiles({
|
|
127
|
+
cwd: dir,
|
|
128
|
+
includeHidden: true,
|
|
129
|
+
noIgnore: true,
|
|
130
|
+
maxFiles: 1,
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
expect(files.files).toHaveLength(1);
|
|
134
|
+
expect(files.truncated).toBe(true);
|
|
135
|
+
});
|
|
136
|
+
});
|