crackerjack 0.33.0__py3-none-any.whl → 0.33.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.

Potentially problematic release.


This version of crackerjack might be problematic. Click here for more details.

Files changed (198) hide show
  1. crackerjack/__main__.py +1350 -34
  2. crackerjack/adapters/__init__.py +17 -0
  3. crackerjack/adapters/lsp_client.py +358 -0
  4. crackerjack/adapters/rust_tool_adapter.py +194 -0
  5. crackerjack/adapters/rust_tool_manager.py +193 -0
  6. crackerjack/adapters/skylos_adapter.py +231 -0
  7. crackerjack/adapters/zuban_adapter.py +560 -0
  8. crackerjack/agents/base.py +7 -3
  9. crackerjack/agents/coordinator.py +271 -33
  10. crackerjack/agents/documentation_agent.py +9 -15
  11. crackerjack/agents/dry_agent.py +3 -15
  12. crackerjack/agents/formatting_agent.py +1 -1
  13. crackerjack/agents/import_optimization_agent.py +36 -180
  14. crackerjack/agents/performance_agent.py +17 -98
  15. crackerjack/agents/performance_helpers.py +7 -31
  16. crackerjack/agents/proactive_agent.py +1 -3
  17. crackerjack/agents/refactoring_agent.py +16 -85
  18. crackerjack/agents/refactoring_helpers.py +7 -42
  19. crackerjack/agents/security_agent.py +9 -48
  20. crackerjack/agents/test_creation_agent.py +356 -513
  21. crackerjack/agents/test_specialist_agent.py +0 -4
  22. crackerjack/api.py +6 -25
  23. crackerjack/cli/cache_handlers.py +204 -0
  24. crackerjack/cli/cache_handlers_enhanced.py +683 -0
  25. crackerjack/cli/facade.py +100 -0
  26. crackerjack/cli/handlers.py +224 -9
  27. crackerjack/cli/interactive.py +6 -4
  28. crackerjack/cli/options.py +642 -55
  29. crackerjack/cli/utils.py +2 -1
  30. crackerjack/code_cleaner.py +58 -117
  31. crackerjack/config/global_lock_config.py +8 -48
  32. crackerjack/config/hooks.py +53 -62
  33. crackerjack/core/async_workflow_orchestrator.py +24 -34
  34. crackerjack/core/autofix_coordinator.py +3 -17
  35. crackerjack/core/enhanced_container.py +4 -13
  36. crackerjack/core/file_lifecycle.py +12 -89
  37. crackerjack/core/performance.py +2 -2
  38. crackerjack/core/performance_monitor.py +15 -55
  39. crackerjack/core/phase_coordinator.py +104 -204
  40. crackerjack/core/resource_manager.py +14 -90
  41. crackerjack/core/service_watchdog.py +62 -95
  42. crackerjack/core/session_coordinator.py +149 -0
  43. crackerjack/core/timeout_manager.py +14 -72
  44. crackerjack/core/websocket_lifecycle.py +13 -78
  45. crackerjack/core/workflow_orchestrator.py +171 -174
  46. crackerjack/docs/INDEX.md +11 -0
  47. crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
  48. crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
  49. crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
  50. crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
  51. crackerjack/docs/generated/api/SERVICES.md +1252 -0
  52. crackerjack/documentation/__init__.py +31 -0
  53. crackerjack/documentation/ai_templates.py +756 -0
  54. crackerjack/documentation/dual_output_generator.py +765 -0
  55. crackerjack/documentation/mkdocs_integration.py +518 -0
  56. crackerjack/documentation/reference_generator.py +977 -0
  57. crackerjack/dynamic_config.py +55 -50
  58. crackerjack/executors/async_hook_executor.py +10 -15
  59. crackerjack/executors/cached_hook_executor.py +117 -43
  60. crackerjack/executors/hook_executor.py +8 -34
  61. crackerjack/executors/hook_lock_manager.py +26 -183
  62. crackerjack/executors/individual_hook_executor.py +13 -11
  63. crackerjack/executors/lsp_aware_hook_executor.py +270 -0
  64. crackerjack/executors/tool_proxy.py +417 -0
  65. crackerjack/hooks/lsp_hook.py +79 -0
  66. crackerjack/intelligence/adaptive_learning.py +25 -10
  67. crackerjack/intelligence/agent_orchestrator.py +2 -5
  68. crackerjack/intelligence/agent_registry.py +34 -24
  69. crackerjack/intelligence/agent_selector.py +5 -7
  70. crackerjack/interactive.py +17 -6
  71. crackerjack/managers/async_hook_manager.py +0 -1
  72. crackerjack/managers/hook_manager.py +79 -1
  73. crackerjack/managers/publish_manager.py +44 -8
  74. crackerjack/managers/test_command_builder.py +1 -15
  75. crackerjack/managers/test_executor.py +1 -3
  76. crackerjack/managers/test_manager.py +98 -7
  77. crackerjack/managers/test_manager_backup.py +10 -9
  78. crackerjack/mcp/cache.py +2 -2
  79. crackerjack/mcp/client_runner.py +1 -1
  80. crackerjack/mcp/context.py +191 -68
  81. crackerjack/mcp/dashboard.py +7 -5
  82. crackerjack/mcp/enhanced_progress_monitor.py +31 -28
  83. crackerjack/mcp/file_monitor.py +30 -23
  84. crackerjack/mcp/progress_components.py +31 -21
  85. crackerjack/mcp/progress_monitor.py +50 -53
  86. crackerjack/mcp/rate_limiter.py +6 -6
  87. crackerjack/mcp/server_core.py +17 -16
  88. crackerjack/mcp/service_watchdog.py +2 -1
  89. crackerjack/mcp/state.py +4 -7
  90. crackerjack/mcp/task_manager.py +11 -9
  91. crackerjack/mcp/tools/core_tools.py +173 -32
  92. crackerjack/mcp/tools/error_analyzer.py +3 -2
  93. crackerjack/mcp/tools/execution_tools.py +8 -10
  94. crackerjack/mcp/tools/execution_tools_backup.py +42 -30
  95. crackerjack/mcp/tools/intelligence_tool_registry.py +7 -5
  96. crackerjack/mcp/tools/intelligence_tools.py +5 -2
  97. crackerjack/mcp/tools/monitoring_tools.py +33 -70
  98. crackerjack/mcp/tools/proactive_tools.py +24 -11
  99. crackerjack/mcp/tools/progress_tools.py +5 -8
  100. crackerjack/mcp/tools/utility_tools.py +20 -14
  101. crackerjack/mcp/tools/workflow_executor.py +62 -40
  102. crackerjack/mcp/websocket/app.py +8 -0
  103. crackerjack/mcp/websocket/endpoints.py +352 -357
  104. crackerjack/mcp/websocket/jobs.py +40 -57
  105. crackerjack/mcp/websocket/monitoring_endpoints.py +2935 -0
  106. crackerjack/mcp/websocket/server.py +7 -25
  107. crackerjack/mcp/websocket/websocket_handler.py +6 -17
  108. crackerjack/mixins/__init__.py +0 -2
  109. crackerjack/mixins/error_handling.py +1 -70
  110. crackerjack/models/config.py +12 -1
  111. crackerjack/models/config_adapter.py +49 -1
  112. crackerjack/models/protocols.py +122 -122
  113. crackerjack/models/resource_protocols.py +55 -210
  114. crackerjack/monitoring/ai_agent_watchdog.py +13 -13
  115. crackerjack/monitoring/metrics_collector.py +426 -0
  116. crackerjack/monitoring/regression_prevention.py +8 -8
  117. crackerjack/monitoring/websocket_server.py +643 -0
  118. crackerjack/orchestration/advanced_orchestrator.py +11 -6
  119. crackerjack/orchestration/coverage_improvement.py +3 -3
  120. crackerjack/orchestration/execution_strategies.py +26 -6
  121. crackerjack/orchestration/test_progress_streamer.py +8 -5
  122. crackerjack/plugins/base.py +2 -2
  123. crackerjack/plugins/hooks.py +7 -0
  124. crackerjack/plugins/managers.py +11 -8
  125. crackerjack/security/__init__.py +0 -1
  126. crackerjack/security/audit.py +6 -35
  127. crackerjack/services/anomaly_detector.py +392 -0
  128. crackerjack/services/api_extractor.py +615 -0
  129. crackerjack/services/backup_service.py +2 -2
  130. crackerjack/services/bounded_status_operations.py +15 -152
  131. crackerjack/services/cache.py +127 -1
  132. crackerjack/services/changelog_automation.py +395 -0
  133. crackerjack/services/config.py +15 -9
  134. crackerjack/services/config_merge.py +19 -80
  135. crackerjack/services/config_template.py +506 -0
  136. crackerjack/services/contextual_ai_assistant.py +48 -22
  137. crackerjack/services/coverage_badge_service.py +171 -0
  138. crackerjack/services/coverage_ratchet.py +27 -25
  139. crackerjack/services/debug.py +3 -3
  140. crackerjack/services/dependency_analyzer.py +460 -0
  141. crackerjack/services/dependency_monitor.py +14 -11
  142. crackerjack/services/documentation_generator.py +491 -0
  143. crackerjack/services/documentation_service.py +675 -0
  144. crackerjack/services/enhanced_filesystem.py +6 -5
  145. crackerjack/services/enterprise_optimizer.py +865 -0
  146. crackerjack/services/error_pattern_analyzer.py +676 -0
  147. crackerjack/services/file_hasher.py +1 -1
  148. crackerjack/services/git.py +8 -25
  149. crackerjack/services/health_metrics.py +10 -8
  150. crackerjack/services/heatmap_generator.py +735 -0
  151. crackerjack/services/initialization.py +11 -30
  152. crackerjack/services/input_validator.py +5 -97
  153. crackerjack/services/intelligent_commit.py +327 -0
  154. crackerjack/services/log_manager.py +15 -12
  155. crackerjack/services/logging.py +4 -3
  156. crackerjack/services/lsp_client.py +628 -0
  157. crackerjack/services/memory_optimizer.py +19 -87
  158. crackerjack/services/metrics.py +42 -33
  159. crackerjack/services/parallel_executor.py +9 -67
  160. crackerjack/services/pattern_cache.py +1 -1
  161. crackerjack/services/pattern_detector.py +6 -6
  162. crackerjack/services/performance_benchmarks.py +18 -59
  163. crackerjack/services/performance_cache.py +20 -81
  164. crackerjack/services/performance_monitor.py +27 -95
  165. crackerjack/services/predictive_analytics.py +510 -0
  166. crackerjack/services/quality_baseline.py +234 -0
  167. crackerjack/services/quality_baseline_enhanced.py +646 -0
  168. crackerjack/services/quality_intelligence.py +785 -0
  169. crackerjack/services/regex_patterns.py +618 -524
  170. crackerjack/services/regex_utils.py +43 -123
  171. crackerjack/services/secure_path_utils.py +5 -164
  172. crackerjack/services/secure_status_formatter.py +30 -141
  173. crackerjack/services/secure_subprocess.py +11 -92
  174. crackerjack/services/security.py +9 -41
  175. crackerjack/services/security_logger.py +12 -24
  176. crackerjack/services/server_manager.py +124 -16
  177. crackerjack/services/status_authentication.py +16 -159
  178. crackerjack/services/status_security_manager.py +4 -131
  179. crackerjack/services/thread_safe_status_collector.py +19 -125
  180. crackerjack/services/unified_config.py +21 -13
  181. crackerjack/services/validation_rate_limiter.py +5 -54
  182. crackerjack/services/version_analyzer.py +459 -0
  183. crackerjack/services/version_checker.py +1 -1
  184. crackerjack/services/websocket_resource_limiter.py +10 -144
  185. crackerjack/services/zuban_lsp_service.py +390 -0
  186. crackerjack/slash_commands/__init__.py +2 -7
  187. crackerjack/slash_commands/run.md +2 -2
  188. crackerjack/tools/validate_input_validator_patterns.py +14 -40
  189. crackerjack/tools/validate_regex_patterns.py +19 -48
  190. {crackerjack-0.33.0.dist-info → crackerjack-0.33.2.dist-info}/METADATA +196 -25
  191. crackerjack-0.33.2.dist-info/RECORD +229 -0
  192. crackerjack/CLAUDE.md +0 -207
  193. crackerjack/RULES.md +0 -380
  194. crackerjack/py313.py +0 -234
  195. crackerjack-0.33.0.dist-info/RECORD +0 -187
  196. {crackerjack-0.33.0.dist-info → crackerjack-0.33.2.dist-info}/WHEEL +0 -0
  197. {crackerjack-0.33.0.dist-info → crackerjack-0.33.2.dist-info}/entry_points.txt +0 -0
  198. {crackerjack-0.33.0.dist-info → crackerjack-0.33.2.dist-info}/licenses/LICENSE +0 -0
