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.

Files changed (135) hide show
  1. kodit/_version.py +2 -2
  2. kodit/app.py +51 -23
  3. kodit/application/factories/reporting_factory.py +6 -2
  4. kodit/application/factories/server_factory.py +353 -0
  5. kodit/application/services/code_search_application_service.py +144 -0
  6. kodit/application/services/commit_indexing_application_service.py +700 -0
  7. kodit/application/services/indexing_worker_service.py +13 -44
  8. kodit/application/services/queue_service.py +24 -3
  9. kodit/application/services/reporting.py +0 -2
  10. kodit/application/services/sync_scheduler.py +15 -31
  11. kodit/cli.py +2 -753
  12. kodit/cli_utils.py +2 -9
  13. kodit/config.py +4 -97
  14. kodit/database.py +38 -1
  15. kodit/domain/enrichments/__init__.py +1 -0
  16. kodit/domain/enrichments/architecture/__init__.py +1 -0
  17. kodit/domain/enrichments/architecture/architecture.py +20 -0
  18. kodit/domain/enrichments/architecture/physical/__init__.py +1 -0
  19. kodit/domain/enrichments/architecture/physical/discovery_notes.py +14 -0
  20. kodit/domain/enrichments/architecture/physical/formatter.py +11 -0
  21. kodit/domain/enrichments/architecture/physical/physical.py +17 -0
  22. kodit/domain/enrichments/development/__init__.py +1 -0
  23. kodit/domain/enrichments/development/development.py +18 -0
  24. kodit/domain/enrichments/development/snippet/__init__.py +1 -0
  25. kodit/domain/enrichments/development/snippet/snippet.py +21 -0
  26. kodit/domain/enrichments/enricher.py +17 -0
  27. kodit/domain/enrichments/enrichment.py +39 -0
  28. kodit/domain/enrichments/request.py +12 -0
  29. kodit/domain/enrichments/response.py +11 -0
  30. kodit/domain/enrichments/usage/__init__.py +1 -0
  31. kodit/domain/enrichments/usage/api_docs.py +19 -0
  32. kodit/domain/enrichments/usage/usage.py +18 -0
  33. kodit/domain/{entities.py → entities/__init__.py} +50 -195
  34. kodit/domain/entities/git.py +190 -0
  35. kodit/domain/factories/__init__.py +1 -0
  36. kodit/domain/factories/git_repo_factory.py +76 -0
  37. kodit/domain/protocols.py +264 -64
  38. kodit/domain/services/bm25_service.py +5 -1
  39. kodit/domain/services/embedding_service.py +3 -0
  40. kodit/domain/services/enrichment_service.py +9 -30
  41. kodit/domain/services/git_repository_service.py +429 -0
  42. kodit/domain/services/git_service.py +300 -0
  43. kodit/domain/services/physical_architecture_service.py +182 -0
  44. kodit/domain/services/task_status_query_service.py +2 -2
  45. kodit/domain/value_objects.py +87 -135
  46. kodit/infrastructure/api/client/__init__.py +0 -2
  47. kodit/infrastructure/api/v1/__init__.py +0 -4
  48. kodit/infrastructure/api/v1/dependencies.py +92 -46
  49. kodit/infrastructure/api/v1/routers/__init__.py +0 -6
  50. kodit/infrastructure/api/v1/routers/commits.py +352 -0
  51. kodit/infrastructure/api/v1/routers/queue.py +2 -2
  52. kodit/infrastructure/api/v1/routers/repositories.py +282 -0
  53. kodit/infrastructure/api/v1/routers/search.py +31 -14
  54. kodit/infrastructure/api/v1/schemas/__init__.py +0 -24
  55. kodit/infrastructure/api/v1/schemas/commit.py +96 -0
  56. kodit/infrastructure/api/v1/schemas/context.py +2 -0
  57. kodit/infrastructure/api/v1/schemas/enrichment.py +29 -0
  58. kodit/infrastructure/api/v1/schemas/repository.py +128 -0
  59. kodit/infrastructure/api/v1/schemas/search.py +12 -9
  60. kodit/infrastructure/api/v1/schemas/snippet.py +58 -0
  61. kodit/infrastructure/api/v1/schemas/tag.py +31 -0
  62. kodit/infrastructure/api/v1/schemas/task_status.py +2 -0
  63. kodit/infrastructure/bm25/local_bm25_repository.py +16 -4
  64. kodit/infrastructure/bm25/vectorchord_bm25_repository.py +68 -52
  65. kodit/infrastructure/cloning/git/git_python_adaptor.py +534 -0
  66. kodit/infrastructure/cloning/git/working_copy.py +1 -1
  67. kodit/infrastructure/embedding/embedding_factory.py +3 -2
  68. kodit/infrastructure/embedding/local_vector_search_repository.py +1 -1
  69. kodit/infrastructure/embedding/vectorchord_vector_search_repository.py +111 -84
  70. kodit/infrastructure/enricher/__init__.py +1 -0
  71. kodit/infrastructure/enricher/enricher_factory.py +53 -0
  72. kodit/infrastructure/{enrichment/litellm_enrichment_provider.py → enricher/litellm_enricher.py} +36 -56
  73. kodit/infrastructure/{enrichment/local_enrichment_provider.py → enricher/local_enricher.py} +19 -24
  74. kodit/infrastructure/enricher/null_enricher.py +36 -0
  75. kodit/infrastructure/indexing/fusion_service.py +1 -1
  76. kodit/infrastructure/mappers/enrichment_mapper.py +83 -0
  77. kodit/infrastructure/mappers/git_mapper.py +193 -0
  78. kodit/infrastructure/mappers/snippet_mapper.py +104 -0
  79. kodit/infrastructure/mappers/task_mapper.py +5 -44
  80. kodit/infrastructure/physical_architecture/__init__.py +1 -0
  81. kodit/infrastructure/physical_architecture/detectors/__init__.py +1 -0
  82. kodit/infrastructure/physical_architecture/detectors/docker_compose_detector.py +336 -0
  83. kodit/infrastructure/physical_architecture/formatters/__init__.py +1 -0
  84. kodit/infrastructure/physical_architecture/formatters/narrative_formatter.py +149 -0
  85. kodit/infrastructure/reporting/log_progress.py +8 -5
  86. kodit/infrastructure/reporting/telemetry_progress.py +21 -0
  87. kodit/infrastructure/slicing/api_doc_extractor.py +836 -0
  88. kodit/infrastructure/slicing/ast_analyzer.py +1128 -0
  89. kodit/infrastructure/slicing/slicer.py +87 -421
  90. kodit/infrastructure/sqlalchemy/embedding_repository.py +43 -23
  91. kodit/infrastructure/sqlalchemy/enrichment_v2_repository.py +118 -0
  92. kodit/infrastructure/sqlalchemy/entities.py +402 -158
  93. kodit/infrastructure/sqlalchemy/git_branch_repository.py +274 -0
  94. kodit/infrastructure/sqlalchemy/git_commit_repository.py +346 -0
  95. kodit/infrastructure/sqlalchemy/git_repository.py +262 -0
  96. kodit/infrastructure/sqlalchemy/git_tag_repository.py +268 -0
  97. kodit/infrastructure/sqlalchemy/snippet_v2_repository.py +479 -0
  98. kodit/infrastructure/sqlalchemy/task_repository.py +29 -23
  99. kodit/infrastructure/sqlalchemy/task_status_repository.py +24 -12
  100. kodit/infrastructure/sqlalchemy/unit_of_work.py +10 -14
  101. kodit/mcp.py +12 -30
  102. kodit/migrations/env.py +1 -0
  103. kodit/migrations/versions/04b80f802e0c_foreign_key_review.py +100 -0
  104. kodit/migrations/versions/19f8c7faf8b9_add_generic_enrichment_type.py +260 -0
  105. kodit/migrations/versions/7f15f878c3a1_add_new_git_entities.py +690 -0
  106. kodit/migrations/versions/f9e5ef5e688f_add_git_commits_number.py +43 -0
  107. kodit/py.typed +0 -0
  108. kodit/utils/dump_config.py +361 -0
  109. kodit/utils/dump_openapi.py +6 -4
  110. kodit/utils/path_utils.py +29 -0
  111. {kodit-0.4.3.dist-info → kodit-0.5.1.dist-info}/METADATA +3 -3
  112. kodit-0.5.1.dist-info/RECORD +168 -0
  113. kodit/application/factories/code_indexing_factory.py +0 -195
  114. kodit/application/services/auto_indexing_service.py +0 -99
  115. kodit/application/services/code_indexing_application_service.py +0 -410
  116. kodit/domain/services/index_query_service.py +0 -70
  117. kodit/domain/services/index_service.py +0 -269
  118. kodit/infrastructure/api/client/index_client.py +0 -57
  119. kodit/infrastructure/api/v1/routers/indexes.py +0 -164
  120. kodit/infrastructure/api/v1/schemas/index.py +0 -101
  121. kodit/infrastructure/bm25/bm25_factory.py +0 -28
  122. kodit/infrastructure/cloning/__init__.py +0 -1
  123. kodit/infrastructure/cloning/metadata.py +0 -98
  124. kodit/infrastructure/enrichment/__init__.py +0 -1
  125. kodit/infrastructure/enrichment/enrichment_factory.py +0 -52
  126. kodit/infrastructure/enrichment/null_enrichment_provider.py +0 -19
  127. kodit/infrastructure/mappers/index_mapper.py +0 -345
  128. kodit/infrastructure/reporting/tdqm_progress.py +0 -38
  129. kodit/infrastructure/slicing/language_detection_service.py +0 -18
  130. kodit/infrastructure/sqlalchemy/index_repository.py +0 -646
  131. kodit-0.4.3.dist-info/RECORD +0 -125
  132. /kodit/infrastructure/{enrichment → enricher}/utils.py +0 -0
  133. {kodit-0.4.3.dist-info → kodit-0.5.1.dist-info}/WHEEL +0 -0
  134. {kodit-0.4.3.dist-info → kodit-0.5.1.dist-info}/entry_points.txt +0 -0
  135. {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()
@@ -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
- # Remove any dev tags from the version by retaining only the semver part
25
- git_tag = openapi["info"]["version"].split(".")[:3]
26
- openapi["info"]["version"] = ".".join(git_tag)
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.4.3
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.75.8
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,,