mcp-code-indexer 3.5.2__py3-none-any.whl → 3.5.3__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.
@@ -52,9 +52,12 @@ class MakeLocalCommand:
52
52
  if not folder_path_obj.is_dir():
53
53
  raise ValueError(f"Path is not a directory: {folder_path}")
54
54
 
55
+ # Get local database folder and path
56
+ local_db_folder = self.db_factory.get_path_resolver().get_local_database_folder(folder_path)
57
+ local_db_path = self.db_factory.get_path_resolver().get_local_database_path(folder_path)
58
+
55
59
  # Check if local database already exists and has data
56
- local_db_path = folder_path_obj / ".code-index.db"
57
- if local_db_path.exists() and local_db_path.stat().st_size > 0:
60
+ if local_db_folder.exists() and local_db_path.exists() and local_db_path.stat().st_size > 0:
58
61
  # Check if it actually has project data (not just schema)
59
62
  from sqlite3 import connect
60
63
  try:
@@ -88,13 +91,12 @@ class MakeLocalCommand:
88
91
  if project_overview:
89
92
  logger.info("Found project overview to migrate")
90
93
 
91
- # Create local database manager (this will initialize schema if needed)
92
- local_db_manager = await self.db_factory.get_database_manager(str(folder_path_obj))
94
+ # Create local database folder (this ensures it exists)
95
+ local_db_folder.mkdir(parents=True, exist_ok=True)
96
+ logger.info(f"Created local database folder: {local_db_folder}")
93
97
 
94
- # Check if project already exists in local database
95
- existing_local_project = await local_db_manager.get_project(project.id)
96
- if existing_local_project:
97
- raise ValueError(f"Project '{project.name}' (ID: {project.id}) already exists in local database")
98
+ # Create local database manager (this will initialize schema)
99
+ local_db_manager = await self.db_factory.get_database_manager(str(folder_path_obj))
98
100
 
99
101
  # Migrate data
100
102
  await self._migrate_project_data(
@@ -109,6 +111,7 @@ class MakeLocalCommand:
109
111
  "project_name": project.name,
110
112
  "project_id": project.id,
111
113
  "local_database_path": str(local_db_path),
114
+ "local_database_folder": str(local_db_folder),
112
115
  "migrated_files": len(file_descriptions),
113
116
  "migrated_overview": project_overview is not None,
114
117
  }
@@ -82,15 +82,6 @@ class DatabaseFactory:
82
82
  if db_key in self._database_managers:
83
83
  return self._database_managers[db_key]
84
84
 
85
- # Check if we need to initialize an empty local database
86
- if (folder_path and
87
- self.path_resolver.is_local_database(folder_path) and
88
- self.path_resolver.should_initialize_local_database(folder_path)):
89
- logger.info(f"Initializing empty local database: {db_path}")
90
- # Remove the empty file so DatabaseManager can create it properly
91
- if db_path.exists():
92
- db_path.unlink()
93
-
94
85
  # Create new database manager