@@ -51,6 +51,10 @@ class OptionsProtocol(t.Protocol):
51
51
  global_lock_timeout: int = 600
52
52
  global_lock_cleanup: bool = True
53
53
  global_lock_dir: str | None = None
54
+ generate_docs: bool = False
55
+ docs_format: str = "markdown"
56
+ validate_docs: bool = False
57
+ update_docs_index: bool = False
54
58
 
55
59
 
56
60
  @t.runtime_checkable
@@ -77,6 +81,8 @@ class GitInterface(t.Protocol):
77
81
 
78
82
  def get_changed_files(self) -> list[str]: ...
79
83
 
84
+ def get_staged_files(self) -> list[str]: ...
85
+
80
86
  def commit(self, message: str) -> bool: ...
81
87
 
82
88
  def push(self) -> bool: ...
@@ -105,49 +111,17 @@ class HookManager(t.Protocol):
105
111
 
106
112
  @t.runtime_checkable
107
113
  class SecurityAwareHookManager(HookManager, t.Protocol):
108
- """Security-aware hook manager that tracks security-critical failures."""
109
-
110
- def get_security_critical_failures(self, results: list[t.Any]) -> list[t.Any]:
111
- """Extract security-critical failures from hook results.
112
-
113
- Args:
114
- results: List of hook results from run_fast_hooks or run_comprehensive_hooks
115
-
116
- Returns:
117
- List of results that are security-critical and failed
118
- """
119
- ...
114
+ def get_security_critical_failures(self, results: list[t.Any]) -> list[t.Any]: ...
120
115
 
