crackerjack 0.18.2__py3-none-any.whl → 0.45.2__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 (533) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +96 -2
  3. crackerjack/__main__.py +637 -138
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +39 -0
  6. crackerjack/adapters/_output_paths.py +167 -0
  7. crackerjack/adapters/_qa_adapter_base.py +309 -0
  8. crackerjack/adapters/_tool_adapter_base.py +706 -0
  9. crackerjack/adapters/ai/README.md +65 -0
  10. crackerjack/adapters/ai/__init__.py +5 -0
  11. crackerjack/adapters/ai/claude.py +853 -0
  12. crackerjack/adapters/complexity/README.md +53 -0
  13. crackerjack/adapters/complexity/__init__.py +10 -0
  14. crackerjack/adapters/complexity/complexipy.py +641 -0
  15. crackerjack/adapters/dependency/__init__.py +22 -0
  16. crackerjack/adapters/dependency/pip_audit.py +418 -0
  17. crackerjack/adapters/format/README.md +72 -0
  18. crackerjack/adapters/format/__init__.py +11 -0
  19. crackerjack/adapters/format/mdformat.py +313 -0
  20. crackerjack/adapters/format/ruff.py +516 -0
  21. crackerjack/adapters/lint/README.md +47 -0
  22. crackerjack/adapters/lint/__init__.py +11 -0
  23. crackerjack/adapters/lint/codespell.py +273 -0
  24. crackerjack/adapters/lsp/README.md +49 -0
  25. crackerjack/adapters/lsp/__init__.py +27 -0
  26. crackerjack/adapters/lsp/_base.py +194 -0
  27. crackerjack/adapters/lsp/_client.py +358 -0
  28. crackerjack/adapters/lsp/_manager.py +193 -0
  29. crackerjack/adapters/lsp/skylos.py +283 -0
  30. crackerjack/adapters/lsp/zuban.py +557 -0
  31. crackerjack/adapters/refactor/README.md +59 -0
  32. crackerjack/adapters/refactor/__init__.py +12 -0
  33. crackerjack/adapters/refactor/creosote.py +318 -0
  34. crackerjack/adapters/refactor/refurb.py +406 -0
  35. crackerjack/adapters/refactor/skylos.py +494 -0
  36. crackerjack/adapters/sast/README.md +132 -0
  37. crackerjack/adapters/sast/__init__.py +32 -0
  38. crackerjack/adapters/sast/_base.py +201 -0
  39. crackerjack/adapters/sast/bandit.py +423 -0
  40. crackerjack/adapters/sast/pyscn.py +405 -0
  41. crackerjack/adapters/sast/semgrep.py +241 -0
  42. crackerjack/adapters/security/README.md +111 -0
  43. crackerjack/adapters/security/__init__.py +17 -0
  44. crackerjack/adapters/security/gitleaks.py +339 -0
  45. crackerjack/adapters/type/README.md +52 -0
  46. crackerjack/adapters/type/__init__.py +12 -0
  47. crackerjack/adapters/type/pyrefly.py +402 -0
  48. crackerjack/adapters/type/ty.py +402 -0
  49. crackerjack/adapters/type/zuban.py +522 -0
  50. crackerjack/adapters/utility/README.md +51 -0
  51. crackerjack/adapters/utility/__init__.py +10 -0
  52. crackerjack/adapters/utility/checks.py +884 -0
  53. crackerjack/agents/README.md +264 -0
  54. crackerjack/agents/__init__.py +66 -0
  55. crackerjack/agents/architect_agent.py +238 -0
  56. crackerjack/agents/base.py +167 -0
  57. crackerjack/agents/claude_code_bridge.py +641 -0
  58. crackerjack/agents/coordinator.py +600 -0
  59. crackerjack/agents/documentation_agent.py +520 -0
  60. crackerjack/agents/dry_agent.py +585 -0
  61. crackerjack/agents/enhanced_coordinator.py +279 -0
  62. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  63. crackerjack/agents/error_middleware.py +53 -0
  64. crackerjack/agents/formatting_agent.py +230 -0
  65. crackerjack/agents/helpers/__init__.py +9 -0
  66. crackerjack/agents/helpers/performance/__init__.py +22 -0
  67. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  68. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  69. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  70. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  71. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  72. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  73. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  74. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  75. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  76. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  77. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  78. crackerjack/agents/import_optimization_agent.py +1181 -0
  79. crackerjack/agents/performance_agent.py +325 -0
  80. crackerjack/agents/performance_helpers.py +205 -0
  81. crackerjack/agents/proactive_agent.py +55 -0
  82. crackerjack/agents/refactoring_agent.py +511 -0
  83. crackerjack/agents/refactoring_helpers.py +247 -0
  84. crackerjack/agents/security_agent.py +793 -0
  85. crackerjack/agents/semantic_agent.py +479 -0
  86. crackerjack/agents/semantic_helpers.py +356 -0
  87. crackerjack/agents/test_creation_agent.py +570 -0
  88. crackerjack/agents/test_specialist_agent.py +526 -0
  89. crackerjack/agents/tracker.py +110 -0
  90. crackerjack/api.py +647 -0
  91. crackerjack/cli/README.md +394 -0
  92. crackerjack/cli/__init__.py +24 -0
  93. crackerjack/cli/cache_handlers.py +209 -0
  94. crackerjack/cli/cache_handlers_enhanced.py +680 -0
  95. crackerjack/cli/facade.py +162 -0
  96. crackerjack/cli/formatting.py +13 -0
  97. crackerjack/cli/handlers/__init__.py +85 -0
  98. crackerjack/cli/handlers/advanced.py +103 -0
  99. crackerjack/cli/handlers/ai_features.py +62 -0
  100. crackerjack/cli/handlers/analytics.py +479 -0
  101. crackerjack/cli/handlers/changelog.py +271 -0
  102. crackerjack/cli/handlers/config_handlers.py +16 -0
  103. crackerjack/cli/handlers/coverage.py +84 -0
  104. crackerjack/cli/handlers/documentation.py +280 -0
  105. crackerjack/cli/handlers/main_handlers.py +497 -0
  106. crackerjack/cli/handlers/monitoring.py +371 -0
  107. crackerjack/cli/handlers.py +700 -0
  108. crackerjack/cli/interactive.py +488 -0
  109. crackerjack/cli/options.py +1216 -0
  110. crackerjack/cli/semantic_handlers.py +292 -0
  111. crackerjack/cli/utils.py +19 -0
  112. crackerjack/cli/version.py +19 -0
  113. crackerjack/code_cleaner.py +1307 -0
  114. crackerjack/config/README.md +472 -0
  115. crackerjack/config/__init__.py +275 -0
  116. crackerjack/config/global_lock_config.py +207 -0
  117. crackerjack/config/hooks.py +390 -0
  118. crackerjack/config/loader.py +239 -0
  119. crackerjack/config/settings.py +141 -0
  120. crackerjack/config/tool_commands.py +331 -0
  121. crackerjack/core/README.md +393 -0
  122. crackerjack/core/__init__.py +0 -0
  123. crackerjack/core/async_workflow_orchestrator.py +738 -0
  124. crackerjack/core/autofix_coordinator.py +282 -0
  125. crackerjack/core/container.py +105 -0
  126. crackerjack/core/enhanced_container.py +583 -0
  127. crackerjack/core/file_lifecycle.py +472 -0
  128. crackerjack/core/performance.py +244 -0
  129. crackerjack/core/performance_monitor.py +357 -0
  130. crackerjack/core/phase_coordinator.py +1227 -0
  131. crackerjack/core/proactive_workflow.py +267 -0
  132. crackerjack/core/resource_manager.py +425 -0
  133. crackerjack/core/retry.py +275 -0
  134. crackerjack/core/service_watchdog.py +601 -0
  135. crackerjack/core/session_coordinator.py +239 -0
  136. crackerjack/core/timeout_manager.py +563 -0
  137. crackerjack/core/websocket_lifecycle.py +410 -0
  138. crackerjack/core/workflow/__init__.py +21 -0
  139. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  140. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  141. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  142. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  143. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  144. crackerjack/core/workflow_orchestrator.py +2243 -0
  145. crackerjack/data/README.md +11 -0
  146. crackerjack/data/__init__.py +8 -0
  147. crackerjack/data/models.py +79 -0
  148. crackerjack/data/repository.py +210 -0
  149. crackerjack/decorators/README.md +180 -0
  150. crackerjack/decorators/__init__.py +35 -0
  151. crackerjack/decorators/error_handling.py +649 -0
  152. crackerjack/decorators/error_handling_decorators.py +334 -0
  153. crackerjack/decorators/helpers.py +58 -0
  154. crackerjack/decorators/patterns.py +281 -0
  155. crackerjack/decorators/utils.py +58 -0
  156. crackerjack/docs/INDEX.md +11 -0
  157. crackerjack/docs/README.md +11 -0
  158. crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
  159. crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
  160. crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
  161. crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
  162. crackerjack/docs/generated/api/SERVICES.md +1252 -0
  163. crackerjack/documentation/README.md +11 -0
  164. crackerjack/documentation/__init__.py +31 -0
  165. crackerjack/documentation/ai_templates.py +756 -0
  166. crackerjack/documentation/dual_output_generator.py +767 -0
  167. crackerjack/documentation/mkdocs_integration.py +518 -0
  168. crackerjack/documentation/reference_generator.py +1065 -0
  169. crackerjack/dynamic_config.py +678 -0
  170. crackerjack/errors.py +378 -0
  171. crackerjack/events/README.md +11 -0
  172. crackerjack/events/__init__.py +16 -0
  173. crackerjack/events/telemetry.py +175 -0
  174. crackerjack/events/workflow_bus.py +346 -0
  175. crackerjack/exceptions/README.md +301 -0
  176. crackerjack/exceptions/__init__.py +5 -0
  177. crackerjack/exceptions/config.py +4 -0
  178. crackerjack/exceptions/tool_execution_error.py +245 -0
  179. crackerjack/executors/README.md +591 -0
  180. crackerjack/executors/__init__.py +13 -0
  181. crackerjack/executors/async_hook_executor.py +938 -0
  182. crackerjack/executors/cached_hook_executor.py +316 -0
  183. crackerjack/executors/hook_executor.py +1295 -0
  184. crackerjack/executors/hook_lock_manager.py +708 -0
  185. crackerjack/executors/individual_hook_executor.py +739 -0
  186. crackerjack/executors/lsp_aware_hook_executor.py +349 -0
  187. crackerjack/executors/progress_hook_executor.py +282 -0
  188. crackerjack/executors/tool_proxy.py +433 -0
  189. crackerjack/hooks/README.md +485 -0
  190. crackerjack/hooks/lsp_hook.py +93 -0
  191. crackerjack/intelligence/README.md +557 -0
  192. crackerjack/intelligence/__init__.py +37 -0
  193. crackerjack/intelligence/adaptive_learning.py +693 -0
  194. crackerjack/intelligence/agent_orchestrator.py +485 -0
  195. crackerjack/intelligence/agent_registry.py +377 -0
  196. crackerjack/intelligence/agent_selector.py +439 -0
  197. crackerjack/intelligence/integration.py +250 -0
  198. crackerjack/interactive.py +719 -0
  199. crackerjack/managers/README.md +369 -0
  200. crackerjack/managers/__init__.py +11 -0
  201. crackerjack/managers/async_hook_manager.py +135 -0
  202. crackerjack/managers/hook_manager.py +585 -0
  203. crackerjack/managers/publish_manager.py +631 -0
  204. crackerjack/managers/test_command_builder.py +391 -0
  205. crackerjack/managers/test_executor.py +474 -0
  206. crackerjack/managers/test_manager.py +1357 -0
  207. crackerjack/managers/test_progress.py +187 -0
  208. crackerjack/mcp/README.md +374 -0
  209. crackerjack/mcp/__init__.py +0 -0
  210. crackerjack/mcp/cache.py +352 -0
  211. crackerjack/mcp/client_runner.py +121 -0
  212. crackerjack/mcp/context.py +802 -0
  213. crackerjack/mcp/dashboard.py +657 -0
  214. crackerjack/mcp/enhanced_progress_monitor.py +493 -0
  215. crackerjack/mcp/file_monitor.py +394 -0
  216. crackerjack/mcp/progress_components.py +607 -0
  217. crackerjack/mcp/progress_monitor.py +1016 -0
  218. crackerjack/mcp/rate_limiter.py +336 -0
  219. crackerjack/mcp/server.py +24 -0
  220. crackerjack/mcp/server_core.py +526 -0
  221. crackerjack/mcp/service_watchdog.py +505 -0
  222. crackerjack/mcp/state.py +407 -0
  223. crackerjack/mcp/task_manager.py +259 -0
  224. crackerjack/mcp/tools/README.md +27 -0
  225. crackerjack/mcp/tools/__init__.py +19 -0
  226. crackerjack/mcp/tools/core_tools.py +469 -0
  227. crackerjack/mcp/tools/error_analyzer.py +283 -0
  228. crackerjack/mcp/tools/execution_tools.py +384 -0
  229. crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
  230. crackerjack/mcp/tools/intelligence_tools.py +264 -0
  231. crackerjack/mcp/tools/monitoring_tools.py +628 -0
  232. crackerjack/mcp/tools/proactive_tools.py +367 -0
  233. crackerjack/mcp/tools/progress_tools.py +222 -0
  234. crackerjack/mcp/tools/semantic_tools.py +584 -0
  235. crackerjack/mcp/tools/utility_tools.py +358 -0
  236. crackerjack/mcp/tools/workflow_executor.py +699 -0
  237. crackerjack/mcp/websocket/README.md +31 -0
  238. crackerjack/mcp/websocket/__init__.py +14 -0
  239. crackerjack/mcp/websocket/app.py +54 -0
  240. crackerjack/mcp/websocket/endpoints.py +492 -0
  241. crackerjack/mcp/websocket/event_bridge.py +188 -0
  242. crackerjack/mcp/websocket/jobs.py +406 -0
  243. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  244. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  245. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  246. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  247. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  248. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  249. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  250. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  251. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  252. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  253. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  254. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  255. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  256. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  257. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  258. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  259. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  260. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  261. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  262. crackerjack/mcp/websocket/monitoring_endpoints.py +21 -0
  263. crackerjack/mcp/websocket/server.py +174 -0
  264. crackerjack/mcp/websocket/websocket_handler.py +276 -0
  265. crackerjack/mcp/websocket_server.py +10 -0
  266. crackerjack/models/README.md +308 -0
  267. crackerjack/models/__init__.py +40 -0
  268. crackerjack/models/config.py +730 -0
  269. crackerjack/models/config_adapter.py +265 -0
  270. crackerjack/models/protocols.py +1535 -0
  271. crackerjack/models/pydantic_models.py +320 -0
  272. crackerjack/models/qa_config.py +145 -0
  273. crackerjack/models/qa_results.py +134 -0
  274. crackerjack/models/resource_protocols.py +299 -0
  275. crackerjack/models/results.py +35 -0
  276. crackerjack/models/semantic_models.py +258 -0
  277. crackerjack/models/task.py +173 -0
  278. crackerjack/models/test_models.py +60 -0
  279. crackerjack/monitoring/README.md +11 -0
  280. crackerjack/monitoring/__init__.py +0 -0
  281. crackerjack/monitoring/ai_agent_watchdog.py +405 -0
  282. crackerjack/monitoring/metrics_collector.py +427 -0
  283. crackerjack/monitoring/regression_prevention.py +580 -0
  284. crackerjack/monitoring/websocket_server.py +406 -0
  285. crackerjack/orchestration/README.md +340 -0
  286. crackerjack/orchestration/__init__.py +43 -0
  287. crackerjack/orchestration/advanced_orchestrator.py +894 -0
  288. crackerjack/orchestration/cache/README.md +312 -0
  289. crackerjack/orchestration/cache/__init__.py +37 -0
  290. crackerjack/orchestration/cache/memory_cache.py +338 -0
  291. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  292. crackerjack/orchestration/config.py +297 -0
  293. crackerjack/orchestration/coverage_improvement.py +180 -0
  294. crackerjack/orchestration/execution_strategies.py +361 -0
  295. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  296. crackerjack/orchestration/strategies/README.md +401 -0
  297. crackerjack/orchestration/strategies/__init__.py +39 -0
  298. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  299. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  300. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  301. crackerjack/orchestration/test_progress_streamer.py +647 -0
  302. crackerjack/plugins/README.md +11 -0
  303. crackerjack/plugins/__init__.py +15 -0
  304. crackerjack/plugins/base.py +200 -0
  305. crackerjack/plugins/hooks.py +254 -0
  306. crackerjack/plugins/loader.py +335 -0
  307. crackerjack/plugins/managers.py +264 -0
  308. crackerjack/py313.py +191 -0
  309. crackerjack/security/README.md +11 -0
  310. crackerjack/security/__init__.py +0 -0
  311. crackerjack/security/audit.py +197 -0
  312. crackerjack/services/README.md +374 -0
  313. crackerjack/services/__init__.py +9 -0
  314. crackerjack/services/ai/README.md +295 -0
  315. crackerjack/services/ai/__init__.py +7 -0
  316. crackerjack/services/ai/advanced_optimizer.py +878 -0
  317. crackerjack/services/ai/contextual_ai_assistant.py +542 -0
  318. crackerjack/services/ai/embeddings.py +444 -0
  319. crackerjack/services/ai/intelligent_commit.py +328 -0
  320. crackerjack/services/ai/predictive_analytics.py +510 -0
  321. crackerjack/services/anomaly_detector.py +392 -0
  322. crackerjack/services/api_extractor.py +617 -0
  323. crackerjack/services/backup_service.py +467 -0
  324. crackerjack/services/bounded_status_operations.py +530 -0
  325. crackerjack/services/cache.py +369 -0
  326. crackerjack/services/changelog_automation.py +399 -0
  327. crackerjack/services/command_execution_service.py +305 -0
  328. crackerjack/services/config_integrity.py +132 -0
  329. crackerjack/services/config_merge.py +546 -0
  330. crackerjack/services/config_service.py +198 -0
  331. crackerjack/services/config_template.py +493 -0
  332. crackerjack/services/coverage_badge_service.py +173 -0
  333. crackerjack/services/coverage_ratchet.py +381 -0
  334. crackerjack/services/debug.py +733 -0
  335. crackerjack/services/dependency_analyzer.py +460 -0
  336. crackerjack/services/dependency_monitor.py +622 -0
  337. crackerjack/services/documentation_generator.py +493 -0
  338. crackerjack/services/documentation_service.py +704 -0
  339. crackerjack/services/enhanced_filesystem.py +497 -0
  340. crackerjack/services/enterprise_optimizer.py +865 -0
  341. crackerjack/services/error_pattern_analyzer.py +676 -0
  342. crackerjack/services/file_filter.py +221 -0
  343. crackerjack/services/file_hasher.py +149 -0
  344. crackerjack/services/file_io_service.py +361 -0
  345. crackerjack/services/file_modifier.py +615 -0
  346. crackerjack/services/filesystem.py +381 -0
  347. crackerjack/services/git.py +422 -0
  348. crackerjack/services/health_metrics.py +615 -0
  349. crackerjack/services/heatmap_generator.py +744 -0
  350. crackerjack/services/incremental_executor.py +380 -0
  351. crackerjack/services/initialization.py +823 -0
  352. crackerjack/services/input_validator.py +668 -0
  353. crackerjack/services/intelligent_commit.py +327 -0
  354. crackerjack/services/log_manager.py +289 -0
  355. crackerjack/services/logging.py +228 -0
  356. crackerjack/services/lsp_client.py +628 -0
  357. crackerjack/services/memory_optimizer.py +414 -0
  358. crackerjack/services/metrics.py +587 -0
  359. crackerjack/services/monitoring/README.md +30 -0
  360. crackerjack/services/monitoring/__init__.py +9 -0
  361. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  362. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  363. crackerjack/services/monitoring/health_metrics.py +716 -0
  364. crackerjack/services/monitoring/metrics.py +587 -0
  365. crackerjack/services/monitoring/performance_benchmarks.py +410 -0
  366. crackerjack/services/monitoring/performance_cache.py +388 -0
  367. crackerjack/services/monitoring/performance_monitor.py +569 -0
  368. crackerjack/services/parallel_executor.py +527 -0
  369. crackerjack/services/pattern_cache.py +333 -0
  370. crackerjack/services/pattern_detector.py +478 -0
  371. crackerjack/services/patterns/__init__.py +142 -0
  372. crackerjack/services/patterns/agents.py +107 -0
  373. crackerjack/services/patterns/code/__init__.py +15 -0
  374. crackerjack/services/patterns/code/detection.py +118 -0
  375. crackerjack/services/patterns/code/imports.py +107 -0
  376. crackerjack/services/patterns/code/paths.py +159 -0
  377. crackerjack/services/patterns/code/performance.py +119 -0
  378. crackerjack/services/patterns/code/replacement.py +36 -0
  379. crackerjack/services/patterns/core.py +212 -0
  380. crackerjack/services/patterns/documentation/__init__.py +14 -0
  381. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  382. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  383. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  384. crackerjack/services/patterns/formatting.py +226 -0
  385. crackerjack/services/patterns/operations.py +339 -0
  386. crackerjack/services/patterns/security/__init__.py +23 -0
  387. crackerjack/services/patterns/security/code_injection.py +122 -0
  388. crackerjack/services/patterns/security/credentials.py +190 -0
  389. crackerjack/services/patterns/security/path_traversal.py +221 -0
  390. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  391. crackerjack/services/patterns/templates.py +62 -0
  392. crackerjack/services/patterns/testing/__init__.py +18 -0
  393. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  394. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  395. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  396. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  397. crackerjack/services/patterns/tool_output/other.py +97 -0
  398. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  399. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  400. crackerjack/services/patterns/url_sanitization.py +114 -0
  401. crackerjack/services/patterns/utilities.py +42 -0
  402. crackerjack/services/patterns/utils.py +339 -0
  403. crackerjack/services/patterns/validation.py +46 -0
  404. crackerjack/services/patterns/versioning.py +62 -0
  405. crackerjack/services/predictive_analytics.py +523 -0
  406. crackerjack/services/profiler.py +280 -0
  407. crackerjack/services/quality/README.md +415 -0
  408. crackerjack/services/quality/__init__.py +11 -0
  409. crackerjack/services/quality/anomaly_detector.py +392 -0
  410. crackerjack/services/quality/pattern_cache.py +333 -0
  411. crackerjack/services/quality/pattern_detector.py +479 -0
  412. crackerjack/services/quality/qa_orchestrator.py +491 -0
  413. crackerjack/services/quality/quality_baseline.py +395 -0
  414. crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
  415. crackerjack/services/quality/quality_intelligence.py +949 -0
  416. crackerjack/services/regex_patterns.py +58 -0
  417. crackerjack/services/regex_utils.py +483 -0
  418. crackerjack/services/secure_path_utils.py +524 -0
  419. crackerjack/services/secure_status_formatter.py +450 -0
  420. crackerjack/services/secure_subprocess.py +635 -0
  421. crackerjack/services/security.py +239 -0
  422. crackerjack/services/security_logger.py +495 -0
  423. crackerjack/services/server_manager.py +411 -0
  424. crackerjack/services/smart_scheduling.py +167 -0
  425. crackerjack/services/status_authentication.py +460 -0
  426. crackerjack/services/status_security_manager.py +315 -0
  427. crackerjack/services/terminal_utils.py +0 -0
  428. crackerjack/services/thread_safe_status_collector.py +441 -0
  429. crackerjack/services/tool_filter.py +368 -0
  430. crackerjack/services/tool_version_service.py +43 -0
  431. crackerjack/services/unified_config.py +115 -0
  432. crackerjack/services/validation_rate_limiter.py +220 -0
  433. crackerjack/services/vector_store.py +689 -0
  434. crackerjack/services/version_analyzer.py +461 -0
  435. crackerjack/services/version_checker.py +223 -0
  436. crackerjack/services/websocket_resource_limiter.py +438 -0
  437. crackerjack/services/zuban_lsp_service.py +391 -0
  438. crackerjack/slash_commands/README.md +11 -0
  439. crackerjack/slash_commands/__init__.py +59 -0
  440. crackerjack/slash_commands/init.md +112 -0
  441. crackerjack/slash_commands/run.md +197 -0
  442. crackerjack/slash_commands/status.md +127 -0
  443. crackerjack/tools/README.md +11 -0
  444. crackerjack/tools/__init__.py +30 -0
  445. crackerjack/tools/_git_utils.py +105 -0
  446. crackerjack/tools/check_added_large_files.py +139 -0
  447. crackerjack/tools/check_ast.py +105 -0
  448. crackerjack/tools/check_json.py +103 -0
  449. crackerjack/tools/check_jsonschema.py +297 -0
  450. crackerjack/tools/check_toml.py +103 -0
  451. crackerjack/tools/check_yaml.py +110 -0
  452. crackerjack/tools/codespell_wrapper.py +72 -0
  453. crackerjack/tools/end_of_file_fixer.py +202 -0
  454. crackerjack/tools/format_json.py +128 -0
  455. crackerjack/tools/mdformat_wrapper.py +114 -0
  456. crackerjack/tools/trailing_whitespace.py +198 -0
  457. crackerjack/tools/validate_input_validator_patterns.py +236 -0
  458. crackerjack/tools/validate_regex_patterns.py +188 -0
  459. crackerjack/ui/README.md +11 -0
  460. crackerjack/ui/__init__.py +1 -0
  461. crackerjack/ui/dashboard_renderer.py +28 -0
  462. crackerjack/ui/templates/README.md +11 -0
  463. crackerjack/utils/console_utils.py +13 -0
  464. crackerjack/utils/dependency_guard.py +230 -0
  465. crackerjack/utils/retry_utils.py +275 -0
  466. crackerjack/workflows/README.md +590 -0
  467. crackerjack/workflows/__init__.py +46 -0
  468. crackerjack/workflows/actions.py +811 -0
  469. crackerjack/workflows/auto_fix.py +444 -0
  470. crackerjack/workflows/container_builder.py +499 -0
  471. crackerjack/workflows/definitions.py +443 -0
  472. crackerjack/workflows/engine.py +177 -0
  473. crackerjack/workflows/event_bridge.py +242 -0
  474. crackerjack-0.45.2.dist-info/METADATA +1678 -0
  475. crackerjack-0.45.2.dist-info/RECORD +478 -0
  476. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  477. crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
  478. crackerjack/.gitignore +0 -14
  479. crackerjack/.libcst.codemod.yaml +0 -18
  480. crackerjack/.pdm.toml +0 -1
  481. crackerjack/.pre-commit-config.yaml +0 -91
  482. crackerjack/.pytest_cache/.gitignore +0 -2
  483. crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
  484. crackerjack/.pytest_cache/README.md +0 -8
  485. crackerjack/.pytest_cache/v/cache/nodeids +0 -1
  486. crackerjack/.pytest_cache/v/cache/stepwise +0 -1
  487. crackerjack/.ruff_cache/.gitignore +0 -1
  488. crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
  489. crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
  490. crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
  491. crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
  492. crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
  493. crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
  494. crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
  495. crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
  496. crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
  497. crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
  498. crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
  499. crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
  500. crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
  501. crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
  502. crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
  503. crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
  504. crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
  505. crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
  506. crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
  507. crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
  508. crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
  509. crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
  510. crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
  511. crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
  512. crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
  513. crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
  514. crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
  515. crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
  516. crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
  517. crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
  518. crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
  519. crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
  520. crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
  521. crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
  522. crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
  523. crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
  524. crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
  525. crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
  526. crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
  527. crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
  528. crackerjack/crackerjack.py +0 -855
  529. crackerjack/pyproject.toml +0 -214
  530. crackerjack-0.18.2.dist-info/METADATA +0 -420
  531. crackerjack-0.18.2.dist-info/RECORD +0 -59
  532. crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
  533. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,299 @@
