kodit 0.1.16__py3-none-any.whl → 0.1.18__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 +2 -2
- kodit/embedding/vectorchord_vector_search_service.py +2 -0
- kodit/indexing/indexing_repository.py +22 -24
- kodit/indexing/indexing_service.py +10 -6
- kodit/migrations/versions/c3f5137d30f5_index_all_the_things.py +44 -0
- kodit/snippets/languages/javascript.scm +24 -0
- kodit/snippets/languages/typescript.scm +25 -0
- kodit/source/source_models.py +4 -4
- kodit-0.1.18.dist-info/METADATA +152 -0
- {kodit-0.1.16.dist-info → kodit-0.1.18.dist-info}/RECORD +13 -10
- kodit-0.1.16.dist-info/METADATA +0 -91
- {kodit-0.1.16.dist-info → kodit-0.1.18.dist-info}/WHEEL +0 -0
- {kodit-0.1.16.dist-info → kodit-0.1.18.dist-info}/entry_points.txt +0 -0
- {kodit-0.1.16.dist-info → kodit-0.1.18.dist-info}/licenses/LICENSE +0 -0
kodit/_version.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
136
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
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(
|
|
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.
|
|
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.
|
|
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 ###
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
(import_statement
|
|
2
|
+
(import_clause
|
|
3
|
+
(named_imports
|
|
4
|
+
(import_specifier
|
|
5
|
+
name: (identifier) @import.name
|
|
6
|
+
)
|
|
7
|
+
)
|
|
8
|
+
)
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
(function_declaration
|
|
12
|
+
name: (identifier) @function.name
|
|
13
|
+
body: (statement_block) @function.body
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
(class_declaration
|
|
17
|
+
name: (identifier) @class.name
|
|
18
|
+
body: (class_body) @class.body
|
|
19
|
+
) @class.def
|
|
20
|
+
|
|
21
|
+
(method_definition
|
|
22
|
+
name: (property_identifier) @function.name
|
|
23
|
+
body: (statement_block) @function.body
|
|
24
|
+
)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
(import_statement
|
|
2
|
+
(import_clause
|
|
3
|
+
(named_imports
|
|
4
|
+
(import_specifier
|
|
5
|
+
name: (identifier) @import.name
|
|
6
|
+
)
|
|
7
|
+
)
|
|
8
|
+
)
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
(variable_declarator
|
|
12
|
+
name: (identifier) @function.name
|
|
13
|
+
value: (arrow_function
|
|
14
|
+
body: (statement_block) @function.body
|
|
15
|
+
)
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
(class_declaration
|
|
19
|
+
name: (type_identifier) @class.name
|
|
20
|
+
) @class.def
|
|
21
|
+
|
|
22
|
+
(method_definition
|
|
23
|
+
name: (property_identifier) @function.name
|
|
24
|
+
body: (statement_block) @function.body
|
|
25
|
+
)
|
kodit/source/source_models.py
CHANGED
|
@@ -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.18
|
|
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
|
+
[](https://docs.helix.ml/kodit/)
|
|
67
|
+
[](./LICENSE)
|
|
68
|
+
[](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=
|
|
3
|
+
kodit/_version.py,sha256=mhAYdSWzD7l6mXhR3foHESbkj_QM4Asoa3WlsLLYkfM,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=
|
|
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=
|
|
39
|
-
kodit/indexing/indexing_service.py,sha256=
|
|
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,21 +44,24 @@ 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
|
|
50
51
|
kodit/snippets/languages/__init__.py,sha256=Bj5KKZSls2MQ8ZY1S_nHg447MgGZW-2WZM-oq6vjwwA,1187
|
|
51
52
|
kodit/snippets/languages/csharp.scm,sha256=gbBN4RiV1FBuTJF6orSnDFi8H9JwTw-d4piLJYsWUsc,222
|
|
52
53
|
kodit/snippets/languages/go.scm,sha256=SEX9mTOrhP2KiQW7oflDKkd21u5dK56QbJ4LvTDxY8A,533
|
|
54
|
+
kodit/snippets/languages/javascript.scm,sha256=Ini5TsVNmcBKQ8aL46a5Id9ut0g9UdmvmVqdMqRJtFk,446
|
|
53
55
|
kodit/snippets/languages/python.scm,sha256=ee85R9PBzwye3IMTE7-iVoKWd_ViU3EJISTyrFGrVeo,429
|
|
56
|
+
kodit/snippets/languages/typescript.scm,sha256=U-ujbbv4tylbUBj9wuhL-e5cW6hmgPCNs4xrIX3r_hE,448
|
|
54
57
|
kodit/source/__init__.py,sha256=1NTZyPdjThVQpZO1Mp1ColVsS7sqYanOVLqnoqV9Ipo,83
|
|
55
|
-
kodit/source/source_models.py,sha256=
|
|
58
|
+
kodit/source/source_models.py,sha256=kcC59XPSDDMth2mOYK3FakqTN0jxKFaTDch0ejyD9Sw,2446
|
|
56
59
|
kodit/source/source_repository.py,sha256=0EksMpoLzdkfe8S4eeCm4Sf7TuxsOzOzaF4BBsMYo-4,3163
|
|
57
60
|
kodit/source/source_service.py,sha256=u_GaH07ewakThQJRfT8O_yZ54A52qLtJuM1bF3xUT2A,9633
|
|
58
61
|
kodit/util/__init__.py,sha256=bPu6CtqDWCRGU7VgW2_aiQrCBi8G89FS6k1PjvDajJ0,37
|
|
59
62
|
kodit/util/spinner.py,sha256=R9bzrHtBiIH6IfLbmsIVHL53s8vg-tqW4lwGGALu4dw,1932
|
|
60
|
-
kodit-0.1.
|
|
61
|
-
kodit-0.1.
|
|
62
|
-
kodit-0.1.
|
|
63
|
-
kodit-0.1.
|
|
64
|
-
kodit-0.1.
|
|
63
|
+
kodit-0.1.18.dist-info/METADATA,sha256=uL7uiPnhJ3HZ97UaZCmybprmlQkGegMoUAbM0TWfnLs,5822
|
|
64
|
+
kodit-0.1.18.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
65
|
+
kodit-0.1.18.dist-info/entry_points.txt,sha256=hoTn-1aKyTItjnY91fnO-rV5uaWQLQ-Vi7V5et2IbHY,40
|
|
66
|
+
kodit-0.1.18.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
67
|
+
kodit-0.1.18.dist-info/RECORD,,
|
kodit-0.1.16.dist-info/METADATA
DELETED
|
@@ -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
|
|
File without changes
|
|
File without changes
|