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,238 @@
|
|
|
1
|
+
"""Handler for Git branch operations."""
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from rich.console import Console
|
|
5
|
+
|
|
6
|
+
from roadmap.adapters.cli.cli_error_handlers import handle_cli_error
|
|
7
|
+
from roadmap.core.domain import Issue, Status
|
|
8
|
+
from roadmap.infrastructure.coordination.core import RoadmapCore
|
|
9
|
+
|
|
10
|
+
logger = structlog.get_logger()
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class GitBranchHandler:
|
|
14
|
+
"""Handles Git branch creation, linking, and validation."""
|
|
15
|
+
|
|
16
|
+
def __init__(self, console: Console):
|
|
17
|
+
"""Initialize handler with console for output.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
console: Rich Console instance
|
|
21
|
+
"""
|
|
22
|
+
self.console = console
|
|
23
|
+
|
|
24
|
+
def validate_branch_environment(self, core: RoadmapCore) -> bool:
|
|
25
|
+
"""Validate roadmap and git environment for branch creation.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
core: RoadmapCore instance
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
True if environment is valid
|
|
32
|
+
"""
|
|
33
|
+
if not core.is_initialized():
|
|
34
|
+
self.console.print(
|
|
35
|
+
"❌ Roadmap not initialized. Run 'roadmap init' first.",
|
|
36
|
+
style="bold red",
|
|
37
|
+
)
|
|
38
|
+
return False
|
|
39
|
+
|
|
40
|
+
if not core.git.is_git_repository():
|
|
41
|
+
self.console.print("❌ Not in a Git repository", style="bold red")
|
|
42
|
+
return False
|
|
43
|
+
|
|
44
|
+
return True
|
|
45
|
+
|
|
46
|
+
def get_and_validate_issue(self, core: RoadmapCore, issue_id: str):
|
|
47
|
+
"""Get and validate issue exists.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
core: RoadmapCore instance
|
|
51
|
+
issue_id: Issue ID to retrieve
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
Issue object or None if not found
|
|
55
|
+
"""
|
|
56
|
+
issue = core.issues.get(issue_id)
|
|
57
|
+
if not issue:
|
|
58
|
+
self.console.print(f"❌ Issue not found: {issue_id}", style="bold red")
|
|
59
|
+
return None
|
|
60
|
+
return issue
|
|
61
|
+
|
|
62
|
+
def create_branch(self, core: RoadmapCore, issue_id: str, checkout: bool = True):
|
|
63
|
+
"""Create a Git branch for an issue.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
core: RoadmapCore instance
|
|
67
|
+
issue_id: ID of the issue to create branch for
|
|
68
|
+
checkout: Whether to checkout the new branch
|
|
69
|
+
|
|
70
|
+
Raises:
|
|
71
|
+
Exception: If branch creation fails
|
|
72
|
+
"""
|
|
73
|
+
if not self.validate_branch_environment(core):
|
|
74
|
+
return
|
|
75
|
+
|
|
76
|
+
try:
|
|
77
|
+
issue = self.get_and_validate_issue(core, issue_id)
|
|
78
|
+
if not issue:
|
|
79
|
+
return
|
|
80
|
+
|
|
81
|
+
branch_name = core.git.suggest_branch_name(issue_id)
|
|
82
|
+
if not branch_name:
|
|
83
|
+
self.console.print(
|
|
84
|
+
"❌ Could not suggest branch name for issue", style="bold red"
|
|
85
|
+
)
|
|
86
|
+
return
|
|
87
|
+
|
|
88
|
+
# Create the branch (use a compatibility wrapper)
|
|
89
|
+
success = self._safe_create_branch(core.git, issue, checkout=checkout)
|
|
90
|
+
|
|
91
|
+
if success:
|
|
92
|
+
self._display_branch_success(branch_name, issue, checkout)
|
|
93
|
+
self._update_issue_status_if_needed(core, issue, issue_id)
|
|
94
|
+
else:
|
|
95
|
+
# Try a direct git fallback using subprocess
|
|
96
|
+
import subprocess
|
|
97
|
+
|
|
98
|
+
try:
|
|
99
|
+
subprocess.run(
|
|
100
|
+
["git", "checkout", "-b", branch_name],
|
|
101
|
+
cwd=core.git.repo_path,
|
|
102
|
+
check=True,
|
|
103
|
+
capture_output=True,
|
|
104
|
+
)
|
|
105
|
+
self._display_branch_success(branch_name, issue, checkout)
|
|
106
|
+
self._update_issue_status_if_needed(core, issue, issue_id)
|
|
107
|
+
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
108
|
+
self.console.print("❌ Failed to create branch", style="bold red")
|
|
109
|
+
|
|
110
|
+
except Exception as e:
|
|
111
|
+
handle_cli_error(
|
|
112
|
+
error=e,
|
|
113
|
+
operation="create_git_branch",
|
|
114
|
+
entity_type="issue",
|
|
115
|
+
entity_id=issue_id,
|
|
116
|
+
context={"checkout": checkout},
|
|
117
|
+
fatal=True,
|
|
118
|
+
)
|
|
119
|
+
self.console.print(f"❌ Failed to create Git branch: {e}", style="bold red")
|
|
120
|
+
|
|
121
|
+
def link_issue_to_branch(self, core: RoadmapCore, issue_id: str):
|
|
122
|
+
"""Link an issue to the current Git branch.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
core: RoadmapCore instance
|
|
126
|
+
issue_id: ID of the issue to link
|
|
127
|
+
|
|
128
|
+
Raises:
|
|
129
|
+
Exception: If linking fails
|
|
130
|
+
"""
|
|
131
|
+
if not core.git.is_git_repository():
|
|
132
|
+
self.console.print("❌ Not in a Git repository", style="bold red")
|
|
133
|
+
return
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
issue = core.issues.get(issue_id)
|
|
137
|
+
if not issue:
|
|
138
|
+
self.console.print(f"❌ Issue not found: {issue_id}", style="bold red")
|
|
139
|
+
return
|
|
140
|
+
|
|
141
|
+
current_branch = core.git.get_current_branch()
|
|
142
|
+
if not current_branch:
|
|
143
|
+
self.console.print(
|
|
144
|
+
"❌ Could not determine current branch", style="bold red"
|
|
145
|
+
)
|
|
146
|
+
return
|
|
147
|
+
|
|
148
|
+
# Link the issue to the current branch
|
|
149
|
+
success = core.git.link_issue_to_branch(issue_id)
|
|
150
|
+
|
|
151
|
+
if success:
|
|
152
|
+
self.console.print(
|
|
153
|
+
f"🔗 Linked issue to branch: {current_branch}",
|
|
154
|
+
style="bold green",
|
|
155
|
+
)
|
|
156
|
+
self.console.print(f"📋 Issue: {issue.title}", style="cyan")
|
|
157
|
+
self.console.print(f"🆔 ID: {issue_id}", style="dim")
|
|
158
|
+
else:
|
|
159
|
+
self.console.print(
|
|
160
|
+
"❌ Failed to link issue to branch", style="bold red"
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
except Exception as e:
|
|
164
|
+
handle_cli_error(
|
|
165
|
+
error=e,
|
|
166
|
+
operation="link_issue_to_branch",
|
|
167
|
+
entity_type="issue",
|
|
168
|
+
entity_id=issue_id,
|
|
169
|
+
context={},
|
|
170
|
+
fatal=True,
|
|
171
|
+
)
|
|
172
|
+
self.console.print(
|
|
173
|
+
f"❌ Failed to link issue to Git branch: {e}", style="bold red"
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
def _safe_create_branch(self, git, issue, checkout=True) -> bool:
|
|
177
|
+
"""Safely create branch with fallback attempts.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
git: Git executor
|
|
181
|
+
issue: Issue object
|
|
182
|
+
checkout: Whether to checkout the new branch
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
True if branch was created
|
|
186
|
+
"""
|
|
187
|
+
try:
|
|
188
|
+
return git.create_branch_for_issue(issue, checkout=checkout)
|
|
189
|
+
except TypeError as e:
|
|
190
|
+
handle_cli_error(
|
|
191
|
+
error=e,
|
|
192
|
+
operation="create_branch_for_issue",
|
|
193
|
+
entity_type="issue",
|
|
194
|
+
entity_id=issue.id,
|
|
195
|
+
context={"checkout": checkout, "error_type": "TypeError"},
|
|
196
|
+
fatal=False,
|
|
197
|
+
)
|
|
198
|
+
try:
|
|
199
|
+
return git.create_branch_for_issue(issue)
|
|
200
|
+
except Exception as e:
|
|
201
|
+
handle_cli_error(
|
|
202
|
+
error=e,
|
|
203
|
+
operation="create_branch_for_issue_fallback",
|
|
204
|
+
entity_type="issue",
|
|
205
|
+
entity_id=issue.id,
|
|
206
|
+
context={},
|
|
207
|
+
fatal=False,
|
|
208
|
+
)
|
|
209
|
+
return False
|
|
210
|
+
|
|
211
|
+
def _display_branch_success(self, branch_name: str, issue, checkout: bool) -> None:
|
|
212
|
+
"""Display success messages for branch creation.
|
|
213
|
+
|
|
214
|
+
Args:
|
|
215
|
+
branch_name: Name of created branch
|
|
216
|
+
issue: Issue object
|
|
217
|
+
checkout: Whether branch was checked out
|
|
218
|
+
"""
|
|
219
|
+
self.console.print(f"🌿 Created branch: {branch_name}", style="bold green")
|
|
220
|
+
if checkout:
|
|
221
|
+
self.console.print(f"✅ Checked out branch: {branch_name}", style="green")
|
|
222
|
+
self.console.print(f"🔗 Linked to issue: {issue.title}", style="cyan")
|
|
223
|
+
|
|
224
|
+
def _update_issue_status_if_needed(
|
|
225
|
+
self, core: RoadmapCore, issue: Issue, issue_id: str
|
|
226
|
+
) -> None:
|
|
227
|
+
"""Update issue status to in-progress if it's todo.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
core: RoadmapCore instance
|
|
231
|
+
issue: Issue object
|
|
232
|
+
issue_id: Issue ID
|
|
233
|
+
"""
|
|
234
|
+
if issue.status == Status.TODO:
|
|
235
|
+
core.issues.update(issue_id, status=Status.IN_PROGRESS)
|
|
236
|
+
self.console.print(
|
|
237
|
+
"📊 Updated issue status to: in-progress", style="yellow"
|
|
238
|
+
)
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""Handler for Git connectivity and authentication testing."""
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from rich.console import Console
|
|
5
|
+
|
|
6
|
+
from roadmap.infrastructure.coordination.core import RoadmapCore
|
|
7
|
+
|
|
8
|
+
logger = structlog.get_logger()
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class GitConnectivityHandler:
|
|
12
|
+
"""Handles testing and verifying Git repository connectivity."""
|
|
13
|
+
|
|
14
|
+
def __init__(self, console: Console):
|
|
15
|
+
"""Initialize handler with console for output.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
console: Rich Console instance
|
|
19
|
+
"""
|
|
20
|
+
self.console = console
|
|
21
|
+
|
|
22
|
+
def test_git_connectivity(self, core: RoadmapCore):
|
|
23
|
+
"""Test and verify Git repository connectivity for self-hosting.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
core: RoadmapCore instance
|
|
27
|
+
|
|
28
|
+
Raises:
|
|
29
|
+
Exception: If git connectivity test fails
|
|
30
|
+
"""
|
|
31
|
+
from roadmap.adapters.cli.services.sync_service import (
|
|
32
|
+
get_sync_backend,
|
|
33
|
+
test_backend_connectivity,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
self.console.print("🔌 Git Repository Connectivity Test", style="bold cyan")
|
|
37
|
+
self.console.print()
|
|
38
|
+
|
|
39
|
+
# Try to create vanilla git backend to test connectivity
|
|
40
|
+
self.console.print("🧪 Testing Git repository connectivity...", style="cyan")
|
|
41
|
+
logger.debug("git_connectivity_testing")
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
# Use sync service to create vanilla git backend
|
|
45
|
+
backend = get_sync_backend("git", core, {})
|
|
46
|
+
|
|
47
|
+
if backend is None:
|
|
48
|
+
self.console.print(
|
|
49
|
+
"❌ Could not initialize Git backend (not in a git repository?)",
|
|
50
|
+
style="bold red",
|
|
51
|
+
)
|
|
52
|
+
logger.warning(
|
|
53
|
+
"git_backend_initialization_failed", severity="config_error"
|
|
54
|
+
)
|
|
55
|
+
return
|
|
56
|
+
|
|
57
|
+
# Test authentication (connectivity check)
|
|
58
|
+
success, message = test_backend_connectivity(backend, "git")
|
|
59
|
+
if success:
|
|
60
|
+
self.console.print(message, style="green")
|
|
61
|
+
self.console.print(
|
|
62
|
+
"Your git repository is accessible and ready for syncing",
|
|
63
|
+
style="dim",
|
|
64
|
+
)
|
|
65
|
+
logger.info("git_connectivity_verified")
|
|
66
|
+
else:
|
|
67
|
+
self.console.print(
|
|
68
|
+
"⚠️ Could not verify git remote access",
|
|
69
|
+
style="yellow",
|
|
70
|
+
)
|
|
71
|
+
self.console.print()
|
|
72
|
+
self.console.print(
|
|
73
|
+
"This might be due to:",
|
|
74
|
+
style="dim",
|
|
75
|
+
)
|
|
76
|
+
self.console.print(" • SSH key not configured", style="dim")
|
|
77
|
+
self.console.print(" • HTTPS credentials needed", style="dim")
|
|
78
|
+
self.console.print(" • Network connectivity issues", style="dim")
|
|
79
|
+
self.console.print(
|
|
80
|
+
" • Remote repository doesn't exist yet",
|
|
81
|
+
style="dim",
|
|
82
|
+
)
|
|
83
|
+
self.console.print()
|
|
84
|
+
self.console.print(
|
|
85
|
+
"For SSH: Make sure your SSH key is in ~/.ssh/",
|
|
86
|
+
style="dim",
|
|
87
|
+
)
|
|
88
|
+
self.console.print(
|
|
89
|
+
"For HTTPS: Configure git credentials with: git config credential.helper",
|
|
90
|
+
style="dim",
|
|
91
|
+
)
|
|
92
|
+
logger.warning(
|
|
93
|
+
"git_connectivity_verification_failed", severity="infrastructure"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
except ValueError as e:
|
|
97
|
+
self.console.print(
|
|
98
|
+
f"❌ Git repository error: {e}",
|
|
99
|
+
style="bold red",
|
|
100
|
+
)
|
|
101
|
+
logger.error(
|
|
102
|
+
"git_repository_error",
|
|
103
|
+
error=str(e),
|
|
104
|
+
error_type=type(e).__name__,
|
|
105
|
+
severity="config_error",
|
|
106
|
+
)
|
|
107
|
+
self.console.print()
|
|
108
|
+
self.console.print(
|
|
109
|
+
"Make sure you're in a git repository directory",
|
|
110
|
+
style="dim",
|
|
111
|
+
)
|
|
112
|
+
except Exception as e:
|
|
113
|
+
self.console.print(
|
|
114
|
+
f"❌ Connectivity test failed: {e}",
|
|
115
|
+
style="bold red",
|
|
116
|
+
)
|
|
117
|
+
logger.error(
|
|
118
|
+
"git_connectivity_error",
|
|
119
|
+
error=str(e),
|
|
120
|
+
severity="infrastructure",
|
|
121
|
+
error_type=type(e).__name__,
|
|
122
|
+
)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""Handler for Git hooks management."""
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from rich.console import Console
|
|
5
|
+
|
|
6
|
+
from roadmap.adapters.git.git_hooks_manager import GitHookManager
|
|
7
|
+
from roadmap.infrastructure.coordination.core import RoadmapCore
|
|
8
|
+
|
|
9
|
+
logger = structlog.get_logger()
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class GitHooksHandler:
|
|
13
|
+
"""Handles Git hooks installation, removal, and status checking."""
|
|
14
|
+
|
|
15
|
+
def __init__(self, console: Console):
|
|
16
|
+
"""Initialize handler with console for output.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
console: Rich Console instance
|
|
20
|
+
"""
|
|
21
|
+
self.console = console
|
|
22
|
+
|
|
23
|
+
def install_hooks(self, core: RoadmapCore):
|
|
24
|
+
"""Install Git hooks for roadmap integration.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
core: RoadmapCore instance
|
|
28
|
+
|
|
29
|
+
Raises:
|
|
30
|
+
Exception: If hook installation fails
|
|
31
|
+
"""
|
|
32
|
+
try:
|
|
33
|
+
manager = GitHookManager(core)
|
|
34
|
+
if manager.install_hooks():
|
|
35
|
+
self.console.print(
|
|
36
|
+
"✅ Git hooks installed successfully", style="bold green"
|
|
37
|
+
)
|
|
38
|
+
self.console.print(
|
|
39
|
+
"Hooks will now automatically track commits and branch changes",
|
|
40
|
+
style="green",
|
|
41
|
+
)
|
|
42
|
+
else:
|
|
43
|
+
self.console.print(
|
|
44
|
+
"❌ Failed to install hooks. Not a git repository?",
|
|
45
|
+
style="bold red",
|
|
46
|
+
)
|
|
47
|
+
except Exception as e:
|
|
48
|
+
self.console.print(f"❌ Error installing hooks: {e}", style="bold red")
|
|
49
|
+
raise
|
|
50
|
+
|
|
51
|
+
def uninstall_hooks(self, core: RoadmapCore):
|
|
52
|
+
"""Remove Git hooks for roadmap integration.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
core: RoadmapCore instance
|
|
56
|
+
|
|
57
|
+
Raises:
|
|
58
|
+
Exception: If hook removal fails
|
|
59
|
+
"""
|
|
60
|
+
try:
|
|
61
|
+
manager = GitHookManager(core)
|
|
62
|
+
if manager.uninstall_hooks():
|
|
63
|
+
self.console.print(
|
|
64
|
+
"✅ Git hooks removed successfully", style="bold green"
|
|
65
|
+
)
|
|
66
|
+
else:
|
|
67
|
+
self.console.print("❌ Failed to remove hooks", style="bold red")
|
|
68
|
+
except Exception as e:
|
|
69
|
+
self.console.print(f"❌ Error removing hooks: {e}", style="bold red")
|
|
70
|
+
raise
|
|
71
|
+
|
|
72
|
+
def show_hooks_status(self, core: RoadmapCore):
|
|
73
|
+
"""Show status of installed Git hooks.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
core: RoadmapCore instance
|
|
77
|
+
|
|
78
|
+
Raises:
|
|
79
|
+
Exception: If status check fails
|
|
80
|
+
"""
|
|
81
|
+
try:
|
|
82
|
+
manager = GitHookManager(core)
|
|
83
|
+
status = manager.get_hooks_status()
|
|
84
|
+
|
|
85
|
+
if not status:
|
|
86
|
+
self.console.print("No hooks installed", style="yellow")
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
self.console.print("Git Hooks Status:", style="bold")
|
|
90
|
+
self.console.print()
|
|
91
|
+
|
|
92
|
+
for hook_name, hook_info in status.items():
|
|
93
|
+
installed = "✅" if hook_info.get("is_roadmap_hook") else "❌"
|
|
94
|
+
executable = "✓" if hook_info.get("executable") else "✗"
|
|
95
|
+
self.console.print(
|
|
96
|
+
f"{installed} {hook_name:20} [executable: {executable}]"
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
self.console.print()
|
|
100
|
+
self.console.print(
|
|
101
|
+
"Run 'roadmap git hooks-install' to install all hooks", style="dim"
|
|
102
|
+
)
|
|
103
|
+
except Exception as e:
|
|
104
|
+
self.console.print(f"❌ Error checking hooks: {e}", style="bold red")
|
|
105
|
+
raise
|