1
+ import typing as t
2
+ from abc import ABC, abstractmethod
3
+ from types import TracebackType
4
+
5
+ if t.TYPE_CHECKING:
6
+ import asyncio
7
+ from pathlib import Path
8
+
9
+
10
+ class AsyncCleanupProtocol(t.Protocol):
11
+ async def cleanup(self) -> None: ...
12
+
13
+
14
+ class SyncCleanupProtocol(t.Protocol):
15
+ def cleanup(self) -> None: ...
16
+
17
+
18
+ class ResourceLifecycleProtocol(t.Protocol):
19
+ async def initialize(self) -> None: ...
20
+
21
+ async def cleanup(self) -> None: ...
22
+
23
+ def is_initialized(self) -> bool: ...
24
+
25
+ def is_closed(self) -> bool: ...
26
+
27
+
28
+ class AsyncContextProtocol(t.Protocol):
29
+ async def __aenter__(self) -> t.Self: ...
30
+
31
+ async def __aexit__(
32
+ self,
33
+ exc_type: type[BaseException] | None,
34
+ exc_val: BaseException | None,
35
+ exc_tb: TracebackType | None,
36
+ ) -> None: ...
37
+
38
+
39
+ class ResourceManagerProtocol(t.Protocol):
40
+ def register_resource(self, resource: AsyncCleanupProtocol) -> None: ...
41
+
42
+ def register_cleanup_callback(
43
+ self, callback: t.Callable[[], t.Awaitable[None]]
44
+ ) -> None: ...
45
+
46
+ async def cleanup_all(self) -> None: ...
47
+
48
+
49
+ class FileResourceProtocol(t.Protocol):
50
+ @property
51
+ def path(self) -> "Path": ...
52
+
53
+ def exists(self) -> bool: ...
54
+
55
+ async def cleanup(self) -> None: ...
56
+
57
+
58
+ class ProcessResourceProtocol(t.Protocol):
59
+ @property
60
+ def pid(self) -> int: ...
61
+
62
+ def is_running(self) -> bool: ...
63
+
64
+ async def cleanup(self) -> None: ...
65
+
66
+
67
+ class TaskResourceProtocol(t.Protocol):
68
+ @property
69
+ def task(self) -> "asyncio.Task[t.Any]": ...
70
+
71
+ def is_done(self) -> bool: ...
72
+
73
+ def is_cancelled(self) -> bool: ...
74
+
75
+ async def cleanup(self) -> None: ...
76
+
77
+
78
+ class NetworkResourceProtocol(t.Protocol):
79
+ @property
80
+ def is_connected(self) -> bool: ...
81
+
82
+ async def disconnect(self) -> None: ...
83
+
84
+ async def cleanup(self) -> None: ...
85
+
86
+
87
+ class CacheResourceProtocol(t.Protocol):
88
+ def clear(self) -> None: ...
89
+
90
+ def get_size(self) -> int: ...
91
+
92
+ async def cleanup(self) -> None: ...
93
+
94
+
95
+ class AbstractManagedResource(ABC):
96
+ def __init__(self) -> None:
97
+ self._initialized = False
98
+ self._closed = False
99
+
100
+ @abstractmethod
101
+ async def _do_initialize(self) -> None:
102
+ pass
103
+
104
+ @abstractmethod
105
+ async def _do_cleanup(self) -> None:
106
+ pass
107
+
108
+ async def initialize(self) -> None:
109
+ if self._initialized:
110
+ return
111
+
112
+ try:
113
+ await self._do_initialize()
114
+ self._initialized = True
115
+ except Exception:
116
+ self._closed = True
117
+ raise
118
+
119
+ async def cleanup(self) -> None:
120
+ if self._closed:
121
+ return
122
+
123
+ self._closed = True
124
+ try:
125
+ await self._do_cleanup()
126
+ except Exception:
127
+ import logging
128
+
129
+ logging.getLogger(__name__).warning(
130
+ f"Error during cleanup of {self.__class__.__name__}", exc_info=True
131
+ )
132
+
133
+ def is_initialized(self) -> bool:
134
+ return self._initialized
135
+
136
+ def is_closed(self) -> bool:
137
+ return self._closed
138
+
139
+ async def __aenter__(self) -> t.Self:
140
+ await self.initialize()
141
+ return self
142
+
143
+ async def __aexit__(
144
+ self,
145
+ exc_type: type[BaseException] | None,
146
+ exc_val: BaseException | None,
147
+ exc_tb: TracebackType | None,
148
+ ) -> None:
149
+ await self.cleanup()
150
+
151
+
152
+ class AbstractFileResource(AbstractManagedResource):
153
+ def __init__(self, path: "Path") -> None:
154
+ super().__init__()
155
+ self._path = path
156
+
157
+ @property
158
+ def path(self) -> "Path":
159
+ return self._path
160
+
161
+ def exists(self) -> bool:
162
+ return self._path.exists()
163
+
164
+
165
+ class AbstractProcessResource(AbstractManagedResource):
166
+ def __init__(self, pid: int) -> None:
167
+ super().__init__()
168
+ self._pid = pid
169
+
170
+ @property
171
+ def pid(self) -> int:
172
+ return self._pid
173
+
174
+ def is_running(self) -> bool:
175
+ try:
176
+ import os
177
+
178
+ os.kill(self._pid, 0)
179
+ return True
180
+ except (OSError, ProcessLookupError):
181
+ return False
182
+
183
+
184
+ class AbstractTaskResource(AbstractManagedResource):
185
+ def __init__(self, task: "asyncio.Task[t.Any]") -> None:
186
+ super().__init__()
187
+ self._task = task
188
+
189
+ @property
190
+ def task(self) -> "asyncio.Task[t.Any]":
191
+ return self._task
192
+
193
+ def is_done(self) -> bool:
194
+ return self._task.done()
195
+
196
+ def is_cancelled(self) -> bool:
197
+ return self._task.cancelled()
198
+
199
+
200
+ class AbstractNetworkResource(AbstractManagedResource):
201
+ def __init__(self) -> None:
202
+ super().__init__()
203
+ self._connected = False
204
+
205
+ @property
206
+ def is_connected(self) -> bool:
207
+ return self._connected and not self._closed
208
+
209
+ async def disconnect(self) -> None:
210
+ if self._connected:
211
+ self._connected = False
212
+ await self._do_disconnect()
213
+
214
+ @abstractmethod
215
+ async def _do_disconnect(self) -> None:
216
+ pass
217
+
218
+ async def _do_cleanup(self) -> None:
219
+ await self.disconnect()
220
+
221
+
222
+ def with_resource_cleanup(
223
+ resource_attr: str,
224
+ ) -> t.Callable[..., t.Callable[..., t.Awaitable[t.Any]]]:
225
+ def decorator(
226
+ func: t.Callable[..., t.Awaitable[t.Any]],
227
+ ) -> t.Callable[..., t.Awaitable[t.Any]]:
228
+ async def wrapper(self: t.Any, *args: t.Any, **kwargs: t.Any) -> t.Any:
229
+ resource = getattr(self, resource_attr, None)
230
+ try:
231
+ return await func(self, *args, **kwargs)
232
+ finally:
233
+ if resource and hasattr(resource, "cleanup"):
234
+ await resource.cleanup()
235
+
236
+ return wrapper
237
+
238
+ return decorator
239
+
240
+
241
+ def ensure_initialized(
242
+ resource_attr: str,
243
+ ) -> t.Callable[..., t.Callable[..., t.Awaitable[t.Any]]]:
244
+ def decorator(
245
+ func: t.Callable[..., t.Awaitable[t.Any]],
246
+ ) -> t.Callable[..., t.Awaitable[t.Any]]:
247
+ async def wrapper(self: t.Any, *args: t.Any, **kwargs: t.Any) -> t.Any:
248
+ resource = getattr(self, resource_attr, None)
249
+ if resource and hasattr(resource, "initialize"):
250
+ await resource.initialize()
251
+ return await func(self, *args, **kwargs)
252
+
253
+ return wrapper
254
+
255
+ return decorator
256
+
257
+
258
+ class HealthCheckProtocol(t.Protocol):
259
+ async def health_check(self) -> dict[str, t.Any]: ...
260
+
261
+ def is_healthy(self) -> bool: ...
262
+
263
+
264
+ class MonitorableResourceProtocol(t.Protocol):
265
+ def get_metrics(self) -> dict[str, t.Any]: ...
266
+
267
+ def get_status(self) -> str: ...
268
+
269
+ async def health_check(self) -> dict[str, t.Any]: ...
270
+
271
+
272
+ class ResourceFactoryProtocol(t.Protocol):
273
+ async def create_resource(self, **kwargs: t.Any) -> AsyncCleanupProtocol: ...
274
+
275
+ def get_resource_type(self) -> str: ...
276
+
277
+
278
+ class PooledResourceProtocol(t.Protocol):
279
+ async def acquire(self) -> AsyncCleanupProtocol: ...
280
+
281
+ async def release(self, resource: AsyncCleanupProtocol) -> None: ...
282
+
283
+ def get_pool_size(self) -> int: ...
284
+
285
+ def get_active_count(self) -> int: ...
286
+
287
+
288
+ class ResourceErrorProtocol(t.Protocol):
289
+ def handle_error(self, error: Exception) -> bool: ...
290
+
291
+ def should_retry(self, error: Exception) -> bool: ...
292
+
293
+ def get_retry_delay(self, attempt: int) -> float: ...
294
+
295
+
296
+ class FallbackResourceProtocol(t.Protocol):
297
+ async def get_fallback(self) -> AsyncCleanupProtocol | None: ...
298
+
299
+ def has_fallback(self) -> bool: ...
@@ -0,0 +1,35 @@
1
+ import typing as t
2
+ from dataclasses import dataclass, field
3
+
4
+
5
+ @dataclass
6
+ class ExecutionResult:
7
+ operation_id: str
8
+ success: bool
9
+ duration_seconds: float
10
+ output: str = ""
11
+ error: str = ""
12
+ exit_code: int = 0
13
+ metadata: dict[str, t.Any] = field(default_factory=dict[str, t.Any])
14
+
15
+
16
+ @dataclass
17
+ class ParallelExecutionResult:
18
+ group_name: str
19
+ total_operations: int
20
+ successful_operations: int
21
+ failed_operations: int
22
+ total_duration_seconds: float
23
+ results: list[ExecutionResult]
24
+
25
+ @property
26
+ def success_rate(self) -> float:
27
+ return (
28
+ self.successful_operations / self.total_operations
29
+ if self.total_operations > 0
30
+ else 0.0
31
+ )
32
+
33
+ @property
34
+ def overall_success(self) -> bool:
35
+ return self.failed_operations == 0
@@ -0,0 +1,258 @@
1
+ """Semantic search data models for crackerjack vector store functionality."""
2
+
3
+ import typing as t
4
+ from datetime import datetime
5
+ from pathlib import Path
6
+
7
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
8
+
9
+
10
+ class EmbeddingVector(BaseModel):
11
+ """Represents a single embedding vector with metadata."""
12
+
13
+ file_path: Path = Field(..., description="Path to the source file")
14
+ chunk_id: str = Field(..., description="Unique identifier for this chunk")
15
+ content: str = Field(..., description="The text content that was embedded")
16
+ embedding: list[float] = Field(
17
+ ..., description="The numerical vector representation"
18
+ )
19
+ created_at: datetime = Field(
20
+ default_factory=datetime.now, description="Creation timestamp"
21
+ )
22
+ file_hash: str = Field(
23
+ ..., description="Hash of the source file for change detection"
24
+ )
25
+ start_line: int = Field(..., description="Starting line number in the source file")
26
+ end_line: int = Field(..., description="Ending line number in the source file")
27
+ file_type: str = Field(..., description="File extension or type identifier")
28
+
29
+ model_config = ConfigDict(ser_json_timedelta="iso8601")
30
+
31
+ @field_serializer("file_path")
32
+ def serialize_path(self, value: Path) -> str:
33
+ """Serialize Path to string."""
34
+ return str(value)
35
+
36
+ @field_serializer("created_at")
37
+ def serialize_datetime(self, value: datetime) -> str:
38
+ """Serialize datetime to ISO format."""
39
+ return value.isoformat()
40
+
41
+
42
+ class SearchResult(BaseModel):
43
+ """Represents a semantic search result with similarity score."""
44
+
45
+ file_path: Path = Field(..., description="Path to the matching file")
46
+ chunk_id: str = Field(..., description="Identifier of the matching chunk")
47
+ content: str = Field(..., description="The matching text content")
48
+ similarity_score: float = Field(
49
+ ..., ge=0.0, le=1.0, description="Similarity score (0-1)"
50
+ )
51
+ start_line: int = Field(..., description="Starting line number")
52
+ end_line: int = Field(..., description="Ending line number")
53
+ file_type: str = Field(..., description="File type identifier")
54
+ context_lines: list[str] = Field(
55
+ default_factory=list, description="Surrounding context lines"
56
+ )
57
+
58
+ @field_serializer("file_path")
59
+ def serialize_path(self, value: Path) -> str:
60
+ """Serialize Path to string."""
61
+ return str(value)
62
+
63
+
64
+ class IndexStats(BaseModel):
65
+ """Statistics about the semantic index."""
66
+
67
+ total_files: int = Field(..., description="Total number of indexed files")
68
+ total_chunks: int = Field(..., description="Total number of text chunks")
69
+ index_size_mb: float = Field(..., description="Index size in megabytes")
70
+ last_updated: datetime = Field(..., description="Last index update timestamp")
71
+ file_types: dict[str, int] = Field(
72
+ default_factory=dict, description="Count by file type"
73
+ )
74
+ embedding_model: str = Field(..., description="Name of the embedding model used")
75
+ avg_chunk_size: float = Field(..., description="Average chunk size in characters")
76
+
77
+ @field_serializer("last_updated")
78
+ def serialize_datetime(self, value: datetime) -> str:
79
+ """Serialize datetime to ISO format."""
80
+ return value.isoformat()
81
+
82
+
83
+ class SearchQuery(BaseModel):
84
+ """Represents a semantic search query with parameters."""
85
+
86
+ query: str = Field(..., min_length=1, description="The search query text")
87
+ max_results: int = Field(
88
+ default=10, ge=1, le=100, description="Maximum number of results"
89
+ )
90
+ min_similarity: float = Field(
91
+ default=0.3, ge=0.0, le=1.0, description="Minimum similarity threshold"
92
+ )
93
+ file_types: list[str] = Field(
94
+ default_factory=list, description="Filter by file types"
95
+ )
96
+ include_context: bool = Field(
97
+ default=True, description="Include surrounding context lines"
98
+ )
99
+ context_lines: int = Field(
100
+ default=3, ge=0, le=10, description="Number of context lines"
101
+ )
102
+
103
+ model_config = ConfigDict(validate_assignment=True)
104
+
105
+
106
+ class IndexingProgress(BaseModel):
107
+ """Progress information for indexing operations."""
108
+
109
+ current_file: Path = Field(..., description="Currently processing file")
110
+ files_processed: int = Field(..., ge=0, description="Number of files processed")
111
+ total_files: int = Field(..., ge=0, description="Total files to process")
112
+ chunks_created: int = Field(..., ge=0, description="Number of chunks created")
113
+ elapsed_time: float = Field(..., ge=0.0, description="Elapsed time in seconds")
114
+ estimated_remaining: float | None = Field(
115
+ default=None, description="Estimated remaining time in seconds"
116
+ )
117
+
118
+ @property
119
+ def progress_percentage(self) -> float:
120
+ """Calculate progress as a percentage."""
121
+ if self.total_files == 0:
122
+ return 0.0
123
+ return min(100.0, (self.files_processed / self.total_files) * 100.0)
124
+
125
+ @field_serializer("current_file")
126
+ def serialize_path(self, value: Path) -> str:
127
+ """Serialize Path to string."""
128
+ return str(value)
129
+
130
+
131
+ class SemanticConfig(BaseModel):
132
+ """Configuration for semantic search functionality."""
133
+
134
+ embedding_model: str = Field(
135
+ default="all-MiniLM-L6-v2", description="Sentence transformer model name"
136
+ )
137
+ chunk_size: int = Field(
138
+ default=500, ge=100, le=2000, description="Maximum characters per chunk"
139
+ )
140
+ chunk_overlap: int = Field(
141
+ default=50, ge=0, le=500, description="Overlap between chunks"
142
+ )
143
+ max_search_results: int = Field(
144
+ default=10, ge=1, le=100, description="Maximum number of search results"
145
+ )
146
+ similarity_threshold: float = Field(
147
+ default=0.7, ge=0.0, le=1.0, description="Minimum similarity threshold"
148
+ )
149
+ embedding_dimension: int = Field(
150
+ default=384, ge=128, le=1024, description="Embedding vector dimension"
151
+ )
152
+ max_file_size_mb: int = Field(
153
+ default=10, ge=1, le=100, description="Maximum file size to process"
154
+ )
155
+ excluded_patterns: list[str] = Field(
156
+ default_factory=lambda: [
157
+ "*.pyc",
158
+ "*.pyo",
159
+ "*.pyd",
160
+ "__pycache__/*",
161
+ ".git/*",
162
+ ".venv/*",
163
+ "*.log",
164
+ "*.tmp",
165
+ ],
166
+ description="File patterns to exclude from indexing",
167
+ )
168
+ included_extensions: list[str] = Field(
169
+ default_factory=lambda: [
170
+ ".py",
171
+ ".md",
172
+ ".txt",
173
+ ".yml",
174
+ ".yaml",
175
+ ".json",
176
+ ".toml",
177
+ ".ini",
178
+ ".cfg",
179
+ ".sh",
180
+ ".js",
181
+ ".ts",
182
+ ".html",
183
+ ".css",
184
+ ".sql",
185
+ ],
186
+ description="File extensions to include in indexing",
187
+ )
188
+ cache_embeddings: bool = Field(default=True, description="Cache embeddings to disk")
189
+ cache_ttl_hours: int = Field(
190
+ default=24, ge=1, le=168, description="Cache time-to-live in hours"
191
+ )
192
+
193
+ model_config = ConfigDict(validate_assignment=True)
194
+
195
+
196
+ class FileChangeEvent(BaseModel):
197
+ """Represents a file system change event for incremental indexing."""
198
+
199
+ file_path: Path = Field(..., description="Path to the changed file")
200
+ event_type: t.Literal["created", "modified", "deleted"] = Field(
201
+ ..., description="Type of change"
202
+ )
203
+ timestamp: datetime = Field(
204
+ default_factory=datetime.now, description="When the change occurred"
205
+ )
206
+ file_hash: str | None = Field(
207
+ default=None, description="New file hash if available"
208
+ )
209
+
210
+ @field_serializer("file_path")
211
+ def serialize_path(self, value: Path) -> str:
212
+ """Serialize Path to string."""
213
+ return str(value)
214
+
215
+ @field_serializer("timestamp")
216
+ def serialize_datetime(self, value: datetime) -> str:
217
+ """Serialize datetime to ISO format."""
218
+ return value.isoformat()
219
+
220
+
221
+ class SemanticContext(BaseModel):
222
+ """Context information for AI agents using semantic search."""
223
+
224
+ query: str = Field(..., description="The query that generated this context")
225
+ related_files: list[SearchResult] = Field(
226
+ ..., description="Semantically related files"
227
+ )
228
+ patterns: list[str] = Field(
229
+ default_factory=list, description="Identified code patterns"
230
+ )
231
+ suggestions: list[str] = Field(
232
+ default_factory=list, description="AI-generated suggestions"
233
+ )
234
+ confidence: float = Field(
235
+ ..., ge=0.0, le=1.0, description="Confidence in the context relevance"
236
+ )
237
+
238
+
239
+ # Type aliases for better code readability
240
+ EmbeddingMatrix = list[list[float]]
241
+ SimilarityMatrix = list[list[float]]
242
+ FilePathSet = set[Path]
243
+ ChunkMapping = dict[str, EmbeddingVector]
244
+
245
+ __all__ = [
246
+ "EmbeddingVector",
247
+ "SearchResult",
248
+ "IndexStats",
249
+ "SearchQuery",
250
+ "IndexingProgress",
251
+ "SemanticConfig",
252
+ "FileChangeEvent",
253
+ "SemanticContext",
254
+ "EmbeddingMatrix",
255
+ "SimilarityMatrix",
256
+ "FilePathSet",
257
+ "ChunkMapping",
258
+ ]