@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.
Files changed (38) hide show
  1. package/dist/context/builder.d.ts.map +1 -1
  2. package/dist/context/builder.js +29 -28
  3. package/dist/context/builder.js.map +1 -1
  4. package/dist/output/file-bundle.d.ts +1 -1
  5. package/dist/tools/catalog-components.d.ts.map +1 -1
  6. package/dist/tools/catalog-components.js +29 -3
  7. package/dist/tools/catalog-components.js.map +1 -1
  8. package/dist/tools/detect-ui-stack.d.ts.map +1 -1
  9. package/dist/tools/detect-ui-stack.js +45 -14
  10. package/dist/tools/detect-ui-stack.js.map +1 -1
  11. package/dist/tools/repo-search.d.ts.map +1 -1
  12. package/dist/tools/repo-search.js +26 -120
  13. package/dist/tools/repo-search.js.map +1 -1
  14. package/dist/tools/repo-tree.d.ts.map +1 -1
  15. package/dist/tools/repo-tree.js +44 -19
  16. package/dist/tools/repo-tree.js.map +1 -1
  17. package/dist/utils/concurrency.d.ts +2 -0
  18. package/dist/utils/concurrency.d.ts.map +1 -0
  19. package/dist/utils/concurrency.js +16 -0
  20. package/dist/utils/concurrency.js.map +1 -0
  21. package/dist/utils/ripgrep.d.ts +45 -0
  22. package/dist/utils/ripgrep.d.ts.map +1 -0
  23. package/dist/utils/ripgrep.js +312 -0
  24. package/dist/utils/ripgrep.js.map +1 -0
  25. package/dist/utils/walk.d.ts +1 -0
  26. package/dist/utils/walk.d.ts.map +1 -1
  27. package/dist/utils/walk.js +2 -1
  28. package/dist/utils/walk.js.map +1 -1
  29. package/package.json +2 -1
  30. package/src/__tests__/ripgrep.test.ts +136 -0
  31. package/src/context/builder.ts +27 -30
  32. package/src/tools/catalog-components.ts +28 -3
  33. package/src/tools/detect-ui-stack.ts +51 -14
  34. package/src/tools/repo-search.ts +27 -121
  35. package/src/tools/repo-tree.ts +44 -17
  36. package/src/utils/concurrency.ts +21 -0
  37. package/src/utils/ripgrep.ts +360 -0
  38. 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;AAS5C,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,CA6C1F"}
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"}
@@ -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
- function scan(dir, depth = 0) {
151
- if (depth > 3)
152
- return; // Max depth
153
- try {
154
- const entries = fs.readdirSync(dir, { withFileTypes: true });
155
- for (const entry of entries) {
156
- const fullPath = path.join(dir, entry.name);
157
- // Skip node_modules, .git, etc.
158
- if (entry.isDirectory()) {
159
- if (['node_modules', '.git', 'dist', 'build', '.next', '.nuxt'].includes(entry.name)) {
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":"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"}
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;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,kEAAkE;AAClE,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,aAAa;AAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,sBAAsB;AAkBpD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAe,EACf,MAAc,EACd,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAe,EACf,MAAc,EACd,UAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEjD,wEAAwE;IACxE,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAE3C,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5F,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC;YACH,WAAW,GAAG,kBAAkB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;YAClE,IAAI,MAAM,CAAC,KAAK;gBAAE,OAAO,CAAC,KAAK,CAAC,sBAAsB,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAC;YAC1E,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,KAAK,GAAG,GAAG,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAEpD,yCAAyC;YACzC,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YAEnC,iCAAiC;YACjC,IAAI,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,YAAY,GAAG,eAAe,GAAG,eAAe,CAAC;YAEvD,uBAAuB;YACvB,IAAI,UAAU,GAAG,eAAe,EAAE,CAAC;gBACjC,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBAC/C,UAAU,GAAG,eAAe,CAAC;YAC/B,CAAC;YAED,gDAAgD;YAChD,IAAI,WAAW,GAAG,UAAU,GAAG,kBAAkB,EAAE,CAAC;gBAClD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC3D,CAAC;gBACD,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAChD,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACjI,MAAM,MAAM,GAAG,YAAY,WAAW,KAAK,GAAG,QAAQ,UAAU,YAAY,CAAC;YAC7E,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;YACvC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,WAAW,IAAI,UAAU,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,2BAA2B,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/D,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,eAAe,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;QAChE,eAAe,EAAE,WAAW;QAC5B,aAAa;QACb,YAAY;QACZ,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAe;IACtC,MAAM,QAAQ,GAA2B;QACvC,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;QACT,UAAU,EAAE,CAAC;QACb,MAAM,EAAE,CAAC;QACT,GAAG,EAAE,CAAC;KACP,CAAC;IAEF,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAE7C,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,SAAS,GAAG,EAAE,CAAC;QAEnB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAChE,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,OAAe,EAAE,QAAgB;IACtD,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC;IAE/C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;IAEpC,OAAO,GAAG,KAAK,eAAe,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,gCAAgC,GAAG,EAAE,CAAC;AACpH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB,EAAE,MAAc;IACrE,MAAM,UAAU,GAAG;QACjB,yBAAyB;QACzB,cAAc;QACd,iBAAiB;QACjB,SAAS;QACT,sBAAsB;QACtB,oBAAoB;KACrB,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjF,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAE5D,IAAI,IAAkD,CAAC;IACvD,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,gBAAgB,CAAC;YAC5B,GAAG,EAAE,SAAS;YACd,aAAa,EAAE,IAAI;YACnB,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,sFAAsF;QACtF,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,SAAS;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC;YAAE,SAAS;QACvD,IAAI,eAAe,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"}
@@ -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;AA0B5C,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAqEjF"}
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 { walkFiles, toPosixPath } from '../utils/walk.js';
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 found = walkFiles(r, { includeExtensions: extensions, maxFiles });
66
- allFiles.push(...found);
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":"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"}
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;AA4D5C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA0D7E"}
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
- function findPackageJsonRoots(rootDir, maxDepth) {
25
- const deny = new Set([
26
- 'node_modules',
27
- '.git',
28
- '.next',
29
- 'dist',
30
- 'build',
31
- 'out',
32
- 'coverage',
33
- '.turbo',
34
- '.cache',
35
- 'tmp',
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 = findPackageJsonRoots(safeRoot, 3);
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":"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"}
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;AAKpE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAkG5C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA6F3E"}
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 JavaScript RegExp source.'),
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 = new Set([
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
- let re;
60
+ const ignoredDirGlobs = DEFAULT_IGNORED_DIRS.map((d) => `!**/${d}/**`);
61
+ let res;
119
62
  try {
120
- re = regex
121
- ? new RegExp(pattern, caseSensitive ? 'g' : 'gi')
122
- : new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), caseSensitive ? 'g' : 'gi');
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: invalid pattern/regex: ${msg}` }], isError: true };
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: scannedFiles.length,
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":"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"}
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;AAgC5C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA+CxE"}
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"}
@@ -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 { walkFiles, toPosixPath } from '../utils/walk.js';
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 absFiles = walkFiles(safeRoot, { includeExtensions, excludeDirNames, maxFiles });
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
- for (const abs of absFiles) {
54
- const rel = toPosixPath(path.relative(safeRoot, abs));
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
- continue;
62
- }
63
- try {
64
- const st = fs.statSync(abs);
65
- files.push({ path: rel, sizeBytes: st.size, mtimeMs: st.mtimeMs });
66
- }
67
- catch {
68
- files.push({ path: rel });
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: absFiles.length >= maxFiles,
99
+ truncated: list.truncated,
75
100
  files,
76
101
  };
77
102
  return { content: [{ type: 'text', text: JSON.stringify(out, null, 2) }] };