kodit 0.1.16__py3-none-any.whl → 0.1.17__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.

Potentially problematic release.


This version of kodit might be problematic. Click here for more details.

kodit/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.1.16'
21
- __version_tuple__ = version_tuple = (0, 1, 16)
20
+ __version__ = version = '0.1.17'
21
+ __version_tuple__ = version_tuple = (0, 1, 17)
@@ -142,6 +142,8 @@ class VectorChordVectorSearchService(VectorSearchService):
142
142
  async def retrieve(self, query: str, top_k: int = 10) -> list[VectorSearchResponse]:
143
143
  """Query the embedding model."""
144
144
  embedding = await self.embedding_provider.embed([query])
145
+ if len(embedding) == 0 or len(embedding[0]) == 0:
146
+ return []
145
147
  result = await self._execute(
146
148
  text(SEARCH_QUERY.format(TABLE_NAME=self.table_name)),
147
149
  {"query": str(embedding[0]), "top_k": top_k},
@@ -10,7 +10,6 @@ from typing import TypeVar
10
10
 
11
11
  from sqlalchemy import delete, func, select
12
12
  from sqlalchemy.ext.asyncio import AsyncSession
13
- from sqlalchemy.orm.exc import MultipleResultsFound
14
13
 
15
14
  from kodit.embedding.embedding_models import Embedding
16
15
  from kodit.indexing.indexing_models import Index, Snippet
@@ -125,34 +124,15 @@ class IndexRepository:
125
124
  index.updated_at = datetime.now(UTC)
126
125
  await self.session.commit()
127
126
 
128
- async def add_snippet_or_update_content(self, snippet: Snippet) -> None:
127
+ async def add_snippet(self, snippet: Snippet) -> None:
129
128
  """Add a new snippet to the database if it doesn't exist, otherwise update it.
130
129
 
131
130
  Args:
132
131
  snippet: The Snippet instance to add.
133
132
 
134
133
  """
135
- query = select(Snippet).where(
136
- Snippet.file_id == snippet.file_id,
137
- Snippet.index_id == snippet.index_id,
138
- )
139
- result = await self.session.execute(query)
140
- try:
141
- existing_snippet = result.scalar_one_or_none()
142
-
143
- if existing_snippet:
144
- existing_snippet.content = snippet.content
145
- else:
146
- self.session.add(snippet)
147
-
148
- await self.session.commit()
149
- except MultipleResultsFound as e:
150
- msg = (
151
- f"Multiple snippets found for file_id {snippet.file_id}, this "
152
- "shouldn't happen. "
153
- "Please report this as a bug then delete your index and start again."
154
- )
155
- raise ValueError(msg) from e
134
+ self.session.add(snippet)
135
+ await self.session.commit()
156
136
 
157
137
  async def delete_all_snippets(self, index_id: int) -> None:
158
138
  """Delete all snippets for an index.
@@ -161,6 +141,15 @@ class IndexRepository:
161
141
  index_id: The ID of the index to delete snippets for.
162
142
 
163
143
  """
144
+ # First get all snippets for this index
145
+ snippets = await self.get_snippets_for_index(index_id)
146
+
147
+ # Delete all embeddings for these snippets, if there are any
148
+ for snippet in snippets:
149
+ query = delete(Embedding).where(Embedding.snippet_id == snippet.id)
150
+ await self.session.execute(query)
151
+
152
+ # Now delete the snippets
164
153
  query = delete(Snippet).where(Snippet.index_id == index_id)
165
154
  await self.session.execute(query)
166
155
  await self.session.commit()
@@ -214,5 +203,14 @@ class IndexRepository:
214
203
  # Create a dictionary for O(1) lookup of results by ID
215
204
  id_to_result = {snippet.id: (file, snippet) for snippet, file in rows.all()}
216
205
 
217
- # Return results in the same order as input IDs
206
+ # Check that all IDs are present
207
+ if len(id_to_result) != len(ids):
208
+ # Create a list of missing IDs
209
+ missing_ids = [
210
+ snippet_id for snippet_id in ids if snippet_id not in id_to_result
211
+ ]
212
+ msg = f"Some IDs are not present: {missing_ids}"
213
+ raise ValueError(msg)
214
+
215
+ # Rebuild the list in the same order that it was passed in
218
216
  return [id_to_result[i] for i in ids]
@@ -161,10 +161,15 @@ class IndexService:
161
161
  msg = f"Index not found: {index_id}"
162
162
  raise ValueError(msg)
163
163
 
164
+ # Delete old snippets so we don't duplicate. In the future should probably check
165
+ # which files have changed and only change those.
166
+ await self.repository.delete_all_snippets(index.id)
167
+
164
168
  # Create snippets for supported file types
165
- await self._create_snippets(index_id)
169
+ self.log.info("Creating snippets for files", index_id=index.id)
170
+ await self._create_snippets(index.id)
166
171
 
167
- snippets = await self.repository.get_all_snippets(index_id)
172
+ snippets = await self.repository.get_all_snippets(index.id)
168
173
 
169
174
  self.log.info("Creating keyword index")
170
175
  with Spinner():
@@ -184,7 +189,7 @@ class IndexService:
184
189
  ]