121
- def has_security_critical_failures(self, results: list[t.Any]) -> bool:
122
- """Check if any security-critical hooks failed.
123
-
124
- Args:
125
- results: List of hook results
126
-
127
- Returns:
128
- True if any CRITICAL security level hooks failed
129
- """
130
- ...
116
+ def has_security_critical_failures(self, results: list[t.Any]) -> bool: ...
131
117
 
132
118
  def get_security_audit_report(
133
119
  self, fast_results: list[t.Any], comprehensive_results: list[t.Any]
134
- ) -> dict[str, t.Any]:
135
- """Generate security audit report for publishing decisions.
136
-
137
- Args:
138
- fast_results: Results from fast hooks
139
- comprehensive_results: Results from comprehensive hooks
140
-
141
- Returns:
142
- Dict containing security status, failed critical checks, and recommendations
143
- """
144
- ...
120
+ ) -> dict[str, t.Any]: ...
145
121
 
146
122
 
147
123
  @t.runtime_checkable
148
124
  class CoverageRatchetProtocol(t.Protocol):
149
- """Protocol for coverage ratchet service."""
150
-
151
125
  def get_baseline_coverage(self) -> float: ...
152
126
 
153
127
  def update_baseline_coverage(self, new_coverage: float) -> bool: ...
@@ -165,8 +139,6 @@ class CoverageRatchetProtocol(t.Protocol):
165
139
 
