mcp-vector-search 1.0.3__py3-none-any.whl → 1.1.22__py3-none-any.whl

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 (63) hide show
  1. mcp_vector_search/__init__.py +3 -3
  2. mcp_vector_search/analysis/__init__.py +48 -1
  3. mcp_vector_search/analysis/baseline/__init__.py +68 -0
  4. mcp_vector_search/analysis/baseline/comparator.py +462 -0
  5. mcp_vector_search/analysis/baseline/manager.py +621 -0
  6. mcp_vector_search/analysis/collectors/__init__.py +35 -0
  7. mcp_vector_search/analysis/collectors/cohesion.py +463 -0
  8. mcp_vector_search/analysis/collectors/coupling.py +1162 -0
  9. mcp_vector_search/analysis/collectors/halstead.py +514 -0
  10. mcp_vector_search/analysis/collectors/smells.py +325 -0
  11. mcp_vector_search/analysis/debt.py +516 -0
  12. mcp_vector_search/analysis/interpretation.py +685 -0
  13. mcp_vector_search/analysis/metrics.py +74 -1
  14. mcp_vector_search/analysis/reporters/__init__.py +3 -1
  15. mcp_vector_search/analysis/reporters/console.py +424 -0
  16. mcp_vector_search/analysis/reporters/markdown.py +480 -0
  17. mcp_vector_search/analysis/reporters/sarif.py +377 -0
  18. mcp_vector_search/analysis/storage/__init__.py +93 -0
  19. mcp_vector_search/analysis/storage/metrics_store.py +762 -0
  20. mcp_vector_search/analysis/storage/schema.py +245 -0
  21. mcp_vector_search/analysis/storage/trend_tracker.py +560 -0
  22. mcp_vector_search/analysis/trends.py +308 -0
  23. mcp_vector_search/analysis/visualizer/__init__.py +90 -0
  24. mcp_vector_search/analysis/visualizer/d3_data.py +534 -0
  25. mcp_vector_search/analysis/visualizer/exporter.py +484 -0
  26. mcp_vector_search/analysis/visualizer/html_report.py +2895 -0
  27. mcp_vector_search/analysis/visualizer/schemas.py +525 -0
  28. mcp_vector_search/cli/commands/analyze.py +665 -11
  29. mcp_vector_search/cli/commands/chat.py +193 -0
  30. mcp_vector_search/cli/commands/index.py +600 -2
  31. mcp_vector_search/cli/commands/index_background.py +467 -0
  32. mcp_vector_search/cli/commands/search.py +194 -1
  33. mcp_vector_search/cli/commands/setup.py +64 -13
  34. mcp_vector_search/cli/commands/status.py +302 -3
  35. mcp_vector_search/cli/commands/visualize/cli.py +26 -10
  36. mcp_vector_search/cli/commands/visualize/exporters/json_exporter.py +8 -4
  37. mcp_vector_search/cli/commands/visualize/graph_builder.py +167 -234
  38. mcp_vector_search/cli/commands/visualize/server.py +304 -15
  39. mcp_vector_search/cli/commands/visualize/templates/base.py +60 -6
  40. mcp_vector_search/cli/commands/visualize/templates/scripts.py +2100 -65
  41. mcp_vector_search/cli/commands/visualize/templates/styles.py +1297 -88
  42. mcp_vector_search/cli/didyoumean.py +5 -0
  43. mcp_vector_search/cli/main.py +16 -5
  44. mcp_vector_search/cli/output.py +134 -5
  45. mcp_vector_search/config/thresholds.py +89 -1
  46. mcp_vector_search/core/__init__.py +16 -0
  47. mcp_vector_search/core/database.py +39 -2
  48. mcp_vector_search/core/embeddings.py +24 -0
  49. mcp_vector_search/core/git.py +380 -0
  50. mcp_vector_search/core/indexer.py +445 -84
  51. mcp_vector_search/core/llm_client.py +9 -4
  52. mcp_vector_search/core/models.py +88 -1
  53. mcp_vector_search/core/relationships.py +473 -0
  54. mcp_vector_search/core/search.py +1 -1
  55. mcp_vector_search/mcp/server.py +795 -4
  56. mcp_vector_search/parsers/python.py +285 -5
  57. mcp_vector_search/utils/gitignore.py +0 -3
  58. {mcp_vector_search-1.0.3.dist-info → mcp_vector_search-1.1.22.dist-info}/METADATA +3 -2
  59. {mcp_vector_search-1.0.3.dist-info → mcp_vector_search-1.1.22.dist-info}/RECORD +62 -39
  60. mcp_vector_search/cli/commands/visualize.py.original +0 -2536
  61. {mcp_vector_search-1.0.3.dist-info → mcp_vector_search-1.1.22.dist-info}/WHEEL +0 -0
  62. {mcp_vector_search-1.0.3.dist-info → mcp_vector_search-1.1.22.dist-info}/entry_points.txt +0 -0
  63. {mcp_vector_search-1.0.3.dist-info → mcp_vector_search-1.1.22.dist-info}/licenses/LICENSE +0 -0
@@ -181,18 +181,148 @@ class PythonParser(BaseParser):
181
181
 
182
182
  return chunks
183
183
 
