kodit 0.4.3__py3-none-any.whl → 0.5.1__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/app.py +51 -23
- kodit/application/factories/reporting_factory.py +6 -2
- kodit/application/factories/server_factory.py +353 -0
- kodit/application/services/code_search_application_service.py +144 -0
- kodit/application/services/commit_indexing_application_service.py +700 -0
- kodit/application/services/indexing_worker_service.py +13 -44
- kodit/application/services/queue_service.py +24 -3
- kodit/application/services/reporting.py +0 -2
- kodit/application/services/sync_scheduler.py +15 -31
- kodit/cli.py +2 -753
- kodit/cli_utils.py +2 -9
- kodit/config.py +4 -97
- kodit/database.py +38 -1
- kodit/domain/enrichments/__init__.py +1 -0
- kodit/domain/enrichments/architecture/__init__.py +1 -0
- kodit/domain/enrichments/architecture/architecture.py +20 -0
- kodit/domain/enrichments/architecture/physical/__init__.py +1 -0
- kodit/domain/enrichments/architecture/physical/discovery_notes.py +14 -0
- kodit/domain/enrichments/architecture/physical/formatter.py +11 -0
- kodit/domain/enrichments/architecture/physical/physical.py +17 -0
- kodit/domain/enrichments/development/__init__.py +1 -0
- kodit/domain/enrichments/development/development.py +18 -0
- kodit/domain/enrichments/development/snippet/__init__.py +1 -0
- kodit/domain/enrichments/development/snippet/snippet.py +21 -0
- kodit/domain/enrichments/enricher.py +17 -0
- kodit/domain/enrichments/enrichment.py +39 -0
- kodit/domain/enrichments/request.py +12 -0
- kodit/domain/enrichments/response.py +11 -0
- kodit/domain/enrichments/usage/__init__.py +1 -0
- kodit/domain/enrichments/usage/api_docs.py +19 -0
- kodit/domain/enrichments/usage/usage.py +18 -0
- kodit/domain/{entities.py → entities/__init__.py} +50 -195
- kodit/domain/entities/git.py +190 -0
- kodit/domain/factories/__init__.py +1 -0
- kodit/domain/factories/git_repo_factory.py +76 -0
- kodit/domain/protocols.py +264 -64
- kodit/domain/services/bm25_service.py +5 -1
- kodit/domain/services/embedding_service.py +3 -0
- kodit/domain/services/enrichment_service.py +9 -30
- kodit/domain/services/git_repository_service.py +429 -0
- kodit/domain/services/git_service.py +300 -0
- kodit/domain/services/physical_architecture_service.py +182 -0
- kodit/domain/services/task_status_query_service.py +2 -2
- kodit/domain/value_objects.py +87 -135
- kodit/infrastructure/api/client/__init__.py +0 -2
- kodit/infrastructure/api/v1/__init__.py +0 -4
- kodit/infrastructure/api/v1/dependencies.py +92 -46
- kodit/infrastructure/api/v1/routers/__init__.py +0 -6
- kodit/infrastructure/api/v1/routers/commits.py +352 -0
- kodit/infrastructure/api/v1/routers/queue.py +2 -2
- kodit/infrastructure/api/v1/routers/repositories.py +282 -0
- kodit/infrastructure/api/v1/routers/search.py +31 -14
- kodit/infrastructure/api/v1/schemas/__init__.py +0 -24
- kodit/infrastructure/api/v1/schemas/commit.py +96 -0
- kodit/infrastructure/api/v1/schemas/context.py +2 -0
- kodit/infrastructure/api/v1/schemas/enrichment.py +29 -0
- kodit/infrastructure/api/v1/schemas/repository.py +128 -0
- kodit/infrastructure/api/v1/schemas/search.py +12 -9
- kodit/infrastructure/api/v1/schemas/snippet.py +58 -0
- kodit/infrastructure/api/v1/schemas/tag.py +31 -0
- kodit/infrastructure/api/v1/schemas/task_status.py +2 -0
- kodit/infrastructure/bm25/local_bm25_repository.py +16 -4
- kodit/infrastructure/bm25/vectorchord_bm25_repository.py +68 -52
- kodit/infrastructure/cloning/git/git_python_adaptor.py +534 -0
- kodit/infrastructure/cloning/git/working_copy.py +1 -1
- kodit/infrastructure/embedding/embedding_factory.py +3 -2
- kodit/infrastructure/embedding/local_vector_search_repository.py +1 -1
- kodit/infrastructure/embedding/vectorchord_vector_search_repository.py +111 -84
- kodit/infrastructure/enricher/__init__.py +1 -0
- kodit/infrastructure/enricher/enricher_factory.py +53 -0
- kodit/infrastructure/{enrichment/litellm_enrichment_provider.py → enricher/litellm_enricher.py} +36 -56
- kodit/infrastructure/{enrichment/local_enrichment_provider.py → enricher/local_enricher.py} +19 -24
- kodit/infrastructure/enricher/null_enricher.py +36 -0
- kodit/infrastructure/indexing/fusion_service.py +1 -1
- kodit/infrastructure/mappers/enrichment_mapper.py +83 -0
- kodit/infrastructure/mappers/git_mapper.py +193 -0
- kodit/infrastructure/mappers/snippet_mapper.py +104 -0
- kodit/infrastructure/mappers/task_mapper.py +5 -44
- kodit/infrastructure/physical_architecture/__init__.py +1 -0
- kodit/infrastructure/physical_architecture/detectors/__init__.py +1 -0
- kodit/infrastructure/physical_architecture/detectors/docker_compose_detector.py +336 -0
- kodit/infrastructure/physical_architecture/formatters/__init__.py +1 -0
- kodit/infrastructure/physical_architecture/formatters/narrative_formatter.py +149 -0
- kodit/infrastructure/reporting/log_progress.py +8 -5
- kodit/infrastructure/reporting/telemetry_progress.py +21 -0
- kodit/infrastructure/slicing/api_doc_extractor.py +836 -0
- kodit/infrastructure/slicing/ast_analyzer.py +1128 -0
- kodit/infrastructure/slicing/slicer.py +87 -421
- kodit/infrastructure/sqlalchemy/embedding_repository.py +43 -23
- kodit/infrastructure/sqlalchemy/enrichment_v2_repository.py +118 -0
- kodit/infrastructure/sqlalchemy/entities.py +402 -158
- kodit/infrastructure/sqlalchemy/git_branch_repository.py +274 -0
- kodit/infrastructure/sqlalchemy/git_commit_repository.py +346 -0
- kodit/infrastructure/sqlalchemy/git_repository.py +262 -0
- kodit/infrastructure/sqlalchemy/git_tag_repository.py +268 -0
- kodit/infrastructure/sqlalchemy/snippet_v2_repository.py +479 -0
- kodit/infrastructure/sqlalchemy/task_repository.py +29 -23
- kodit/infrastructure/sqlalchemy/task_status_repository.py +24 -12
- kodit/infrastructure/sqlalchemy/unit_of_work.py +10 -14
- kodit/mcp.py +12 -30
- kodit/migrations/env.py +1 -0
- kodit/migrations/versions/04b80f802e0c_foreign_key_review.py +100 -0
- kodit/migrations/versions/19f8c7faf8b9_add_generic_enrichment_type.py +260 -0
- kodit/migrations/versions/7f15f878c3a1_add_new_git_entities.py +690 -0
- kodit/migrations/versions/f9e5ef5e688f_add_git_commits_number.py +43 -0
- kodit/py.typed +0 -0
- kodit/utils/dump_config.py +361 -0
- kodit/utils/dump_openapi.py +6 -4
- kodit/utils/path_utils.py +29 -0
- {kodit-0.4.3.dist-info → kodit-0.5.1.dist-info}/METADATA +3 -3
- kodit-0.5.1.dist-info/RECORD +168 -0
- kodit/application/factories/code_indexing_factory.py +0 -195
- kodit/application/services/auto_indexing_service.py +0 -99
- kodit/application/services/code_indexing_application_service.py +0 -410
- kodit/domain/services/index_query_service.py +0 -70
- kodit/domain/services/index_service.py +0 -269
- kodit/infrastructure/api/client/index_client.py +0 -57
- kodit/infrastructure/api/v1/routers/indexes.py +0 -164
- kodit/infrastructure/api/v1/schemas/index.py +0 -101
- kodit/infrastructure/bm25/bm25_factory.py +0 -28
- kodit/infrastructure/cloning/__init__.py +0 -1
- kodit/infrastructure/cloning/metadata.py +0 -98
- kodit/infrastructure/enrichment/__init__.py +0 -1
- kodit/infrastructure/enrichment/enrichment_factory.py +0 -52
- kodit/infrastructure/enrichment/null_enrichment_provider.py +0 -19
- kodit/infrastructure/mappers/index_mapper.py +0 -345
- kodit/infrastructure/reporting/tdqm_progress.py +0 -38
- kodit/infrastructure/slicing/language_detection_service.py +0 -18
- kodit/infrastructure/sqlalchemy/index_repository.py +0 -646
- kodit-0.4.3.dist-info/RECORD +0 -125
- /kodit/infrastructure/{enrichment → enricher}/utils.py +0 -0
- {kodit-0.4.3.dist-info → kodit-0.5.1.dist-info}/WHEEL +0 -0
- {kodit-0.4.3.dist-info → kodit-0.5.1.dist-info}/entry_points.txt +0 -0
- {kodit-0.4.3.dist-info → kodit-0.5.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# ruff: noqa
|
|
2
|
+
"""add git commits number
|
|
3
|
+
|
|
4
|
+
Revision ID: f9e5ef5e688f
|
|
5
|
+
Revises: 04b80f802e0c
|
|
6
|
+
Create Date: 2025-09-23 10:55:15.553741
|
|
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 = "f9e5ef5e688f"
|
|
18
|
+
down_revision: Union[str, None] = "04b80f802e0c"
|
|
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
|
+
op.add_column(
|
|
26
|
+
"git_repos",
|
|
27
|
+
sa.Column("num_commits", sa.Integer(), nullable=False, server_default="0"),
|
|
28
|
+
)
|
|
29
|
+
op.add_column(
|
|
30
|
+
"git_repos",
|
|
31
|
+
sa.Column("num_branches", sa.Integer(), nullable=False, server_default="0"),
|
|
32
|
+
)
|
|
33
|
+
op.add_column(
|
|
34
|
+
"git_repos",
|
|
35
|
+
sa.Column("num_tags", sa.Integer(), nullable=False, server_default="0"),
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def downgrade() -> None:
|
|
40
|
+
"""Downgrade schema."""
|
|
41
|
+
op.drop_column("git_repos", "num_commits")
|
|
42
|
+
op.drop_column("git_repos", "num_branches")
|
|
43
|
+
op.drop_column("git_repos", "num_tags")
|
kodit/py.typed
ADDED
|
File without changes
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
"""Dump Pydantic Settings configuration to markdown."""
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import inspect
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any, get_args, get_origin
|
|
7
|
+
|
|
8
|
+
import jinja2
|
|
9
|
+
from pydantic import BaseModel
|
|
10
|
+
from pydantic_settings import BaseSettings
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def get_model_info(model_class: type[BaseModel]) -> dict[str, Any]:
|
|
14
|
+
"""Extract information from a Pydantic model."""
|
|
15
|
+
model_info: dict[str, Any] = {
|
|
16
|
+
"description": inspect.getdoc(model_class) or "",
|
|
17
|
+
"env_vars": [],
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
# Extract environment variables if it's a BaseSettings class
|
|
21
|
+
if issubclass(model_class, BaseSettings):
|
|
22
|
+
model_info["env_vars"] = _extract_env_vars(model_class)
|
|
23
|
+
|
|
24
|
+
return model_info
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _format_type(type_annotation: Any) -> str: # noqa: C901, PLR0911
|
|
28
|
+
"""Format type annotation for display."""
|
|
29
|
+
if hasattr(type_annotation, "__name__"):
|
|
30
|
+
return type_annotation.__name__
|
|
31
|
+
|
|
32
|
+
origin = get_origin(type_annotation)
|
|
33
|
+
args = get_args(type_annotation)
|
|
34
|
+
|
|
35
|
+
if origin is None:
|
|
36
|
+
return str(type_annotation)
|
|
37
|
+
|
|
38
|
+
if origin is list:
|
|
39
|
+
if args:
|
|
40
|
+
return f"list[{_format_type(args[0])}]"
|
|
41
|
+
return "list"
|
|
42
|
+
|
|
43
|
+
if origin is dict:
|
|
44
|
+
if len(args) >= 2:
|
|
45
|
+
return f"dict[{_format_type(args[0])}, {_format_type(args[1])}]"
|
|
46
|
+
return "dict"
|
|
47
|
+
|
|
48
|
+
if origin is type(None) or origin is type:
|
|
49
|
+
return str(type_annotation)
|
|
50
|
+
|
|
51
|
+
# Handle Union types (including Optional)
|
|
52
|
+
has_union_name = hasattr(origin, "__name__") and origin.__name__ in (
|
|
53
|
+
"UnionType",
|
|
54
|
+
"_UnionGenericAlias",
|
|
55
|
+
)
|
|
56
|
+
is_union = has_union_name or str(origin).startswith("typing.Union")
|
|
57
|
+
if is_union:
|
|
58
|
+
if len(args) == 2 and type(None) in args:
|
|
59
|
+
# Optional type
|
|
60
|
+
non_none_type = next(arg for arg in args if arg is not type(None))
|
|
61
|
+
return f"`{_format_type(non_none_type)} | None`"
|
|
62
|
+
# Union type
|
|
63
|
+
type_names = [_format_type(arg) for arg in args]
|
|
64
|
+
return f"`{' | '.join(type_names)}`"
|
|
65
|
+
|
|
66
|
+
if origin and hasattr(origin, "__name__"):
|
|
67
|
+
if args:
|
|
68
|
+
arg_names = [_format_type(arg) for arg in args]
|
|
69
|
+
return f"{origin.__name__}[{', '.join(arg_names)}]"
|
|
70
|
+
return origin.__name__
|
|
71
|
+
|
|
72
|
+
return str(type_annotation)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _extract_env_vars(
|
|
76
|
+
settings_class: type[BaseSettings], prefix: str = ""
|
|
77
|
+
) -> list[dict[str, str]]:
|
|
78
|
+
"""Extract environment variable names from a BaseSettings class with inheritance."""
|
|
79
|
+
env_vars: list[dict[str, str]] = []
|
|
80
|
+
|
|
81
|
+
# Get the model config
|
|
82
|
+
config = getattr(settings_class, "model_config", None)
|
|
83
|
+
if config:
|
|
84
|
+
env_prefix = getattr(config, "env_prefix", "")
|
|
85
|
+
env_nested_delimiter = getattr(config, "env_nested_delimiter", "_")
|
|
86
|
+
else:
|
|
87
|
+
env_prefix = ""
|
|
88
|
+
env_nested_delimiter = "_"
|
|
89
|
+
|
|
90
|
+
# Generate env vars for each field
|
|
91
|
+
for field_name, field_info in settings_class.model_fields.items():
|
|
92
|
+
current_prefix = f"{prefix}{env_prefix}{field_name.upper()}"
|
|
93
|
+
|
|
94
|
+
# Extract description and default
|
|
95
|
+
description = field_info.description or ""
|
|
96
|
+
|
|
97
|
+
# Extract default value
|
|
98
|
+
from pydantic_core import PydanticUndefined
|
|
99
|
+
if field_info.default is not PydanticUndefined:
|
|
100
|
+
if field_info.default is None:
|
|
101
|
+
default_value = "None"
|
|
102
|
+
else:
|
|
103
|
+
default_value = _format_default_value(field_info.default, field_name)
|
|
104
|
+
elif field_info.default_factory is not None:
|
|
105
|
+
try:
|
|
106
|
+
factory_result = field_info.default_factory() # type: ignore[call-arg]
|
|
107
|
+
default_value = _format_default_value(factory_result, field_name)
|
|
108
|
+
except (TypeError, ValueError, AttributeError):
|
|
109
|
+
default_value = f"{field_info.default_factory.__name__}()"
|
|
110
|
+
else:
|
|
111
|
+
default_value = "Required"
|
|
112
|
+
|
|
113
|
+
# Extract type
|
|
114
|
+
field_type = field_info.annotation
|
|
115
|
+
type_name = _format_type(field_type) if field_type else "Any"
|
|
116
|
+
|
|
117
|
+
env_vars.append({
|
|
118
|
+
"name": current_prefix,
|
|
119
|
+
"type": type_name,
|
|
120
|
+
"default": default_value,
|
|
121
|
+
"description": description,
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
# Handle nested models (inheritance)
|
|
125
|
+
if field_info.annotation:
|
|
126
|
+
nested_vars = _extract_nested_env_vars(
|
|
127
|
+
field_info.annotation, current_prefix + env_nested_delimiter
|
|
128
|
+
)
|
|
129
|
+
env_vars.extend(nested_vars)
|
|
130
|
+
|
|
131
|
+
return env_vars
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _extract_nested_env_vars( # noqa: C901, PLR0912
|
|
135
|
+
model_class: type, prefix: str
|
|
136
|
+
) -> list[dict[str, str]]:
|
|
137
|
+
"""Extract environment variables from nested Pydantic models."""
|
|
138
|
+
env_vars: list[dict[str, str]] = []
|
|
139
|
+
|
|
140
|
+
# Handle Optional types
|
|
141
|
+
origin = get_origin(model_class)
|
|
142
|
+
args = get_args(model_class)
|
|
143
|
+
|
|
144
|
+
if origin and args:
|
|
145
|
+
# Check if it's Optional[SomeModel]
|
|
146
|
+
if len(args) == 2 and type(None) in args:
|
|
147
|
+
actual_model = next(arg for arg in args if arg is not type(None))
|
|
148
|
+
if _is_pydantic_model(actual_model):
|
|
149
|
+
model_class = actual_model
|
|
150
|
+
# Check if it's Union but not Optional
|
|
151
|
+
elif (
|
|
152
|
+
(
|
|
153
|
+
hasattr(origin, "__name__")
|
|
154
|
+
and origin.__name__ in ("Union", "UnionType", "_UnionGenericAlias")
|
|
155
|
+
)
|
|
156
|
+
or str(origin) == "<class 'types.UnionType'>"
|
|
157
|
+
):
|
|
158
|
+
# For Union types, we'll use the first non-None type
|
|
159
|
+
for arg in args:
|
|
160
|
+
if arg is not type(None) and _is_pydantic_model(arg):
|
|
161
|
+
model_class = arg
|
|
162
|
+
break
|
|
163
|
+
else:
|
|
164
|
+
return env_vars
|
|
165
|
+
|
|
166
|
+
if not _is_pydantic_model(model_class):
|
|
167
|
+
return env_vars
|
|
168
|
+
|
|
169
|
+
if not hasattr(model_class, "model_fields"):
|
|
170
|
+
return env_vars
|
|
171
|
+
|
|
172
|
+
for field_name, field_info in model_class.model_fields.items(): # type: ignore[attr-defined]
|
|
173
|
+
nested_var_name = f"{prefix}{field_name.upper()}"
|
|
174
|
+
|
|
175
|
+
# Extract field information
|
|
176
|
+
description = field_info.description or ""
|
|
177
|
+
|
|
178
|
+
# Extract default value
|
|
179
|
+
from pydantic_core import PydanticUndefined
|
|
180
|
+
if field_info.default is not PydanticUndefined:
|
|
181
|
+
if field_info.default is None:
|
|
182
|
+
default_value = "None"
|
|
183
|
+
else:
|
|
184
|
+
default_value = _format_default_value(field_info.default, field_name)
|
|
185
|
+
elif field_info.default_factory is not None:
|
|
186
|
+
try:
|
|
187
|
+
factory_result = field_info.default_factory() # type: ignore[call-arg]
|
|
188
|
+
default_value = _format_default_value(factory_result, field_name)
|
|
189
|
+
except (TypeError, ValueError, AttributeError):
|
|
190
|
+
default_value = f"{field_info.default_factory.__name__}()"
|
|
191
|
+
else:
|
|
192
|
+
default_value = "Required"
|
|
193
|
+
|
|
194
|
+
# Extract type
|
|
195
|
+
field_type = field_info.annotation
|
|
196
|
+
type_name = _format_type(field_type) if field_type else "Any"
|
|
197
|
+
|
|
198
|
+
env_vars.append({
|
|
199
|
+
"name": nested_var_name,
|
|
200
|
+
"type": type_name,
|
|
201
|
+
"default": default_value,
|
|
202
|
+
"description": description,
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
# Handle further nesting
|
|
206
|
+
if _is_pydantic_model(field_info.annotation):
|
|
207
|
+
further_nested = _extract_nested_env_vars(
|
|
208
|
+
field_info.annotation, nested_var_name + "_"
|
|
209
|
+
)
|
|
210
|
+
env_vars.extend(further_nested)
|
|
211
|
+
|
|
212
|
+
return env_vars
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def _is_pydantic_model(type_annotation: Any) -> bool:
|
|
216
|
+
"""Check if a type annotation represents a Pydantic model."""
|
|
217
|
+
try:
|
|
218
|
+
return (
|
|
219
|
+
hasattr(type_annotation, "model_fields")
|
|
220
|
+
and hasattr(type_annotation, "__mro__")
|
|
221
|
+
and BaseModel in type_annotation.__mro__
|
|
222
|
+
)
|
|
223
|
+
except (TypeError, AttributeError):
|
|
224
|
+
return False
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def _format_default_value(value: Any, field_name: str) -> str:
|
|
228
|
+
"""Format default values for documentation, handling special cases."""
|
|
229
|
+
from pathlib import Path
|
|
230
|
+
|
|
231
|
+
# Handle Path objects that contain user home directory
|
|
232
|
+
if isinstance(value, Path):
|
|
233
|
+
path_str = str(value)
|
|
234
|
+
# Replace actual home directory with generic placeholder
|
|
235
|
+
home_dir = str(Path.home())
|
|
236
|
+
if path_str.startswith(home_dir):
|
|
237
|
+
return path_str.replace(home_dir, "~")
|
|
238
|
+
|
|
239
|
+
# Handle special field names that we know represent dynamic defaults
|
|
240
|
+
if field_name.lower() == "data_dir" and isinstance(value, Path):
|
|
241
|
+
return "~/.kodit"
|
|
242
|
+
|
|
243
|
+
return str(value)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _lint_markdown(content: str) -> str:
|
|
247
|
+
"""Apply basic markdown linting rules to clean up formatting."""
|
|
248
|
+
import re
|
|
249
|
+
|
|
250
|
+
lines = content.split("\n")
|
|
251
|
+
cleaned_lines: list[str] = []
|
|
252
|
+
previous_line_empty = False
|
|
253
|
+
in_table = False
|
|
254
|
+
|
|
255
|
+
for original_line in lines:
|
|
256
|
+
# Remove trailing whitespace
|
|
257
|
+
cleaned_line = original_line.rstrip()
|
|
258
|
+
|
|
259
|
+
# Check if current line is empty
|
|
260
|
+
current_line_empty = len(cleaned_line) == 0
|
|
261
|
+
|
|
262
|
+
# Check if we're in a table
|
|
263
|
+
is_table_line = cleaned_line.startswith("|")
|
|
264
|
+
|
|
265
|
+
# Handle table state
|
|
266
|
+
if is_table_line and not in_table:
|
|
267
|
+
# Starting a table - ensure blank line before
|
|
268
|
+
if cleaned_lines and not previous_line_empty:
|
|
269
|
+
cleaned_lines.append("")
|
|
270
|
+
in_table = True
|
|
271
|
+
elif not is_table_line and in_table:
|
|
272
|
+
# Ending a table
|
|
273
|
+
in_table = False
|
|
274
|
+
|
|
275
|
+
# Skip multiple consecutive empty lines (keep only one)
|
|
276
|
+
# But don't skip empty lines in tables
|
|
277
|
+
if current_line_empty and previous_line_empty and not in_table:
|
|
278
|
+
continue
|
|
279
|
+
|
|
280
|
+
# Don't add empty lines within tables
|
|
281
|
+
if current_line_empty and in_table:
|
|
282
|
+
continue
|
|
283
|
+
|
|
284
|
+
cleaned_lines.append(cleaned_line)
|
|
285
|
+
previous_line_empty = current_line_empty
|
|
286
|
+
|
|
287
|
+
# Join lines back together
|
|
288
|
+
result = "\n".join(cleaned_lines)
|
|
289
|
+
|
|
290
|
+
# Ensure file ends with exactly one newline
|
|
291
|
+
result = result.rstrip("\n") + "\n"
|
|
292
|
+
|
|
293
|
+
# Fix spacing around headers (ensure one blank line before, no blank line after)
|
|
294
|
+
result = re.sub(r"\n+(?=^##)", "\n\n", result, flags=re.MULTILINE)
|
|
295
|
+
|
|
296
|
+
# Clean up any remaining multiple newlines (max 2 consecutive)
|
|
297
|
+
return re.sub(r"\n{3,}", "\n\n", result)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def extract_all_models() -> dict[str, Any]:
|
|
303
|
+
"""Extract all Pydantic models from config module."""
|
|
304
|
+
from kodit import config
|
|
305
|
+
|
|
306
|
+
models = {}
|
|
307
|
+
|
|
308
|
+
# Get all classes from the config module
|
|
309
|
+
for name, obj in inspect.getmembers(config):
|
|
310
|
+
if inspect.isclass(obj) and issubclass(obj, BaseModel) and obj is not BaseModel:
|
|
311
|
+
models[name] = get_model_info(obj)
|
|
312
|
+
|
|
313
|
+
return models
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def main() -> None:
|
|
317
|
+
"""Generate configuration documentation from Pydantic Settings."""
|
|
318
|
+
parser = argparse.ArgumentParser(
|
|
319
|
+
prog="dump-config.py",
|
|
320
|
+
description="Generate configuration documentation from Pydantic Settings",
|
|
321
|
+
)
|
|
322
|
+
parser.add_argument(
|
|
323
|
+
"--template",
|
|
324
|
+
help="Jinja2 template file path",
|
|
325
|
+
default="docs/reference/configuration/templates/template.j2",
|
|
326
|
+
)
|
|
327
|
+
parser.add_argument(
|
|
328
|
+
"--output",
|
|
329
|
+
help="Output markdown file path",
|
|
330
|
+
default="docs/reference/configuration/index.md",
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
args = parser.parse_args()
|
|
334
|
+
|
|
335
|
+
# Extract model information
|
|
336
|
+
models = extract_all_models()
|
|
337
|
+
|
|
338
|
+
# Load and render template
|
|
339
|
+
template_path = Path(args.template)
|
|
340
|
+
if not template_path.exists():
|
|
341
|
+
raise FileNotFoundError(f"Template file not found: {template_path}")
|
|
342
|
+
|
|
343
|
+
with template_path.open("r") as f:
|
|
344
|
+
template_content = f.read()
|
|
345
|
+
|
|
346
|
+
template = jinja2.Template(template_content)
|
|
347
|
+
rendered = template.render(models=models)
|
|
348
|
+
|
|
349
|
+
# Apply markdown linting
|
|
350
|
+
cleaned_content = _lint_markdown(rendered)
|
|
351
|
+
|
|
352
|
+
# Write output
|
|
353
|
+
output_path = Path(args.output)
|
|
354
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
355
|
+
|
|
356
|
+
with output_path.open("w") as f:
|
|
357
|
+
f.write(cleaned_content)
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
if __name__ == "__main__":
|
|
361
|
+
main()
|
kodit/utils/dump_openapi.py
CHANGED
|
@@ -19,11 +19,13 @@ if __name__ == "__main__":
|
|
|
19
19
|
|
|
20
20
|
app = import_from_string(args.app)
|
|
21
21
|
openapi = app.openapi()
|
|
22
|
-
version = openapi.get("openapi", "unknown version")
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
git_tag = openapi["info"]["version"]
|
|
24
|
+
if not git_tag:
|
|
25
|
+
raise ValueError(f"Invalid version: {openapi['info']}")
|
|
26
|
+
# Strip any rcxxx suffix
|
|
27
|
+
git_tag = git_tag.split("rc")[0]
|
|
28
|
+
openapi["info"]["version"] = git_tag
|
|
27
29
|
|
|
28
30
|
output_json_file = Path(args.out_dir) / "openapi.json"
|
|
29
31
|
|
kodit/utils/path_utils.py
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"""Path utilities for Python compatibility."""
|
|
2
2
|
|
|
3
|
+
import hashlib
|
|
3
4
|
import sys
|
|
4
5
|
from pathlib import Path
|
|
5
6
|
from urllib.parse import urlparse
|
|
6
7
|
from urllib.request import url2pathname
|
|
7
8
|
|
|
9
|
+
from pydantic import AnyUrl
|
|
10
|
+
|
|
8
11
|
|
|
9
12
|
def path_from_uri(uri: str) -> Path:
|
|
10
13
|
"""Convert a file URI to a Path object.
|
|
@@ -52,3 +55,29 @@ def path_from_uri(uri: str) -> Path:
|
|
|
52
55
|
path_str = url2pathname(parsed.path)
|
|
53
56
|
|
|
54
57
|
return Path(path_str)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def repo_id_from_uri(sanitized_uri: AnyUrl) -> str:
|
|
61
|
+
"""Create a unique id for a repository."""
|
|
62
|
+
# Get the last part of the sanitized remote URI,
|
|
63
|
+
uri_end = clean_end_of_uri(sanitized_uri)
|
|
64
|
+
dir_hash = hashlib.sha256(str(sanitized_uri).encode("utf-8")).hexdigest()[:16]
|
|
65
|
+
return f"{dir_hash}-{uri_end}"
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def clean_end_of_uri(sanitized_uri: AnyUrl) -> str:
|
|
69
|
+
"""Clean the end of a URI."""
|
|
70
|
+
path = sanitized_uri.path
|
|
71
|
+
if not path:
|
|
72
|
+
path = str(sanitized_uri)
|
|
73
|
+
|
|
74
|
+
# Extract the last part of the path (it might not have any slashes)
|
|
75
|
+
part = path.split("/")[-1]
|
|
76
|
+
if not part:
|
|
77
|
+
part = path
|
|
78
|
+
|
|
79
|
+
# Now get up to the LAST 8 characters of the part, if they exist
|
|
80
|
+
if len(part) > 8:
|
|
81
|
+
part = part[-8:]
|
|
82
|
+
|
|
83
|
+
return part
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kodit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.1
|
|
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/
|
|
@@ -35,7 +35,7 @@ Requires-Dist: gitpython>=3.1.44
|
|
|
35
35
|
Requires-Dist: hf-xet>=1.1.2
|
|
36
36
|
Requires-Dist: httpx-retries>=0.3.2
|
|
37
37
|
Requires-Dist: httpx>=0.28.1
|
|
38
|
-
Requires-Dist: litellm>=1.
|
|
38
|
+
Requires-Dist: litellm>=1.77.1
|
|
39
39
|
Requires-Dist: openai==1.99.9
|
|
40
40
|
Requires-Dist: pathspec>=0.12.1
|
|
41
41
|
Requires-Dist: pydantic-settings>=2.9.1
|
|
@@ -45,8 +45,8 @@ Requires-Dist: rudder-sdk-python>=2.1.4
|
|
|
45
45
|
Requires-Dist: sentence-transformers>=4.1.0
|
|
46
46
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.40
|
|
47
47
|
Requires-Dist: structlog>=25.3.0
|
|
48
|
-
Requires-Dist: tdqm>=0.0.1
|
|
49
48
|
Requires-Dist: tiktoken>=0.9.0
|
|
49
|
+
Requires-Dist: torch>=2.7.0
|
|
50
50
|
Requires-Dist: transformers>=4.51.3
|
|
51
51
|
Requires-Dist: tree-sitter-language-pack>=0.7.3
|
|
52
52
|
Requires-Dist: tree-sitter>=0.24.0
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
kodit/.gitignore,sha256=ztkjgRwL9Uud1OEi36hGQeDGk3OLK1NfDEO8YqGYy8o,11
|
|
2
|
+
kodit/__init__.py,sha256=aEKHYninUq1yh6jaNfvJBYg-6fenpN132nJt1UU6Jxs,59
|
|
3
|
+
kodit/_version.py,sha256=cYMOhuaBHd0MIZmumuccsEQ-AxM8LIJy9dsBAWgOpqE,704
|
|
4
|
+
kodit/app.py,sha256=niIfZiuuDp7mLzrBwQhx_FU7RvKfUALNV5y0o43miss,5802
|
|
5
|
+
kodit/cli.py,sha256=QSTXIUDxZo3anIONY-grZi9_VSehWoS8QoVJZyOmWPQ,3086
|
|
6
|
+
kodit/cli_utils.py,sha256=umkvt4kWNapk6db6RGz6bmn7oxgDpsW2Vo09MZ37OGg,2430
|
|
7
|
+
kodit/config.py,sha256=s3xm0ve_Sw5LllAA-PKzka3OF-ucQ4F0O8XqZcJ7-Yc,7667
|
|
8
|
+
kodit/database.py,sha256=Pjxx0k431_lCqAJwE3FpLfs74qz1l5JFUQX1TD-wgSs,3264
|
|
9
|
+
kodit/log.py,sha256=ZpM0eMo_DVGQqrHxg0VV6dMrN2AAmu_3C0I3G7p2nMw,8828
|
|
10
|
+
kodit/mcp.py,sha256=PwMogCaYwEJ289y_8-LkLQrL00q2vesYRVxix6-4nuE,7166
|
|
11
|
+
kodit/middleware.py,sha256=TiwebNpaEmiP7QRuZrfZcCL51IUefQyNLSPuzVyk8UM,2813
|
|
12
|
+
kodit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
+
kodit/application/__init__.py,sha256=mH50wTpgP9dhbKztFsL8Dda9Hi18TSnMVxXtpp4aGOA,35
|
|
14
|
+
kodit/application/factories/__init__.py,sha256=bU5CvEnaBePZ7JbkCOp1MGTNP752bnU2uEqmfy5FdRk,37
|
|
15
|
+
kodit/application/factories/reporting_factory.py,sha256=3IpRiAw_olM69db-jbDAtjyGtd6Nh5o8jUJX3-rXCA8,1421
|
|
16
|
+
kodit/application/factories/server_factory.py,sha256=NrOFLbkKsLpymNBYbuvoWdRznV5YRh_BsoLQjx3_i_o,15185
|
|
17
|
+
kodit/application/services/__init__.py,sha256=p5UQNw-H5sxQvs5Etfte93B3cJ1kKW6DNxK34uFvU1E,38
|
|
18
|
+
kodit/application/services/code_search_application_service.py,sha256=sqMgyAw7e2d2FWroaonaL8G1Hwigb-Yku71dut3wOpQ,4963
|
|
19
|
+
kodit/application/services/commit_indexing_application_service.py,sha256=S5Gep4aXB9_1CWxs9xcIMnGmsrfrwJqvfDAHIPhoS1k,29860
|
|
20
|
+
kodit/application/services/indexing_worker_service.py,sha256=8J8CaUdPd5nF6MyvJbJQpXeGkP2oClmFjZel1xBXELU,4065
|
|
21
|
+
kodit/application/services/queue_service.py,sha256=nXplzN-nehPEeEvygzjJwWg4oQmu3SPodsZzY1Z3MtE,2509
|
|
22
|
+
kodit/application/services/reporting.py,sha256=cwe-S-UpSOE6xSAEhoD1hi4hSWk1bW3YRLJ7463fIvM,3518
|
|
23
|
+
kodit/application/services/sync_scheduler.py,sha256=Oy4Hw64SBkNmgXEIAJqXNkMM1nVGnwrP70-htrngCOU,2779
|
|
24
|
+
kodit/domain/__init__.py,sha256=TCpg4Xx-oF4mKV91lo4iXqMEfBT1OoRSYnbG-zVWolA,66
|
|
25
|
+
kodit/domain/errors.py,sha256=yIsgCjM_yOFIg8l7l-t7jM8pgeAX4cfPq0owf7iz3DA,106
|
|
26
|
+
kodit/domain/protocols.py,sha256=7PyGVkSEdTYW0CuROmxZALHppMtkd6H0S7lyJs-mbAs,9794
|
|
27
|
+
kodit/domain/value_objects.py,sha256=PyoH1JUPdz95GGfASjWFnL1Kjhpn4hI2H_eCgpJku7I,17940
|
|
28
|
+
kodit/domain/enrichments/__init__.py,sha256=UpQMnMEHqaK3u3K-eJZOC28kfBPHALLAjFMdyYBXSPE,33
|
|
29
|
+
kodit/domain/enrichments/enricher.py,sha256=jnZ5X9RmZA8Acy-RBS2TbEoBg9QSm8AgleqwS9h5WlY,512
|
|
30
|
+
kodit/domain/enrichments/enrichment.py,sha256=C4TbzyZXWjZTIYDZFbM9VESU-1Se3tCfYflkTvnuXdc,993
|
|
31
|
+
kodit/domain/enrichments/request.py,sha256=6zBQhliDcdw8vS4sYPG2mqZSDSbQ5VzY1YQ-4bMkuQE,244
|
|
32
|
+
kodit/domain/enrichments/response.py,sha256=NzoMAKgs7c2yo9vvgWjQDo1yO0koKHbbY_SrsqsalAk,205
|
|
33
|
+
kodit/domain/enrichments/architecture/__init__.py,sha256=hBSliXMuixUZKtF-_zvcgQjnqrdyc4_SjYG2PTRFYpg,39
|
|
34
|
+
kodit/domain/enrichments/architecture/architecture.py,sha256=P229vroi9Hk3mvPDMVyInjJZiHNuh0AkWq0lCm0htvY,494
|
|
35
|
+
kodit/domain/enrichments/architecture/physical/__init__.py,sha256=4jc89cGxALWo8d3Xzfb5t-YjcCyDb1dDVGwTqVYBFmc,48
|
|
36
|
+
kodit/domain/enrichments/architecture/physical/discovery_notes.py,sha256=Wdv41rkUcMgRqXWB5Q9roaGMGFznH4V_I7mELUvDShw,636
|
|
37
|
+
kodit/domain/enrichments/architecture/physical/formatter.py,sha256=V_JvHsGDPPJ-TqGS-G61P3OS3xe0QpS2NLBEk5jX6Yc,351
|
|
38
|
+
kodit/domain/enrichments/architecture/physical/physical.py,sha256=BT7qR-Y0LZNBxx5AZpyAVZFmrXQdY1Q6HwgvCf8Y1AA,511
|
|
39
|
+
kodit/domain/enrichments/development/__init__.py,sha256=ls7zlKUpSpyLZRl-WTuaow9C68c0COkjcoEEEenpMxk,38
|
|
40
|
+
kodit/domain/enrichments/development/development.py,sha256=cFmtOnFUEHLxINn7FR4L4F8NAP_LgoPH8ulInFszZ2k,470
|
|
41
|
+
kodit/domain/enrichments/development/snippet/__init__.py,sha256=M5XVnlDgfqSE5UiAqkQwE1Mbr5Rg8zQpcspHKC3k_xU,34
|
|
42
|
+
kodit/domain/enrichments/development/snippet/snippet.py,sha256=nRsCcWpr6d2nves7u13gQWLWuen7w-W4znfjJ2N9SAs,603
|
|
43
|
+
kodit/domain/enrichments/usage/__init__.py,sha256=7W36rvCF6DH-VqW2RiqU6GMlkYYHZy9Wm0DL_3_fbRc,40
|
|
44
|
+
kodit/domain/enrichments/usage/api_docs.py,sha256=AvkywyWAd4_UOk4ayBxBOTjxAIJPyzYrAM4kOeiI0FE,457
|
|
45
|
+
kodit/domain/enrichments/usage/usage.py,sha256=A2GZCK_Xc5XS3R2aCoFnsmN0irViX0f_rK8QGmWm1tw,440
|
|
46
|
+
kodit/domain/entities/__init__.py,sha256=Wh05xl-8y0j3e7m4KkFcwT7d2R_dlGwphJeOUodDkWw,8633
|
|
47
|
+
kodit/domain/entities/git.py,sha256=b86MtNJgpJbZ_0z3E5oQX5bXNAeeAGnsC4SyH2DPGq0,5970
|
|
48
|
+
kodit/domain/factories/__init__.py,sha256=0JnpqMDhhbuCG4UoEbdc_SM7RfTyOCpotTUB7GN6glU,32
|
|
49
|
+
kodit/domain/factories/git_repo_factory.py,sha256=4yaa-waMbzapNtldHG1oxBVMuI6JB-iMLzf3dzgJm0M,2496
|
|
50
|
+
kodit/domain/services/__init__.py,sha256=Q1GhCK_PqKHYwYE4tkwDz5BIyXkJngLBBOHhzvX8nzo,42
|
|
51
|
+
kodit/domain/services/bm25_service.py,sha256=-E5k0td2Ucs25qygWkJlY0fl7ZckOUe5xZnKYff3hF8,3631
|
|
52
|
+
kodit/domain/services/embedding_service.py,sha256=al-vBd7H9KuCqZTWtC7q8CEDVXaIQhDhvMFV9IxWasU,4663
|
|
53
|
+
kodit/domain/services/enrichment_service.py,sha256=ziFaYqTYE5R2LTgirYDCniQxVuB1d3ZeONEalyaS_o0,858
|
|
54
|
+
kodit/domain/services/git_repository_service.py,sha256=b-zAAFVxU22KKp2ACyKUgOpFKK7uar4PV5mqoN0Vgzk,15534
|
|
55
|
+
kodit/domain/services/git_service.py,sha256=nVQCfXQ8kW-MAAoAd8bgSQmCdgPMVftUh5qd4du_bes,11352
|
|
56
|
+
kodit/domain/services/physical_architecture_service.py,sha256=0YgoAvbUxT_VwgIh_prftSYnil_XIqNPSoP0g37eIt4,7209
|
|
57
|
+
kodit/domain/services/task_status_query_service.py,sha256=rI93pTMHeycigQryCWkimXSDzRqx_nJOr07UzPAacPE,736
|
|
58
|
+
kodit/infrastructure/__init__.py,sha256=HzEYIjoXnkz_i_MHO2e0sIVYweUcRnl2RpyBiTbMObU,28
|
|
59
|
+
kodit/infrastructure/api/__init__.py,sha256=U0TSMPpHrlj1zbAtleuZjU3nXGwudyMe-veNBgvODwM,34
|
|
60
|
+
kodit/infrastructure/api/client/__init__.py,sha256=8MjEc6cHCqiI-LtIyng3uKD7a2wUaR-QUdIAePYyIRg,292
|
|
61
|
+
kodit/infrastructure/api/client/base.py,sha256=CIx0Cth8u845T1_6Q71Nj8BkXnh9m_v6d7OlJsZQsyQ,3105
|
|
62
|
+
kodit/infrastructure/api/client/exceptions.py,sha256=wK1OGiImIbNW-fz1juOExd5pKmkKK-xDhI_YFj4Q5Ic,401
|
|
63
|
+
kodit/infrastructure/api/client/generated_endpoints.py,sha256=8qhAg_gDuHsH_nKqGLialZCmEEuDDjLtSnEr-za82XU,641
|
|
64
|
+
kodit/infrastructure/api/client/search_client.py,sha256=f4mM5ZJpAuR7w-i9yASbh4SYMxOq7_f4hXgaQesGquI,2614
|
|
65
|
+
kodit/infrastructure/api/middleware/__init__.py,sha256=6m7eE5k5buboJbuzyX5E9-Tf99yNwFaeJF0f_6HwLyM,30
|
|
66
|
+
kodit/infrastructure/api/middleware/auth.py,sha256=QSnMcMLWvfumqN1iG4ePj2vEZb2Dlsgr-WHptkEkkhE,1064
|
|
67
|
+
kodit/infrastructure/api/v1/__init__.py,sha256=xWtkR3UP7daksCXW_Eyvcqsh091OREqfBPnlFs027_o,22
|
|
68
|
+
kodit/infrastructure/api/v1/dependencies.py,sha256=S0U1oY0CH8rQpF685d1eT2TE6KgbCWsav1E4HIss5KQ,4457
|
|
69
|
+
kodit/infrastructure/api/v1/routers/__init__.py,sha256=pz_7kFwHcxztbTiFI-57Q2tCAllI7u0fgTP4rpQeUoQ,22
|
|
70
|
+
kodit/infrastructure/api/v1/routers/commits.py,sha256=osjmm2Po-MOshD7zBv01C12UcYukkaKATtjEa3hSAJU,11624
|
|
71
|
+
kodit/infrastructure/api/v1/routers/queue.py,sha256=srZmOCZqvcCBlDcPYt1ZWhwVhvVWARWJ3Qp4Tn5eK4Y,2148
|
|
72
|
+
kodit/infrastructure/api/v1/routers/repositories.py,sha256=pxdCCMQWAsezkwyj-rNG-eQbtlW8wMaXZwfzHmae3sI,9328
|
|
73
|
+
kodit/infrastructure/api/v1/routers/search.py,sha256=eMlofqcy9xWCsE9ugfBZHtcPo1hb-A06_Xfv4XR3FfY,3187
|
|
74
|
+
kodit/infrastructure/api/v1/schemas/__init__.py,sha256=capaxPe7y28pWj6Pu5hfTOxLnVL9pwW-hJu7ZdN2klw,41
|
|
75
|
+
kodit/infrastructure/api/v1/schemas/commit.py,sha256=UVGkwZNjwUMiitUbFws1_mlZN7IALq99P99HJCg5h2c,1794
|
|
76
|
+
kodit/infrastructure/api/v1/schemas/context.py,sha256=E6gra1uByM8FYmIXlJeaM59j5VhG4M5E9MzgsGWWJHs,317
|
|
77
|
+
kodit/infrastructure/api/v1/schemas/enrichment.py,sha256=pV9VnVqnr9Sud1CYdZOS97GyyL3y5aBjTxG5tlM7X2s,616
|
|
78
|
+
kodit/infrastructure/api/v1/schemas/queue.py,sha256=oa4wumWOvGzi53Q3cjwIrQJRoentp5nsQSsaj-l-B4U,652
|
|
79
|
+
kodit/infrastructure/api/v1/schemas/repository.py,sha256=BRVXlajqQDxoi9RGPeO434RQvyxFYTXp68V7L3wwYXE,3192
|
|
80
|
+
kodit/infrastructure/api/v1/schemas/search.py,sha256=IrqPvIH4IA1QBfmWkD33JqhOmhOJVaZRvOfrNjzowCg,5768
|
|
81
|
+
kodit/infrastructure/api/v1/schemas/snippet.py,sha256=--WFiu-6SLevfbDsozo34lGaROOHTrebnVU9VR6bSFs,1181
|
|
82
|
+
kodit/infrastructure/api/v1/schemas/tag.py,sha256=hJSyaokIk3ggytGZjggLjfWQ-2lni21_L_scIh8kFfk,584
|
|
83
|
+
kodit/infrastructure/api/v1/schemas/task_status.py,sha256=9YIyeYuPWVw48lF0qdmnYPaoQtTjKNWmi8EDvaXAgto,1344
|
|
84
|
+
kodit/infrastructure/bm25/__init__.py,sha256=DmGbrEO34FOJy4e685BbyxLA7gPW1eqs2gAxsp6JOuM,34
|
|
85
|
+
kodit/infrastructure/bm25/local_bm25_repository.py,sha256=YE3pUkPS5n1JNu6oSM_HRBOXM8U04HiY8dMMZCf9CMQ,5197
|
|
86
|
+
kodit/infrastructure/bm25/vectorchord_bm25_repository.py,sha256=LjbUPj4nPMb9pdEudThUbZTmQjhxvpN314EzKGpXfi0,8621
|
|
87
|
+
kodit/infrastructure/cloning/git/__init__.py,sha256=20ePcp0qE6BuLsjsv4KYB1DzKhMIMsPXwEqIEZtjTJs,34
|
|
88
|
+
kodit/infrastructure/cloning/git/git_python_adaptor.py,sha256=X0cyoBz3AWeY4lEmAyAqD4i3bXhSBh0ggKng1ERoswI,19944
|
|
89
|
+
kodit/infrastructure/cloning/git/working_copy.py,sha256=sPKQN-A1gDVV_QJISNNP4PqxRWxyj5owv5tvWfXMl44,3909
|
|
90
|
+
kodit/infrastructure/embedding/__init__.py,sha256=F-8nLlWAerYJ0MOIA4tbXHLan8bW5rRR84vzxx6tRKI,39
|
|
91
|
+
kodit/infrastructure/embedding/embedding_factory.py,sha256=6nP8HKKlNWmDE8ATT5tNQHgPqeTDUMpRuWwn2rsfrOQ,3446
|
|
92
|
+
kodit/infrastructure/embedding/local_vector_search_repository.py,sha256=urccvadIF-uizmYuzK7ii7hl2HaV7swHCiS8P6n7U18,3507
|
|
93
|
+
kodit/infrastructure/embedding/vectorchord_vector_search_repository.py,sha256=nIcy4DBKM2yb_azKe_N76WpYIMuE1zFtdeZj16NWV6Q,9530
|
|
94
|
+
kodit/infrastructure/embedding/embedding_providers/__init__.py,sha256=qeZ-oAIAxMl5QqebGtO1lq-tHjl_ucAwOXePklcwwGk,34
|
|
95
|
+
kodit/infrastructure/embedding/embedding_providers/batching.py,sha256=a8CL9PX2VLmbeg616fc_lQzfC4BWTVn32m4SEhXpHxc,3279
|
|
96
|
+
kodit/infrastructure/embedding/embedding_providers/hash_embedding_provider.py,sha256=V6OdCuWyQQOvo3OJGRi-gBKDApIcrELydFg7T696P5s,2257
|
|
97
|
+
kodit/infrastructure/embedding/embedding_providers/litellm_embedding_provider.py,sha256=9Q5he_MI8xXENODwCvYCbhVawTjTv1bArGQrmxoWLas,5297
|
|
98
|
+
kodit/infrastructure/embedding/embedding_providers/local_embedding_provider.py,sha256=9aLV1Zg4KMhYWlGRwgAUtswW4aIabNqbsipWhAn64RI,4133
|
|
99
|
+
kodit/infrastructure/enricher/__init__.py,sha256=5KCwKHnQ3i_-1s5Q8kquUY_Y0BktJMGVrsDJLtTlDNc,55
|
|
100
|
+
kodit/infrastructure/enricher/enricher_factory.py,sha256=R2UlmCrMW55nvPHHf5Aj0soEBr7T_XU1dgDWwqs49Cg,1593
|
|
101
|
+
kodit/infrastructure/enricher/litellm_enricher.py,sha256=q3V6frb29yzmodzqQ6TDovbSmittiwHtoPNYy5x4dLQ,4866
|
|
102
|
+
kodit/infrastructure/enricher/local_enricher.py,sha256=AUzmpjlPK7LGaX5DO8thmvfdwNPLLHCB4W5wyudqk3k,4317
|
|
103
|
+
kodit/infrastructure/enricher/null_enricher.py,sha256=Vu3agCTXROzYl2MzM8gVgH2rMw_FHIkgH-S1vijKw_0,1048
|
|
104
|
+
kodit/infrastructure/enricher/utils.py,sha256=FE9UCuxxzSdoHrmAC8Si2b5D6Nf6kVqgM1yjUVyCvW0,930
|
|
105
|
+
kodit/infrastructure/git/__init__.py,sha256=0iMosFzudj4_xNIMe2SRbV6l5bWqkjnUsZoFsoZFuM8,33
|
|
106
|
+
kodit/infrastructure/git/git_utils.py,sha256=5lH94AcF7Hac4h6kBzo_B9pzC1S6AK2-Dy13gz--Zf0,781
|
|
107
|
+
kodit/infrastructure/ignore/__init__.py,sha256=VzFv8XOzHmsu0MEGnWVSF6KsgqLBmvHlRqAkT1Xb1MY,36
|
|
108
|
+
kodit/infrastructure/ignore/ignore_pattern_provider.py,sha256=zdxun3GodLfXxyssBK8QDUK58xb4fBJ0SKcHUyn3pzM,2131
|
|
109
|
+
kodit/infrastructure/indexing/__init__.py,sha256=7UPRa2jwCAsa0Orsp6PqXSF8iIXJVzXHMFmrKkI9yH8,38
|
|
110
|
+
kodit/infrastructure/indexing/fusion_service.py,sha256=VJiSmE1XujtaZhi1lpkGwjUKdqI-XVRNDSRHOeJWMlo,1790
|
|
111
|
+
kodit/infrastructure/mappers/__init__.py,sha256=QPHOjNreXmBPPovZ6elnYFS0vD-IsmrGl4TT01FCKro,77
|
|
112
|
+
kodit/infrastructure/mappers/enrichment_mapper.py,sha256=kc8TFmjKvhKrKo0UJ8t-wamg8Db1jNNAhYqbfU1SzdY,3143
|
|
113
|
+
kodit/infrastructure/mappers/git_mapper.py,sha256=AhFqPxGT7ZeFcUui7P1XnqDuVhooSSDoGuzwIDY5CGc,8214
|
|
114
|
+
kodit/infrastructure/mappers/snippet_mapper.py,sha256=za9FUB3s_K4xszHWJAz8nqABMUvaj_haqDPqppclz4g,4035
|
|
115
|
+
kodit/infrastructure/mappers/task_mapper.py,sha256=R4-hVJD0-wHP51MbX9yiWSBBdeCJ7UiZZWTJwYp2gK8,1511
|
|
116
|
+
kodit/infrastructure/mappers/task_status_mapper.py,sha256=5lo_jS2EKYg4czOOAFmrWfQl3OojIokwpzhaR3b1wE0,3433
|
|
117
|
+
kodit/infrastructure/physical_architecture/__init__.py,sha256=DLfszH6h_bRgksDS_TtzJ13Dfa5TuFas9eI99DdZbF4,54
|
|
118
|
+
kodit/infrastructure/physical_architecture/detectors/__init__.py,sha256=z8JzHOy8MyOwK2i2o5Eh-H2k-tnVAhsA6JLUkWE8rTY,63
|
|
119
|
+
kodit/infrastructure/physical_architecture/detectors/docker_compose_detector.py,sha256=NQWN24eV_wl3tDMsCnL2FbcBsGz2y-4pEfASBejeAKg,13245
|
|
120
|
+
kodit/infrastructure/physical_architecture/formatters/__init__.py,sha256=2OCvhVKGUTHusxlsqRbLk8cNtzZ9HrGqnKYcozuLOE0,81
|
|
121
|
+
kodit/infrastructure/physical_architecture/formatters/narrative_formatter.py,sha256=43bERS_iGhL94pkUV2Bn5vjeaHPxjHatuDh7dHreh_M,5713
|
|
122
|
+
kodit/infrastructure/reporting/__init__.py,sha256=4Qu38YbDOaeDqLdT_CbK8tOZHTKGrHRXncVKlGRzOeQ,32
|
|
123
|
+
kodit/infrastructure/reporting/db_progress.py,sha256=VVaCKjC_UFwdRptXbBroG9qhXCxI4bZmElf1PMsBzWA,819
|
|
124
|
+
kodit/infrastructure/reporting/log_progress.py,sha256=yhzkjYulEn_sfpKwHKi--HdQHLb4h4uEolhFYqvdHS8,1261
|
|
125
|
+
kodit/infrastructure/reporting/telemetry_progress.py,sha256=uT9mNyF2bQ83a0bQvUAXXsidvTievc16DUYKUN0X4tY,581
|
|
126
|
+
kodit/infrastructure/slicing/__init__.py,sha256=x7cjvHA9Ay2weUYE_dpdAaPaStp20M-4U2b5MLgT5KM,37
|
|
127
|
+
kodit/infrastructure/slicing/api_doc_extractor.py,sha256=XZF3GdQQRdDr0f6rq_3gJZ54ZsSceAdIgqwSQjebojc,29480
|
|
128
|
+
kodit/infrastructure/slicing/ast_analyzer.py,sha256=Kd42XixjTmWWroQEmzwUSoRMiMIdNaLPXikQxrSHJ8M,43556
|
|
129
|
+
kodit/infrastructure/slicing/slicer.py,sha256=EDYkoLf6RsTVloudZUq6LS5X10JJAHWcKWx3pllYTFU,21975
|
|
130
|
+
kodit/infrastructure/sqlalchemy/__init__.py,sha256=UXPMSF_hgWaqr86cawRVqM8XdVNumQyyK5B8B97GnlA,33
|
|
131
|
+
kodit/infrastructure/sqlalchemy/embedding_repository.py,sha256=2JCDc-nSau6B3GA-e1rGian5zfJZpgJZ0TbN5hc1nRE,8866
|
|
132
|
+
kodit/infrastructure/sqlalchemy/enrichment_v2_repository.py,sha256=SBi2YU3yqv0YpCZKc8sTURQfySBAhygTqB0oXcqcT7M,4336
|
|
133
|
+
kodit/infrastructure/sqlalchemy/entities.py,sha256=TfRkQoCBa77dr6vrj0fYlXkNuXkjxe4zcC21i2BBq0Q,18155
|
|
134
|
+
kodit/infrastructure/sqlalchemy/git_branch_repository.py,sha256=UWug5qb6HPljcm_2cBdW_4FlsJhDxtx3wyt4VUGAjXs,11515
|
|
135
|
+
kodit/infrastructure/sqlalchemy/git_commit_repository.py,sha256=FgHwwUBVKW2BQtM5qfhOU7gZNhK_jMMSGy4FJ_cP8CE,14362
|
|
136
|
+
kodit/infrastructure/sqlalchemy/git_repository.py,sha256=LnqhN80xtpSyH69n16hYvot9XRRYoFQUpIV_zlc7-CQ,10590
|
|
137
|
+
kodit/infrastructure/sqlalchemy/git_tag_repository.py,sha256=rOGQTZy1cFuGnkGSdmGcN3TagEVpksIDN1IauODdcIA,10943
|
|
138
|
+
kodit/infrastructure/sqlalchemy/snippet_v2_repository.py,sha256=COsj9mLTk25vwovY09m-hj5fw9hoy363N38DdME35HM,19203
|
|
139
|
+
kodit/infrastructure/sqlalchemy/task_repository.py,sha256=ZrPKxw0IbIcfcP_AOtyEJ8TDhVjODTI5xQg5ZhGkF8M,4072
|
|
140
|
+
kodit/infrastructure/sqlalchemy/task_status_repository.py,sha256=WouXNu8iZSzaKPqKXrUOEO_lskHbPtt4_kEgmjaiZcU,4014
|
|
141
|
+
kodit/infrastructure/sqlalchemy/unit_of_work.py,sha256=MAF8sBr-T5crSWx1wvjf00xboPNz9YMyzRfaKSLCbzQ,1970
|
|
142
|
+
kodit/migrations/README,sha256=ISVtAOvqvKk_5ThM5ioJE-lMkvf9IbknFUFVU_vPma4,58
|
|
143
|
+
kodit/migrations/__init__.py,sha256=lP5MuwlyWRMO6UcDWnQcQ3G-GYHcFb6rl9gYPHJ1sjo,40
|
|
144
|
+
kodit/migrations/env.py,sha256=7lJWv-fp2bV9Mb4dfgVh1h0IYGq3YQJaZuNdiBT7WmY,2394
|
|
145
|
+
kodit/migrations/script.py.mako,sha256=zWziKtiwYKEWuwPV_HBNHwa9LCT45_bi01-uSNFaOOE,703
|
|
146
|
+
kodit/migrations/versions/04b80f802e0c_foreign_key_review.py,sha256=zZjiRLx16JBVOOuY912S_rest83kgnEN3AXM3TCPdOs,4129
|
|
147
|
+
kodit/migrations/versions/19f8c7faf8b9_add_generic_enrichment_type.py,sha256=5uFUwzscBslU7jGeu4WJ_To_mqrg77V8ML4c2FiL9pQ,9458
|
|
148
|
+
kodit/migrations/versions/4073b33f9436_add_file_processing_flag.py,sha256=c8dMcKQ-BBBr_2-92eJZFS3Fwe3__B2eNqvQeMZHs0w,917
|
|
149
|
+
kodit/migrations/versions/4552eb3f23ce_add_summary.py,sha256=WjyBQzFK8IXuvta15YBE23yaTMM1rZCXvPxW98MStng,870
|
|
150
|
+
kodit/migrations/versions/7c3bbc2ab32b_add_embeddings_table.py,sha256=JL6lxaYtGbXolrkNEujg5SWj3_aQBWReYP3I4vcibdo,1755
|
|
151
|
+
kodit/migrations/versions/7f15f878c3a1_add_new_git_entities.py,sha256=6RoJPwSZT_jfzhCR09lXGz9haYpvzKVeS1aZSh00TCA,25269
|
|
152
|
+
kodit/migrations/versions/85155663351e_initial.py,sha256=h8DWmSxVwTtWlmWNH8-S4AxfEIbCm_iWtR6Kg5psPnk,3605
|
|
153
|
+
kodit/migrations/versions/9cf0e87de578_add_queue.py,sha256=FYrco38f3_-1ZRfGOU617bgR1Ta0YTwwz3QDQMw_NKY,1600
|
|
154
|
+
kodit/migrations/versions/9e53ea8bb3b0_add_authors.py,sha256=a32Zm8KUQyiiLkjKNPYdaJDgjW6VsV-GhaLnPnK_fpI,3884
|
|
155
|
+
kodit/migrations/versions/__init__.py,sha256=9-lHzptItTzq_fomdIRBegQNm4Znx6pVjwD4MiqRIdo,36
|
|
156
|
+
kodit/migrations/versions/b9cd1c3fd762_add_task_status.py,sha256=7cgdMKu4OBidL0ER8AGgyerfSfEk1I3XHo6Kh0sCzIQ,2754
|
|
157
|
+
kodit/migrations/versions/c3f5137d30f5_index_all_the_things.py,sha256=r7ukmJ_axXLAWewYx-F1fEmZ4JbtFd37i7cSb0tq3y0,1722
|
|
158
|
+
kodit/migrations/versions/f9e5ef5e688f_add_git_commits_number.py,sha256=tI2GoZthhdXm8yyZqnpmfuFoUqbXDKh-tpbPHfJrXco,1078
|
|
159
|
+
kodit/utils/__init__.py,sha256=DPEB1i8evnLF4Ns3huuAYg-0pKBFKUFuiDzOKG9r-sw,33
|
|
160
|
+
kodit/utils/dump_config.py,sha256=dd5uPgqh6ATk02Zt59t2JFKR9X17YWjHudV0nE8VktE,11869
|
|
161
|
+
kodit/utils/dump_openapi.py,sha256=EasYOnnpeabwb_sTKQUBrrOLHjPcOFQ7Zx0YKpx9fmM,1239
|
|
162
|
+
kodit/utils/generate_api_paths.py,sha256=TMtx9v55podDfUmiWaHgJHLtEWLV2sLL-5ejGFMPzAo,3569
|
|
163
|
+
kodit/utils/path_utils.py,sha256=UB_81rx7Y1G1jalVv2PX8miwaprBbcqEdtoQ3hPT3kU,2451
|
|
164
|
+
kodit-0.5.1.dist-info/METADATA,sha256=HyFZ0U2-rvusI_5CIa3Z1BOaER_--WZEyy_g3i1BHg8,7703
|
|
165
|
+
kodit-0.5.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
166
|
+
kodit-0.5.1.dist-info/entry_points.txt,sha256=hoTn-1aKyTItjnY91fnO-rV5uaWQLQ-Vi7V5et2IbHY,40
|
|
167
|
+
kodit-0.5.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
168
|
+
kodit-0.5.1.dist-info/RECORD,,
|