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

Files changed (70) hide show
  1. kodit/_version.py +2 -2
  2. kodit/application/factories/code_indexing_factory.py +56 -29
  3. kodit/application/services/code_indexing_application_service.py +152 -118
  4. kodit/cli.py +14 -41
  5. kodit/domain/entities.py +268 -197
  6. kodit/domain/protocols.py +61 -0
  7. kodit/domain/services/embedding_service.py +1 -1
  8. kodit/domain/services/index_query_service.py +66 -0
  9. kodit/domain/services/index_service.py +282 -0
  10. kodit/domain/value_objects.py +143 -65
  11. kodit/infrastructure/cloning/git/working_copy.py +17 -8
  12. kodit/infrastructure/cloning/metadata.py +37 -67
  13. kodit/infrastructure/embedding/embedding_factory.py +1 -1
  14. kodit/infrastructure/embedding/local_vector_search_repository.py +1 -1
  15. kodit/infrastructure/embedding/vectorchord_vector_search_repository.py +1 -1
  16. kodit/infrastructure/enrichment/null_enrichment_provider.py +4 -10
  17. kodit/infrastructure/git/git_utils.py +1 -63
  18. kodit/infrastructure/ignore/ignore_pattern_provider.py +1 -2
  19. kodit/infrastructure/indexing/auto_indexing_service.py +2 -12
  20. kodit/infrastructure/indexing/fusion_service.py +1 -1
  21. kodit/infrastructure/mappers/__init__.py +1 -0
  22. kodit/infrastructure/mappers/index_mapper.py +344 -0
  23. kodit/infrastructure/slicing/__init__.py +1 -0
  24. kodit/infrastructure/slicing/language_detection_service.py +18 -0
  25. kodit/infrastructure/slicing/slicer.py +894 -0
  26. kodit/infrastructure/sqlalchemy/embedding_repository.py +1 -1
  27. kodit/infrastructure/sqlalchemy/entities.py +203 -0
  28. kodit/infrastructure/sqlalchemy/index_repository.py +579 -0
  29. kodit/mcp.py +0 -7
  30. kodit/migrations/env.py +1 -1
  31. kodit/migrations/versions/4073b33f9436_add_file_processing_flag.py +36 -0
  32. kodit/migrations/versions/4552eb3f23ce_add_summary.py +4 -4
  33. kodit/migrations/versions/7c3bbc2ab32b_add_embeddings_table.py +24 -16
  34. kodit/migrations/versions/85155663351e_initial.py +64 -48
  35. kodit/migrations/versions/c3f5137d30f5_index_all_the_things.py +20 -14
  36. kodit/utils/__init__.py +1 -0
  37. kodit/utils/path_utils.py +54 -0
  38. {kodit-0.3.2.dist-info → kodit-0.3.4.dist-info}/METADATA +9 -4
  39. kodit-0.3.4.dist-info/RECORD +89 -0
  40. kodit/domain/enums.py +0 -9
  41. kodit/domain/repositories.py +0 -128
  42. kodit/domain/services/ignore_service.py +0 -45
  43. kodit/domain/services/indexing_service.py +0 -204
  44. kodit/domain/services/snippet_extraction_service.py +0 -89
  45. kodit/domain/services/snippet_service.py +0 -215
  46. kodit/domain/services/source_service.py +0 -85
  47. kodit/infrastructure/cloning/folder/__init__.py +0 -1
  48. kodit/infrastructure/cloning/folder/factory.py +0 -128
  49. kodit/infrastructure/cloning/folder/working_copy.py +0 -38
  50. kodit/infrastructure/cloning/git/factory.py +0 -153
  51. kodit/infrastructure/indexing/index_repository.py +0 -286
  52. kodit/infrastructure/indexing/snippet_domain_service_factory.py +0 -37
  53. kodit/infrastructure/snippet_extraction/__init__.py +0 -1
  54. kodit/infrastructure/snippet_extraction/language_detection_service.py +0 -39
  55. kodit/infrastructure/snippet_extraction/languages/csharp.scm +0 -12
  56. kodit/infrastructure/snippet_extraction/languages/go.scm +0 -26
  57. kodit/infrastructure/snippet_extraction/languages/java.scm +0 -12
  58. kodit/infrastructure/snippet_extraction/languages/javascript.scm +0 -24
  59. kodit/infrastructure/snippet_extraction/languages/python.scm +0 -22
  60. kodit/infrastructure/snippet_extraction/languages/typescript.scm +0 -25
  61. kodit/infrastructure/snippet_extraction/snippet_extraction_factory.py +0 -67
  62. kodit/infrastructure/snippet_extraction/snippet_query_provider.py +0 -45
  63. kodit/infrastructure/snippet_extraction/tree_sitter_snippet_extractor.py +0 -182
  64. kodit/infrastructure/sqlalchemy/file_repository.py +0 -78
  65. kodit/infrastructure/sqlalchemy/repository.py +0 -133
  66. kodit/infrastructure/sqlalchemy/snippet_repository.py +0 -259
  67. kodit-0.3.2.dist-info/RECORD +0 -103
  68. {kodit-0.3.2.dist-info → kodit-0.3.4.dist-info}/WHEEL +0 -0
  69. {kodit-0.3.2.dist-info → kodit-0.3.4.dist-info}/entry_points.txt +0 -0
  70. {kodit-0.3.2.dist-info → kodit-0.3.4.dist-info}/licenses/LICENSE +0 -0
@@ -14,8 +14,8 @@ import sqlalchemy as sa
14
14
 
15
15
 
