codexa 0.4.0__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.
Files changed (189) hide show
  1. codexa-0.4.0.dist-info/METADATA +650 -0
  2. codexa-0.4.0.dist-info/RECORD +189 -0
  3. codexa-0.4.0.dist-info/WHEEL +5 -0
  4. codexa-0.4.0.dist-info/entry_points.txt +2 -0
  5. codexa-0.4.0.dist-info/licenses/LICENSE +21 -0
  6. codexa-0.4.0.dist-info/top_level.txt +1 -0
  7. semantic_code_intelligence/__init__.py +5 -0
  8. semantic_code_intelligence/analysis/__init__.py +21 -0
  9. semantic_code_intelligence/analysis/ai_features.py +351 -0
  10. semantic_code_intelligence/bridge/__init__.py +28 -0
  11. semantic_code_intelligence/bridge/context_provider.py +245 -0
  12. semantic_code_intelligence/bridge/protocol.py +167 -0
  13. semantic_code_intelligence/bridge/server.py +348 -0
  14. semantic_code_intelligence/bridge/vscode.py +271 -0
  15. semantic_code_intelligence/ci/__init__.py +13 -0
  16. semantic_code_intelligence/ci/hooks.py +98 -0
  17. semantic_code_intelligence/ci/hotspots.py +272 -0
  18. semantic_code_intelligence/ci/impact.py +246 -0
  19. semantic_code_intelligence/ci/metrics.py +591 -0
  20. semantic_code_intelligence/ci/pr.py +412 -0
  21. semantic_code_intelligence/ci/quality.py +557 -0
  22. semantic_code_intelligence/ci/templates.py +164 -0
  23. semantic_code_intelligence/ci/trace.py +224 -0
  24. semantic_code_intelligence/cli/__init__.py +0 -0
  25. semantic_code_intelligence/cli/commands/__init__.py +0 -0
  26. semantic_code_intelligence/cli/commands/ask_cmd.py +153 -0
  27. semantic_code_intelligence/cli/commands/benchmark_cmd.py +303 -0
  28. semantic_code_intelligence/cli/commands/chat_cmd.py +252 -0
  29. semantic_code_intelligence/cli/commands/ci_gen_cmd.py +74 -0
  30. semantic_code_intelligence/cli/commands/context_cmd.py +120 -0
  31. semantic_code_intelligence/cli/commands/cross_refactor_cmd.py +113 -0
  32. semantic_code_intelligence/cli/commands/deps_cmd.py +91 -0
  33. semantic_code_intelligence/cli/commands/docs_cmd.py +101 -0
  34. semantic_code_intelligence/cli/commands/doctor_cmd.py +147 -0
  35. semantic_code_intelligence/cli/commands/evolve_cmd.py +171 -0
  36. semantic_code_intelligence/cli/commands/explain_cmd.py +112 -0
  37. semantic_code_intelligence/cli/commands/gate_cmd.py +135 -0
  38. semantic_code_intelligence/cli/commands/grep_cmd.py +234 -0
  39. semantic_code_intelligence/cli/commands/hotspots_cmd.py +119 -0
  40. semantic_code_intelligence/cli/commands/impact_cmd.py +131 -0
  41. semantic_code_intelligence/cli/commands/index_cmd.py +138 -0
  42. semantic_code_intelligence/cli/commands/init_cmd.py +152 -0
  43. semantic_code_intelligence/cli/commands/investigate_cmd.py +163 -0
  44. semantic_code_intelligence/cli/commands/languages_cmd.py +101 -0
  45. semantic_code_intelligence/cli/commands/lsp_cmd.py +49 -0
  46. semantic_code_intelligence/cli/commands/mcp_cmd.py +50 -0
  47. semantic_code_intelligence/cli/commands/metrics_cmd.py +264 -0
  48. semantic_code_intelligence/cli/commands/models_cmd.py +157 -0
  49. semantic_code_intelligence/cli/commands/plugin_cmd.py +275 -0
  50. semantic_code_intelligence/cli/commands/pr_summary_cmd.py +178 -0
  51. semantic_code_intelligence/cli/commands/quality_cmd.py +208 -0
  52. semantic_code_intelligence/cli/commands/refactor_cmd.py +103 -0
  53. semantic_code_intelligence/cli/commands/review_cmd.py +88 -0
  54. semantic_code_intelligence/cli/commands/search_cmd.py +236 -0
  55. semantic_code_intelligence/cli/commands/serve_cmd.py +117 -0
  56. semantic_code_intelligence/cli/commands/suggest_cmd.py +100 -0
  57. semantic_code_intelligence/cli/commands/summary_cmd.py +78 -0
  58. semantic_code_intelligence/cli/commands/tool_cmd.py +282 -0
  59. semantic_code_intelligence/cli/commands/trace_cmd.py +123 -0
  60. semantic_code_intelligence/cli/commands/tui_cmd.py +58 -0
  61. semantic_code_intelligence/cli/commands/viz_cmd.py +127 -0
  62. semantic_code_intelligence/cli/commands/watch_cmd.py +72 -0
  63. semantic_code_intelligence/cli/commands/web_cmd.py +61 -0
  64. semantic_code_intelligence/cli/commands/workspace_cmd.py +250 -0
  65. semantic_code_intelligence/cli/main.py +65 -0
  66. semantic_code_intelligence/cli/router.py +92 -0
  67. semantic_code_intelligence/config/__init__.py +0 -0
  68. semantic_code_intelligence/config/settings.py +260 -0
  69. semantic_code_intelligence/context/__init__.py +19 -0
  70. semantic_code_intelligence/context/engine.py +429 -0
  71. semantic_code_intelligence/context/memory.py +253 -0
  72. semantic_code_intelligence/daemon/__init__.py +1 -0
  73. semantic_code_intelligence/daemon/watcher.py +515 -0
  74. semantic_code_intelligence/docs/__init__.py +1080 -0
  75. semantic_code_intelligence/embeddings/__init__.py +0 -0
  76. semantic_code_intelligence/embeddings/enhanced.py +131 -0
  77. semantic_code_intelligence/embeddings/generator.py +149 -0
  78. semantic_code_intelligence/embeddings/model_registry.py +100 -0
  79. semantic_code_intelligence/evolution/__init__.py +1 -0
  80. semantic_code_intelligence/evolution/budget_guard.py +111 -0
  81. semantic_code_intelligence/evolution/commit_manager.py +88 -0
  82. semantic_code_intelligence/evolution/context_builder.py +131 -0
  83. semantic_code_intelligence/evolution/engine.py +249 -0
  84. semantic_code_intelligence/evolution/patch_generator.py +229 -0
  85. semantic_code_intelligence/evolution/task_selector.py +214 -0
  86. semantic_code_intelligence/evolution/test_runner.py +111 -0
  87. semantic_code_intelligence/indexing/__init__.py +0 -0
  88. semantic_code_intelligence/indexing/chunker.py +174 -0
  89. semantic_code_intelligence/indexing/parallel.py +86 -0
  90. semantic_code_intelligence/indexing/scanner.py +146 -0
  91. semantic_code_intelligence/indexing/semantic_chunker.py +337 -0
  92. semantic_code_intelligence/llm/__init__.py +62 -0
  93. semantic_code_intelligence/llm/cache.py +219 -0
  94. semantic_code_intelligence/llm/cached_provider.py +145 -0
  95. semantic_code_intelligence/llm/conversation.py +190 -0
  96. semantic_code_intelligence/llm/cross_refactor.py +272 -0
  97. semantic_code_intelligence/llm/investigation.py +274 -0
  98. semantic_code_intelligence/llm/mock_provider.py +77 -0
  99. semantic_code_intelligence/llm/ollama_provider.py +122 -0
  100. semantic_code_intelligence/llm/openai_provider.py +100 -0
  101. semantic_code_intelligence/llm/provider.py +92 -0
  102. semantic_code_intelligence/llm/rate_limiter.py +164 -0
  103. semantic_code_intelligence/llm/reasoning.py +438 -0
  104. semantic_code_intelligence/llm/safety.py +110 -0
  105. semantic_code_intelligence/llm/streaming.py +251 -0
  106. semantic_code_intelligence/lsp/__init__.py +609 -0
  107. semantic_code_intelligence/mcp/__init__.py +393 -0
  108. semantic_code_intelligence/parsing/__init__.py +19 -0
  109. semantic_code_intelligence/parsing/parser.py +375 -0
  110. semantic_code_intelligence/plugins/__init__.py +255 -0
  111. semantic_code_intelligence/plugins/examples/__init__.py +1 -0
  112. semantic_code_intelligence/plugins/examples/code_quality.py +73 -0
  113. semantic_code_intelligence/plugins/examples/search_annotator.py +56 -0
  114. semantic_code_intelligence/scalability/__init__.py +205 -0
  115. semantic_code_intelligence/search/__init__.py +0 -0
  116. semantic_code_intelligence/search/formatter.py +123 -0
  117. semantic_code_intelligence/search/grep.py +361 -0
  118. semantic_code_intelligence/search/hybrid_search.py +170 -0
  119. semantic_code_intelligence/search/keyword_search.py +311 -0
  120. semantic_code_intelligence/search/section_expander.py +103 -0
  121. semantic_code_intelligence/services/__init__.py +0 -0
  122. semantic_code_intelligence/services/indexing_service.py +630 -0
  123. semantic_code_intelligence/services/search_service.py +269 -0
  124. semantic_code_intelligence/storage/__init__.py +0 -0
  125. semantic_code_intelligence/storage/chunk_hash_store.py +86 -0
  126. semantic_code_intelligence/storage/hash_store.py +66 -0
  127. semantic_code_intelligence/storage/index_manifest.py +85 -0
  128. semantic_code_intelligence/storage/index_stats.py +138 -0
  129. semantic_code_intelligence/storage/query_history.py +160 -0
  130. semantic_code_intelligence/storage/symbol_registry.py +209 -0
  131. semantic_code_intelligence/storage/vector_store.py +297 -0
  132. semantic_code_intelligence/tests/__init__.py +0 -0
  133. semantic_code_intelligence/tests/test_ai_features.py +351 -0
  134. semantic_code_intelligence/tests/test_chunker.py +119 -0
  135. semantic_code_intelligence/tests/test_cli.py +188 -0
  136. semantic_code_intelligence/tests/test_config.py +154 -0
  137. semantic_code_intelligence/tests/test_context.py +381 -0
  138. semantic_code_intelligence/tests/test_embeddings.py +73 -0
  139. semantic_code_intelligence/tests/test_endtoend.py +1142 -0
  140. semantic_code_intelligence/tests/test_enhanced_embeddings.py +92 -0
  141. semantic_code_intelligence/tests/test_hash_store.py +79 -0
  142. semantic_code_intelligence/tests/test_logging.py +55 -0
  143. semantic_code_intelligence/tests/test_new_cli.py +138 -0
  144. semantic_code_intelligence/tests/test_parser.py +495 -0
  145. semantic_code_intelligence/tests/test_phase10.py +355 -0
  146. semantic_code_intelligence/tests/test_phase11.py +593 -0
  147. semantic_code_intelligence/tests/test_phase12.py +375 -0
  148. semantic_code_intelligence/tests/test_phase13.py +663 -0
  149. semantic_code_intelligence/tests/test_phase14.py +568 -0
  150. semantic_code_intelligence/tests/test_phase15.py +814 -0
  151. semantic_code_intelligence/tests/test_phase16.py +792 -0
  152. semantic_code_intelligence/tests/test_phase17.py +815 -0
  153. semantic_code_intelligence/tests/test_phase18.py +934 -0
  154. semantic_code_intelligence/tests/test_phase19.py +986 -0
  155. semantic_code_intelligence/tests/test_phase20.py +2753 -0
  156. semantic_code_intelligence/tests/test_phase20b.py +2058 -0
  157. semantic_code_intelligence/tests/test_phase20c.py +962 -0
  158. semantic_code_intelligence/tests/test_phase21.py +428 -0
  159. semantic_code_intelligence/tests/test_phase22.py +799 -0
  160. semantic_code_intelligence/tests/test_phase23.py +783 -0
  161. semantic_code_intelligence/tests/test_phase24.py +715 -0
  162. semantic_code_intelligence/tests/test_phase25.py +496 -0
  163. semantic_code_intelligence/tests/test_phase26.py +251 -0
  164. semantic_code_intelligence/tests/test_phase27.py +531 -0
  165. semantic_code_intelligence/tests/test_phase8.py +592 -0
  166. semantic_code_intelligence/tests/test_phase9.py +643 -0
  167. semantic_code_intelligence/tests/test_plugins.py +293 -0
  168. semantic_code_intelligence/tests/test_priority_features.py +727 -0
  169. semantic_code_intelligence/tests/test_router.py +41 -0
  170. semantic_code_intelligence/tests/test_scalability.py +138 -0
  171. semantic_code_intelligence/tests/test_scanner.py +125 -0
  172. semantic_code_intelligence/tests/test_search.py +160 -0
  173. semantic_code_intelligence/tests/test_semantic_chunker.py +255 -0
  174. semantic_code_intelligence/tests/test_tools.py +182 -0
  175. semantic_code_intelligence/tests/test_vector_store.py +151 -0
  176. semantic_code_intelligence/tests/test_watcher.py +211 -0
  177. semantic_code_intelligence/tools/__init__.py +442 -0
  178. semantic_code_intelligence/tools/executor.py +232 -0
  179. semantic_code_intelligence/tools/protocol.py +200 -0
  180. semantic_code_intelligence/tui/__init__.py +454 -0
  181. semantic_code_intelligence/utils/__init__.py +0 -0
  182. semantic_code_intelligence/utils/logging.py +112 -0
  183. semantic_code_intelligence/version.py +3 -0
  184. semantic_code_intelligence/web/__init__.py +11 -0
  185. semantic_code_intelligence/web/api.py +289 -0
  186. semantic_code_intelligence/web/server.py +397 -0
  187. semantic_code_intelligence/web/ui.py +659 -0
  188. semantic_code_intelligence/web/visualize.py +226 -0
  189. semantic_code_intelligence/workspace/__init__.py +427 -0