184
+ def _extract_class_skeleton(self, node, lines: list[str], file_path: Path) -> str:
185
+ """Extract class skeleton with method signatures only (no method bodies).
186
+
187
+ This reduces redundancy since method chunks contain full implementations.
188
+ """
189
+ skeleton_lines = []
190
+
191
+ # Find the class body block
192
+ class_block = None
193
+ for child in node.children:
194
+ if child.type == "block":
195
+ class_block = child
196
+ break
197
+
198
+ if not class_block:
199
+ # No block found, return full class content
200
+ start_line = node.start_point[0] + 1
201
+ end_line = node.end_point[0] + 1
202
+ return self._get_line_range(lines, start_line, end_line)
203
+
204
+ # Add class definition line(s) and decorators (everything before the block)
205
+ # but NOT the block's opening line (to avoid duplicating the docstring)
206
+ class_start = node.start_point[0]
207
+ block_start = class_block.start_point[0]
208
+
209
+ for line_idx in range(class_start, block_start):
210
+ if line_idx < len(lines):
211
+ line = lines[line_idx].rstrip()
212
+ # Add the line, ensuring we get the colon on the class definition
213
+ skeleton_lines.append(line)
214
+
215
+ # Add the colon line if it wasn't already added
216
+ if skeleton_lines and not skeleton_lines[-1].rstrip().endswith(":"):
217
+ # The class definition might span multiple lines
218
+ # Find and add up to the colon
219
+ for line_idx in range(class_start, block_start + 1):
220
+ if line_idx < len(lines):
221
+ line = lines[line_idx].rstrip()
222
+ if line not in [s.rstrip() for s in skeleton_lines]:
223
+ skeleton_lines.append(line)
224
+ if line.endswith(":"):
225
+ break
226
+
227
+ # Process class body - add class variables and method signatures
228
+ indent = " " # Standard Python indent
229
+ docstring_added = False
230
+
231
+ for stmt in class_block.children:
232
+ if stmt.type == "expression_statement":
233
+ # Check if it's a docstring (first statement after class def)
234
+ for expr_child in stmt.children:
235
+ if expr_child.type == "string":
236
+ # Add docstring only once
237
+ if not docstring_added:
238
+ doc_start = stmt.start_point[0]
239
+ doc_end = stmt.end_point[0]
240
+ for line_idx in range(doc_start, doc_end + 1):
241
+ if line_idx < len(lines):
242
+ skeleton_lines.append(lines[line_idx].rstrip())
243
+ docstring_added = True
244
+ break
245
+ else:
246
+ # Not a docstring - could be a class variable assignment
247
+ # Add it to the skeleton
248
+ stmt_start = stmt.start_point[0]
249
+ stmt_end = stmt.end_point[0]
250
+ for line_idx in range(stmt_start, stmt_end + 1):
251
+ if line_idx < len(lines):
252
+ skeleton_lines.append(lines[line_idx].rstrip())
253
+
254
+ elif stmt.type in ("assignment", "annotated_assignment"):
255
+ # Class variable - add it
256
+ stmt_start = stmt.start_point[0]
257
+ stmt_end = stmt.end_point[0]
258
+ for line_idx in range(stmt_start, stmt_end + 1):
259
+ if line_idx < len(lines):
260
+ skeleton_lines.append(lines[line_idx].rstrip())
261
+
262
+ elif stmt.type == "function_definition":
263
+ # Method - add only the signature (no body)
264
+ _ = self._get_node_name(stmt) # Not used, but validates method
265
+
266
+ # Add decorators
267
+ for deco_child in stmt.children:
268
+ if deco_child.type == "decorator":
269
+ deco_line = deco_child.start_point[0]
270
+ if deco_line < len(lines):
271
+ skeleton_lines.append(lines[deco_line].rstrip())
272
+
273
+ # Add the def line (with parameters and return type)
274
+ def_line_start = stmt.start_point[0]
275
+
276
+ # Find where the actual body starts (after the colon)
277
+ # We want everything up to and including the colon
278
+ for child in stmt.children:
279
+ if child.type == "block":
280
+ # The block starts after the colon
281
+ # Get lines up to the colon
282
+ block_line = child.start_point[0]
283
+ for line_idx in range(def_line_start, block_line + 1):
284
+ if line_idx < len(lines):
285
+ line = lines[line_idx].rstrip()
286
+ skeleton_lines.append(line)
287
+ # Stop if we've added the colon line
288
+ if ":" in line:
289
+ break
290
+
291
+ # Check if there's a docstring in the method
292
+ for block_child in child.children:
293
+ if block_child.type == "expression_statement":
294
+ for expr_child in block_child.children:
295
+ if expr_child.type == "string":
296
+ # Add method docstring
297
+ doc_start = block_child.start_point[0]
298
+ doc_end = block_child.end_point[0]
299
+ for line_idx in range(doc_start, doc_end + 1):
300
+ if line_idx < len(lines):
301
+ skeleton_lines.append(
302
+ lines[line_idx].rstrip()
303
+ )
304
+ break
305
+ break
306
+
307
+ # Add placeholder for method body
308
+ skeleton_lines.append(f"{indent}{indent}...")
309
+ skeleton_lines.append("") # Blank line between methods
310
+ break
311
+
312
+ return "\n".join(skeleton_lines)
313
+
184
314
  def _extract_class(
185
315
  self, node, lines: list[str], file_path: Path
186
316
  ) -> list[CodeChunk]:
187
- """Extract class definition as a chunk."""
317
+ """Extract class definition as a chunk (skeleton only, no method bodies)."""
188
318
  chunks = []
189
319
 
190
320
  class_name = self._get_node_name(node)
191
321
  start_line = node.start_point[0] + 1
192
322
  end_line = node.end_point[0] + 1
193
323
 
194
- # Get class content
195
- content = self._get_line_range(lines, start_line, end_line)
324
+ # Get class skeleton (without method bodies)
325
+ content = self._extract_class_skeleton(node, lines, file_path)
196
326
 
197
327
  # Extract docstring if present
198
328
  docstring = self._extract_docstring(node, lines)
@@ -339,11 +469,16 @@ class PythonParser(BaseParser):
339
469
  class_content = self._get_line_range(lines, start_line, end_line)
340
470
 
341
471
  if class_content.strip(): # Only add if content is not empty
472
+ # Extract class skeleton (method signatures only)
473
+ skeleton_content = self._extract_class_skeleton_regex(
474
+ class_content, start_line, lines
475
+ )
476
+
342
477
  # Extract class docstring
343
- docstring = self._extract_docstring_regex(class_content)
478
+ docstring = self._extract_docstring_regex(skeleton_content)
344
479
 