166
140
  @t.runtime_checkable
167
141
  class ConfigurationServiceProtocol(t.Protocol):
168
- """Protocol for configuration service."""
169
-
170
142
  def update_precommit_config(self, options: OptionsProtocol) -> bool: ...
171
143
 
172
144
  def update_pyproject_config(self, options: OptionsProtocol) -> bool: ...
@@ -176,8 +148,6 @@ class ConfigurationServiceProtocol(t.Protocol):
176
148
 
177
149
  @t.runtime_checkable
178
150
  class SecurityServiceProtocol(t.Protocol):
179
- """Protocol for security service."""
180
-
181
151
  def validate_file_safety(self, path: str | Path) -> bool: ...
182
152
 
183
153
  def check_hardcoded_secrets(self, content: str) -> list[dict[str, t.Any]]: ...
@@ -193,8 +163,6 @@ class SecurityServiceProtocol(t.Protocol):
193
163
 
194
164
  @t.runtime_checkable
195
165
  class InitializationServiceProtocol(t.Protocol):
196
- """Protocol for initialization service."""
197
-
198
166
  def initialize_project(self, project_path: str | Path) -> bool: ...
199
167
 
200
168
  def validate_project_structure(self) -> bool: ...
@@ -204,8 +172,6 @@ class InitializationServiceProtocol(t.Protocol):
204
172
 
205
173
  @t.runtime_checkable
206
174
  class UnifiedConfigurationServiceProtocol(t.Protocol):
207
- """Protocol for unified configuration service."""
208
-
209
175
  def merge_configurations(self) -> dict[str, t.Any]: ...
210
176
 
211
177
  def validate_configuration(self, config: dict[str, t.Any]) -> bool: ...
@@ -239,8 +205,6 @@ class PublishManager(t.Protocol):
239
205
 
240
206
  @t.runtime_checkable
241
207
  class ConfigMergeServiceProtocol(t.Protocol):