@@ -0,0 +1,251 @@
1
+ """Tests for v0.27.0 features: grep flags, JSONL, models CLI, IVF, build, VS Code extension."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import numpy as np
7
+ import pytest
8
+ from pathlib import Path
9
+ from click.testing import CliRunner
10
+
11
+ from semantic_code_intelligence import __version__
12
+ from semantic_code_intelligence.cli.main import cli
13
+
14
+
15
+ # =========================================================================
16
+ # Version
17
+ # =========================================================================
18
+
19
+ class TestVersion027:
20
+ def test_version_is_027(self):
21
+ assert __version__ == "0.4.0"
22
+
23
+
24
+ # =========================================================================
25
+ # P2 — Grep flag parity + JSONL
26
+ # =========================================================================
27
+
28
+ class TestSearchGrepFlags:
29
+ """Verify the new grep-style flags are accepted by the search CLI."""
30
+
31
+ def test_search_help_has_context_lines(self):
32
+ runner = CliRunner()
33
+ result = runner.invoke(cli, ["search", "--help"])
34
+ assert "--context-lines" in result.output
35
+ assert "-C" in result.output
36
+
37
+ def test_search_help_has_files_only(self):
38
+ runner = CliRunner()
39
+ result = runner.invoke(cli, ["search", "--help"])
40
+ assert "--files-only" in result.output
41
+
42
+ def test_search_help_has_files_without_match(self):
43
+ runner = CliRunner()
44
+ result = runner.invoke(cli, ["search", "--help"])
45
+ assert "--files-without-match" in result.output
46
+
47
+ def test_search_help_has_line_numbers(self):
48
+ runner = CliRunner()
49
+ result = runner.invoke(cli, ["search", "--help"])
50
+ assert "--line-numbers" in result.output
51
+
52
+ def test_search_help_has_jsonl(self):
53
+ runner = CliRunner()
54
+ result = runner.invoke(cli, ["search", "--help"])
55
+ assert "--jsonl" in result.output
56
+
57
+
58
+ class TestFormatterJsonl:
59
+ """Test format_results_jsonl output."""
60
+
61
+ def test_jsonl_empty(self):
62
+ from semantic_code_intelligence.search.formatter import format_results_jsonl
63
+ assert format_results_jsonl([]) == ""
64
+
65
+ def test_jsonl_format(self):
66
+ from semantic_code_intelligence.search.formatter import format_results_jsonl
67
+ from semantic_code_intelligence.services.search_service import SearchResult
68
+ results = [
69
+ SearchResult(
70
+ file_path="a.py", start_line=1, end_line=5,
71
+ language="python", content="pass", score=0.9,
72
+ chunk_index=0,
73
+ ),
74
+ SearchResult(
75
+ file_path="b.py", start_line=10, end_line=20,
76
+ language="python", content="x = 1", score=0.8,
77
+ chunk_index=1,
78
+ ),
79
+ ]
80
+ output = format_results_jsonl(results)
81
+ lines = output.strip().split("\n")
82
+ assert len(lines) == 2
83
+ for line in lines:
84
+ obj = json.loads(line)
85
+ assert "file_path" in obj
86
+ assert "score" in obj
87
+
88
+
89
+ # =========================================================================
90
+ # P5 — IVF index support
91
+ # =========================================================================
92
+
93
+ class TestVectorStoreIVF:
94
+ """Test IVF-related vector store functionality."""
95
+
96
+ def test_default_flat_index(self):
97
+ from semantic_code_intelligence.storage.vector_store import VectorStore
98
+ store = VectorStore(128)
99
+ assert store.size == 0
100
+ assert not store._use_ivf
101
+
102
+ def test_ivf_mode_fallback_few_vectors(self):
103
+ """IVF mode should fall back to flat when not enough vectors to train."""
104
+ from semantic_code_intelligence.storage.vector_store import VectorStore, ChunkMetadata
105
+ store = VectorStore(8, use_ivf=True)
106
+ vecs = np.random.randn(5, 8).astype(np.float32)
107
+ vecs = vecs / np.linalg.norm(vecs, axis=1, keepdims=True)
108
+ meta = [
109
+ ChunkMetadata(f"f{i}.py", 1, 2, i, "python", "x", "")
110
+ for i in range(5)
111
+ ]
112
+ store.add(vecs, meta)
113
+ assert store.size == 5
114
+ # Should have fallen back to flat since 5 < IVF_NLIST
115
+ assert not store._use_ivf
116
+
117
+ def test_ivf_threshold_constant(self):
118
+ from semantic_code_intelligence.storage.vector_store import IVF_THRESHOLD
119
+ assert IVF_THRESHOLD == 50_000
120
+
121
+
122
+ # =========================================================================
123
+ # P6 — Models CLI
124
+ # =========================================================================
125
+
126
+ class TestModelsCLI:
127
+ """Test the models command group."""
128
+
129
+ def test_models_list_help(self):
130
+ runner = CliRunner()
131
+ result = runner.invoke(cli, ["models", "list", "--help"])
132
+ assert result.exit_code == 0
133
+ assert "--json" in result.output
134
+
135
+ def test_models_info_help(self):
136
+ runner = CliRunner()
137
+ result = runner.invoke(cli, ["models", "info", "--help"])
138
+ assert result.exit_code == 0
139
+
140
+ def test_models_download_help(self):
141
+ runner = CliRunner()
142
+ result = runner.invoke(cli, ["models", "download", "--help"])
143
+ assert result.exit_code == 0
144
+ assert "--backend" in result.output
145
+
146
+ def test_models_switch_help(self):
147
+ runner = CliRunner()
148
+ result = runner.invoke(cli, ["models", "switch", "--help"])
149
+ assert result.exit_code == 0
150
+
151
+ def test_models_list_json(self):
152
+ runner = CliRunner()
153
+ result = runner.invoke(cli, ["models", "list", "--json"])
154
+ assert result.exit_code == 0
155
+ data = json.loads(result.output)
156
+ assert isinstance(data, list)
157
+ assert len(data) >= 5
158
+ names = [m["name"] for m in data]
159
+ assert "all-MiniLM-L6-v2" in names
160
+
161
+ def test_models_info_valid(self):
162
+ runner = CliRunner()
163
+ result = runner.invoke(cli, ["models", "info", "minilm"])
164
+ assert result.exit_code == 0
165
+ assert "MiniLM" in result.output
166
+
167
+ def test_models_info_unknown(self):
168
+ runner = CliRunner()
169
+ result = runner.invoke(cli, ["models", "info", "nonexistent-model-xyz"])
170
+ assert result.exit_code != 0
171
+
172
+ def test_model_count_is_35(self):
173
+ """Verify we now have 36 top-level commands."""
174
+ assert len(cli.commands) == 39
175
+
176
+
177
+ class TestModelRegistry:
178
+ """Test model registry helper functions."""
179
+
180
+ def test_resolve_alias(self):
181
+ from semantic_code_intelligence.embeddings.model_registry import resolve_model_name
182
+ assert resolve_model_name("minilm") == "all-MiniLM-L6-v2"
183
+ assert resolve_model_name("jina-code") == "jinaai/jina-embeddings-v2-base-code"
184
+
185
+ def test_list_models(self):
186
+ from semantic_code_intelligence.embeddings.model_registry import list_models
187
+ models = list_models()
188
+ assert len(models) >= 5
189
+
190
+ def test_get_model_info(self):
191
+ from semantic_code_intelligence.embeddings.model_registry import get_model_info
192
+ info = get_model_info("minilm")
193
+ assert info is not None
194
+ assert info.dimension == 384
195
+
196
+ def test_get_model_info_unknown(self):
197
+ from semantic_code_intelligence.embeddings.model_registry import get_model_info
198
+ assert get_model_info("fake-model-xxx") is None
199
+
200
+
201
+ # =========================================================================
202
+ # P4 — Build script
203
+ # =========================================================================
204
+
205
+ class TestBuildScript:
206
+ def test_build_script_exists(self):
207
+ assert Path("scripts/build_binary.py").exists() or Path("d:/mounir/CodexA/scripts/build_binary.py").exists()
208
+
209
+ def test_build_script_importable(self):
210
+ import importlib.util
211
+ spec = importlib.util.spec_from_file_location("build_binary", "scripts/build_binary.py")
212
+ assert spec is not None
213
+
214
+
215
+ # =========================================================================
216
+ # P3 — VS Code extension
217
+ # =========================================================================
218
+
219
+ class TestVSCodeExtension:
220
+ def test_package_json_exists(self):
221
+ p = Path("vscode-extension/package.json")
222
+ assert p.exists() or Path("d:/mounir/CodexA/vscode-extension/package.json").exists()
223
+
224
+ def test_extension_ts_exists(self):
225
+ p = Path("vscode-extension/src/extension.ts")
226
+ assert p.exists() or Path("d:/mounir/CodexA/vscode-extension/src/extension.ts").exists()
227
+
228
+ def test_package_json_valid(self):
229
+ p = Path("vscode-extension/package.json")
230
+ if not p.exists():
231
+ p = Path("d:/mounir/CodexA/vscode-extension/package.json")
232
+ data = json.loads(p.read_text(encoding="utf-8"))
233
+ assert data["name"] == "codexa"
234
+ assert "commands" in str(data["contributes"])
235
+
236
+
237
+ # =========================================================================
238
+ # Formatter context expansion
239
+ # =========================================================================
240
+
241
+ class TestFormatterExpand:
242
+ def test_expand_context_no_file(self):
243
+ from semantic_code_intelligence.search.formatter import _expand_context
244
+ from semantic_code_intelligence.services.search_service import SearchResult
245
+ result = SearchResult(
246
+ file_path="/nonexistent/path.py", start_line=5, end_line=10,
247
+ language="python", content="hello", score=0.5, chunk_index=0,
248
+ )
249
+ content, start = _expand_context(result, 3)
250
+ assert content == "hello"
251
+ assert start == 5