95
86
  db_manager = DatabaseManager(
96
87
  db_path=db_path,
@@ -17,8 +17,8 @@ class DatabasePathResolver:
17
17
  """
18
18
  Resolves database paths, determining whether to use local or global databases.
19
19
 
20
- Local databases are stored as .code-index.db in project folders.
21
- If a local database file exists, it takes precedence over the global database.
20
+ Local databases are stored as tracker.db in .code-index folders.
21
+ If a .code-index folder exists, it takes precedence over the global database.
22
22
  """
23
23
 
24
24
  def __init__(self, global_db_path: Path):
@@ -46,13 +46,14 @@ class DatabasePathResolver:
46
46
 
47
47
  try:
48
48
  folder_path_obj = Path(folder_path).resolve()
49
- local_db_path = folder_path_obj / ".code-index.db"
49
+ local_db_folder = folder_path_obj / ".code-index"
50
50
 
51
- if local_db_path.exists():
52
- logger.debug(f"Found local database: {local_db_path}")
51
+ if local_db_folder.exists() and local_db_folder.is_dir():
52
+ local_db_path = local_db_folder / "tracker.db"
53
+ logger.debug(f"Found local database folder: {local_db_path}")
53
54
  return local_db_path
54
55
  else:
55
- logger.debug(f"No local database found at {local_db_path}, using global database")
56
+ logger.debug(f"No local database folder found at {local_db_folder}, using global database")
56
57
  return self.global_db_path
57
58
 
58
59
  except (OSError, ValueError) as e:
@@ -61,21 +62,21 @@ class DatabasePathResolver:
61
62
 
62
63
  def is_local_database(self, folder_path: Optional[str] = None) -> bool:
63
64
  """
64
- Check if a local database exists for the given folder path.
65
+ Check if a local database folder exists for the given folder path.
65
66
 
66
67
  Args:
67
68
  folder_path: Project folder path to check
68
69
 
69
70
  Returns:
70
- True if a local database exists, False otherwise
71
+ True if a local database folder exists, False otherwise
71
72
  """
72
73
  if not folder_path:
73
74
  return False
74
75
 
75
76
  try:
76
77
  folder_path_obj = Path(folder_path).resolve()
77
- local_db_path = folder_path_obj / ".code-index.db"
78
- return local_db_path.exists()
78
+ local_db_folder = folder_path_obj / ".code-index"
79
+ return local_db_folder.exists() and local_db_folder.is_dir()
79
80
  except (OSError, ValueError):
80
81
  return False
81
82
 
@@ -89,34 +90,16 @@ class DatabasePathResolver:
89
90
  Returns:
90
91
  Path where the local database would be located
91
92
  """
92
- return Path(folder_path).resolve() / ".code-index.db"
93
+ return Path(folder_path).resolve() / ".code-index" / "tracker.db"
93
94
 
94
- def is_empty_database_file(self, db_path: Path) -> bool:
95
+ def get_local_database_folder(self, folder_path: str) -> Path:
95
96
  """
96
- Check if a database file is empty (0 bytes).
97
-
98
- Args:
99
- db_path: Path to the database file
100
-
101
- Returns:
102
- True if the file exists and is empty, False otherwise
103
- """
104
- try:
105
- return db_path.exists() and db_path.stat().st_size == 0
106
- except (OSError, ValueError):
107
- return False
108
-
109
- def should_initialize_local_database(self, folder_path: str) -> bool:
110
- """
111
- Check if a local database should be initialized.
112
-
113
- This returns True if .code-index.db exists and is empty.
97
+ Get the local database folder for a project folder.
114
98
 
115
99
  Args:
116
100
  folder_path: Project folder path
117
101
 
118
102
  Returns:
119
- True if local database should be initialized, False otherwise
103
+ Path where the local database folder would be located
120
104
  """
121
- local_db_path = self.get_local_database_path(folder_path)
122
- return self.is_empty_database_file(local_db_path)
105
+ return Path(folder_path).resolve() / ".code-index"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mcp-code-indexer
3
- Version: 3.5.2
3
+ Version: 3.5.3
4
4
  Summary: MCP server that tracks file descriptions across codebases, enabling AI agents to efficiently navigate and understand code through searchable summaries and token-aware overviews.
5
5
  License: MIT
6
6
  Keywords: mcp,model-context-protocol,code-indexer,ai-tools,codebase-navigation,file-descriptions,llm-tools
@@ -40,8 +40,8 @@ Description-Content-Type: text/markdown
40
40
 
41
41
  # MCP Code Indexer 🚀
42
42
 
43
- [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?37)](https://badge.fury.io/py/mcp-code-indexer)
44
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?37)](https://pypi.org/project/mcp-code-indexer/)
43
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?38)](https://badge.fury.io/py/mcp-code-indexer)
44
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?38)](https://pypi.org/project/mcp-code-indexer/)
45
45
  [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
46
46
 
47
47
  A production-ready **Model Context Protocol (MCP) server** that revolutionizes how AI agents navigate and understand codebases. Built for high-concurrency environments with advanced database resilience, the server provides instant access to intelligent descriptions, semantic search, and context-aware recommendations while maintaining 800+ writes/sec throughput.
@@ -4,15 +4,15 @@ mcp_code_indexer/ask_handler.py,sha256=cy7gVFyXF0c10GZ3Aquktvgw1A8e4_NtBsbjlE1Bc
4
4
  mcp_code_indexer/claude_api_handler.py,sha256=uZF6P64Cac9AHfO2Q3Whe4exhZyZmqZ1grWT1nHw-Wc,13616
5
5
  mcp_code_indexer/cleanup_manager.py,sha256=qjIAMiJ-F1pfgCwVbNaNE0dfs8Wh9aaWh51DBMCWFuI,9491
6
6
  mcp_code_indexer/commands/__init__.py,sha256=141U722dS_NnFTZyxTPipzhXKdU21kCv-mcrN4djyHo,45
7
- mcp_code_indexer/commands/makelocal.py,sha256=rqb0JQHh2-lei1hl7F4BnssgajcDsG5WvOXyq79YIpk,8325
7
+ mcp_code_indexer/commands/makelocal.py,sha256=4r3u4H6SkxeoSaWWp-8TrobbTqrPICSvcSXtsE8fZSM,8507
8
8
  mcp_code_indexer/data/stop_words_english.txt,sha256=7Zdd9ameVgA6tN_zuXROvHXD4hkWeELVywPhb7FJEkw,6343
9
9
  mcp_code_indexer/database/__init__.py,sha256=aPq_aaRp0aSwOBIq9GkuMNjmLxA411zg2vhdrAuHm-w,38
10
10
  mcp_code_indexer/database/connection_health.py,sha256=vu8c8lDLEwva7ldTdxvlACTKT59kO-KjZ9I3tMbwr3s,25240
11
11
  mcp_code_indexer/database/database.py,sha256=BpsWoy5qXqLQpEZ42dt5efOGSrLhokQyvAc9ZK0afc4,46895
12
- mcp_code_indexer/database/database_factory.py,sha256=M7ojiDzs-acJG3QE4khTo2pYyQM9gUBcMAm0duboiLU,4875
12
+ mcp_code_indexer/database/database_factory.py,sha256=fxfwnW0F-9lutiVCYLFap7ftN9_4XuK5ACLt7PF5U20,4410
13
13
  mcp_code_indexer/database/exceptions.py,sha256=Cs9_qc-6724DPJc25fPMvNfO3JQCHrOQ80y8Q55w_3Y,10389
14
14
  mcp_code_indexer/database/models.py,sha256=ITF5dMSBCuaunQ3YeaVQOZ5Kb8y59I5Fg0EU7O9Ez3A,7017
15
- mcp_code_indexer/database/path_resolver.py,sha256=UFLyo_Y5pyHmU1a27XB6S-XHq6l5IUlhfGe5lgFCWv4,4041
15
+ mcp_code_indexer/database/path_resolver.py,sha256=Z3mOYnSiYWn-W9z-bH4-ffX7Vz1aAYdGilCU1I20i3k,3601
16
16
  mcp_code_indexer/database/retry_executor.py,sha256=wBIIbkU1bwQMrjM9AmDWNEQ-cw8IPNobfdeUOLhQVjQ,13528
17
17
  mcp_code_indexer/deepask_handler.py,sha256=wpKMYnlsOGiaKLvuXIb62jeEb4xnYOmIcvvXjvbgdnc,18475
18
18
  mcp_code_indexer/error_handler.py,sha256=XBjjEriq1diPTGKpHcaBh9fj88_qhuNMwPeLiTWxrds,11431
@@ -33,8 +33,8 @@ mcp_code_indexer/server/mcp_server.py,sha256=o6G5vNxtyWwL_x4UXTB9XfG6acoba5P9hTJ
33
33
  mcp_code_indexer/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4,sha256=Ijkht27pm96ZW3_3OFE-7xAPtR0YyTWXoRO8_-hlsqc,1681126
34
34
  mcp_code_indexer/token_counter.py,sha256=e6WsyCEWMMSkMwLbcVtr5e8vEqh-kFqNmiJErCNdqHE,8220
35
35
  mcp_code_indexer/tools/__init__.py,sha256=m01mxML2UdD7y5rih_XNhNSCMzQTz7WQ_T1TeOcYlnE,49
36
- mcp_code_indexer-3.5.2.dist-info/LICENSE,sha256=JN9dyPPgYwH9C-UjYM7FLNZjQ6BF7kAzpF3_4PwY4rY,1086
37
- mcp_code_indexer-3.5.2.dist-info/METADATA,sha256=25-ZLpMXyX2ZkaS1132tpVbDVt4RYoYGhsCMJhR41xo,19359
38
- mcp_code_indexer-3.5.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
39
- mcp_code_indexer-3.5.2.dist-info/entry_points.txt,sha256=UABj7HZ0mC6rvF22gxaz2LLNLGQShTrFmp5u00iUtvo,67
40
- mcp_code_indexer-3.5.2.dist-info/RECORD,,
36
+ mcp_code_indexer-3.5.3.dist-info/LICENSE,sha256=JN9dyPPgYwH9C-UjYM7FLNZjQ6BF7kAzpF3_4PwY4rY,1086
37
+ mcp_code_indexer-3.5.3.dist-info/METADATA,sha256=WIdt7KN_NNGZtmg5lKIP6kk8A3e4HwUkVV1p6Tmjn0U,19359
38
+ mcp_code_indexer-3.5.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
39
+ mcp_code_indexer-3.5.3.dist-info/entry_points.txt,sha256=UABj7HZ0mC6rvF22gxaz2LLNLGQShTrFmp5u00iUtvo,67
40
+ mcp_code_indexer-3.5.3.dist-info/RECORD,,