345
480
  chunk = self._create_chunk(
346
- content=class_content,
481
+ content=skeleton_content,
347
482
  file_path=file_path,
348
483
  start_line=start_line,
349
484
  end_line=end_line,
@@ -397,6 +532,151 @@ class PythonParser(BaseParser):
397
532
  """Find the end line of a class using indentation."""
398
533
  return self._find_function_end(lines, start_line)
399
534
 
535
+ def _extract_class_skeleton_regex(
536
+ self, class_content: str, start_line: int, all_lines: list[str]
537
+ ) -> str:
538
+ """Extract class skeleton using regex (fallback when tree-sitter unavailable).
539
+
540
+ Returns class with method signatures only, no method bodies.
541
+ """
542
+ lines = class_content.splitlines()
543
+ skeleton_lines = []
544
+ i = 0
545
+
546
+ # Get class definition line(s)
547
+ while i < len(lines):
548
+ line = lines[i]
549
+ skeleton_lines.append(line)
550
+ # Stop at the colon that ends the class definition
551
+ if line.rstrip().endswith(":"):
552
+ i += 1
553
+ break
554
+ i += 1
555
+
556
+ # Track indentation level
557
+ class_indent = None
558
+ if skeleton_lines:
559
+ first_line = skeleton_lines[0]
560
+ class_indent = len(first_line) - len(first_line.lstrip())
561
+
562
+ # Process class body
563
+ in_method = False
564
+ method_indent = None
565
+
566
+ while i < len(lines):
567
+ line = lines[i]
568
+ stripped = line.strip()
569
+
570
+ if not stripped:
571
+ # Keep blank lines if not in a method body
572
+ if not in_method:
573
+ skeleton_lines.append(line)
574
+ i += 1
575
+ continue
576
+
577
+ # Calculate indentation
578
+ current_indent = len(line) - len(line.lstrip())
579
+
580
+ # Check if we're back at class level or beyond
581
+ if class_indent is not None and current_indent <= class_indent and stripped:
582
+ # End of class
583
+ break
584
+
585
+ # Check if this is a method definition
586
+ if re.match(r"^\s*(async\s+)?def\s+\w+", line):
587
+ in_method = True
588
+ method_indent = current_indent
589
+
590
+ # Add any decorators before this method
591
+ # (look backwards for @ lines)
592
+ j = i - 1
593
+ decorator_lines = []
594
+ while j >= 0:
595
+ prev_line = lines[j]
596
+ if prev_line.strip().startswith("@"):
597
+ decorator_lines.insert(0, prev_line)
598
+ j -= 1
599
+ elif prev_line.strip():
600
+ break
601
+ else:
602
+ j -= 1
603
+
604
+ # Remove decorators if we already added them
605
+ if decorator_lines:
606
+ # Check if they're not already in skeleton_lines
607
+ for dec in decorator_lines:
608
+ if dec not in skeleton_lines[-len(decorator_lines) :]:
609
+ skeleton_lines.append(dec)
610
+
611
+ # Add method signature line
612
+ skeleton_lines.append(line)
613
+
614
+ # Check if there's a docstring on next lines
615
+ j = i + 1
616
+ while j < len(lines):
617
+ next_line = lines[j]
618
+ next_stripped = next_line.strip()
619
+
620
+ if not next_stripped:
621
+ j += 1
622
+ continue
623
+
624
+ # Check for docstring
625
+ if next_stripped.startswith('"""') or next_stripped.startswith(
626
+ "'''"
627
+ ):
628
+ quote_type = next_stripped[:3]
629
+ # Add docstring
630
+ skeleton_lines.append(next_line)
631
+ if not (
632
+ next_stripped.endswith(quote_type)
633
+ and len(next_stripped) > 6
634
+ ):
635
+ # Multi-line docstring
636
+ j += 1
637
+ while j < len(lines):
638
+ doc_line = lines[j]
639
+ skeleton_lines.append(doc_line)
640
+ if doc_line.strip().endswith(quote_type):
641
+ j += 1
642
+ break
643
+ j += 1
644
+ else:
645
+ j += 1
646
+ break
647
+ else:
648
+ break
649
+
650
+ # Add placeholder for method body
651
+ if method_indent is not None:
652
+ skeleton_lines.append(" " * (method_indent + 4) + "...")
653
+ else:
654
+ skeleton_lines.append(" ...")
655
+
656
+ i += 1
657
+ continue
658
+
659
+ # Check if we're still in a method
660
+ if in_method:
661
+ if method_indent is not None and current_indent <= method_indent:
662
+ # End of method
663
+ in_method = False
664
+ # Don't skip this line, process it in next iteration
665
+ continue
666
+ else:
667
+ # Inside method body - skip it
668
+ i += 1
669
+ continue
670
+
671
+ # Class-level statement (not a method)
672
+ # This could be a class variable, docstring, etc.
673
+ if current_indent > (class_indent or 0):
674
+ skeleton_lines.append(line)
675
+
676
+ i += 1
677
+
678
+ return "\n".join(skeleton_lines)
679
+
400
680
  def _extract_docstring_regex(self, content: str) -> str | None:
401
681
  """Extract docstring using regex patterns."""
402
682
  # Look for triple-quoted strings at the beginning of the content
@@ -65,9 +65,6 @@ class GitignorePattern:
65
65
  parent = "/".join(path_parts[:i])
66
66
  if fnmatch.fnmatch(parent, pattern):
67
67
  return True
68
- # If no parent matches and this is not a directory, don't exclude
69
- if not is_directory:
70
- return False
71
68
 
72
69
  # Try exact match first
73
70
  if fnmatch.fnmatch(path, pattern):
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-vector-search
3
- Version: 1.0.3
3
+ Version: 1.1.22
4
4
  Summary: CLI-first semantic code search with MCP integration and interactive D3.js visualization for exploring code relationships
5
5
  Project-URL: Homepage, https://github.com/bobmatnyc/mcp-vector-search
6
6
  Project-URL: Documentation, https://mcp-vector-search.readthedocs.io
7
7
  Project-URL: Repository, https://github.com/bobmatnyc/mcp-vector-search
8
8
  Project-URL: Bug Tracker, https://github.com/bobmatnyc/mcp-vector-search/issues
9
- Author-email: Robert Matsuoka <bobmatnyc@gmail.com>
9
+ Author-email: Robert Matsuoka <bob@matsuoka.com>
10
10
  License: MIT License
11
11
 
12
12
  Copyright (c) 2024 Robert Matsuoka
@@ -48,6 +48,7 @@ Requires-Dist: fastapi>=0.104.0
48
48
  Requires-Dist: httpx>=0.25.0
49
49
  Requires-Dist: loguru>=0.7.0
50
50
  Requires-Dist: mcp>=1.12.4
51
+ Requires-Dist: orjson>=3.9.0
51
52
  Requires-Dist: packaging>=23.0
52
53
  Requires-Dist: py-mcp-installer>=0.1.4
53
54
  Requires-Dist: pydantic-settings>=2.1.0
@@ -1,97 +1,120 @@
1
- mcp_vector_search/__init__.py,sha256=GaPg51gwGr2wWy4xng5lWqBKZY_Rn0DMmEZ7LvLBz2w,299
1
+ mcp_vector_search/__init__.py,sha256=3nT9AQqf8V1olpwMiiuXywwi-Jd8XpufJ05WeLLe5gM,298
2
2
  mcp_vector_search/py.typed,sha256=lCKeV9Qcn9sGtbRsgg-LJO2ZwWRuknnnlmomq3bJFH0,43
3
- mcp_vector_search/analysis/__init__.py,sha256=cdCheFL4eL50J2EkDD6Z6zObujwnYXNShFbP-G05MWo,1861
4
- mcp_vector_search/analysis/metrics.py,sha256=0XR4g3vVpRba8GJLXtfpypxYKY5n2Ipi5ACfQu2reIA,11904
5
- mcp_vector_search/analysis/collectors/__init__.py,sha256=Ot6Paw3fDDvbXNdlevtuIThed_1S8iGK1gjJVp3XVSc,1041
3
+ mcp_vector_search/analysis/__init__.py,sha256=_j6MByWydA1yQqvkRhIRdxCyMfOkOx4hqDi56eUrKis,3153
4
+ mcp_vector_search/analysis/debt.py,sha256=MWSLI8iuhn3KKif8nA4YdGC2wd-zlXfIdDxTljBhbHM,18549
5
+ mcp_vector_search/analysis/interpretation.py,sha256=jvHzDki2jhIvn-J-qoWDnEL-fgxdh7CpZ63lHcp_qcU,23832
6
+ mcp_vector_search/analysis/metrics.py,sha256=PKBRiNPYzZ5yScek6LagIJ--8NbGi3S6B3NHcmg_y7o,14685
7
+ mcp_vector_search/analysis/trends.py,sha256=LGHvjVtq9j_vYxj4vWB__29wLas2fp5w61rSmRVQnBw,9844
8
+ mcp_vector_search/analysis/baseline/__init__.py,sha256=Bx-891xELSopNTN_BrS7e2kXxwBLCqAG-VvDs9sHgDM,2422
9
+ mcp_vector_search/analysis/baseline/comparator.py,sha256=U0v__4PtMXVqjVFRzYgsMJwGIuqt29OMCZd8KP7QeS0,16034
10
+ mcp_vector_search/analysis/baseline/manager.py,sha256=z6124QaCcq67z6J0q5__LaMK3Ri4Z5rK49nIQmEQzeE,21470
11
+ mcp_vector_search/analysis/collectors/__init__.py,sha256=ZtxmyI4TevGsOu01ri_QnlW6Dhm_9RF2UBaJw76erl4,1896
6
12
  mcp_vector_search/analysis/collectors/base.py,sha256=Eda8z8rmgFqMlmXl-cfgilG_YElV0vqlRb56YK7bJeI,5465
13
+ mcp_vector_search/analysis/collectors/cohesion.py,sha256=jynjJWjRw2ADW8LMYpenuvkU5puqfdZAzxEheNyib20,15069
7
14
  mcp_vector_search/analysis/collectors/complexity.py,sha256=sEPy9v91KtOERc46jN7hGFoyj_5KrZxYVG63qS9ue20,25332
8
- mcp_vector_search/analysis/reporters/__init__.py,sha256=EOZymd-DqqdQ4mY4i_Hg9A_ryZ225htzID6-wUBs7Bo,137
9
- mcp_vector_search/analysis/reporters/console.py,sha256=zqrK7A4Q3Zf84B7wYaBefsvTE6tDTY5_JVv02ObpNPY,7899
15
+ mcp_vector_search/analysis/collectors/coupling.py,sha256=PuKEQcUVg5MpvZrM-MmQkcgnUOhYaya0R8S_yQyFHO4,38955
16
+ mcp_vector_search/analysis/collectors/halstead.py,sha256=9Sk33ftAtirHzwi6AKaG6CxXqkfchljJksX-Ds21mbA,14207
17
+ mcp_vector_search/analysis/collectors/smells.py,sha256=OEhB_Ub5viU_kbOm3rVuIFQDDHH2UULkHJXndl1zXjg,12092
18
+ mcp_vector_search/analysis/reporters/__init__.py,sha256=T4tsBIzljXweZr7M_IGfayrcoooKOwz5hgDLwKwUlxE,246
19
+ mcp_vector_search/analysis/reporters/console.py,sha256=4yiHGmP9eKvMZ9_NszSo8N-T-22e2U2IzNT48YaLxR0,24627
20
+ mcp_vector_search/analysis/reporters/markdown.py,sha256=lR9rd-oU9OKg7M5WWWMXECecLUgEJT1TeKVB86DSxec,17721
21
+ mcp_vector_search/analysis/reporters/sarif.py,sha256=A3ic5CPid-jHDvjFDA3P1_ZUBK4oKdDo-ByFIJ-2KlE,14101
22
+ mcp_vector_search/analysis/storage/__init__.py,sha256=pbuSH9Ayw_BSUqbhPM1ciyAr6aXKJiMwt7YYBBz7L3A,2790
23
+ mcp_vector_search/analysis/storage/metrics_store.py,sha256=21RhgVH1hSOhpcepPXAnX-jrIoNPn8IRuGfJLAN_HAc,26380
24
+ mcp_vector_search/analysis/storage/schema.py,sha256=tQy6uBnmKDPm07Mp8X5ybilevazjaHQXmnRzwkQWPX4,8419
25
+ mcp_vector_search/analysis/storage/trend_tracker.py,sha256=3jHvgEsADUPqzMGhHb2_Ss16VndnRzP4Ia4kz7EQ9YU,21156
26
+ mcp_vector_search/analysis/visualizer/__init__.py,sha256=NxiawNHoZFGUodmstnFY8JL4mm1DpgM47mjHA3sZDo8,2367
27
+ mcp_vector_search/analysis/visualizer/d3_data.py,sha256=sjnz5GE--4nligwoKALZpodsjmsiJYYkM8e5sSTHa4A,16579
28
+ mcp_vector_search/analysis/visualizer/exporter.py,sha256=ZQDynTkyMdLMp2jWjZJ1Jk0BkWqGLwmaP7f597GqAPA,16901
29
+ mcp_vector_search/analysis/visualizer/html_report.py,sha256=FxIoJ8sJkh6Qh1n6EPLw7NTLyzDRbTPFh8ZwmzLTrZQ,92041
30
+ mcp_vector_search/analysis/visualizer/schemas.py,sha256=WhCwQCyD-t5Qan7Iz10WNj2smH6IW7RwbG7EgcdiE3A,20388
10
31
  mcp_vector_search/cli/__init__.py,sha256=TNB7CaOASz8u3yHWLbNmo8-GtHF0qwUjVKWAuNphKgo,40
11
- mcp_vector_search/cli/didyoumean.py,sha256=wEpiFbieH-aBsfEtFW7gtRsTBP17zC2xRzDpKGrD7Kg,16921
32
+ mcp_vector_search/cli/didyoumean.py,sha256=y6jJOPQQoLJ__mRPNoVXB5mRDij3fMsy8hDxF-M7lG8,17139
12
33
  mcp_vector_search/cli/export.py,sha256=iluxuRT2KELdKlQeDAlVkteiel4GGrng153UAw9H0as,10804
13
34
  mcp_vector_search/cli/history.py,sha256=6wRrSfxpUe9hJXuaEeVxOVkFlcpqkIiGfwzDgd5N6c8,9323
14
35
  mcp_vector_search/cli/interactive.py,sha256=T7P4dAdvbglznzQYgiePv5YNyOx9FeE57Y3OKYnnbYE,12744
15
- mcp_vector_search/cli/main.py,sha256=D30OqWeYEvJOLcRJaBmLp3ajRXQ-Gvqhk-VP9bLSbb0,15741
16
- mcp_vector_search/cli/output.py,sha256=0U6tV8CLAmX8IkTe9mUGGEsniFGmHR2v25iJ3SW_wNA,13235
36
+ mcp_vector_search/cli/main.py,sha256=z7CX_fz8SSeglt7EY5lPaXL_zYBq3CTknVC0S9XaaJo,16317
37
+ mcp_vector_search/cli/output.py,sha256=vaWTIjd3SZuO5AbyfS2nnrHTOP17wWcgbg_v1oOTpOM,18196
17
38
  mcp_vector_search/cli/suggestions.py,sha256=h-UaxoLcHmFbhZSm0WG7nKJXAIRIqhv7aGsXijp7vA8,13273
18
39
  mcp_vector_search/cli/commands/__init__.py,sha256=vQls-YKZ54YEwmf7g1dL0T2SS9D4pdQljXzsUChG_V4,42
19
- mcp_vector_search/cli/commands/analyze.py,sha256=4eItZ9U52iN3L1RriVfc-BumKIqqucDkhSZULw7RGA4,12698
40
+ mcp_vector_search/cli/commands/analyze.py,sha256=SiDVxn_m1AslGy4xhQI_a6gvOgDY6GSRhdQEEF7LPdM,39181
20
41
  mcp_vector_search/cli/commands/auto_index.py,sha256=imVVbxWRlA128NPdK9BetNNl3ELrsdq-hqcsLqyAmoM,12712
21
- mcp_vector_search/cli/commands/chat.py,sha256=jgcCsrh1dHd7HVczjd-jDc9WCbMA30P8d6q2SnaImlI,44042
42
+ mcp_vector_search/cli/commands/chat.py,sha256=so6sqtSbco15XjA5iPD7RLn_N7McGV426g7mHfp0U6A,51657
22
43
  mcp_vector_search/cli/commands/config.py,sha256=y2rCX6108cJj8osISeroGRukkyWZdoSz0Hhdz8ehK4E,12862
23
44
  mcp_vector_search/cli/commands/demo.py,sha256=MVfEkYmA2abRFwAbk-lpa6P14_SLJBHZAuHb9d6d02U,10630
24
- mcp_vector_search/cli/commands/index.py,sha256=e5o6C4QfAxP5KZX9ujqGViyVyjUCNfTWousIVSjsJbw,25001
45
+ mcp_vector_search/cli/commands/index.py,sha256=eoFAOWZHSnukZcWhrETSF2CYWvsBjwwsRjYkuDtNeLw,44709
46
+ mcp_vector_search/cli/commands/index_background.py,sha256=8gEPO7kFRaGZ7try47nVq040M-qxgc3TEZKaftheu54,16612
25
47
  mcp_vector_search/cli/commands/init.py,sha256=VLGX1BXy9U0aFOjUR5Ao_nsRGIA6t5hGvM6zHvTLjtY,23809
26
48
  mcp_vector_search/cli/commands/install.py,sha256=dd0LqL-yE6ZIxJ0HIwwZ7nGto_43jhYKbnLbt-IOgHc,32535
27
49
  mcp_vector_search/cli/commands/install_old.py,sha256=K3Yo8L2Bti6EYaRvojz5Y-RdT4ABlN9-4--EKOs1YxI,24669
28
50
  mcp_vector_search/cli/commands/mcp.py,sha256=mAC-8pP0PQxnmUuhStndgZBS444JmjunFHhhRlUwLMc,41240
29
51
  mcp_vector_search/cli/commands/reset.py,sha256=Ab0u6G1g_cvSJ4mltVrUPooKJbRqEa4uX57-CNa9IZM,15229
30
- mcp_vector_search/cli/commands/search.py,sha256=GH2BAMknFZ5SO5KwcBRMW_PbxkYb1pSxUbSITr4P-Vw,25927
31
- mcp_vector_search/cli/commands/setup.py,sha256=ENiaE25bPafwIw1hSmob79nv4eIumoQNsxO41gn2Gfs,40546
32
- mcp_vector_search/cli/commands/status.py,sha256=vSk1X7vOwKmhrPaMOSiZ-EIf62WXAKy7LQV4K82m_nU,21235
52
+ mcp_vector_search/cli/commands/search.py,sha256=8wotCWJxW7Dram2p1KmGxnxUxWbv-WvKJvlAaNe1MmM,33502
53
+ mcp_vector_search/cli/commands/setup.py,sha256=Ct_MncdazryamK-Gef2UT-Qs1HZgiPnXeO9epNdEisk,42568
54
+ mcp_vector_search/cli/commands/status.py,sha256=v8oLt_iwgpaUakHbRqz0hklx7M1RkxO0b1AX5AdQFU0,30867
33
55
  mcp_vector_search/cli/commands/uninstall.py,sha256=SjfViJYm0N4N955Ya3xGdu7eFfK7CWuJcw0AwZqwpRQ,13265
34
- mcp_vector_search/cli/commands/visualize.py.original,sha256=oq_yG1UqwqSxUTWzUp5hBJIvoQleA-GCaPGAMroUAtM,99016
35
56
  mcp_vector_search/cli/commands/watch.py,sha256=bwR9Xaa7TaLMCcwRDA3WzbsInI2UYCp0eVg3TnCiyaQ,8902
36
57
  mcp_vector_search/cli/commands/visualize/__init__.py,sha256=eh2s2nQwptY__dy5P5oX4HznrGzLHI2wvk0WJrRyzgI,1107
37
- mcp_vector_search/cli/commands/visualize/cli.py,sha256=piXTkGizEDyyQ2zm5HKP0gtT6hXIn-y8ibkNBzn8Kfw,9217
38
- mcp_vector_search/cli/commands/visualize/graph_builder.py,sha256=kZnXq7usBE3wCHsYOj-W-eZ1djWSablj8LlIdFVADW8,26152
58
+ mcp_vector_search/cli/commands/visualize/cli.py,sha256=m_a6EYdMB0N8lG3kG7uyAZehkXh-ZGfN8t-7DbX96QE,9953
59
+ mcp_vector_search/cli/commands/visualize/graph_builder.py,sha256=_dUUHz7TzVmTa9xyLFsUkGocsEca4i5lxVIWi8vTlY8,23011
39
60
  mcp_vector_search/cli/commands/visualize/layout_engine.py,sha256=jTQnZNI42DrJfiLr1MXC3Dq0eMgInz0U1xOLBa4maWA,15973
40
- mcp_vector_search/cli/commands/visualize/server.py,sha256=yOucZ_gZUSVb5jJn-qfZ9RAvpp3otdnpmq7Bfg_ugoY,10413
61
+ mcp_vector_search/cli/commands/visualize/server.py,sha256=L9fgvTp-_oZh_k3QCP3lU_eryCXFahClkiLpXMaShwI,21745
41
62
  mcp_vector_search/cli/commands/visualize/state_manager.py,sha256=f91cmdXigh0f8POdGYfBpeUfN0aRsdRRZwNxaZAr3y4,15069
42
63
  mcp_vector_search/cli/commands/visualize/exporters/__init__.py,sha256=0bFmy9SRV7xlYZRtRY_VyYcoxR-0a94N9Qspd47xXFc,278
43
64
  mcp_vector_search/cli/commands/visualize/exporters/html_exporter.py,sha256=wa4TufaTCGqFJFghXds1wXXLbgEF3vdAzfJbKfRFCBA,799
44
- mcp_vector_search/cli/commands/visualize/exporters/json_exporter.py,sha256=jmjFe64It860loSk_wPezFHJxq6v_aQsSwhDUHVt-LA,773
65
+ mcp_vector_search/cli/commands/visualize/exporters/json_exporter.py,sha256=Dr7yoz_mMndNu6RCiFLO_hJ7lgssAZYlQkV_nGb3vx8,1040
45
66
  mcp_vector_search/cli/commands/visualize/templates/__init__.py,sha256=yZqjGO77JlcMVdbnO0t5Sli84Mp5xfJPw9SS_4JcO_8,389
46
- mcp_vector_search/cli/commands/visualize/templates/base.py,sha256=LQWF4VKKwd-TWhhBNvoae53JpNJXU9haDvgTmqfqiz4,7367
47
- mcp_vector_search/cli/commands/visualize/templates/scripts.py,sha256=sx6mNpDclb4WM1XQyAI3ChsVFlkMVMMQjcNb-vvq344,97338
48
- mcp_vector_search/cli/commands/visualize/templates/styles.py,sha256=2FVPBubWzGIJqu1m-_7S0IojGe48jLQU_s88xaeMEfk,32999
67
+ mcp_vector_search/cli/commands/visualize/templates/base.py,sha256=wRnbOoe8mEFHBKBSVSU-AA_lnWwFwSGDBClJUPIZrwo,10056
68
+ mcp_vector_search/cli/commands/visualize/templates/scripts.py,sha256=M22BRCu1l4j9ezpTml_l8YCp25Y-Vqum3PUe6KU5vH8,170731
69
+ mcp_vector_search/cli/commands/visualize/templates/styles.py,sha256=AVw_xpaD6C-sEWcuLPqXmq5s3wEKD_DtR6coDaydwUo,65623
49
70
  mcp_vector_search/config/__init__.py,sha256=GWmUIAIf2yVmUSqPqzTA47mlMeWCXmYwmyECSa8Lq14,208
50
71
  mcp_vector_search/config/constants.py,sha256=afXR6SvLLd8QYY4MG4s1vq-hCJiQsE5PhnE-XG9lvb4,1092
51
72
  mcp_vector_search/config/default_thresholds.yaml,sha256=sF9BVm1JvooqBS_MaL2HMxSqpJYqjwDqXjQAedxKx-M,1439
52
73
  mcp_vector_search/config/defaults.py,sha256=SkPWFpU6BIYbGjyW9WtZ-tsBy9KSGZKkti-EJc2O-8E,5325
53
74
  mcp_vector_search/config/settings.py,sha256=D1KMwpBOc-lbuUDy4Q-dvPHp63YAHGqAWipiCVb4xMA,5112
54
- mcp_vector_search/config/thresholds.py,sha256=HKpOlfHbtGu6F2k7TVGE5JwEcs_FmWCdb1vhMtk3InY,5959
55
- mcp_vector_search/core/__init__.py,sha256=bWKtKmmaFs7gG5XPCbrx77UYIVeO1FF8wIJxpj1dLNw,48
75
+ mcp_vector_search/config/thresholds.py,sha256=A78use0Kk5InNhptrQuFO-7BrHf-gMZaIWPtcYeyDB8,9320
76
+ mcp_vector_search/core/__init__.py,sha256=JZU12AYO1OJsaqPm6E8qnOJXaRZhgYFVQAQW_V38GBw,317
56
77
  mcp_vector_search/core/auto_indexer.py,sha256=E6_6gOcczG6AIpm9TwpZv_rUR4Eif_zIkhEvD5VFm4Y,10315
57
78
  mcp_vector_search/core/boilerplate.py,sha256=kyA1Cf79aXgCGWPaxeqoE6cKI1m7-Q4ousmZBMvOTW8,5395
58
79
  mcp_vector_search/core/config_utils.py,sha256=qWUvv-a7MNiSQvPqt6WMfeZQv_agsaLIyVVVWZCNbpQ,12056
59
80
  mcp_vector_search/core/connection_pool.py,sha256=Ls6zenjS6lGNiQvaPtpVEB4g7J-Yt2b_bM89FiS_io4,12668
60
- mcp_vector_search/core/database.py,sha256=X6wXHSm4pNWCUTnWygCZJWcJ2-vtDM8a9TYmk94hRFs,59125
81
+ mcp_vector_search/core/database.py,sha256=Aoi7LUvwArRNz1MtDg4v9f26bqTSYY3SPr_PGVNB9pE,61220
61
82
  mcp_vector_search/core/directory_index.py,sha256=kCHyltX0b3ZgAm21BSBU_NI_DlyIJ9xq7TrnkFmCmb4,11207
62
- mcp_vector_search/core/embeddings.py,sha256=wSMUNxZcuGPMxxQ1AbKqA1a3-0c6AiOqmuuI7OqTyaQ,10578
83
+ mcp_vector_search/core/embeddings.py,sha256=ooTEF8GtI9zi_g3bFjFY3fBOiyBlU24d8hqbPN7YWPE,11498
63
84
  mcp_vector_search/core/exceptions.py,sha256=1PSbuJcsZXupSYbC7piG8zmHzqAeJstvZVTelxONK2k,1891
64
85
  mcp_vector_search/core/factory.py,sha256=0ZfjBUq2XvnU2lhFdNzAk1r25f7V0Y28qDmvD0jTjj8,10359
86
+ mcp_vector_search/core/git.py,sha256=_JU4w7VinlAQfIkb6MP20__iwGr7ceEEjCf9HemN8tQ,12821
65
87
  mcp_vector_search/core/git_hooks.py,sha256=BUfTU1hky6zdDgtofa1djFwa7g-S1_bxekO4OvPaY8s,10906
66
- mcp_vector_search/core/indexer.py,sha256=kpw9BzuOGSzbSJW9eyUIw5SR2tNLaJTNJFvksTo-FgE,45312
67
- mcp_vector_search/core/llm_client.py,sha256=ImhKlK8DFef7LmtU_ikaaO9ota1GBlhQYSEG8zfbsXc,26864
68
- mcp_vector_search/core/models.py,sha256=svIZ_le_9MZfOgpSPxiP2-VGxrT-0rSnobeckDuPgWE,11737
88
+ mcp_vector_search/core/indexer.py,sha256=7mbMsUymZ92LbscxOpQzQO3tE24m3gmHztAV7cs_siI,61109
89
+ mcp_vector_search/core/llm_client.py,sha256=5m7B19XLkjXb-DwwDKmTXmJ0AOJ2Py_ZfDVHnOhMTfU,27245
90
+ mcp_vector_search/core/models.py,sha256=tkieEDcDLOn37FIAACSfGc2cHJQw8StZZ69aEJ4zk1U,15066
69
91
  mcp_vector_search/core/project.py,sha256=87Cgxm8P3Q2ocqJDJwgJaqrdbzj-6LvM5pKQJTvXfqk,11601
92
+ mcp_vector_search/core/relationships.py,sha256=5bS9Is7-7tn8cCp8jYeZ7MTY9YWB96P-2ICCqZJWAVw,16522
70
93
  mcp_vector_search/core/scheduler.py,sha256=msDatz1nFJLg4An99TX6yfWEHtXtl0FiWE1m-RBWTYY,11859
71
- mcp_vector_search/core/search.py,sha256=kxdH038EUAnTs_IvKxXnnk2muRUxmW-N6MvzycaexWA,39236
94
+ mcp_vector_search/core/search.py,sha256=MiWlMWMAB4o_S52o3Sudrsa2b_Iyec0UEWOxmJYDCnE,39236
72
95
  mcp_vector_search/core/watcher.py,sha256=-DFRCnuUfcqcTrkZPQqfJSvxKAxnpt-axgEj1V-B0O4,10862
73
96
  mcp_vector_search/mcp/__init__.py,sha256=gfKR0QV7Jqvj5y0LMBe9gSghd5_rPsvm_rml0ryQtoY,158
74
97
  mcp_vector_search/mcp/__main__.py,sha256=KgwB59HM5pRLe2Aj-fvDFcTp95lyT0wfmS3ENcx9gPc,571
75
- mcp_vector_search/mcp/server.py,sha256=R4cRvakhG8UhS-qPXJl97MT5cUOFZw0rPkr-EKPvNTY,29194
98
+ mcp_vector_search/mcp/server.py,sha256=Pozv2E0Fcx-epcht5BkMvo5zCWyhU0hU5KFbaWDE-t8,62377
76
99
  mcp_vector_search/parsers/__init__.py,sha256=jr0Yqz1xMok4lnG7_aXnkZThGuefrlAj8PWVbfeT3QQ,228
77
100
  mcp_vector_search/parsers/base.py,sha256=dtezuhVgs9dAWlRYT23GGONyckWzTqkEj7Vcwor8C1k,9341
78
101
  mcp_vector_search/parsers/dart.py,sha256=li2JP0vwpSsZnMNq0PweZCD_o-y1jUwubHlSA8nm8KQ,21816
79
102
  mcp_vector_search/parsers/html.py,sha256=nzEVDV4oCBp3wpL8vp6WWx5eqiB39agu9E048JkuRJQ,13010
80
103
  mcp_vector_search/parsers/javascript.py,sha256=uJMLTbY5NGDSf0817bZ6dQQuQMXLUfIEZzyPuxLxoBY,24337
81
104
  mcp_vector_search/parsers/php.py,sha256=1QjnE8SAQF86VQ7pNfn1Pmpg5Dni4M7KCLU7212DkXM,24774
82
- mcp_vector_search/parsers/python.py,sha256=SiiFySPqZuSMgoctElZCMm18XEA3p1x1qdm1uvYlj_4,19322
105
+ mcp_vector_search/parsers/python.py,sha256=M8GP03BesOym0irUmcRkN50VsgOt-tpKOT_2J4t3QoY,31183
83
106
  mcp_vector_search/parsers/registry.py,sha256=_a5TwQ19xRb8bQUJhybL04PdmIEXhZ0-6687QvZvE_M,6556
84
107
  mcp_vector_search/parsers/ruby.py,sha256=xNn_z8txAWL7E1ULcFMiqn5idFhf5GQn8N3x1yE-c2k,23818
85
108
  mcp_vector_search/parsers/text.py,sha256=jvMdFspbmrrOR1GSGzf2gvBDCXz1cPN_xemoDK4fUvM,6084
86
109
  mcp_vector_search/parsers/utils.py,sha256=10vT-GJSeDUoGSIslz8zq4RyavFiMtizCmcnn9cbQqE,8103
87
110
  mcp_vector_search/utils/__init__.py,sha256=A1UUiZnwYZLw3FnYfwEE9ejGWFxfPFq4fur-tQO26oo,971
88
- mcp_vector_search/utils/gitignore.py,sha256=hJHt5YsfEvLIfweaa968tGTavcbxqh3X5nSaeWOS_FA,8690
111
+ mcp_vector_search/utils/gitignore.py,sha256=Ka-ta625mdlVVbWRRb1dBHGiUjeJPhlZB-1Jn7FE9pk,8550
89
112
  mcp_vector_search/utils/gitignore_updater.py,sha256=JNi307O0gS0tlc1dSqFfWkIrEqkUKx051-TE7E_Gf70,8454
90
113
  mcp_vector_search/utils/monorepo.py,sha256=mlew8cjuIUvtXFAlAJtWZhav5LCLHL2uIef5LEH8aMc,10634
91
114
  mcp_vector_search/utils/timing.py,sha256=GuHebwsn6xhEzyR7Mthf1o-dPd_nQhXCsDhsveiRXDE,11365
92
115
  mcp_vector_search/utils/version.py,sha256=d7fS-CLemxb8UzZ9j18zH0Y0Ud097ljKKYYOPulnGPE,1138
93
- mcp_vector_search-1.0.3.dist-info/METADATA,sha256=XaLKHHKlKxJVvz_xnz-KhUVUbGr1cCv6gbA0ZAUh2Io,29787
94
- mcp_vector_search-1.0.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
95
- mcp_vector_search-1.0.3.dist-info/entry_points.txt,sha256=H3Ku3CLmadh89aN8fZ3rxr3w19JQWm_TsYyPErlftB8,146
96
- mcp_vector_search-1.0.3.dist-info/licenses/LICENSE,sha256=FqZUgGJH_tZKZLQsMCpXaLawRyLmyFKRVfMwYyEcyTs,1072
97
- mcp_vector_search-1.0.3.dist-info/RECORD,,
116
+ mcp_vector_search-1.1.22.dist-info/METADATA,sha256=GwKLvJAMGLsE2BhKoiYk6VgiN7_75OxghdEn9biFdXU,29814
117
+ mcp_vector_search-1.1.22.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
118
+ mcp_vector_search-1.1.22.dist-info/entry_points.txt,sha256=H3Ku3CLmadh89aN8fZ3rxr3w19JQWm_TsYyPErlftB8,146
119
+ mcp_vector_search-1.1.22.dist-info/licenses/LICENSE,sha256=FqZUgGJH_tZKZLQsMCpXaLawRyLmyFKRVfMwYyEcyTs,1072
120
+ mcp_vector_search-1.1.22.dist-info/RECORD,,