roadmap-cli 0.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- roadmap/__init__.py +27 -0
- roadmap/adapters/__init__.py +1 -0
- roadmap/adapters/base_paginated_adapter.py +117 -0
- roadmap/adapters/cli/__init__.py +249 -0
- roadmap/adapters/cli/analysis/__init__.py +5 -0
- roadmap/adapters/cli/analysis/commands.py +370 -0
- roadmap/adapters/cli/analysis/presenter.py +125 -0
- roadmap/adapters/cli/archive_operations.py +86 -0
- roadmap/adapters/cli/cli_command_helpers.py +109 -0
- roadmap/adapters/cli/cli_confirmations.py +74 -0
- roadmap/adapters/cli/cli_error_handlers.py +146 -0
- roadmap/adapters/cli/cli_validators.py +39 -0
- roadmap/adapters/cli/commands/sync_status.py +308 -0
- roadmap/adapters/cli/comment/__init__.py +5 -0
- roadmap/adapters/cli/comment/commands.py +106 -0
- roadmap/adapters/cli/config/__init__.py +5 -0
- roadmap/adapters/cli/config/commands.py +198 -0
- roadmap/adapters/cli/console_exports.py +10 -0
- roadmap/adapters/cli/core.py +26 -0
- roadmap/adapters/cli/crud/__init__.py +47 -0
- roadmap/adapters/cli/crud/base_archive.py +208 -0
- roadmap/adapters/cli/crud/base_create.py +154 -0
- roadmap/adapters/cli/crud/base_delete.py +155 -0
- roadmap/adapters/cli/crud/base_restore.py +283 -0
- roadmap/adapters/cli/crud/base_update.py +193 -0
- roadmap/adapters/cli/crud/crud_helpers.py +206 -0
- roadmap/adapters/cli/crud/crud_utils.py +152 -0
- roadmap/adapters/cli/crud/entity_builders.py +374 -0
- roadmap/adapters/cli/data/__init__.py +8 -0
- roadmap/adapters/cli/data/commands.py +149 -0
- roadmap/adapters/cli/decorators.py +208 -0
- roadmap/adapters/cli/dtos/__init__.py +155 -0
- roadmap/adapters/cli/exception_handler.py +105 -0
- roadmap/adapters/cli/git/__init__.py +8 -0
- roadmap/adapters/cli/git/commands.py +475 -0
- roadmap/adapters/cli/git/handlers/__init__.py +1 -0
- roadmap/adapters/cli/git/handlers/git_authentication_handler.py +124 -0
- roadmap/adapters/cli/git/handlers/git_branch_handler.py +238 -0
- roadmap/adapters/cli/git/handlers/git_connectivity_handler.py +122 -0
- roadmap/adapters/cli/git/handlers/git_hooks_handler.py +105 -0
- roadmap/adapters/cli/git/hooks_config.py +327 -0
- roadmap/adapters/cli/git/status_display.py +158 -0
- roadmap/adapters/cli/health/__init__.py +8 -0
- roadmap/adapters/cli/health/db_integrity.py +204 -0
- roadmap/adapters/cli/health/enhancer.py +227 -0
- roadmap/adapters/cli/health/fixer.py +295 -0
- roadmap/adapters/cli/health/fixers/__init__.py +10 -0
- roadmap/adapters/cli/health/fixers/corrupted_comments_fixer.py +231 -0
- roadmap/adapters/cli/health/fixers/data_integrity_fixer.py +137 -0
- roadmap/adapters/cli/health/fixers/duplicate_issues_fixer.py +138 -0
- roadmap/adapters/cli/health/fixers/folder_structure_fixer.py +114 -0
- roadmap/adapters/cli/health/fixers/label_normalization_fixer.py +162 -0
- roadmap/adapters/cli/health/fixers/milestone_name_normalization_fixer.py +181 -0
- roadmap/adapters/cli/health/fixers/milestone_naming_compliance_fixer.py +244 -0
- roadmap/adapters/cli/health/fixers/milestone_parse_error_fixer.py +162 -0
- roadmap/adapters/cli/health/fixers/milestone_validation_fixer.py +211 -0
- roadmap/adapters/cli/health/fixers/old_backups_fixer.py +135 -0
- roadmap/adapters/cli/health/fixers/orphaned_issues_fixer.py +252 -0
- roadmap/adapters/cli/health/formatter.py +250 -0
- roadmap/adapters/cli/health/formatters.py +427 -0
- roadmap/adapters/cli/health/scan.py +293 -0
- roadmap/adapters/cli/init/__init__.py +5 -0
- roadmap/adapters/cli/init/commands.py +587 -0
- roadmap/adapters/cli/init.py +9 -0
- roadmap/adapters/cli/issues/__init__.py +70 -0
- roadmap/adapters/cli/issues/archive.py +137 -0
- roadmap/adapters/cli/issues/archive_class.py +253 -0
- roadmap/adapters/cli/issues/block.py +39 -0
- roadmap/adapters/cli/issues/close.py +216 -0
- roadmap/adapters/cli/issues/comment.py +178 -0
- roadmap/adapters/cli/issues/create.py +162 -0
- roadmap/adapters/cli/issues/delete.py +31 -0
- roadmap/adapters/cli/issues/deps.py +161 -0
- roadmap/adapters/cli/issues/issue_status_helpers.py +111 -0
- roadmap/adapters/cli/issues/link.py +308 -0
- roadmap/adapters/cli/issues/list.py +402 -0
- roadmap/adapters/cli/issues/lookup.py +96 -0
- roadmap/adapters/cli/issues/progress.py +102 -0
- roadmap/adapters/cli/issues/restore.py +96 -0
- roadmap/adapters/cli/issues/restore_class.py +57 -0
- roadmap/adapters/cli/issues/start.py +165 -0
- roadmap/adapters/cli/issues/sync_status.py +374 -0
- roadmap/adapters/cli/issues/unblock.py +43 -0
- roadmap/adapters/cli/issues/unlink.py +104 -0
- roadmap/adapters/cli/issues/update.py +120 -0
- roadmap/adapters/cli/issues/view.py +36 -0
- roadmap/adapters/cli/layout.py +220 -0
- roadmap/adapters/cli/mappers.py +200 -0
- roadmap/adapters/cli/milestones/__init__.py +52 -0
- roadmap/adapters/cli/milestones/archive.py +125 -0
- roadmap/adapters/cli/milestones/archive_class.py +236 -0
- roadmap/adapters/cli/milestones/assign.py +62 -0
- roadmap/adapters/cli/milestones/close.py +177 -0
- roadmap/adapters/cli/milestones/create.py +131 -0
- roadmap/adapters/cli/milestones/delete.py +27 -0
- roadmap/adapters/cli/milestones/kanban.py +123 -0
- roadmap/adapters/cli/milestones/list.py +87 -0
- roadmap/adapters/cli/milestones/recalculate.py +79 -0
- roadmap/adapters/cli/milestones/restore.py +87 -0
- roadmap/adapters/cli/milestones/restore_class.py +99 -0
- roadmap/adapters/cli/milestones/update.py +61 -0
- roadmap/adapters/cli/milestones/view.py +142 -0
- roadmap/adapters/cli/output_manager.py +319 -0
- roadmap/adapters/cli/presentation/base_presenter.py +121 -0
- roadmap/adapters/cli/presentation/cleanup_presenter.py +235 -0
- roadmap/adapters/cli/presentation/core_initialization_presenter.py +277 -0
- roadmap/adapters/cli/presentation/crud_presenter.py +134 -0
- roadmap/adapters/cli/presentation/daily_summary_presenter.py +266 -0
- roadmap/adapters/cli/presentation/issue_presenter.py +258 -0
- roadmap/adapters/cli/presentation/milestone_list_presenter.py +135 -0
- roadmap/adapters/cli/presentation/milestone_presenter.py +297 -0
- roadmap/adapters/cli/presentation/project_presenter.py +233 -0
- roadmap/adapters/cli/presentation/project_status_presenter.py +186 -0
- roadmap/adapters/cli/presentation/table_builders.py +95 -0
- roadmap/adapters/cli/projects/__init__.py +42 -0
- roadmap/adapters/cli/projects/archive.py +127 -0
- roadmap/adapters/cli/projects/archive_class.py +96 -0
- roadmap/adapters/cli/projects/close.py +94 -0
- roadmap/adapters/cli/projects/create.py +50 -0
- roadmap/adapters/cli/projects/delete.py +27 -0
- roadmap/adapters/cli/projects/list.py +227 -0
- roadmap/adapters/cli/projects/restore.py +87 -0
- roadmap/adapters/cli/projects/restore_class.py +56 -0
- roadmap/adapters/cli/projects/update.py +57 -0
- roadmap/adapters/cli/projects/view.py +157 -0
- roadmap/adapters/cli/services/__init__.py +1 -0
- roadmap/adapters/cli/services/daily_summary_service.py +313 -0
- roadmap/adapters/cli/services/export_manager.py +268 -0
- roadmap/adapters/cli/services/milestone_list_service.py +266 -0
- roadmap/adapters/cli/services/project_initialization_service.py +29 -0
- roadmap/adapters/cli/services/project_status_service.py +462 -0
- roadmap/adapters/cli/services/sync_service.py +62 -0
- roadmap/adapters/cli/status.py +408 -0
- roadmap/adapters/cli/styling.py +21 -0
- roadmap/adapters/cli/sync.py +1117 -0
- roadmap/adapters/cli/sync_context.py +432 -0
- roadmap/adapters/cli/sync_handlers/__init__.py +77 -0
- roadmap/adapters/cli/sync_handlers/apply_ops.py +522 -0
- roadmap/adapters/cli/sync_handlers/baseline_ops.py +366 -0
- roadmap/adapters/cli/sync_handlers/conflict_ops.py +161 -0
- roadmap/adapters/cli/sync_handlers/dry_run_display.py +237 -0
- roadmap/adapters/cli/sync_handlers/interactive_resolver.py +396 -0
- roadmap/adapters/cli/sync_handlers/progress_tracker.py +128 -0
- roadmap/adapters/cli/sync_metrics_command.py +190 -0
- roadmap/adapters/cli/sync_presenter.py +58 -0
- roadmap/adapters/cli/sync_validation.py +295 -0
- roadmap/adapters/cli/today.py +52 -0
- roadmap/adapters/cli/utils/click_options.py +38 -0
- roadmap/adapters/git/__init__.py +1 -0
- roadmap/adapters/git/git.py +208 -0
- roadmap/adapters/git/git_branch_manager.py +400 -0
- roadmap/adapters/git/git_command_executor.py +56 -0
- roadmap/adapters/git/git_commit_analyzer.py +334 -0
- roadmap/adapters/git/git_hooks.py +22 -0
- roadmap/adapters/git/git_hooks_manager.py +455 -0
- roadmap/adapters/git/git_repository_info.py +65 -0
- roadmap/adapters/git/hook_installer.py +106 -0
- roadmap/adapters/git/hook_registry.py +97 -0
- roadmap/adapters/git/hook_script_generator.py +58 -0
- roadmap/adapters/git/sync_monitor.py +409 -0
- roadmap/adapters/git/workflow_automation.py +286 -0
- roadmap/adapters/github/__init__.py +1 -0
- roadmap/adapters/github/github.py +360 -0
- roadmap/adapters/github/handlers/__init__.py +17 -0
- roadmap/adapters/github/handlers/base.py +337 -0
- roadmap/adapters/github/handlers/collaborators.py +165 -0
- roadmap/adapters/github/handlers/comments.py +118 -0
- roadmap/adapters/github/handlers/issues.py +150 -0
- roadmap/adapters/github/handlers/labels.py +164 -0
- roadmap/adapters/github/handlers/milestones.py +104 -0
- roadmap/adapters/persistence/__init__.py +35 -0
- roadmap/adapters/persistence/conflict_resolver.py +190 -0
- roadmap/adapters/persistence/database_manager.py +492 -0
- roadmap/adapters/persistence/entity_sync_coordinators.py +672 -0
- roadmap/adapters/persistence/file_locking.py +348 -0
- roadmap/adapters/persistence/file_parser.py +92 -0
- roadmap/adapters/persistence/file_synchronizer.py +107 -0
- roadmap/adapters/persistence/focused_managers.py +140 -0
- roadmap/adapters/persistence/git_history.py +330 -0
- roadmap/adapters/persistence/parser/__init__.py +20 -0
- roadmap/adapters/persistence/parser/frontmatter.py +152 -0
- roadmap/adapters/persistence/parser/issue.py +245 -0
- roadmap/adapters/persistence/parser/milestone.py +146 -0
- roadmap/adapters/persistence/parser/project.py +106 -0
- roadmap/adapters/persistence/persistence.py +288 -0
- roadmap/adapters/persistence/repositories/__init__.py +15 -0
- roadmap/adapters/persistence/repositories/issue_repository.py +223 -0
- roadmap/adapters/persistence/repositories/milestone_repository.py +140 -0
- roadmap/adapters/persistence/repositories/project_repository.py +168 -0
- roadmap/adapters/persistence/repositories/remote_link_repository.py +355 -0
- roadmap/adapters/persistence/repositories/sync_state_repository.py +66 -0
- roadmap/adapters/persistence/storage/__init__.py +36 -0
- roadmap/adapters/persistence/storage/conflicts.py +101 -0
- roadmap/adapters/persistence/storage/connection_manager.py +79 -0
- roadmap/adapters/persistence/storage/issue_storage.py +89 -0
- roadmap/adapters/persistence/storage/milestone_storage.py +80 -0
- roadmap/adapters/persistence/storage/project_storage.py +102 -0
- roadmap/adapters/persistence/storage/queries.py +227 -0
- roadmap/adapters/persistence/storage/state_manager.py +652 -0
- roadmap/adapters/persistence/storage/sync_state_storage.py +207 -0
- roadmap/adapters/persistence/sync_metrics_repository.py +342 -0
- roadmap/adapters/persistence/sync_orchestrator.py +293 -0
- roadmap/adapters/persistence/sync_state_tracker.py +86 -0
- roadmap/adapters/persistence/yaml_repositories.py +711 -0
- roadmap/adapters/sync/__init__.py +21 -0
- roadmap/adapters/sync/backend_factory.py +108 -0
- roadmap/adapters/sync/backends/__init__.py +15 -0
- roadmap/adapters/sync/backends/converters.py +209 -0
- roadmap/adapters/sync/backends/github_backend_helpers.py +380 -0
- roadmap/adapters/sync/backends/github_client.py +99 -0
- roadmap/adapters/sync/backends/github_sync_backend.py +792 -0
- roadmap/adapters/sync/backends/github_sync_ops.py +908 -0
- roadmap/adapters/sync/backends/services/__init__.py +1 -0
- roadmap/adapters/sync/backends/services/github_authentication_service.py +105 -0
- roadmap/adapters/sync/backends/services/github_issue_delete_service.py +423 -0
- roadmap/adapters/sync/backends/services/github_issue_dependency_service.py +63 -0
- roadmap/adapters/sync/backends/services/github_issue_fetch_service.py +158 -0
- roadmap/adapters/sync/backends/services/github_label_sync_service.py +126 -0
- roadmap/adapters/sync/backends/services/github_local_issue_sync_service.py +229 -0
- roadmap/adapters/sync/backends/services/github_milestone_fetch_service.py +204 -0
- roadmap/adapters/sync/backends/vanilla_git_sync_backend.py +198 -0
- roadmap/adapters/sync/services/__init__.py +11 -0
- roadmap/adapters/sync/services/baseline_state_handler.py +83 -0
- roadmap/adapters/sync/services/conflict_converter.py +85 -0
- roadmap/adapters/sync/services/issue_persistence_service.py +263 -0
- roadmap/adapters/sync/services/issue_state_service.py +243 -0
- roadmap/adapters/sync/services/local_change_filter.py +129 -0
- roadmap/adapters/sync/services/pull_result_processor.py +71 -0
- roadmap/adapters/sync/services/remote_issue_creation_service.py +112 -0
- roadmap/adapters/sync/services/sync_analysis_service.py +250 -0
- roadmap/adapters/sync/services/sync_authentication_service.py +57 -0
- roadmap/adapters/sync/services/sync_data_fetch_service.py +212 -0
- roadmap/adapters/sync/services/sync_linking_service.py +329 -0
- roadmap/adapters/sync/services/sync_report_service.py +62 -0
- roadmap/adapters/sync/services/sync_state_update_service.py +51 -0
- roadmap/adapters/sync/sync_cache_orchestrator.py +454 -0
- roadmap/adapters/sync/sync_merge_engine.py +416 -0
- roadmap/adapters/sync/sync_merge_orchestrator.py +1313 -0
- roadmap/adapters/sync/sync_retrieval_orchestrator.py +810 -0
- roadmap/application/services/__init__.py +1 -0
- roadmap/application/services/deduplicate_service.py +517 -0
- roadmap/application/use_cases/__init__.py +1 -0
- roadmap/common/__init__.py +308 -0
- roadmap/common/cache.py +209 -0
- roadmap/common/cli_errors.py +147 -0
- roadmap/common/configuration/__init__.py +33 -0
- roadmap/common/configuration/config_loader.py +264 -0
- roadmap/common/configuration/config_manager.py +164 -0
- roadmap/common/configuration/config_schema.py +145 -0
- roadmap/common/configuration/github/__init__.py +9 -0
- roadmap/common/configuration/github/config_manager.py +154 -0
- roadmap/common/configuration/github/token_resolver.py +84 -0
- roadmap/common/console.py +184 -0
- roadmap/common/constants.py +134 -0
- roadmap/common/datetime_parser.py +319 -0
- roadmap/common/error_formatter.py +84 -0
- roadmap/common/errors/__init__.py +143 -0
- roadmap/common/errors/error_base.py +73 -0
- roadmap/common/errors/error_file.py +82 -0
- roadmap/common/errors/error_git.py +67 -0
- roadmap/common/errors/error_handler.py +166 -0
- roadmap/common/errors/error_network.py +90 -0
- roadmap/common/errors/error_security.py +78 -0
- roadmap/common/errors/error_standards.py +561 -0
- roadmap/common/errors/error_validation.py +111 -0
- roadmap/common/errors/exceptions.py +432 -0
- roadmap/common/formatters/__init__.py +29 -0
- roadmap/common/formatters/base_table_formatter.py +96 -0
- roadmap/common/formatters/export/__init__.py +7 -0
- roadmap/common/formatters/export/issue_exporter.py +97 -0
- roadmap/common/formatters/helpers.py +28 -0
- roadmap/common/formatters/kanban/__init__.py +9 -0
- roadmap/common/formatters/kanban/layout.py +48 -0
- roadmap/common/formatters/kanban/organizer.py +81 -0
- roadmap/common/formatters/output/__init__.py +15 -0
- roadmap/common/formatters/tables/__init__.py +11 -0
- roadmap/common/formatters/tables/column_factory.py +312 -0
- roadmap/common/formatters/tables/issue_table.py +276 -0
- roadmap/common/formatters/tables/milestone_table.py +247 -0
- roadmap/common/formatters/tables/project_table.py +195 -0
- roadmap/common/formatters/text/__init__.py +57 -0
- roadmap/common/formatters/text/basic.py +217 -0
- roadmap/common/formatters/text/display.py +42 -0
- roadmap/common/formatters/text/duration.py +36 -0
- roadmap/common/formatters/text/operations.py +325 -0
- roadmap/common/formatters/text/status_badges.py +57 -0
- roadmap/common/initialization/github/__init__.py +11 -0
- roadmap/common/initialization/github/setup_service.py +238 -0
- roadmap/common/initialization/github/setup_validator.py +78 -0
- roadmap/common/logging/__init__.py +113 -0
- roadmap/common/logging/audit_logging.py +5 -0
- roadmap/common/logging/correlation.py +45 -0
- roadmap/common/logging/decorators.py +267 -0
- roadmap/common/logging/error_logging.py +217 -0
- roadmap/common/logging/formatters.py +124 -0
- roadmap/common/logging/loggers.py +68 -0
- roadmap/common/logging/performance_tracking.py +267 -0
- roadmap/common/logging/utils.py +335 -0
- roadmap/common/models/__init__.py +44 -0
- roadmap/common/models/cli_models.py +118 -0
- roadmap/common/models/config_models.py +199 -0
- roadmap/common/models/output_models.py +381 -0
- roadmap/common/observability/__init__.py +28 -0
- roadmap/common/observability/instrumentation.py +103 -0
- roadmap/common/observability/observability.py +76 -0
- roadmap/common/observability/otel_init.py +109 -0
- roadmap/common/output_formatter.py +393 -0
- roadmap/common/progress.py +379 -0
- roadmap/common/result.py +396 -0
- roadmap/common/security/__init__.py +48 -0
- roadmap/common/security/exceptions.py +13 -0
- roadmap/common/security/export_cleanup.py +79 -0
- roadmap/common/security/file_operations.py +104 -0
- roadmap/common/security/filename_sanitization.py +54 -0
- roadmap/common/security/logging.py +27 -0
- roadmap/common/security/path_validation.py +137 -0
- roadmap/common/security/temp_files.py +41 -0
- roadmap/common/services/__init__.py +65 -0
- roadmap/common/services/decorators.py +183 -0
- roadmap/common/services/logging_utils.py +208 -0
- roadmap/common/services/metrics.py +161 -0
- roadmap/common/services/performance.py +219 -0
- roadmap/common/services/profiling.py +288 -0
- roadmap/common/services/retry.py +288 -0
- roadmap/common/status_style_manager.py +114 -0
- roadmap/common/union_find.py +88 -0
- roadmap/common/update_constants.py +13 -0
- roadmap/common/utils/__init__.py +65 -0
- roadmap/common/utils/cli_helpers.py +381 -0
- roadmap/common/utils/file_utils.py +440 -0
- roadmap/common/utils/path_utils.py +38 -0
- roadmap/common/utils/status_utils.py +130 -0
- roadmap/common/utils/timezone_utils.py +480 -0
- roadmap/common/validation/__init__.py +37 -0
- roadmap/common/validation/field_validator.py +104 -0
- roadmap/common/validation/result.py +37 -0
- roadmap/common/validation/roadmap_validator.py +310 -0
- roadmap/common/validation/schema_validator.py +36 -0
- roadmap/common/validation/validators.py +50 -0
- roadmap/core/__init__.py +1 -0
- roadmap/core/domain/__init__.py +30 -0
- roadmap/core/domain/comment.py +24 -0
- roadmap/core/domain/health.py +15 -0
- roadmap/core/domain/issue.py +274 -0
- roadmap/core/domain/milestone.py +173 -0
- roadmap/core/domain/ports/__init__.py +1 -0
- roadmap/core/domain/ports/baseline_repository.py +24 -0
- roadmap/core/domain/ports/issue_repository.py +34 -0
- roadmap/core/domain/ports/remote_backend_port.py +31 -0
- roadmap/core/domain/project.py +130 -0
- roadmap/core/interfaces/__init__.py +109 -0
- roadmap/core/interfaces/assignee_validator.py +40 -0
- roadmap/core/interfaces/backend_factory.py +175 -0
- roadmap/core/interfaces/github.py +102 -0
- roadmap/core/interfaces/parsers.py +140 -0
- roadmap/core/interfaces/persistence.py +45 -0
- roadmap/core/interfaces/repositories.py +174 -0
- roadmap/core/interfaces/state_managers.py +111 -0
- roadmap/core/interfaces/state_storage.py +64 -0
- roadmap/core/interfaces/sync_backend.py +275 -0
- roadmap/core/interfaces/sync_services.py +119 -0
- roadmap/core/interfaces/sync_validators.py +180 -0
- roadmap/core/models/__init__.py +31 -0
- roadmap/core/models/sync_models.py +162 -0
- roadmap/core/models.py +115 -0
- roadmap/core/observability/__init__.py +17 -0
- roadmap/core/observability/sync_metrics.py +699 -0
- roadmap/core/repositories.py +200 -0
- roadmap/core/services/__init__.py +313 -0
- roadmap/core/services/baseline/__init__.py +1 -0
- roadmap/core/services/baseline/baseline_builder_progress.py +274 -0
- roadmap/core/services/baseline/baseline_retriever.py +63 -0
- roadmap/core/services/baseline/baseline_selector.py +248 -0
- roadmap/core/services/baseline/baseline_state_retriever.py +284 -0
- roadmap/core/services/baseline/optimized_baseline_builder.py +425 -0
- roadmap/core/services/comment/__init__.py +1 -0
- roadmap/core/services/comment/comment_service.py +277 -0
- roadmap/core/services/git/__init__.py +1 -0
- roadmap/core/services/git/git_hook_auto_sync_service.py +403 -0
- roadmap/core/services/github/__init__.py +1 -0
- roadmap/core/services/github/github_change_detector.py +162 -0
- roadmap/core/services/github/github_config_validator.py +148 -0
- roadmap/core/services/github/github_conflict_detector.py +179 -0
- roadmap/core/services/github/github_entity_classifier.py +51 -0
- roadmap/core/services/github/github_integration_service.py +439 -0
- roadmap/core/services/github/github_issue_client.py +346 -0
- roadmap/core/services/health/__init__.py +1 -0
- roadmap/core/services/health/backup_cleanup_service.py +202 -0
- roadmap/core/services/health/data_integrity_validator_service.py +90 -0
- roadmap/core/services/health/entity_health_scanner.py +460 -0
- roadmap/core/services/health/file_repair_service.py +193 -0
- roadmap/core/services/health/health_check_service.py +166 -0
- roadmap/core/services/health/health_models.py +80 -0
- roadmap/core/services/health/infrastructure_validator_service.py +328 -0
- roadmap/core/services/health/issue_health_scanner.py +263 -0
- roadmap/core/services/helpers/__init__.py +18 -0
- roadmap/core/services/helpers/status_change_helpers.py +88 -0
- roadmap/core/services/initialization/__init__.py +19 -0
- roadmap/core/services/initialization/utils.py +104 -0
- roadmap/core/services/initialization/validator.py +78 -0
- roadmap/core/services/initialization/workflow.py +182 -0
- roadmap/core/services/initialization_service.py +111 -0
- roadmap/core/services/issue/__init__.py +1 -0
- roadmap/core/services/issue/assignee_validation_service.py +312 -0
- roadmap/core/services/issue/issue_creation_service.py +309 -0
- roadmap/core/services/issue/issue_filter_service.py +302 -0
- roadmap/core/services/issue/issue_matching_service.py +127 -0
- roadmap/core/services/issue/issue_service.py +765 -0
- roadmap/core/services/issue/issue_update_service.py +144 -0
- roadmap/core/services/issue/start_issue_service.py +174 -0
- roadmap/core/services/issue_helpers/__init__.py +18 -0
- roadmap/core/services/issue_helpers/issue_filters.py +296 -0
- roadmap/core/services/milestone_service.py +438 -0
- roadmap/core/services/project/__init__.py +1 -0
- roadmap/core/services/project/project_service.py +434 -0
- roadmap/core/services/project/project_status_service.py +125 -0
- roadmap/core/services/project_init/__init__.py +22 -0
- roadmap/core/services/project_init/context_detection.py +146 -0
- roadmap/core/services/project_init/creation.py +76 -0
- roadmap/core/services/project_init/detection.py +51 -0
- roadmap/core/services/project_init/template.py +228 -0
- roadmap/core/services/status_change_service.py +88 -0
- roadmap/core/services/sync/__init__.py +1 -0
- roadmap/core/services/sync/batch_processor.py +290 -0
- roadmap/core/services/sync/conflict_resolver.py +154 -0
- roadmap/core/services/sync/dependency_resolver.py +367 -0
- roadmap/core/services/sync/duplicate_detector.py +771 -0
- roadmap/core/services/sync/duplicate_resolver.py +315 -0
- roadmap/core/services/sync/error_classification.py +470 -0
- roadmap/core/services/sync/performance.py +263 -0
- roadmap/core/services/sync/sync_change_computer.py +211 -0
- roadmap/core/services/sync/sync_checkpoint.py +348 -0
- roadmap/core/services/sync/sync_conflict_detector.py +147 -0
- roadmap/core/services/sync/sync_conflict_resolver.py +448 -0
- roadmap/core/services/sync/sync_errors.py +383 -0
- roadmap/core/services/sync/sync_key_normalizer.py +222 -0
- roadmap/core/services/sync/sync_metadata_service.py +361 -0
- roadmap/core/services/sync/sync_plan.py +171 -0
- roadmap/core/services/sync/sync_plan_executor.py +447 -0
- roadmap/core/services/sync/sync_report.py +296 -0
- roadmap/core/services/sync/sync_state.py +173 -0
- roadmap/core/services/sync/sync_state_comparator.py +690 -0
- roadmap/core/services/sync/sync_state_manager.py +431 -0
- roadmap/core/services/sync/sync_state_normalizer.py +98 -0
- roadmap/core/services/sync/sync_three_way.py +78 -0
- roadmap/core/services/sync/three_way_merger.py +178 -0
- roadmap/core/services/utils/__init__.py +1 -0
- roadmap/core/services/utils/configuration_service.py +113 -0
- roadmap/core/services/utils/critical_path_calculator.py +418 -0
- roadmap/core/services/utils/dependency_analyzer.py +360 -0
- roadmap/core/services/utils/field_conflict_detector.py +126 -0
- roadmap/core/services/utils/remote_fetcher.py +202 -0
- roadmap/core/services/utils/remote_state_normalizer.py +110 -0
- roadmap/core/services/utils/retry_policy.py +51 -0
- roadmap/core/services/validator_base.py +130 -0
- roadmap/core/services/validators/__init__.py +28 -0
- roadmap/core/services/validators/_utils.py +20 -0
- roadmap/core/services/validators/archivable_issues_validator.py +71 -0
- roadmap/core/services/validators/archivable_milestones_validator.py +69 -0
- roadmap/core/services/validators/backup_validator.py +89 -0
- roadmap/core/services/validators/data_integrity_validator.py +84 -0
- roadmap/core/services/validators/duplicate_issues_validator.py +75 -0
- roadmap/core/services/validators/duplicate_milestones_validator.py +141 -0
- roadmap/core/services/validators/folder_structure_validator.py +165 -0
- roadmap/core/services/validators/health_status_utils.py +28 -0
- roadmap/core/services/validators/milestone_naming_validator.py +146 -0
- roadmap/core/services/validators/missing_headlines_validator.py +97 -0
- roadmap/core/services/validators/orphaned_issues_validator.py +142 -0
- roadmap/core/services/validators/orphaned_milestones_validator.py +85 -0
- roadmap/core/utils/git_remote_parser.py +83 -0
- roadmap/core/utils/github_urls.py +66 -0
- roadmap/domain/validation.py +30 -0
- roadmap/infrastructure/__init__.py +55 -0
- roadmap/infrastructure/coordination/__init__.py +8 -0
- roadmap/infrastructure/coordination/coordinator_params.py +82 -0
- roadmap/infrastructure/coordination/core.py +446 -0
- roadmap/infrastructure/coordination/git_coordinator.py +160 -0
- roadmap/infrastructure/coordination/initialization.py +348 -0
- roadmap/infrastructure/coordination/issue_coordinator.py +154 -0
- roadmap/infrastructure/coordination/issue_operations.py +456 -0
- roadmap/infrastructure/coordination/milestone_coordinator.py +135 -0
- roadmap/infrastructure/coordination/milestone_operations.py +201 -0
- roadmap/infrastructure/coordination/project_coordinator.py +113 -0
- roadmap/infrastructure/coordination/project_operations.py +144 -0
- roadmap/infrastructure/coordination/team_coordinator.py +107 -0
- roadmap/infrastructure/coordination/user_operations.py +150 -0
- roadmap/infrastructure/coordination/validation_coordinator.py +249 -0
- roadmap/infrastructure/coordination_gateway.py +152 -0
- roadmap/infrastructure/git/__init__.py +6 -0
- roadmap/infrastructure/git/git_integration_ops.py +234 -0
- roadmap/infrastructure/git_gateway.py +35 -0
- roadmap/infrastructure/github_gateway.py +52 -0
- roadmap/infrastructure/maintenance/__init__.py +5 -0
- roadmap/infrastructure/maintenance/cleanup.py +483 -0
- roadmap/infrastructure/observability/__init__.py +7 -0
- roadmap/infrastructure/observability/health.py +196 -0
- roadmap/infrastructure/observability/health_formatter.py +73 -0
- roadmap/infrastructure/observability/specialized_health_checkers.py +188 -0
- roadmap/infrastructure/persistence_gateway.py +164 -0
- roadmap/infrastructure/security/__init__.py +1 -0
- roadmap/infrastructure/security/credentials.py +489 -0
- roadmap/infrastructure/sync_gateway.py +94 -0
- roadmap/infrastructure/validation/__init__.py +7 -0
- roadmap/infrastructure/validation/file_enumeration.py +219 -0
- roadmap/infrastructure/validation/github_assignee_validator.py +47 -0
- roadmap/infrastructure/validation/github_validator.py +101 -0
- roadmap/infrastructure/validation/milestone_consistency_validator.py +96 -0
- roadmap/infrastructure/validation/vanilla_assignee_validator.py +37 -0
- roadmap/infrastructure/validation_gateway.py +96 -0
- roadmap/presentation/formatters/sync_metrics_formatter.py +355 -0
- roadmap/settings.py +345 -0
- roadmap/templates/github_workflows/ci-cd-roadmap.yml +241 -0
- roadmap/templates/github_workflows/issue-lifecycle.yml +236 -0
- roadmap/templates/github_workflows/roadmap-integration.yml +137 -0
- roadmap/templates/github_workflows/roadmap-starter.yml +59 -0
- roadmap/version.py +381 -0
- roadmap_cli-0.1.1.dist-info/METADATA +448 -0
- roadmap_cli-0.1.1.dist-info/RECORD +521 -0
- roadmap_cli-0.1.1.dist-info/WHEEL +4 -0
- roadmap_cli-0.1.1.dist-info/entry_points.txt +2 -0
- roadmap_cli-0.1.1.dist-info/licenses/LICENSE.md +21 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"""Repository abstraction layer for persistence.
|
|
2
|
+
|
|
3
|
+
This module defines protocols (interfaces) for data persistence operations.
|
|
4
|
+
Implementations can be swapped (YAML, JSON, database) without affecting services.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Protocol
|
|
10
|
+
|
|
11
|
+
from roadmap.core.domain.issue import Issue
|
|
12
|
+
from roadmap.core.domain.milestone import Milestone
|
|
13
|
+
from roadmap.core.domain.project import Project
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class IssueRepository(Protocol):
|
|
17
|
+
"""Protocol for issue data persistence."""
|
|
18
|
+
|
|
19
|
+
def get(self, issue_id: str) -> Issue | None:
|
|
20
|
+
"""Get a specific issue by ID.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
issue_id: Issue identifier
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
Issue object if found, None otherwise
|
|
27
|
+
"""
|
|
28
|
+
...
|
|
29
|
+
|
|
30
|
+
def list(
|
|
31
|
+
self, milestone: str | None = None, status: str | None = None
|
|
32
|
+
) -> list[Issue]:
|
|
33
|
+
"""List issues with optional filtering.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
milestone: Optional milestone filter
|
|
37
|
+
status: Optional status filter
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
List of Issue objects matching filters
|
|
41
|
+
"""
|
|
42
|
+
...
|
|
43
|
+
|
|
44
|
+
def save(self, issue: Issue) -> None:
|
|
45
|
+
"""Save/create an issue.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
issue: Issue object to save
|
|
49
|
+
"""
|
|
50
|
+
...
|
|
51
|
+
|
|
52
|
+
def update(self, issue_id: str, updates: dict) -> Issue | None:
|
|
53
|
+
"""Update specific fields of an issue.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
issue_id: Issue identifier
|
|
57
|
+
updates: Dictionary of field updates
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Updated Issue object if found, None otherwise
|
|
61
|
+
"""
|
|
62
|
+
...
|
|
63
|
+
|
|
64
|
+
def delete(self, issue_id: str) -> bool:
|
|
65
|
+
"""Delete an issue.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
issue_id: Issue identifier
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
True if deleted, False if not found
|
|
72
|
+
"""
|
|
73
|
+
...
|
|
74
|
+
|
|
75
|
+
def delete_many(self, issue_ids: list[str]) -> int:
|
|
76
|
+
"""Delete multiple issues in a single batch operation.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
issue_ids: List of issue identifiers to delete
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Number of issues successfully deleted
|
|
83
|
+
"""
|
|
84
|
+
...
|
|
85
|
+
|
|
86
|
+
def list_all_including_archived(self) -> list[Issue]:
|
|
87
|
+
"""List all issues including archived ones.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
List of all Issue objects (both active and archived)
|
|
91
|
+
"""
|
|
92
|
+
...
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class MilestoneRepository(Protocol):
|
|
96
|
+
"""Protocol for milestone data persistence."""
|
|
97
|
+
|
|
98
|
+
def get(self, milestone_id: str) -> Milestone | None:
|
|
99
|
+
"""Get a specific milestone by ID or name.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
milestone_id: Milestone identifier or name
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Milestone object if found, None otherwise
|
|
106
|
+
"""
|
|
107
|
+
...
|
|
108
|
+
|
|
109
|
+
def list(self) -> list[Milestone]:
|
|
110
|
+
"""List all milestones.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
List of all Milestone objects
|
|
114
|
+
"""
|
|
115
|
+
...
|
|
116
|
+
|
|
117
|
+
def save(self, milestone: Milestone) -> None:
|
|
118
|
+
"""Save/create a milestone.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
milestone: Milestone object to save
|
|
122
|
+
"""
|
|
123
|
+
...
|
|
124
|
+
|
|
125
|
+
def update(self, milestone_id: str, updates: dict) -> Milestone | None:
|
|
126
|
+
"""Update specific fields of a milestone.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
milestone_id: Milestone identifier
|
|
130
|
+
updates: Dictionary of field updates
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Updated Milestone object if found, None otherwise
|
|
134
|
+
"""
|
|
135
|
+
...
|
|
136
|
+
|
|
137
|
+
def delete(self, milestone_id: str) -> bool:
|
|
138
|
+
"""Delete a milestone.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
milestone_id: Milestone identifier
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
True if deleted, False if not found
|
|
145
|
+
"""
|
|
146
|
+
...
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class ProjectRepository(Protocol):
|
|
150
|
+
"""Protocol for project data persistence."""
|
|
151
|
+
|
|
152
|
+
def get(self, project_id: str) -> Project | None:
|
|
153
|
+
"""Get a specific project by ID.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
project_id: Project identifier
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
Project object if found, None otherwise
|
|
160
|
+
"""
|
|
161
|
+
...
|
|
162
|
+
|
|
163
|
+
def list(self) -> list[Project]:
|
|
164
|
+
"""List all projects.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
List of all Project objects
|
|
168
|
+
"""
|
|
169
|
+
...
|
|
170
|
+
|
|
171
|
+
def save(self, project: Project) -> None:
|
|
172
|
+
"""Save/create a project.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
project: Project object to save
|
|
176
|
+
"""
|
|
177
|
+
...
|
|
178
|
+
|
|
179
|
+
def update(self, project_id: str, updates: dict) -> Project | None:
|
|
180
|
+
"""Update specific fields of a project.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
project_id: Project identifier
|
|
184
|
+
updates: Dictionary of field updates
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
Updated Project object if found, None otherwise
|
|
188
|
+
"""
|
|
189
|
+
...
|
|
190
|
+
|
|
191
|
+
def delete(self, project_id: str) -> bool:
|
|
192
|
+
"""Delete a project.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
project_id: Project identifier
|
|
196
|
+
|
|
197
|
+
Returns:
|
|
198
|
+
True if deleted, False if not found
|
|
199
|
+
"""
|
|
200
|
+
...
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
"""Service layer - Business logic orchestrators.
|
|
2
|
+
|
|
3
|
+
Services implement core business logic and workflows.
|
|
4
|
+
Each service focuses on one domain entity (Issue, Milestone, Project).
|
|
5
|
+
|
|
6
|
+
Services depend on:
|
|
7
|
+
- Domain models (Issue, Milestone, Project)
|
|
8
|
+
- Adapters (database, storage, parsers)
|
|
9
|
+
|
|
10
|
+
Services are used by:
|
|
11
|
+
- Infrastructure core (core.py orchestrator)
|
|
12
|
+
- CLI layer (command implementations)
|
|
13
|
+
|
|
14
|
+
Module structure after Phase 5 Stage 2 refactoring:
|
|
15
|
+
- sync/: Synchronization orchestration and conflict resolution
|
|
16
|
+
- health/: Health checking, validation, and repair services
|
|
17
|
+
- github/: GitHub integration and API client services
|
|
18
|
+
- baseline/: Baseline selection and retrieval services
|
|
19
|
+
- issue/: Issue management and lifecycle services
|
|
20
|
+
- project/: Project management services
|
|
21
|
+
- comment/: Comment service
|
|
22
|
+
- git/: Git hooks and auto-sync services
|
|
23
|
+
- utils/: Utility and shared services
|
|
24
|
+
- validators/: Health validators
|
|
25
|
+
- helpers/: Helper functions
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
# pyright: reportUnusedImport=false
|
|
29
|
+
|
|
30
|
+
from typing import TYPE_CHECKING
|
|
31
|
+
|
|
32
|
+
from .baseline.baseline_retriever import BaselineRetriever
|
|
33
|
+
from .baseline.baseline_selector import BaselineStrategy
|
|
34
|
+
from .baseline.baseline_state_retriever import BaselineStateRetriever
|
|
35
|
+
from .baseline.optimized_baseline_builder import OptimizedBaselineBuilder
|
|
36
|
+
from .comment.comment_service import CommentService
|
|
37
|
+
from .github.github_change_detector import GitHubChangeDetector # noqa: F401
|
|
38
|
+
from .github.github_config_validator import GitHubConfigValidator # noqa: F401
|
|
39
|
+
from .github.github_conflict_detector import GitHubConflictDetector # noqa: F401
|
|
40
|
+
from .github.github_entity_classifier import GitHubEntityClassifier # noqa: F401
|
|
41
|
+
from .github.github_integration_service import GitHubIntegrationService # noqa: F401
|
|
42
|
+
from .github.github_issue_client import GitHubIssueClient # noqa: F401
|
|
43
|
+
from .health.backup_cleanup_service import BackupCleanupService # noqa: F401
|
|
44
|
+
from .health.entity_health_scanner import EntityHealthScanner # noqa: F401
|
|
45
|
+
from .health.file_repair_service import ( # noqa: F401
|
|
46
|
+
FileRepairResult,
|
|
47
|
+
FileRepairService,
|
|
48
|
+
)
|
|
49
|
+
from .health.issue_health_scanner import IssueHealthScanner # noqa: F401
|
|
50
|
+
from .issue.issue_creation_service import IssueCreationService # noqa: F401
|
|
51
|
+
from .issue.issue_filter_service import (
|
|
52
|
+
IssueFilterValidator, # noqa: F401
|
|
53
|
+
IssueQueryService, # noqa: F401
|
|
54
|
+
WorkloadCalculator, # noqa: F401
|
|
55
|
+
)
|
|
56
|
+
from .issue.issue_matching_service import IssueMatchingService # noqa: F401
|
|
57
|
+
from .issue.issue_service import IssueService # noqa: F401
|
|
58
|
+
from .issue.issue_update_service import IssueUpdateService # noqa: F401
|
|
59
|
+
from .issue.start_issue_service import StartIssueService # noqa: F401
|
|
60
|
+
from .milestone_service import MilestoneService # noqa: F401
|
|
61
|
+
from .status_change_service import (
|
|
62
|
+
extract_issue_status_update, # noqa: F401
|
|
63
|
+
extract_milestone_status_update, # noqa: F401
|
|
64
|
+
parse_status_change, # noqa: F401
|
|
65
|
+
)
|
|
66
|
+
from .utils.configuration_service import ConfigurationService # noqa: F401
|
|
67
|
+
from .utils.critical_path_calculator import ( # noqa: F401
|
|
68
|
+
CriticalPathCalculator,
|
|
69
|
+
CriticalPathResult,
|
|
70
|
+
)
|
|
71
|
+
from .utils.dependency_analyzer import ( # noqa: F401
|
|
72
|
+
DependencyAnalysisResult,
|
|
73
|
+
DependencyAnalyzer,
|
|
74
|
+
)
|
|
75
|
+
from .utils.field_conflict_detector import FieldConflictDetector # noqa: F401
|
|
76
|
+
from .utils.remote_fetcher import RemoteFetcher # noqa: F401
|
|
77
|
+
from .utils.remote_state_normalizer import RemoteStateNormalizer # noqa: F401
|
|
78
|
+
from .utils.retry_policy import RetryPolicy # noqa: F401
|
|
79
|
+
|
|
80
|
+
# Import circular-dependency services only for type checking
|
|
81
|
+
# These are loaded normally at runtime but import RoadmapCore indirectly
|
|
82
|
+
if TYPE_CHECKING:
|
|
83
|
+
from .git.git_hook_auto_sync_service import ( # noqa: F401
|
|
84
|
+
GitHookAutoSyncConfig,
|
|
85
|
+
GitHookAutoSyncService,
|
|
86
|
+
)
|
|
87
|
+
from .health.data_integrity_validator_service import ( # noqa: F401
|
|
88
|
+
DataIntegrityValidatorService,
|
|
89
|
+
)
|
|
90
|
+
from .health.health_check_service import HealthCheckService # noqa: F401
|
|
91
|
+
from .health.infrastructure_validator_service import (
|
|
92
|
+
InfrastructureValidator, # noqa: F401
|
|
93
|
+
)
|
|
94
|
+
from .project.project_service import ProjectService # noqa: F401
|
|
95
|
+
from .project.project_status_service import ProjectStatusService # noqa: F401
|
|
96
|
+
from .sync.sync_change_computer import ( # noqa: F401
|
|
97
|
+
compute_changes,
|
|
98
|
+
compute_changes_remote,
|
|
99
|
+
)
|
|
100
|
+
from .sync.sync_conflict_detector import detect_field_conflicts # noqa: F401
|
|
101
|
+
from .sync.sync_conflict_resolver import ( # noqa: F401
|
|
102
|
+
Conflict,
|
|
103
|
+
ConflictField,
|
|
104
|
+
SyncConflictResolver,
|
|
105
|
+
)
|
|
106
|
+
from .sync.sync_key_normalizer import normalize_remote_keys # noqa: F401
|
|
107
|
+
from .sync.sync_metadata_service import ( # noqa: F401
|
|
108
|
+
SyncMetadata,
|
|
109
|
+
SyncMetadataService,
|
|
110
|
+
SyncRecord,
|
|
111
|
+
)
|
|
112
|
+
from .sync.sync_plan import ( # noqa: F401
|
|
113
|
+
CreateLocalAction,
|
|
114
|
+
LinkAction,
|
|
115
|
+
PullAction,
|
|
116
|
+
PushAction,
|
|
117
|
+
ResolveConflictAction,
|
|
118
|
+
SyncPlan,
|
|
119
|
+
UpdateBaselineAction,
|
|
120
|
+
)
|
|
121
|
+
from .sync.sync_plan_executor import SyncPlanExecutor # noqa: F401
|
|
122
|
+
from .sync.sync_report import IssueChange, SyncReport # noqa: F401
|
|
123
|
+
from .sync.sync_state_comparator import SyncStateComparator # noqa: F401
|
|
124
|
+
from .sync.sync_state_manager import SyncStateManager # noqa: F401
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def __getattr__(name: str): # noqa: ANN001, ANN201
|
|
128
|
+
"""Lazy load services that have circular dependencies with infrastructure.
|
|
129
|
+
|
|
130
|
+
These services are imported only at runtime when accessed, not at module load time.
|
|
131
|
+
This breaks the circular dependency: infrastructure.core → core.services → services.xxx → infrastructure.core
|
|
132
|
+
"""
|
|
133
|
+
# Lazy modules mapping for runtime loading
|
|
134
|
+
_lazy_modules = {
|
|
135
|
+
"GitHookAutoSyncService": (
|
|
136
|
+
"roadmap.core.services.git.git_hook_auto_sync_service",
|
|
137
|
+
"GitHookAutoSyncService",
|
|
138
|
+
),
|
|
139
|
+
"GitHookAutoSyncConfig": (
|
|
140
|
+
"roadmap.core.services.git.git_hook_auto_sync_service",
|
|
141
|
+
"GitHookAutoSyncConfig",
|
|
142
|
+
),
|
|
143
|
+
"DataIntegrityValidatorService": (
|
|
144
|
+
"roadmap.core.services.health.data_integrity_validator_service",
|
|
145
|
+
"DataIntegrityValidatorService",
|
|
146
|
+
),
|
|
147
|
+
"HealthCheckService": (
|
|
148
|
+
"roadmap.core.services.health.health_check_service",
|
|
149
|
+
"HealthCheckService",
|
|
150
|
+
),
|
|
151
|
+
"InfrastructureValidator": (
|
|
152
|
+
"roadmap.core.services.health.infrastructure_validator_service",
|
|
153
|
+
"InfrastructureValidator",
|
|
154
|
+
),
|
|
155
|
+
"ProjectService": (
|
|
156
|
+
"roadmap.core.services.project.project_service",
|
|
157
|
+
"ProjectService",
|
|
158
|
+
),
|
|
159
|
+
"ProjectStatusService": (
|
|
160
|
+
"roadmap.core.services.project.project_status_service",
|
|
161
|
+
"ProjectStatusService",
|
|
162
|
+
),
|
|
163
|
+
"compute_changes": (
|
|
164
|
+
"roadmap.core.services.sync.sync_change_computer",
|
|
165
|
+
"compute_changes",
|
|
166
|
+
),
|
|
167
|
+
"compute_changes_remote": (
|
|
168
|
+
"roadmap.core.services.sync.sync_change_computer",
|
|
169
|
+
"compute_changes_remote",
|
|
170
|
+
),
|
|
171
|
+
"detect_field_conflicts": (
|
|
172
|
+
"roadmap.core.services.sync.sync_conflict_detector",
|
|
173
|
+
"detect_field_conflicts",
|
|
174
|
+
),
|
|
175
|
+
"SyncConflictResolver": (
|
|
176
|
+
"roadmap.core.services.sync.sync_conflict_resolver",
|
|
177
|
+
"SyncConflictResolver",
|
|
178
|
+
),
|
|
179
|
+
"Conflict": (
|
|
180
|
+
"roadmap.core.services.sync.sync_conflict_resolver",
|
|
181
|
+
"Conflict",
|
|
182
|
+
),
|
|
183
|
+
"ConflictField": (
|
|
184
|
+
"roadmap.core.services.sync.sync_conflict_resolver",
|
|
185
|
+
"ConflictField",
|
|
186
|
+
),
|
|
187
|
+
"normalize_remote_keys": (
|
|
188
|
+
"roadmap.core.services.sync.sync_key_normalizer",
|
|
189
|
+
"normalize_remote_keys",
|
|
190
|
+
),
|
|
191
|
+
"SyncMetadataService": (
|
|
192
|
+
"roadmap.core.services.sync.sync_metadata_service",
|
|
193
|
+
"SyncMetadataService",
|
|
194
|
+
),
|
|
195
|
+
"SyncRecord": (
|
|
196
|
+
"roadmap.core.services.sync.sync_metadata_service",
|
|
197
|
+
"SyncRecord",
|
|
198
|
+
),
|
|
199
|
+
"SyncMetadata": (
|
|
200
|
+
"roadmap.core.services.sync.sync_metadata_service",
|
|
201
|
+
"SyncMetadata",
|
|
202
|
+
),
|
|
203
|
+
"SyncPlan": (
|
|
204
|
+
"roadmap.core.services.sync.sync_plan",
|
|
205
|
+
"SyncPlan",
|
|
206
|
+
),
|
|
207
|
+
"PushAction": (
|
|
208
|
+
"roadmap.core.services.sync.sync_plan",
|
|
209
|
+
"PushAction",
|
|
210
|
+
),
|
|
211
|
+
"PullAction": (
|
|
212
|
+
"roadmap.core.services.sync.sync_plan",
|
|
213
|
+
"PullAction",
|
|
214
|
+
),
|
|
215
|
+
"CreateLocalAction": (
|
|
216
|
+
"roadmap.core.services.sync.sync_plan",
|
|
217
|
+
"CreateLocalAction",
|
|
218
|
+
),
|
|
219
|
+
"LinkAction": (
|
|
220
|
+
"roadmap.core.services.sync.sync_plan",
|
|
221
|
+
"LinkAction",
|
|
222
|
+
),
|
|
223
|
+
"UpdateBaselineAction": (
|
|
224
|
+
"roadmap.core.services.sync.sync_plan",
|
|
225
|
+
"UpdateBaselineAction",
|
|
226
|
+
),
|
|
227
|
+
"ResolveConflictAction": (
|
|
228
|
+
"roadmap.core.services.sync.sync_plan",
|
|
229
|
+
"ResolveConflictAction",
|
|
230
|
+
),
|
|
231
|
+
"SyncPlanExecutor": (
|
|
232
|
+
"roadmap.core.services.sync.sync_plan_executor",
|
|
233
|
+
"SyncPlanExecutor",
|
|
234
|
+
),
|
|
235
|
+
"SyncReport": (
|
|
236
|
+
"roadmap.core.services.sync.sync_report",
|
|
237
|
+
"SyncReport",
|
|
238
|
+
),
|
|
239
|
+
"IssueChange": (
|
|
240
|
+
"roadmap.core.services.sync.sync_report",
|
|
241
|
+
"IssueChange",
|
|
242
|
+
),
|
|
243
|
+
"SyncStateComparator": (
|
|
244
|
+
"roadmap.core.services.sync.sync_state_comparator",
|
|
245
|
+
"SyncStateComparator",
|
|
246
|
+
),
|
|
247
|
+
"SyncStateManager": (
|
|
248
|
+
"roadmap.core.services.sync.sync_state_manager",
|
|
249
|
+
"SyncStateManager",
|
|
250
|
+
),
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if name in _lazy_modules:
|
|
254
|
+
module_name, class_name = _lazy_modules[name]
|
|
255
|
+
import importlib
|
|
256
|
+
|
|
257
|
+
module = importlib.import_module(module_name)
|
|
258
|
+
return getattr(module, class_name)
|
|
259
|
+
msg = f"module {__name__!r} has no attribute {name!r}"
|
|
260
|
+
raise AttributeError(msg)
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
__all__ = [
|
|
264
|
+
# Baseline
|
|
265
|
+
"BaselineRetriever",
|
|
266
|
+
"BaselineStrategy",
|
|
267
|
+
"BaselineStateRetriever",
|
|
268
|
+
"OptimizedBaselineBuilder",
|
|
269
|
+
# Comment
|
|
270
|
+
"CommentService",
|
|
271
|
+
# Git (lazy loaded)
|
|
272
|
+
# Project
|
|
273
|
+
"ProjectService",
|
|
274
|
+
"ProjectStatusService",
|
|
275
|
+
# Root level
|
|
276
|
+
"MilestoneService",
|
|
277
|
+
"extract_issue_status_update",
|
|
278
|
+
"extract_milestone_status_update",
|
|
279
|
+
"parse_status_change",
|
|
280
|
+
# Sync
|
|
281
|
+
"compute_changes",
|
|
282
|
+
"compute_changes_remote",
|
|
283
|
+
"detect_field_conflicts",
|
|
284
|
+
"SyncConflictResolver",
|
|
285
|
+
"Conflict",
|
|
286
|
+
"ConflictField",
|
|
287
|
+
"normalize_remote_keys",
|
|
288
|
+
"SyncMetadataService",
|
|
289
|
+
"SyncRecord",
|
|
290
|
+
"SyncMetadata",
|
|
291
|
+
"SyncPlan",
|
|
292
|
+
"PushAction",
|
|
293
|
+
"PullAction",
|
|
294
|
+
"CreateLocalAction",
|
|
295
|
+
"LinkAction",
|
|
296
|
+
"UpdateBaselineAction",
|
|
297
|
+
"ResolveConflictAction",
|
|
298
|
+
"SyncPlanExecutor",
|
|
299
|
+
"SyncReport",
|
|
300
|
+
"IssueChange",
|
|
301
|
+
"SyncStateComparator",
|
|
302
|
+
"SyncStateManager",
|
|
303
|
+
# Utils
|
|
304
|
+
"ConfigurationService",
|
|
305
|
+
"CriticalPathCalculator",
|
|
306
|
+
"CriticalPathResult",
|
|
307
|
+
"DependencyAnalyzer",
|
|
308
|
+
"DependencyAnalysisResult",
|
|
309
|
+
"FieldConflictDetector",
|
|
310
|
+
"RemoteFetcher",
|
|
311
|
+
"RemoteStateNormalizer",
|
|
312
|
+
"RetryPolicy",
|
|
313
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Package initialization file."""
|