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.
- mcp_vector_search/__init__.py +3 -3
- mcp_vector_search/analysis/__init__.py +48 -1
- mcp_vector_search/analysis/baseline/__init__.py +68 -0
- mcp_vector_search/analysis/baseline/comparator.py +462 -0
- mcp_vector_search/analysis/baseline/manager.py +621 -0
- mcp_vector_search/analysis/collectors/__init__.py +35 -0
- mcp_vector_search/analysis/collectors/cohesion.py +463 -0
- mcp_vector_search/analysis/collectors/coupling.py +1162 -0
- mcp_vector_search/analysis/collectors/halstead.py +514 -0
- mcp_vector_search/analysis/collectors/smells.py +325 -0
- mcp_vector_search/analysis/debt.py +516 -0
- mcp_vector_search/analysis/interpretation.py +685 -0
- mcp_vector_search/analysis/metrics.py +74 -1
- mcp_vector_search/analysis/reporters/__init__.py +3 -1
- mcp_vector_search/analysis/reporters/console.py +424 -0
- mcp_vector_search/analysis/reporters/markdown.py +480 -0
- mcp_vector_search/analysis/reporters/sarif.py +377 -0
- mcp_vector_search/analysis/storage/__init__.py +93 -0
- mcp_vector_search/analysis/storage/metrics_store.py +762 -0
- mcp_vector_search/analysis/storage/schema.py +245 -0
- mcp_vector_search/analysis/storage/trend_tracker.py +560 -0
- mcp_vector_search/analysis/trends.py +308 -0
- mcp_vector_search/analysis/visualizer/__init__.py +90 -0
- mcp_vector_search/analysis/visualizer/d3_data.py +534 -0
- mcp_vector_search/analysis/visualizer/exporter.py +484 -0
- mcp_vector_search/analysis/visualizer/html_report.py +2895 -0
- mcp_vector_search/analysis/visualizer/schemas.py +525 -0
- mcp_vector_search/cli/commands/analyze.py +665 -11
- mcp_vector_search/cli/commands/chat.py +193 -0
- mcp_vector_search/cli/commands/index.py +600 -2
- mcp_vector_search/cli/commands/index_background.py +467 -0
- mcp_vector_search/cli/commands/search.py +194 -1
- mcp_vector_search/cli/commands/setup.py +64 -13
- mcp_vector_search/cli/commands/status.py +302 -3
- mcp_vector_search/cli/commands/visualize/cli.py +26 -10
- mcp_vector_search/cli/commands/visualize/exporters/json_exporter.py +8 -4
- mcp_vector_search/cli/commands/visualize/graph_builder.py +167 -234
- mcp_vector_search/cli/commands/visualize/server.py +304 -15
- mcp_vector_search/cli/commands/visualize/templates/base.py +60 -6
- mcp_vector_search/cli/commands/visualize/templates/scripts.py +2100 -65
- mcp_vector_search/cli/commands/visualize/templates/styles.py +1297 -88
- mcp_vector_search/cli/didyoumean.py +5 -0
- mcp_vector_search/cli/main.py +16 -5
- mcp_vector_search/cli/output.py +134 -5
- mcp_vector_search/config/thresholds.py +89 -1
- mcp_vector_search/core/__init__.py +16 -0
- mcp_vector_search/core/database.py +39 -2
- mcp_vector_search/core/embeddings.py +24 -0
- mcp_vector_search/core/git.py +380 -0
- mcp_vector_search/core/indexer.py +445 -84
- mcp_vector_search/core/llm_client.py +9 -4
- mcp_vector_search/core/models.py +88 -1
- mcp_vector_search/core/relationships.py +473 -0
- mcp_vector_search/core/search.py +1 -1
- mcp_vector_search/mcp/server.py +795 -4
- mcp_vector_search/parsers/python.py +285 -5
- mcp_vector_search/utils/gitignore.py +0 -3
- {mcp_vector_search-1.0.3.dist-info → mcp_vector_search-1.1.22.dist-info}/METADATA +3 -2
- {mcp_vector_search-1.0.3.dist-info → mcp_vector_search-1.1.22.dist-info}/RECORD +62 -39
- mcp_vector_search/cli/commands/visualize.py.original +0 -2536
- {mcp_vector_search-1.0.3.dist-info → mcp_vector_search-1.1.22.dist-info}/WHEEL +0 -0
- {mcp_vector_search-1.0.3.dist-info → mcp_vector_search-1.1.22.dist-info}/entry_points.txt +0 -0
- {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
|
|
195
|
-
content = self.
|
|
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(
|
|
478
|
+
docstring = self._extract_docstring_regex(skeleton_content)
|
|
344
479
|
|
|
345
480
|
chunk = self._create_chunk(
|
|
346
|
-
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.
|
|
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 <
|
|
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=
|
|
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=
|
|
4
|
-
mcp_vector_search/analysis/
|
|
5
|
-
mcp_vector_search/analysis/
|
|
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/
|
|
9
|
-
mcp_vector_search/analysis/
|
|
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=
|
|
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=
|
|
16
|
-
mcp_vector_search/cli/output.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
31
|
-
mcp_vector_search/cli/commands/setup.py,sha256=
|
|
32
|
-
mcp_vector_search/cli/commands/status.py,sha256=
|
|
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=
|
|
38
|
-
mcp_vector_search/cli/commands/visualize/graph_builder.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
47
|
-
mcp_vector_search/cli/commands/visualize/templates/scripts.py,sha256=
|
|
48
|
-
mcp_vector_search/cli/commands/visualize/templates/styles.py,sha256=
|
|
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=
|
|
55
|
-
mcp_vector_search/core/__init__.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
67
|
-
mcp_vector_search/core/llm_client.py,sha256=
|
|
68
|
-
mcp_vector_search/core/models.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
94
|
-
mcp_vector_search-1.
|
|
95
|
-
mcp_vector_search-1.
|
|
96
|
-
mcp_vector_search-1.
|
|
97
|
-
mcp_vector_search-1.
|
|
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,,
|