185
190
  )
186
191
 
187
- self.log.info("Enriching snippets")
192
+ self.log.info("Enriching snippets", num_snippets=len(snippets))
188
193
  enriched_contents = await self.enrichment_service.enrich(
189
194
  [snippet.content for snippet in snippets]
190
195
  )
@@ -206,7 +211,7 @@ class IndexService:
206
211
  snippet.content = (
207
212
  enriched_content + "\n\n```\n" + snippet.content + "\n```"
208
213
  )
209
- await self.repository.add_snippet_or_update_content(snippet)
214
+ await self.repository.add_snippet(snippet)
210
215
 
211
216
  # Update index timestamp
212
217
  await self.repository.update_index_timestamp(index)
@@ -284,7 +289,6 @@ class IndexService:
284
289
 
285
290
  """
286
291
  files = await self.repository.files_for_index(index_id)
287
- self.log.info("Creating snippets for files", index_id=index_id)
288
292
  for file in tqdm(files, total=len(files), leave=False):
289
293
  # Skip unsupported file types
290
294
  if file.mime_type in MIME_BLACKLIST:
@@ -306,4 +310,4 @@ class IndexService:
306
310
  file_id=file.id,
307
311
  content=snippet.text,
308
312
  )
309
- await self.repository.add_snippet_or_update_content(s)
313
+ await self.repository.add_snippet(s)
@@ -0,0 +1,44 @@
1
+ # ruff: noqa
2
+ """index all the things
3
+
4
+ Revision ID: c3f5137d30f5
5
+ Revises: 7c3bbc2ab32b
6
+ Create Date: 2025-06-05 17:17:32.440740
7
+
8
+ """
9
+
10
+ from typing import Sequence, Union
11
+
12
+ from alembic import op
13
+ import sqlalchemy as sa
14
+
15
+
16
+ # revision identifiers, used by Alembic.
17
+ revision: str = 'c3f5137d30f5'
18
+ down_revision: Union[str, None] = '7c3bbc2ab32b'
19
+ branch_labels: Union[str, Sequence[str], None] = None
20
+ depends_on: Union[str, Sequence[str], None] = None
21
+
22
+
23
+ def upgrade() -> None:
24
+ """Upgrade schema."""
25
+ # ### commands auto generated by Alembic - please adjust! ###
26
+ op.create_index(op.f('ix_files_cloned_path'), 'files', ['cloned_path'], unique=False)
27
+ op.create_index(op.f('ix_files_mime_type'), 'files', ['mime_type'], unique=False)
28
+ op.create_index(op.f('ix_files_uri'), 'files', ['uri'], unique=False)
29
+ op.create_index(op.f('ix_snippets_file_id'), 'snippets', ['file_id'], unique=False)
30
+ op.create_index(op.f('ix_snippets_index_id'), 'snippets', ['index_id'], unique=False)
31
+ op.create_index(op.f('ix_sources_cloned_path'), 'sources', ['cloned_path'], unique=False)
32
+ # ### end Alembic commands ###
33
+
34
+
35
+ def downgrade() -> None:
36
+ """Downgrade schema."""
37
+ # ### commands auto generated by Alembic - please adjust! ###
38
+ op.drop_index(op.f('ix_sources_cloned_path'), table_name='sources')
39
+ op.drop_index(op.f('ix_snippets_index_id'), table_name='snippets')
40
+ op.drop_index(op.f('ix_snippets_file_id'), table_name='snippets')
41
+ op.drop_index(op.f('ix_files_uri'), table_name='files')
42
+ op.drop_index(op.f('ix_files_mime_type'), table_name='files')
43
+ op.drop_index(op.f('ix_files_cloned_path'), table_name='files')
44
+ # ### end Alembic commands ###
@@ -31,7 +31,7 @@ class Source(Base, CommonMixin):
31
31
 
32
32
  __tablename__ = "sources"
33
33
  uri: Mapped[str] = mapped_column(String(1024), index=True, unique=True)
34
- cloned_path: Mapped[str] = mapped_column(String(1024))
34
+ cloned_path: Mapped[str] = mapped_column(String(1024), index=True)
35
35
 
36
36
  def __init__(self, uri: str, cloned_path: str) -> None:
37
37
  """Initialize a new Source instance for typing purposes."""
@@ -46,9 +46,9 @@ class File(Base, CommonMixin):
46
46
  __tablename__ = "files"
47
47
 
48
48
  source_id: Mapped[int] = mapped_column(ForeignKey("sources.id"))
49
- mime_type: Mapped[str] = mapped_column(String(255), default="")
50
- uri: Mapped[str] = mapped_column(String(1024), default="")
51
- cloned_path: Mapped[str] = mapped_column(String(1024))
49
+ mime_type: Mapped[str] = mapped_column(String(255), default="", index=True)
50
+ uri: Mapped[str] = mapped_column(String(1024), default="", index=True)
51
+ cloned_path: Mapped[str] = mapped_column(String(1024), index=True)
52
52
  sha256: Mapped[str] = mapped_column(String(64), default="", index=True)
53
53
  size_bytes: Mapped[int] = mapped_column(Integer, default=0)
54
54
 
@@ -0,0 +1,152 @@
1
+ Metadata-Version: 2.4
2
+ Name: kodit
3
+ Version: 0.1.17
4
+ Summary: Code indexing for better AI code generation
5
+ Project-URL: Homepage, https://docs.helixml.tech/kodit/
6
+ Project-URL: Documentation, https://docs.helixml.tech/kodit/
7
+ Project-URL: Repository, https://github.com/helixml/kodit.git
8
+ Project-URL: Issues, https://github.com/helixml/kodit/issues
9
+ Project-URL: Changelog, https://github.com/helixml/kodit/releases
10
+ Author-email: "Helix.ML" <founders@helix.ml>
11
+ Maintainer-email: "Helix.ML" <founders@helix.ml>
12
+ License-Expression: Apache-2.0
13
+ License-File: LICENSE
14
+ Keywords: ai,indexing,mcp,rag
15
+ Classifier: Development Status :: 2 - Pre-Alpha
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Software Development :: Code Generators
20
+ Requires-Python: >=3.12
21
+ Requires-Dist: aiofiles>=24.1.0
22
+ Requires-Dist: aiosqlite>=0.20.0
23
+ Requires-Dist: alembic>=1.15.2
24
+ Requires-Dist: asgi-correlation-id>=4.3.4
25
+ Requires-Dist: asyncpg>=0.30.0
26
+ Requires-Dist: better-exceptions>=0.3.3
27
+ Requires-Dist: bm25s[core]>=0.2.12
28
+ Requires-Dist: click>=8.1.8
29
+ Requires-Dist: colorama>=0.4.6
30
+ Requires-Dist: dotenv>=0.9.9
31
+ Requires-Dist: fastapi[standard]>=0.115.12
32
+ Requires-Dist: fastmcp>=2.3.3
33
+ Requires-Dist: gitpython>=3.1.44
34
+ Requires-Dist: hf-xet>=1.1.2
35
+ Requires-Dist: httpx-retries>=0.3.2
36
+ Requires-Dist: httpx>=0.28.1
37
+ Requires-Dist: openai>=1.82.0
38
+ Requires-Dist: posthog>=4.0.1
39
+ Requires-Dist: pydantic-settings>=2.9.1
40
+ Requires-Dist: pytable-formatter>=0.1.1
41
+ Requires-Dist: sentence-transformers>=4.1.0
42
+ Requires-Dist: sqlalchemy[asyncio]>=2.0.40
43
+ Requires-Dist: structlog>=25.3.0
44
+ Requires-Dist: tdqm>=0.0.1
45
+ Requires-Dist: tiktoken>=0.9.0
46
+ Requires-Dist: transformers>=4.51.3
47
+ Requires-Dist: tree-sitter-language-pack>=0.7.3
48
+ Requires-Dist: tree-sitter>=0.24.0
49
+ Requires-Dist: uritools>=5.0.0
50
+ Description-Content-Type: text/markdown
51
+
52
+ <p align="center">
53
+ <a href="https://docs.helix.ml/kodit/"><img src="https://docs.helix.ml/images/helix-kodit-logo.png" alt="Helix Kodit Logo" width="300"></a>
54
+ </p>
55
+
56
+ <h1 align="center">
57
+ Kodit: A Code Indexing MCP Server
58
+ </h1>
59
+
60
+ <p align="center">
61
+ Kodit connects your AI coding assistant to external codebases to provide accurate and up-to-date snippets of code.
62
+ </p>
63
+
64
+ <div align="center">
65
+
66
+ [![Documentation](https://img.shields.io/badge/Documentation-6B46C1?style=for-the-badge&logo=readthedocs&logoColor=white)](https://docs.helix.ml/kodit/)
67
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg?style=for-the-badge)](./LICENSE)
68
+ [![Discussions](https://img.shields.io/badge/Discussions-181717?style=for-the-badge&logo=github&logoColor=white)](https://github.com/helixml/kodit/discussions)
69
+
70
+ </div>
71
+
72
+ **Helix Kodit** is an **MCP server** that connects your AI coding assistant to external codebases. It can:
73
+
74
+ - Improve your AI-assisted code by providing canonical examples direct from the source
75
+ - Index local and public codebases
76
+ - Integrates with any AI coding assistant via MCP
77
+ - Search using keyword and semantic search
78
+ - Integrate with any OpenAI-compatible or custom API/model
79
+
80
+ If you're an engineer working with AI-powered coding assistants, Kodit helps by
81
+ providing relevant and up-to-date examples of your task so that LLMs make less mistakes
82
+ and produce fewer hallucinations.
83
+
84
+ ## ✨ Features
85
+
86
+ ### Codebase Indexing
87
+
88
+ Kodit connects to a variety of local and remote codebases to build an index of your
89
+ code. This index is used to build a snippet library, ready for ingestion into an LLM.
90
+
91
+ - Index local directories and public Git repositories
92
+ - Build comprehensive snippet libraries for LLM ingestion
93
+ - Support for multiple codebase types and languages
94
+ - Efficient indexing and search capabilities
95
+
96
+ ### MCP Server
97
+
98
+ Relevant snippets are exposed to an AI coding assistant via an MCP server. This allows
99
+ the assistant to request relevant snippets by providing keywords, code, and semantic
100
+ intent. Kodit has been tested to work well with:
101
+
102
+ - Seamless integration with popular AI coding assistants
103
+ - Tested and verified with:
104
+ - [Cursor](https://docs.helix.ml/kodit/#integration-with-cursor)
105
+ - [Cline](https://docs.helix.ml/kodit/#integration-with-cline)
106
+ - Please contribute more instructions! ... any other assistant is likely to work ...
107
+
108
+ ### Enterprise Ready
109
+
110
+ Out of the box, Kodit works with a local SQLite database and very small, local models.
111
+ But enterprises can scale out with performant databases and dedicated models. Everything
112
+ can even run securely, privately, with on-premise LLM platforms like
113
+ [Helix](https://helix.ml).
114
+
115
+ Supported databases:
116
+
117
+ - SQLite
118
+ - [Vectorchord](https://github.com/tensorchord/VectorChord)
119
+
120
+ Supported providers:
121
+
122
+ - Local (which uses tiny CPU-only open-source models)
123
+ - OpenAI
124
+ - Secure, private LLM enclave with [Helix](https://helix.ml).
125
+ - Any other OpenAI compatible API
126
+
127
+ ## 🚀 Quick Start
128
+
129
+ 1. [Install Kodit](https://docs.helix.ml/kodit/#installation)
130
+ 2. [Index codebases](https://docs.helix.ml/kodit/#quick-start)
131
+ 3. [Integrate with your coding assistant](https://docs.helix.ml/kodit/#integrating-kodit-with-coding-assistants)
132
+
133
+ ### Documentation
134
+
135
+ - [Installation Guide](https://docs.helix.ml/kodit/#installation)
136
+ - [Usage Guide](https://docs.helix.ml/kodit/#quick-start)
137
+ - [Connecting to Kodit](https://docs.helix.ml/kodit/#integrating-kodit-with-coding-assistants)
138
+ - [Configuration Options](https://docs.helix.ml/kodit/#configuring-kodit)
139
+ - [Contribution Guidelines](.github/CONTRIBUTING.md)
140
+
141
+ ## Roadmap
142
+
143
+ The roadmap is currently maintained as a [Github Project](https://github.com/orgs/helixml/projects/4).
144
+
145
+ ## 💬 Support
146
+
147
+ For commercial support, please contact [Helix.ML](founders@helix.ml). To ask a question,
148
+ please [open a discussion](https://github.com/helixml/kodit/discussions).
149
+
150
+ ## License
151
+
152
+ [Apache 2.0 © 2025 HelixML, Inc.](./LICENSE)
@@ -1,6 +1,6 @@
1
1
  kodit/.gitignore,sha256=ztkjgRwL9Uud1OEi36hGQeDGk3OLK1NfDEO8YqGYy8o,11
2
2
  kodit/__init__.py,sha256=aEKHYninUq1yh6jaNfvJBYg-6fenpN132nJt1UU6Jxs,59
3
- kodit/_version.py,sha256=VYJNWHISWEW-KD_clKUYcTY_Z30r993Sjws4URJIL0g,513
3
+ kodit/_version.py,sha256=02_IA72k4pYar3Dp1g66WmynC3vl-jdmnf6lQF8QpE4,513
4
4
  kodit/app.py,sha256=Mr5BFHOHx5zppwjC4XPWVvHjwgl1yrKbUjTWXKubJQM,891
5
5
  kodit/cli.py,sha256=i7eEt0FdIQGEfXKFte-8fBcZZGE8BPXBp40aGwJDQGI,11323
6
6
  kodit/config.py,sha256=2W2u5J8j-Mbt-C4xzOuK-PeuDCx0S_rnCXPhBwvfLT4,4353
@@ -19,7 +19,7 @@ kodit/embedding/embedding_models.py,sha256=rN90vSs86dYiqoawcp8E9jtwY31JoJXYfaDls
19
19
  kodit/embedding/embedding_repository.py,sha256=-ux3scpBzel8c0pMH9fNOEsSXFIzl-IfgaWrkTb1szo,6907
20
20
  kodit/embedding/local_vector_search_service.py,sha256=hkF0qlfzjyGt400qIX9Mr6B7b7i8WvYIYWN2Z2C_pcs,1907
21
21
  kodit/embedding/vector_search_service.py,sha256=pQJ129QjGrAWOXzqkywmgtDRpy8_gtzYgkivyqF9Vrs,1009
22
- kodit/embedding/vectorchord_vector_search_service.py,sha256=KSs0IMFHHIllwq2d3A0LGqGGZDqO1Ht6K-BCfBBWW0Y,5051
22
+ kodit/embedding/vectorchord_vector_search_service.py,sha256=63Xf7_nAz3xWOwrmZibw8Q-xoRdCrPDDpdSA_WE7mrc,5131
23
23
  kodit/embedding/embedding_provider/__init__.py,sha256=h9NXzDA1r-K23nvBajBV-RJzHJN0p3UJ7UQsmdnOoRw,24
24
24
  kodit/embedding/embedding_provider/embedding_provider.py,sha256=Tf3bwUsUMzAgoyLFM5qBtOLqPp1qr03TzrwGczkDvy0,1835
25
25
  kodit/embedding/embedding_provider/hash_embedding_provider.py,sha256=nAhlhh8j8PqqCCbhVl26Y8ntFBm2vJBCtB4X04g5Wwg,2638
@@ -35,8 +35,8 @@ kodit/enrichment/enrichment_provider/openai_enrichment_provider.py,sha256=gYuFTA
35
35
  kodit/indexing/__init__.py,sha256=cPyi2Iej3G1JFWlWr7X80_UrsMaTu5W5rBwgif1B3xo,75
36
36
  kodit/indexing/fusion.py,sha256=TZb4fPAedXdEUXzwzOofW98QIOymdbclBOP1KOijuEk,1674
37
37
  kodit/indexing/indexing_models.py,sha256=6NX9HVcj6Pu9ePwHC7n-PWSyAgukpJq0nCNmUIigtbo,1282
38
- kodit/indexing/indexing_repository.py,sha256=GYHoACUWYKQdVTwP7tfik_TMUD1WUK76nywH88eCSwg,7006
39
- kodit/indexing/indexing_service.py,sha256=tKcZpi0pzsmF6OpqnqF0Q5HfSXxi5iLTysrVSou4JiQ,10579
38
+ kodit/indexing/indexing_repository.py,sha256=dqOS0pxKM6bUjMXWqYukAK8XdiD36OnskFASgZRXRQM,6955
39
+ kodit/indexing/indexing_service.py,sha256=_uhoqBic3_zXNJOsKt_w-TgX5ebf7OBwbqMdO9zectM,10779
40
40
  kodit/migrations/README,sha256=ISVtAOvqvKk_5ThM5ioJE-lMkvf9IbknFUFVU_vPma4,58
41
41
  kodit/migrations/__init__.py,sha256=lP5MuwlyWRMO6UcDWnQcQ3G-GYHcFb6rl9gYPHJ1sjo,40
42
42
  kodit/migrations/env.py,sha256=w1M7OZh-ZeR2dPHS0ByXAUxQjfZQ8xIzMseWuzLDTWw,2469
@@ -44,6 +44,7 @@ kodit/migrations/script.py.mako,sha256=zWziKtiwYKEWuwPV_HBNHwa9LCT45_bi01-uSNFaO
44
44
  kodit/migrations/versions/7c3bbc2ab32b_add_embeddings_table.py,sha256=-61qol9PfQKILCDQRA5jEaats9aGZs9Wdtp-j-38SF4,1644
45
45
  kodit/migrations/versions/85155663351e_initial.py,sha256=Cg7zlF871o9ShV5rQMQ1v7hRV7fI59veDY9cjtTrs-8,3306
46
46
  kodit/migrations/versions/__init__.py,sha256=9-lHzptItTzq_fomdIRBegQNm4Znx6pVjwD4MiqRIdo,36
47
+ kodit/migrations/versions/c3f5137d30f5_index_all_the_things.py,sha256=rI8LmjF-I2OMxZ2nOIF_NRmqOLXe45hL_iz_nx97DTQ,1680
47
48
  kodit/snippets/__init__.py,sha256=-2coNoCRjTixU9KcP6alpmt7zqf37tCRWH3D7FPJ8dg,48
48
49
  kodit/snippets/method_snippets.py,sha256=EVHhSNWahAC5nSXv9fWVFJY2yq25goHdCSCuENC07F8,4145
49
50
  kodit/snippets/snippets.py,sha256=mwN0bM1Msu8ZeEsUHyQ7tx3Hj3vZsm8G7Wu4eWSkLY8,1539
@@ -52,13 +53,13 @@ kodit/snippets/languages/csharp.scm,sha256=gbBN4RiV1FBuTJF6orSnDFi8H9JwTw-d4piLJ
52
53
  kodit/snippets/languages/go.scm,sha256=SEX9mTOrhP2KiQW7oflDKkd21u5dK56QbJ4LvTDxY8A,533
53
54
  kodit/snippets/languages/python.scm,sha256=ee85R9PBzwye3IMTE7-iVoKWd_ViU3EJISTyrFGrVeo,429
54
55
  kodit/source/__init__.py,sha256=1NTZyPdjThVQpZO1Mp1ColVsS7sqYanOVLqnoqV9Ipo,83
55
- kodit/source/source_models.py,sha256=xb42CaNDO1CUB8SIW-xXMrB6Ji8cFw-yeJ550xBEg9Q,2398
56
+ kodit/source/source_models.py,sha256=kcC59XPSDDMth2mOYK3FakqTN0jxKFaTDch0ejyD9Sw,2446
56
57
  kodit/source/source_repository.py,sha256=0EksMpoLzdkfe8S4eeCm4Sf7TuxsOzOzaF4BBsMYo-4,3163
57
58
  kodit/source/source_service.py,sha256=u_GaH07ewakThQJRfT8O_yZ54A52qLtJuM1bF3xUT2A,9633
58
59
  kodit/util/__init__.py,sha256=bPu6CtqDWCRGU7VgW2_aiQrCBi8G89FS6k1PjvDajJ0,37
59
60
  kodit/util/spinner.py,sha256=R9bzrHtBiIH6IfLbmsIVHL53s8vg-tqW4lwGGALu4dw,1932
60
- kodit-0.1.16.dist-info/METADATA,sha256=1lR4ZSTiRBzUv9Gj8FPspv4GU2vWGQU6HSiffWgU2Do,2467
61
- kodit-0.1.16.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
62
- kodit-0.1.16.dist-info/entry_points.txt,sha256=hoTn-1aKyTItjnY91fnO-rV5uaWQLQ-Vi7V5et2IbHY,40
63
- kodit-0.1.16.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
64
- kodit-0.1.16.dist-info/RECORD,,
61
+ kodit-0.1.17.dist-info/METADATA,sha256=MvKNOh3LfOOuviJBzZVqPaP0__Z-_DdoUzgfc2lUBFE,5822
62
+ kodit-0.1.17.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
63
+ kodit-0.1.17.dist-info/entry_points.txt,sha256=hoTn-1aKyTItjnY91fnO-rV5uaWQLQ-Vi7V5et2IbHY,40
64
+ kodit-0.1.17.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
65
+ kodit-0.1.17.dist-info/RECORD,,
@@ -1,91 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: kodit
3
- Version: 0.1.16
4
- Summary: Code indexing for better AI code generation
5
- Project-URL: Homepage, https://docs.helixml.tech/kodit/
6
- Project-URL: Documentation, https://docs.helixml.tech/kodit/
7
- Project-URL: Repository, https://github.com/helixml/kodit.git
8
- Project-URL: Issues, https://github.com/helixml/kodit/issues
9
- Project-URL: Changelog, https://github.com/helixml/kodit/releases
10
- Author-email: "Helix.ML" <founders@helix.ml>
11
- Maintainer-email: "Helix.ML" <founders@helix.ml>
12
- License-Expression: Apache-2.0
13
- License-File: LICENSE
14
- Keywords: ai,indexing,mcp,rag
15
- Classifier: Development Status :: 2 - Pre-Alpha
16
- Classifier: Intended Audience :: Developers
17
- Classifier: Programming Language :: Python :: 3.12
18
- Classifier: Programming Language :: Python :: 3.13
19
- Classifier: Topic :: Software Development :: Code Generators
20
- Requires-Python: >=3.12
21
- Requires-Dist: aiofiles>=24.1.0
22
- Requires-Dist: aiosqlite>=0.20.0
23
- Requires-Dist: alembic>=1.15.2
24
- Requires-Dist: asgi-correlation-id>=4.3.4
25
- Requires-Dist: asyncpg>=0.30.0
26
- Requires-Dist: better-exceptions>=0.3.3
27
- Requires-Dist: bm25s[core]>=0.2.12
28
- Requires-Dist: click>=8.1.8
29
- Requires-Dist: colorama>=0.4.6
30
- Requires-Dist: dotenv>=0.9.9
31
- Requires-Dist: fastapi[standard]>=0.115.12
32
- Requires-Dist: fastmcp>=2.3.3
33
- Requires-Dist: gitpython>=3.1.44
34
- Requires-Dist: hf-xet>=1.1.2
35
- Requires-Dist: httpx-retries>=0.3.2
36
- Requires-Dist: httpx>=0.28.1
37
- Requires-Dist: openai>=1.82.0
38
- Requires-Dist: posthog>=4.0.1
39
- Requires-Dist: pydantic-settings>=2.9.1
40
- Requires-Dist: pytable-formatter>=0.1.1
41
- Requires-Dist: sentence-transformers>=4.1.0
42
- Requires-Dist: sqlalchemy[asyncio]>=2.0.40
43
- Requires-Dist: structlog>=25.3.0
44
- Requires-Dist: tdqm>=0.0.1
45
- Requires-Dist: tiktoken>=0.9.0
46
- Requires-Dist: transformers>=4.51.3
47
- Requires-Dist: tree-sitter-language-pack>=0.7.3
48
- Requires-Dist: tree-sitter>=0.24.0
49
- Requires-Dist: uritools>=5.0.0
50
- Description-Content-Type: text/markdown
51
-
52
- # kodit
53
-
54
- ## Installation
55
-
56
- Please choose your preferred installation method. They all ultimately install the kodit
57
- cli, which contains the kodit MCP server and other tools to manage your data sources.
58
-
59
- ### Docker
60
-
61
- ```sh
62
- docker run -it --rm registry.helix.ml/helix/kodit:latest
63
- ```
64
-
65
- Always replace latest with a specific version.
66
-
67
- ### pipx
68
-
69
- ```sh
70
- pipx install kodit
71
- ```
72
-
73
- ### homebrew
74
-
75
- ```sh
76
- brew install helixml/kodit/kodit
77
- ```
78
-
79
- ### uv
80
-
81
- ```sh
82
- uv tool install kodit
83
- ```
84
-
85
- ### pip
86
-
87
- Use this if you want to use kodit as a python library:
88
-
89
- ```sh
90
- pip install kodit
91
- ```
File without changes