16
16
  # revision identifiers, used by Alembic.
17
- revision: str = '7c3bbc2ab32b'
18
- down_revision: Union[str, None] = '85155663351e'
17
+ revision: str = "7c3bbc2ab32b"
18
+ down_revision: Union[str, None] = "85155663351e"
19
19
  branch_labels: Union[str, Sequence[str], None] = None
20
20
  depends_on: Union[str, Sequence[str], None] = None
21
21
 
@@ -23,25 +23,33 @@ depends_on: Union[str, Sequence[str], None] = None
23
23
  def upgrade() -> None:
24
24
  """Upgrade schema."""
25
25
  # ### commands auto generated by Alembic - please adjust! ###
26
- op.create_table('embeddings',
27
- sa.Column('snippet_id', sa.Integer(), nullable=False),
28
- sa.Column('type', sa.Enum('CODE', 'TEXT', name='embeddingtype'), nullable=False),
29
- sa.Column('embedding', sa.JSON(), nullable=False),
30
- sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
31
- sa.Column('created_at', sa.DateTime(), nullable=False),
32
- sa.Column('updated_at', sa.DateTime(), nullable=False),
33
- sa.ForeignKeyConstraint(['snippet_id'], ['snippets.id'], ),
34
- sa.PrimaryKeyConstraint('id')
26
+ op.create_table(
27
+ "embeddings",
28
+ sa.Column("snippet_id", sa.Integer(), nullable=False),
29
+ sa.Column(
30
+ "type", sa.Enum("CODE", "TEXT", name="embeddingtype"), nullable=False
31
+ ),
32
+ sa.Column("embedding", sa.JSON(), nullable=False),
33
+ sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
34
+ sa.Column("created_at", sa.DateTime(), nullable=False),
35
+ sa.Column("updated_at", sa.DateTime(), nullable=False),
36
+ sa.ForeignKeyConstraint(
37
+ ["snippet_id"],
38
+ ["snippets.id"],
39
+ ),
40
+ sa.PrimaryKeyConstraint("id"),
35
41
  )
36
- op.create_index(op.f('ix_embeddings_snippet_id'), 'embeddings', ['snippet_id'], unique=False)
37
- op.create_index(op.f('ix_embeddings_type'), 'embeddings', ['type'], unique=False)
42
+ op.create_index(
43
+ op.f("ix_embeddings_snippet_id"), "embeddings", ["snippet_id"], unique=False
44
+ )
45
+ op.create_index(op.f("ix_embeddings_type"), "embeddings", ["type"], unique=False)
38
46
  # ### end Alembic commands ###
39
47
 
40
48
 
41
49
  def downgrade() -> None:
42
50
  """Downgrade schema."""
43
51
  # ### commands auto generated by Alembic - please adjust! ###
44
- op.drop_index(op.f('ix_embeddings_type'), table_name='embeddings')
45
- op.drop_index(op.f('ix_embeddings_snippet_id'), table_name='embeddings')
46
- op.drop_table('embeddings')
52
+ op.drop_index(op.f("ix_embeddings_type"), table_name="embeddings")
53
+ op.drop_index(op.f("ix_embeddings_snippet_id"), table_name="embeddings")
54
+ op.drop_table("embeddings")
47
55
  # ### end Alembic commands ###
@@ -2,7 +2,7 @@
2
2
  """initial
3
3
 
4
4
  Revision ID: 85155663351e
5
- Revises:
5
+ Revises:
6
6
  Create Date: 2025-05-08 13:45:16.687162
7
7
 
8
8
  """
@@ -14,7 +14,7 @@ import sqlalchemy as sa
14
14
 
15
15
 
16
16
  # revision identifiers, used by Alembic.
17
- revision: str = '85155663351e'
17
+ revision: str = "85155663351e"
18
18
  down_revision: Union[str, None] = None
19
19
  branch_labels: Union[str, Sequence[str], None] = None
20
20
  depends_on: Union[str, Sequence[str], None] = None
@@ -23,48 +23,64 @@ depends_on: Union[str, Sequence[str], None] = None
23
23
  def upgrade() -> None:
24
24
  """Upgrade schema."""
25
25
  # ### commands auto generated by Alembic - please adjust! ###
26
- op.create_table('sources',
27
- sa.Column('uri', sa.String(length=1024), nullable=False),
28
- sa.Column('cloned_path', sa.String(length=1024), nullable=False),
29
- sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
30
- sa.Column('created_at', sa.DateTime(), nullable=False),
31
- sa.Column('updated_at', sa.DateTime(), nullable=False),
32
- sa.PrimaryKeyConstraint('id')
26
+ op.create_table(
27
+ "sources",
28
+ sa.Column("uri", sa.String(length=1024), nullable=False),
29
+ sa.Column("cloned_path", sa.String(length=1024), nullable=False),
30
+ sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
31
+ sa.Column("created_at", sa.DateTime(), nullable=False),
32
+ sa.Column("updated_at", sa.DateTime(), nullable=False),
33
+ sa.PrimaryKeyConstraint("id"),
33
34
  )
34
- op.create_index(op.f('ix_sources_uri'), 'sources', ['uri'], unique=True)
35
- op.create_table('files',
36
- sa.Column('source_id', sa.Integer(), nullable=False),
37
- sa.Column('mime_type', sa.String(length=255), nullable=False),
38
- sa.Column('uri', sa.String(length=1024), nullable=False),
39
- sa.Column('cloned_path', sa.String(length=1024), nullable=False),
40
- sa.Column('sha256', sa.String(length=64), nullable=False),
41
- sa.Column('size_bytes', sa.Integer(), nullable=False),
42
- sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
43
- sa.Column('created_at', sa.DateTime(), nullable=False),
44
- sa.Column('updated_at', sa.DateTime(), nullable=False),
45
- sa.ForeignKeyConstraint(['source_id'], ['sources.id'], ),
46
- sa.PrimaryKeyConstraint('id')
35
+ op.create_index(op.f("ix_sources_uri"), "sources", ["uri"], unique=True)
36
+ op.create_table(
37
+ "files",
38
+ sa.Column("source_id", sa.Integer(), nullable=False),
39
+ sa.Column("mime_type", sa.String(length=255), nullable=False),
40
+ sa.Column("uri", sa.String(length=1024), nullable=False),
41
+ sa.Column("cloned_path", sa.String(length=1024), nullable=False),
42
+ sa.Column("sha256", sa.String(length=64), nullable=False),
43
+ sa.Column("size_bytes", sa.Integer(), nullable=False),
44
+ sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
45
+ sa.Column("created_at", sa.DateTime(), nullable=False),
46
+ sa.Column("updated_at", sa.DateTime(), nullable=False),
47
+ sa.ForeignKeyConstraint(
48
+ ["source_id"],
49
+ ["sources.id"],
50
+ ),
51
+ sa.PrimaryKeyConstraint("id"),
47
52
  )
48
- op.create_index(op.f('ix_files_sha256'), 'files', ['sha256'], unique=False)
49
- op.create_table('indexes',
50
- sa.Column('source_id', sa.Integer(), nullable=False),
51
- sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
52
- sa.Column('created_at', sa.DateTime(), nullable=False),
53
- sa.Column('updated_at', sa.DateTime(), nullable=False),
54
- sa.ForeignKeyConstraint(['source_id'], ['sources.id'], ),
55
- sa.PrimaryKeyConstraint('id')
53
+ op.create_index(op.f("ix_files_sha256"), "files", ["sha256"], unique=False)
54
+ op.create_table(
55
+ "indexes",
56
+ sa.Column("source_id", sa.Integer(), nullable=False),
57
+ sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
58
+ sa.Column("created_at", sa.DateTime(), nullable=False),
59
+ sa.Column("updated_at", sa.DateTime(), nullable=False),
60
+ sa.ForeignKeyConstraint(
61
+ ["source_id"],
62
+ ["sources.id"],
63
+ ),
64
+ sa.PrimaryKeyConstraint("id"),
56
65
  )
57
- op.create_index(op.f('ix_indexes_source_id'), 'indexes', ['source_id'], unique=True)
58
- op.create_table('snippets',
59
- sa.Column('file_id', sa.Integer(), nullable=False),
60
- sa.Column('index_id', sa.Integer(), nullable=False),
61
- sa.Column('content', sa.UnicodeText(), nullable=False),
62
- sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
63
- sa.Column('created_at', sa.DateTime(), nullable=False),
64
- sa.Column('updated_at', sa.DateTime(), nullable=False),
65
- sa.ForeignKeyConstraint(['file_id'], ['files.id'], ),
66
- sa.ForeignKeyConstraint(['index_id'], ['indexes.id'], ),
67
- sa.PrimaryKeyConstraint('id')
66
+ op.create_index(op.f("ix_indexes_source_id"), "indexes", ["source_id"], unique=True)
67
+ op.create_table(
68
+ "snippets",
69
+ sa.Column("file_id", sa.Integer(), nullable=False),
70
+ sa.Column("index_id", sa.Integer(), nullable=False),
71
+ sa.Column("content", sa.UnicodeText(), nullable=False),
72
+ sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
73
+ sa.Column("created_at", sa.DateTime(), nullable=False),
74
+ sa.Column("updated_at", sa.DateTime(), nullable=False),
75
+ sa.ForeignKeyConstraint(
76
+ ["file_id"],
77
+ ["files.id"],
78
+ ),
79
+ sa.ForeignKeyConstraint(
80
+ ["index_id"],
81
+ ["indexes.id"],
82
+ ),
83
+ sa.PrimaryKeyConstraint("id"),
68
84
  )
69
85
  # ### end Alembic commands ###
70
86
 
@@ -72,11 +88,11 @@ def upgrade() -> None:
72
88
  def downgrade() -> None:
73
89
  """Downgrade schema."""
74
90
  # ### commands auto generated by Alembic - please adjust! ###
75
- op.drop_table('snippets')
76
- op.drop_index(op.f('ix_indexes_source_id'), table_name='indexes')
77
- op.drop_table('indexes')
78
- op.drop_index(op.f('ix_files_sha256'), table_name='files')
79
- op.drop_table('files')
80
- op.drop_index(op.f('ix_sources_uri'), table_name='sources')
81
- op.drop_table('sources')
91
+ op.drop_table("snippets")
92
+ op.drop_index(op.f("ix_indexes_source_id"), table_name="indexes")
93
+ op.drop_table("indexes")
94
+ op.drop_index(op.f("ix_files_sha256"), table_name="files")
95
+ op.drop_table("files")
96
+ op.drop_index(op.f("ix_sources_uri"), table_name="sources")
97
+ op.drop_table("sources")
82
98
  # ### end Alembic commands ###
@@ -14,8 +14,8 @@ import sqlalchemy as sa
14
14
 
15
15
 
16
16
  # revision identifiers, used by Alembic.
17
- revision: str = 'c3f5137d30f5'
18
- down_revision: Union[str, None] = '7c3bbc2ab32b'
17
+ revision: str = "c3f5137d30f5"
18
+ down_revision: Union[str, None] = "7c3bbc2ab32b"
19
19
  branch_labels: Union[str, Sequence[str], None] = None
20
20
  depends_on: Union[str, Sequence[str], None] = None
21
21
 
@@ -23,22 +23,28 @@ depends_on: Union[str, Sequence[str], None] = None
23
23
  def upgrade() -> None:
24
24
  """Upgrade schema."""
25
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)
26
+ op.create_index(
27
+ op.f("ix_files_cloned_path"), "files", ["cloned_path"], unique=False
28
+ )
29
+ op.create_index(op.f("ix_files_mime_type"), "files", ["mime_type"], unique=False)
30
+ op.create_index(op.f("ix_files_uri"), "files", ["uri"], unique=False)
31
+ op.create_index(op.f("ix_snippets_file_id"), "snippets", ["file_id"], unique=False)
32
+ op.create_index(
33
+ op.f("ix_snippets_index_id"), "snippets", ["index_id"], unique=False
34
+ )
35
+ op.create_index(
36
+ op.f("ix_sources_cloned_path"), "sources", ["cloned_path"], unique=False
37
+ )
32
38
  # ### end Alembic commands ###
33
39
 
34
40
 
35
41
  def downgrade() -> None:
36
42
  """Downgrade schema."""
37
43
  # ### 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
+ op.drop_index(op.f("ix_sources_cloned_path"), table_name="sources")
45
+ op.drop_index(op.f("ix_snippets_index_id"), table_name="snippets")
46
+ op.drop_index(op.f("ix_snippets_file_id"), table_name="snippets")
47
+ op.drop_index(op.f("ix_files_uri"), table_name="files")
48
+ op.drop_index(op.f("ix_files_mime_type"), table_name="files")
49
+ op.drop_index(op.f("ix_files_cloned_path"), table_name="files")
44
50
  # ### end Alembic commands ###
@@ -0,0 +1 @@
1
+ """Utility modules for Kodit."""
@@ -0,0 +1,54 @@
1
+ """Path utilities for Python compatibility."""
2
+
3
+ import sys
4
+ from pathlib import Path
5
+ from urllib.parse import urlparse
6
+ from urllib.request import url2pathname
7
+
8
+
9
+ def path_from_uri(uri: str) -> Path:
10
+ """Convert a file URI to a Path object.
11
+
12
+ This provides backwards compatibility for Path.from_uri which is only
13
+ available in Python 3.13+.
14
+
15
+ Args:
16
+ uri: File URI string (e.g., "file:///path/to/file")
17
+
18
+ Returns:
19
+ Path object representing the file path
20
+
21
+ Raises:
22
+ ValueError: If the URI is not a valid file URI
23
+
24
+ """
25
+ if sys.version_info >= (3, 13):
26
+ # For Python 3.13+, delegate to the standard library but catch its ValueError
27
+ # and re-raise with our format for consistency
28
+ try:
29
+ return Path.from_uri(uri)
30
+ except ValueError as e:
31
+ # Re-parse to get our own error format
32
+ parsed = urlparse(uri)
33
+ if not parsed.scheme:
34
+ raise ValueError("Expected file URI, got scheme: ") from e
35
+ if parsed.scheme != "file":
36
+ raise ValueError(
37
+ f"Expected file URI, got scheme: {parsed.scheme}"
38
+ ) from e
39
+ # Re-raise original error if it's something else
40
+ raise
41
+
42
+ # Manual implementation for Python 3.12 and earlier
43
+ parsed = urlparse(uri)
44
+
45
+ if not parsed.scheme:
46
+ raise ValueError("Expected file URI, got scheme: ")
47
+
48
+ if parsed.scheme != "file":
49
+ raise ValueError(f"Expected file URI, got scheme: {parsed.scheme}")
50
+
51
+ # Convert URL path to local path
52
+ path_str = url2pathname(parsed.path)
53
+
54
+ return Path(path_str)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kodit
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: Code indexing for better AI code generation
5
5
  Project-URL: Homepage, https://docs.helixml.tech/kodit/
6
6
  Project-URL: Documentation, https://docs.helixml.tech/kodit/
@@ -92,13 +92,16 @@ code. This index is used to build a snippet library, ready for ingestion into an
92
92
 
93
93
  - Index local directories and public Git repositories
94
94
  - Build comprehensive snippet libraries for LLM ingestion
95
- - Support for multiple codebase types and languages
96
- - Efficient indexing and search capabilities
95
+ - Support for 20+ programming languages including Python, JavaScript/TypeScript, Java, Go, Rust, C/C++, C#, HTML/CSS, and more
96
+ - Advanced code analysis with dependency tracking and call graph generation
97
+ - Intelligent snippet extraction with context-aware dependencies
98
+ - Efficient indexing with selective reindexing (only processes modified files)
97
99
  - Privacy first: respects .gitignore and .noindex files
98
100
  - **NEW in 0.3**: Auto-indexing configuration for shared server deployments
99
101
  - **NEW in 0.3**: Enhanced Git provider support including Azure DevOps
100
102
  - **NEW in 0.3**: Index private repositories via a PAT
101
103
  - **NEW in 0.3**: Improved progress monitoring and reporting during indexing
104
+ - **NEW in 0.3**: Advanced code slicing infrastructure with Tree-sitter parsing
102
105
 
103
106
  ### MCP Server
104
107
 
@@ -111,7 +114,9 @@ intent. Kodit has been tested to work well with:
111
114
  - [Cursor](https://docs.helix.ml/kodit/getting-started/integration/#integration-with-cursor)
112
115
  - [Cline](https://docs.helix.ml/kodit/getting-started/integration/#integration-with-cline)
113
116
  - Please contribute more instructions! ... any other assistant is likely to work ...
114
- - **New in 0.3**: Filter snippets by source, language, author or timestamp.
117
+ - **New in 0.3**: Advanced search filters by source, language, author, date range, and file path
118
+ - **New in 0.3**: Hybrid search combining BM25 keyword search with semantic search
119
+ - **New in 0.4**: Enhanced MCP tools with rich context parameters and metadata
115
120
 
116
121
  ### Enterprise Ready
117
122
 
@@ -0,0 +1,89 @@
1
+ kodit/.gitignore,sha256=ztkjgRwL9Uud1OEi36hGQeDGk3OLK1NfDEO8YqGYy8o,11
2
+ kodit/__init__.py,sha256=aEKHYninUq1yh6jaNfvJBYg-6fenpN132nJt1UU6Jxs,59
3
+ kodit/_version.py,sha256=Mxups7YfGBY2vvCok_hLJKCtU6O1WHQJfsMY-bAJ0Yg,511
4
+ kodit/app.py,sha256=uv67TE83fZE7wrA7cz-sKosFrAXlKRr1B7fT-X_gMZQ,2103
5
+ kodit/cli.py,sha256=xh2MNA4sUTA3_yVbHGz-CRpbS0TTzKwf33XbScA74Gw,16626
6
+ kodit/config.py,sha256=VUoUi2t2yGhqOtm5MSZuaasNSklH50hfWn6GOrz3jnU,7518
7
+ kodit/database.py,sha256=kI9yBm4uunsgV4-QeVoCBL0wLzU4kYmYv5qZilGnbPE,1740
8
+ kodit/log.py,sha256=WOsLRitpCBtJa5IcsyZpKr146kXXHK2nU5VA90gcJdQ,8736
9
+ kodit/mcp.py,sha256=OPscMbGQ05nFHJ_UkntobocZ6Y9wO2ZyRx1tVj7XSsY,6016
10
+ kodit/middleware.py,sha256=I6FOkqG9-8RH5kR1-0ZoQWfE4qLCB8lZYv8H_OCH29o,2714
11
+ kodit/reporting.py,sha256=icce1ZyiADsA_Qz-mSjgn2H4SSqKuGfLKnw-yrl9nsg,2722
12
+ kodit/application/__init__.py,sha256=mH50wTpgP9dhbKztFsL8Dda9Hi18TSnMVxXtpp4aGOA,35
13
+ kodit/application/factories/__init__.py,sha256=bU5CvEnaBePZ7JbkCOp1MGTNP752bnU2uEqmfy5FdRk,37
14
+ kodit/application/factories/code_indexing_factory.py,sha256=R9f0wsj4-3NJFS5SEt_-OIGR_s_01gJXaL3PkZd8MlU,5911
15
+ kodit/application/services/__init__.py,sha256=p5UQNw-H5sxQvs5Etfte93B3cJ1kKW6DNxK34uFvU1E,38
16
+ kodit/application/services/code_indexing_application_service.py,sha256=SuIuyBoSPOSjj5VaXIbxcYqaTEeMuUCu7w1tO8orrOY,14656
17
+ kodit/domain/__init__.py,sha256=TCpg4Xx-oF4mKV91lo4iXqMEfBT1OoRSYnbG-zVWolA,66
18
+ kodit/domain/entities.py,sha256=Mcku1Wmk3Xl3YJhY65_RoiLeffOLKOHI0uCAXWJrmvQ,8698
19
+ kodit/domain/errors.py,sha256=yIsgCjM_yOFIg8l7l-t7jM8pgeAX4cfPq0owf7iz3DA,106
20
+ kodit/domain/interfaces.py,sha256=Jkd0Ob4qSvhZHI9jRPFQ1n5Cv0SvU-y3Z-HCw2ikc4I,742
21
+ kodit/domain/protocols.py,sha256=L94FwChhCoj39xicaVrK2UFhFbPzi5JEXW_KmgODsLA,1859
22
+ kodit/domain/value_objects.py,sha256=MBZ0WdqQghDmL0Coz_QjPMoVMCiL8pjtpJ5FgaIynoc,17342
23
+ kodit/domain/services/__init__.py,sha256=Q1GhCK_PqKHYwYE4tkwDz5BIyXkJngLBBOHhzvX8nzo,42
24
+ kodit/domain/services/bm25_service.py,sha256=nsfTan3XtDwXuuAu1LUv-6Jukm6qFKVqqCVymjyepZQ,3625
25
+ kodit/domain/services/embedding_service.py,sha256=7drYRC2kjg0WJmo06a2E9N0vDnwInUlBB96twjz2BT8,4526
26
+ kodit/domain/services/enrichment_service.py,sha256=XsXg3nV-KN4rqtC7Zro_ZiZ6RSq-1eA1MG6IDzFGyBA,1316
27
+ kodit/domain/services/index_query_service.py,sha256=02UWfyB_HoHUskunGuHeq5XwQLSWxGSK4OhvxcqIfY0,2022
28
+ kodit/domain/services/index_service.py,sha256=ezVGbWdII25adri4_yyvsAF2eJOt4xmoHRDuS_-c6Ro,10810
29
+ kodit/infrastructure/__init__.py,sha256=HzEYIjoXnkz_i_MHO2e0sIVYweUcRnl2RpyBiTbMObU,28
30
+ kodit/infrastructure/bm25/__init__.py,sha256=DmGbrEO34FOJy4e685BbyxLA7gPW1eqs2gAxsp6JOuM,34
31
+ kodit/infrastructure/bm25/bm25_factory.py,sha256=I4eo7qRslnyXIRkBf-StZ5ga2Evrr5J5YFocTChFD3g,884
32
+ kodit/infrastructure/bm25/local_bm25_repository.py,sha256=B1ggfHdjC9sFIh62MmSul2tsutWsWFQx5S1Xn07X_I8,4531
33
+ kodit/infrastructure/bm25/vectorchord_bm25_repository.py,sha256=Jyic55V-38XeTad462Ge751iKyc0X8RNVBM9pr_DVJk,7439
34
+ kodit/infrastructure/cloning/__init__.py,sha256=IzIvX-yeRRFZ-lfvPVSEe_qXszO6DGQdjKwwDigexyQ,30
35
+ kodit/infrastructure/cloning/metadata.py,sha256=GD2UnCC1oR82RD0SVUqk9CJOqzXPxhOAHVOp7jqN6Qc,3571
36
+ kodit/infrastructure/cloning/git/__init__.py,sha256=20ePcp0qE6BuLsjsv4KYB1DzKhMIMsPXwEqIEZtjTJs,34
37
+ kodit/infrastructure/cloning/git/working_copy.py,sha256=SvaLAJa7FRsLuWjJz-xUeTJ-EkpPi_rIOP-gyuHLIdM,1835
38
+ kodit/infrastructure/embedding/__init__.py,sha256=F-8nLlWAerYJ0MOIA4tbXHLan8bW5rRR84vzxx6tRKI,39
39
+ kodit/infrastructure/embedding/embedding_factory.py,sha256=A6if4XW7Kp-23qrWlLLNyhijwxZLxmhcyCX-ayvQKY4,3451
40
+ kodit/infrastructure/embedding/local_vector_search_repository.py,sha256=ExweyNEL5cP-g3eDhGqZSih7zhdOrop2WdFPPJL-tB4,3505
41
+ kodit/infrastructure/embedding/vectorchord_vector_search_repository.py,sha256=PIoU0HsDlaoXDXnGjOR0LAkAcW4JiE3ymJy_SBhEopc,8030
42
+ kodit/infrastructure/embedding/embedding_providers/__init__.py,sha256=qeZ-oAIAxMl5QqebGtO1lq-tHjl_ucAwOXePklcwwGk,34
43
+ kodit/infrastructure/embedding/embedding_providers/batching.py,sha256=a8CL9PX2VLmbeg616fc_lQzfC4BWTVn32m4SEhXpHxc,3279
44
+ kodit/infrastructure/embedding/embedding_providers/hash_embedding_provider.py,sha256=V6OdCuWyQQOvo3OJGRi-gBKDApIcrELydFg7T696P5s,2257
45
+ kodit/infrastructure/embedding/embedding_providers/local_embedding_provider.py,sha256=U5fc8jUP8wF-nq1zo-CfSbJbLQyE-3muKmRCaYGtytk,4387
46
+ kodit/infrastructure/embedding/embedding_providers/openai_embedding_provider.py,sha256=LIK9Iir7geraZoqiaNbeHv3hXrghZRDpYGJDEjZaqzQ,4086
47
+ kodit/infrastructure/enrichment/__init__.py,sha256=8acZKNzql8Fs0lceFu9U3KoUrOptRBtVIxr_Iw6lz3Y,40
48
+ kodit/infrastructure/enrichment/enrichment_factory.py,sha256=Pz0Rb1I68udL_zXY3KvJ3LR3aK_9mdF1nMRGQUu4lM0,1828
49
+ kodit/infrastructure/enrichment/local_enrichment_provider.py,sha256=8CATNtgMHgBRt24GrYEwaZKrroNCxMJS-39xQJoG3N0,3818
50
+ kodit/infrastructure/enrichment/null_enrichment_provider.py,sha256=DhZkJBnkvXg_XSAs-oKiFnKqYFPnmTl3ikdxrqeEfbc,713
51
+ kodit/infrastructure/enrichment/openai_enrichment_provider.py,sha256=fenq4HiJ2UkrzsE2D0A0qpmro38z9mKaIzKKU5v7hnY,3189
52
+ kodit/infrastructure/git/__init__.py,sha256=0iMosFzudj4_xNIMe2SRbV6l5bWqkjnUsZoFsoZFuM8,33
53
+ kodit/infrastructure/git/git_utils.py,sha256=KERwmhWDR4ooMQKS-nSPxjvdCzoWF9NS6nhdeXyzdtY,571
54
+ kodit/infrastructure/ignore/__init__.py,sha256=VzFv8XOzHmsu0MEGnWVSF6KsgqLBmvHlRqAkT1Xb1MY,36
55
+ kodit/infrastructure/ignore/ignore_pattern_provider.py,sha256=zdxun3GodLfXxyssBK8QDUK58xb4fBJ0SKcHUyn3pzM,2131
56
+ kodit/infrastructure/indexing/__init__.py,sha256=7UPRa2jwCAsa0Orsp6PqXSF8iIXJVzXHMFmrKkI9yH8,38
57
+ kodit/infrastructure/indexing/auto_indexing_service.py,sha256=PgAyrmR8jNkAOlGnhQjFkqoE22oh-IwYTCg_v4o45Fo,2764
58
+ kodit/infrastructure/indexing/fusion_service.py,sha256=2B0guBsuKz19uWcs18sIJpUJPzXoRvULgl7UNWQGysA,1809
59
+ kodit/infrastructure/indexing/indexing_factory.py,sha256=LPjPCps_wJ9M_fZGRP02bfc2pvYc50ZSTYI99XwRRPg,918
60
+ kodit/infrastructure/mappers/__init__.py,sha256=QPHOjNreXmBPPovZ6elnYFS0vD-IsmrGl4TT01FCKro,77
61
+ kodit/infrastructure/mappers/index_mapper.py,sha256=ZSfu8kjTaa8_UY0nTqr4b02NS3VrjqZYkduCN71AL2g,12743
62
+ kodit/infrastructure/slicing/__init__.py,sha256=x7cjvHA9Ay2weUYE_dpdAaPaStp20M-4U2b5MLgT5KM,37
63
+ kodit/infrastructure/slicing/language_detection_service.py,sha256=JGJXrq9bLyfnisWJXeP7y1jbZMmKAISdPBlRBCosUcE,684
64
+ kodit/infrastructure/slicing/slicer.py,sha256=Q5Syhe2KmYoCPvgP03XA6X0LVzrFgVyttRLEDHNrUSU,34305
65
+ kodit/infrastructure/sqlalchemy/__init__.py,sha256=UXPMSF_hgWaqr86cawRVqM8XdVNumQyyK5B8B97GnlA,33
66
+ kodit/infrastructure/sqlalchemy/embedding_repository.py,sha256=dC2Wzj_zQiWExwfScE1LAGiiyxPyg0YepwyLOgDwcs4,7905
67
+ kodit/infrastructure/sqlalchemy/entities.py,sha256=Dmh0z-dMI0wfMAPpf62kxU4md6NUH9P5Nx1QSTITOfg,5961
68
+ kodit/infrastructure/sqlalchemy/index_repository.py,sha256=fMnR3OxZN37dtp1M2Menf0xy31GjK1iv_0zn7EvRKYs,22575
69
+ kodit/infrastructure/ui/__init__.py,sha256=CzbLOBwIZ6B6iAHEd1L8cIBydCj-n_kobxJAhz2I9_Y,32
70
+ kodit/infrastructure/ui/progress.py,sha256=BaAeMEgXlSSb0c_t_NPxnThIktkzzCS9kegb5ExULJs,4791
71
+ kodit/infrastructure/ui/spinner.py,sha256=GcP115qtR0VEnGfMEtsGoAUpRzVGUSfiUXfoJJERngA,2357
72
+ kodit/migrations/README,sha256=ISVtAOvqvKk_5ThM5ioJE-lMkvf9IbknFUFVU_vPma4,58
73
+ kodit/migrations/__init__.py,sha256=lP5MuwlyWRMO6UcDWnQcQ3G-GYHcFb6rl9gYPHJ1sjo,40
74
+ kodit/migrations/env.py,sha256=m57TkFLYjQ4w2aw1YICXkeek27M6qjwRDMHvThWqIL0,2383
75
+ kodit/migrations/script.py.mako,sha256=zWziKtiwYKEWuwPV_HBNHwa9LCT45_bi01-uSNFaOOE,703
76
+ kodit/migrations/versions/4073b33f9436_add_file_processing_flag.py,sha256=c8dMcKQ-BBBr_2-92eJZFS3Fwe3__B2eNqvQeMZHs0w,917
77
+ kodit/migrations/versions/4552eb3f23ce_add_summary.py,sha256=WjyBQzFK8IXuvta15YBE23yaTMM1rZCXvPxW98MStng,870
78
+ kodit/migrations/versions/7c3bbc2ab32b_add_embeddings_table.py,sha256=JL6lxaYtGbXolrkNEujg5SWj3_aQBWReYP3I4vcibdo,1755
79
+ kodit/migrations/versions/85155663351e_initial.py,sha256=h8DWmSxVwTtWlmWNH8-S4AxfEIbCm_iWtR6Kg5psPnk,3605
80
+ kodit/migrations/versions/9e53ea8bb3b0_add_authors.py,sha256=a32Zm8KUQyiiLkjKNPYdaJDgjW6VsV-GhaLnPnK_fpI,3884
81
+ kodit/migrations/versions/__init__.py,sha256=9-lHzptItTzq_fomdIRBegQNm4Znx6pVjwD4MiqRIdo,36
82
+ kodit/migrations/versions/c3f5137d30f5_index_all_the_things.py,sha256=r7ukmJ_axXLAWewYx-F1fEmZ4JbtFd37i7cSb0tq3y0,1722
83
+ kodit/utils/__init__.py,sha256=DPEB1i8evnLF4Ns3huuAYg-0pKBFKUFuiDzOKG9r-sw,33
84
+ kodit/utils/path_utils.py,sha256=thK6YGGNvQThdBaCYCCeCvS1L8x-lwl3AoGht2jnjGw,1645
85
+ kodit-0.3.4.dist-info/METADATA,sha256=rZKGzihHJy8kShI8lybNHWbhB7z4knuoLGLZ3ba987w,6871
86
+ kodit-0.3.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
87
+ kodit-0.3.4.dist-info/entry_points.txt,sha256=hoTn-1aKyTItjnY91fnO-rV5uaWQLQ-Vi7V5et2IbHY,40
88
+ kodit-0.3.4.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
89
+ kodit-0.3.4.dist-info/RECORD,,
kodit/domain/enums.py DELETED
@@ -1,9 +0,0 @@
1
- """Domain enums."""
2
-
3
- from enum import Enum
4
-
5
-
6
- class SnippetExtractionStrategy(str, Enum):
7
- """Different strategies for extracting snippets from files."""
8
-
9
- METHOD_BASED = "method_based"
@@ -1,128 +0,0 @@
1
- """Domain repositories with generic patterns."""
2
-
3
- from collections.abc import Sequence
4
- from typing import Protocol, TypeVar
5
-
6
- from kodit.domain.entities import (
7
- Author,
8
- AuthorFileMapping,
9
- File,
10
- Snippet,
11
- Source,
12
- SourceType,
13
- )
14
- from kodit.domain.value_objects import (
15
- MultiSearchRequest,
16
- SnippetWithContext,
17
- )
18
-
19
- T = TypeVar("T")
20
-
21
-
22
- class GenericRepository(Protocol[T]):
23
- """Generic repository interface."""
24
-
25
- async def get(self, id: int) -> T | None: # noqa: A002
26
- """Get entity by ID."""
27
- ...
28
-
29
- async def save(self, entity: T) -> T:
30
- """Save entity."""
31
- ...
32
-
33
- async def delete(self, id: int) -> None: # noqa: A002
34
- """Delete entity by ID."""
35
- ...
36
-
37
- async def list(self) -> Sequence[T]:
38
- """List all entities."""
39
- ...
40
-
41
-
42
- class SourceRepository(GenericRepository[Source]):
43
- """Source repository with specific methods."""
44
-
45
- async def get_by_uri(self, uri: str) -> Source | None:
46
- """Get a source by URI."""
47
- raise NotImplementedError
48
-
49
- async def list_by_type(
50
- self, source_type: SourceType | None = None
51
- ) -> Sequence[Source]:
52
- """List sources by type."""
53
- raise NotImplementedError
54
-
55
- async def create_file(self, file: File) -> File:
56
- """Create a new file record."""
57
- raise NotImplementedError
58
-
59
- async def upsert_author(self, author: Author) -> Author:
60
- """Create a new author or return existing one if email already exists."""
61
- raise NotImplementedError
62
-
63
- async def upsert_author_file_mapping(
64
- self, mapping: "AuthorFileMapping"
65
- ) -> "AuthorFileMapping":
66
- """Create a new author file mapping or return existing one if already exists."""
67
- raise NotImplementedError
68
-
69
-
70
- class AuthorRepository(GenericRepository[Author]):
71
- """Author repository with specific methods."""
72
-
73
- async def get_by_name(self, name: str) -> Author | None:
74
- """Get an author by name."""
75
- raise NotImplementedError
76
-
77
- async def get_by_email(self, email: str) -> Author | None:
78
- """Get an author by email."""
79
- raise NotImplementedError
80
-
81
-
82
- class SnippetRepository(GenericRepository[Snippet]):
83
- """Snippet repository with specific methods."""
84
-
85
- async def get_by_index(self, index_id: int) -> Sequence[Snippet]:
86
- """Get all snippets for an index."""
87
- raise NotImplementedError
88
-
89
- async def delete_by_index(self, index_id: int) -> None:
90
- """Delete all snippets for an index."""
91
- raise NotImplementedError
92
-
93
- async def list_snippets(
94
- self, file_path: str | None = None, source_uri: str | None = None
95
- ) -> Sequence[SnippetWithContext]:
96
- """List snippets with optional filtering by file path and source URI.
97
-
98
- Args:
99
- file_path: Optional file or directory path to filter by. Can be relative
100
- (uri) or absolute (cloned_path).
101
- source_uri: Optional source URI to filter by. If None, returns snippets from
102
- all sources.
103
-
104
- Returns:
105
- A sequence of SnippetWithContext instances matching the criteria
106
-
107
- """
108
- raise NotImplementedError
109
-
110
- async def search(self, request: MultiSearchRequest) -> Sequence[SnippetWithContext]:
111
- """Search snippets with filters.
112
-
113
- Args:
114
- request: The search request containing queries and optional filters.
115
-
116
- Returns:
117
- A sequence of SnippetWithContext instances matching the search criteria.
118
-
119
- """
120
- raise NotImplementedError
121
-
122
-
123
- class FileRepository(GenericRepository[File]):
124
- """File repository with specific methods."""
125
-
126
- async def get_files_for_index(self, index_id: int) -> Sequence[File]:
127
- """Get all files for an index."""
128
- raise NotImplementedError
@@ -1,45 +0,0 @@
1
- """Domain service for ignore patterns."""
2
-
3
- from abc import ABC, abstractmethod
4
- from pathlib import Path
5
-
6
-
7
- class IgnorePatternProvider(ABC):
8
- """Abstract interface for ignore pattern providers."""
9
-
10
- @abstractmethod
11
- def should_ignore(self, path: Path) -> bool:
12
- """Check if a path should be ignored.
13
-
14
- Args:
15
- path: The path to check.
16
-
17
- Returns:
18
- True if the path should be ignored, False otherwise.
19
-
20
- """
21
-
22
-
23
- class IgnoreService:
24
- """Domain service for managing ignore patterns."""
25
-
26
- def __init__(self, ignore_pattern_provider: IgnorePatternProvider) -> None:
27
- """Initialize the ignore service.
28
-
29
- Args:
30
- ignore_pattern_provider: The ignore pattern provider to use.
31
-
32
- """
33
- self.ignore_pattern_provider = ignore_pattern_provider
34
-
35
- def should_ignore(self, path: Path) -> bool:
36
- """Check if a path should be ignored.
37
-
38
- Args:
39
- path: The path to check.
40
-
41
- Returns:
42
- True if the path should be ignored, False otherwise.
43
-
44
- """
45
- return self.ignore_pattern_provider.should_ignore(path)