242
- """Protocol for smart configuration file merging."""
243
-
244
208
  def smart_merge_pyproject(
245
209
  self,
246
210
  source_content: dict[str, t.Any],
@@ -285,107 +249,143 @@ class ConfigMergeServiceProtocol(t.Protocol):
285
249
 
286
250
  @t.runtime_checkable
287
251
  class HookLockManagerProtocol(t.Protocol):
288
- """Protocol for managing hook-specific locks to prevent concurrent execution."""
252
+ def requires_lock(self, hook_name: str) -> bool: ...
289
253
 
290
- def requires_lock(self, hook_name: str) -> bool:
291
- """Check if a hook requires sequential execution.
254
+ async def acquire_hook_lock(
255
+ self, hook_name: str
256
+ ) -> t.AsyncContextManager[None]: ...
292
257
 
293
- Args:
294
- hook_name: Name of the hook to check
258
+ def get_lock_stats(self) -> dict[str, t.Any]: ...
295
259
 
296
- Returns:
297
- True if the hook requires a lock for sequential execution
298
- """
299
- ...
260
+ def add_hook_to_lock_list(self, hook_name: str) -> None: ...
300
261
 
301
- async def acquire_hook_lock(self, hook_name: str) -> t.AsyncContextManager[None]:
302
- """Acquire a lock for the specified hook if it requires one.
262
+ def remove_hook_from_lock_list(self, hook_name: str) -> None: ...
303
263
 
304
- Args:
305
- hook_name: Name of the hook to lock
264
+ def is_hook_currently_locked(self, hook_name: str) -> bool: ...
306
265
 
307
- Returns:
308
- Async context manager for lock acquisition
309
- """
310
- ...
266
+ def enable_global_lock(self, enabled: bool = True) -> None: ...
311
267
 
312
- def get_lock_stats(self) -> dict[str, t.Any]:
313
- """Get statistics about lock usage for monitoring.
268
+ def is_global_lock_enabled(self) -> bool: ...
314
269
 
315
- Returns:
316
- Dict containing lock statistics per hook
317
- """
318
- ...
270
+ def get_global_lock_path(self, hook_name: str) -> Path: ...
319
271
 
320
- def add_hook_to_lock_list(self, hook_name: str) -> None:
321
- """Add a hook to the list requiring sequential execution.
272
+ def cleanup_stale_locks(self, max_age_hours: float = 2.0) -> int: ...
322
273
 
323
- Args:
324
- hook_name: Name of the hook to add
325
- """
326
- ...
274
+ def get_global_lock_stats(self) -> dict[str, t.Any]: ...
327
275
 
328
- def remove_hook_from_lock_list(self, hook_name: str) -> None:
329
- """Remove a hook from the list requiring sequential execution.
330
276
 
331
- Args:
332
- hook_name: Name of the hook to remove
333
- """
334
- ...
277
+ @t.runtime_checkable
278
+ class DocumentationServiceProtocol(t.Protocol):
279
+ """Service for automated documentation generation and maintenance."""
280
+
281
+ def extract_api_documentation(
282
+ self, source_paths: list[Path]
283
+ ) -> dict[str, t.Any]: ...
284
+
285
+ def generate_documentation(
286
+ self, template_name: str, context: dict[str, t.Any]
287
+ ) -> str: ...
288
+
289
+ def validate_documentation(self, doc_paths: list[Path]) -> list[dict[str, str]]: ...
290
+
291
+ def update_documentation_index(self) -> bool: ...
335
292
 
336
- def is_hook_currently_locked(self, hook_name: str) -> bool:
337
- """Check if a hook is currently locked.
293
+ def get_documentation_coverage(self) -> dict[str, t.Any]: ...
338
294
 
339
- Args:
340
- hook_name: Name of the hook to check
341
295
 
342
- Returns:
343
- True if the hook is currently locked
344
- """
345
- ...
296
+ @t.runtime_checkable
297
+ class APIExtractorProtocol(t.Protocol):
298
+ """Protocol for extracting API documentation from source code."""
299
+
300
+ def extract_from_python_files(self, files: list[Path]) -> dict[str, t.Any]: ...
346
301
 
347
- def enable_global_lock(self, enabled: bool = True) -> None:
348
- """Enable or disable global lock functionality.
302
+ def extract_protocol_definitions(self, protocol_file: Path) -> dict[str, t.Any]: ...
349
303
 
350
- Args:
351
- enabled: Whether to enable global locking
352
- """
353
- ...
304
+ def extract_service_interfaces(
305
+ self, service_files: list[Path]
306
+ ) -> dict[str, t.Any]: ...
354
307
 
355
- def is_global_lock_enabled(self) -> bool:
356
- """Check if global lock functionality is enabled.
308
+ def extract_cli_commands(self, cli_files: list[Path]) -> dict[str, t.Any]: ...
357
309
 
358
- Returns:
359
- True if global locking is enabled
360
- """
361
- ...
310
+ def extract_mcp_tools(self, mcp_files: list[Path]) -> dict[str, t.Any]: ...
362
311
 
363
- def get_global_lock_path(self, hook_name: str) -> Path:
364
- """Get the filesystem path for a hook's global lock file.
365
312
 
366
- Args:
367
- hook_name: Name of the hook
313
+ @t.runtime_checkable
314
+ class DocumentationGeneratorProtocol(t.Protocol):
315
+ """Protocol for generating documentation from extracted data."""
368
316
 
369
- Returns:
370
- Path to the lock file for the hook
371
- """
372
- ...
317
+ def generate_api_reference(self, api_data: dict[str, t.Any]) -> str: ...
318
+
319
+ def generate_user_guide(self, template_context: dict[str, t.Any]) -> str: ...
320
+
321
+ def generate_changelog_update(
322
+ self, version: str, changes: dict[str, t.Any]
323
+ ) -> str: ...
324
+
325
+ def render_template(
326
+ self, template_path: Path, context: dict[str, t.Any]
327
+ ) -> str: ...
328
+
329
+ def generate_cross_references(
330
+ self, api_data: dict[str, t.Any]
331
+ ) -> dict[str, list[str]]: ...
332
+
333
+
334
+ @t.runtime_checkable
335
+ class DocumentationValidatorProtocol(t.Protocol):
336
+ """Protocol for validating documentation quality and consistency."""
337
+
338
+ def validate_links(self, doc_content: str) -> list[dict[str, str]]: ...
339
+
340
+ def check_documentation_freshness(
341
+ self, api_data: dict[str, t.Any], doc_paths: list[Path]
342
+ ) -> dict[str, t.Any]: ...
343
+
344
+ def validate_cross_references(
345
+ self, docs: dict[str, str]
346
+ ) -> list[dict[str, str]]: ...
347
+
348
+ def calculate_coverage_metrics(
349
+ self, api_data: dict[str, t.Any], existing_docs: dict[str, str]
350
+ ) -> dict[str, float]: ...
351
+
352
+
353
+ @t.runtime_checkable
354
+ class LoggerProtocol(t.Protocol):
355
+ """Protocol for structured logging interface."""
356
+
357
+ def info(self, message: str, **kwargs: t.Any) -> None: ...
358
+
359
+ def warning(self, message: str, **kwargs: t.Any) -> None: ...
360
+
361
+ def error(self, message: str, **kwargs: t.Any) -> None: ...
362
+
363
+ def debug(self, message: str, **kwargs: t.Any) -> None: ...
364
+
365
+
366
+ @t.runtime_checkable
367
+ class ConfigManagerProtocol(t.Protocol):
368
+ """Protocol for configuration management."""
369
+
370
+ def get(self, key: str, default: t.Any = None) -> t.Any: ...
371
+
372
+ def set(self, key: str, value: t.Any) -> None: ...
373
+
374
+ def save(self) -> bool: ...
375
+
376
+ def load(self) -> bool: ...
377
+
378
+
379
+ @t.runtime_checkable
380
+ class FileSystemServiceProtocol(t.Protocol):
381
+ """Protocol for file system operations."""
373
382
 
374
- def cleanup_stale_locks(self, max_age_hours: float = 2.0) -> int:
375
- """Clean up stale lock files older than max_age_hours.
383
+ def read_file(self, path: str | Path) -> str: ...
376
384
 
377
- Args:
378
- max_age_hours: Maximum age in hours before a lock is considered stale
385
+ def write_file(self, path: str | Path, content: str) -> None: ...
379
386
 
380
- Returns:
381
- Number of stale locks cleaned up
382
- """
383
- ...
387
+ def exists(self, path: str | Path) -> bool: ...
384
388
 
385
- def get_global_lock_stats(self) -> dict[str, t.Any]:
386
- """Get comprehensive statistics about global lock usage.
389
+ def mkdir(self, path: str | Path, parents: bool = False) -> None: ...
387
390
 
388
- Returns:
389
- Dictionary containing global lock statistics and metrics
390
- """
391
- ...
391
+ def ensure_directory(self, path: str | Path) -> None: ...