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,73 @@
|
|
|
1
|
+
"""Health status formatting and presentation utilities.
|
|
2
|
+
|
|
3
|
+
Provides health-specific formatting built on top of generic status utilities.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from collections.abc import Mapping
|
|
7
|
+
|
|
8
|
+
from roadmap.core.domain.health import HealthStatus
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class HealthStatusFormatter:
|
|
12
|
+
"""Formats and presents health check results."""
|
|
13
|
+
|
|
14
|
+
@staticmethod
|
|
15
|
+
def summarize_health_checks(
|
|
16
|
+
checks: Mapping[str, tuple[HealthStatus, str]],
|
|
17
|
+
) -> dict[str, int]:
|
|
18
|
+
"""Summarize health check results into status counts.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
checks: Dict mapping check names to (status, message) tuples
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
Dict with counts: {
|
|
25
|
+
"total": count,
|
|
26
|
+
"healthy": count,
|
|
27
|
+
"degraded": count,
|
|
28
|
+
"unhealthy": count,
|
|
29
|
+
}
|
|
30
|
+
"""
|
|
31
|
+
statuses = [status for _, (status, _) in checks.items()]
|
|
32
|
+
|
|
33
|
+
total = len(statuses)
|
|
34
|
+
healthy = sum(1 for s in statuses if s == HealthStatus.HEALTHY)
|
|
35
|
+
degraded = sum(1 for s in statuses if s == HealthStatus.DEGRADED)
|
|
36
|
+
unhealthy = sum(1 for s in statuses if s == HealthStatus.UNHEALTHY)
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
"total": total,
|
|
40
|
+
"healthy": healthy,
|
|
41
|
+
"degraded": degraded,
|
|
42
|
+
"unhealthy": unhealthy,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@staticmethod
|
|
46
|
+
def get_status_color(status: HealthStatus) -> str:
|
|
47
|
+
"""Get terminal color for health status.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
status: HealthStatus to format
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
ANSI color code string
|
|
54
|
+
"""
|
|
55
|
+
if status == HealthStatus.HEALTHY:
|
|
56
|
+
return "\033[92m" # Green
|
|
57
|
+
elif status == HealthStatus.DEGRADED:
|
|
58
|
+
return "\033[93m" # Yellow
|
|
59
|
+
elif status == HealthStatus.UNHEALTHY:
|
|
60
|
+
return "\033[91m" # Red
|
|
61
|
+
return "\033[0m" # Reset
|
|
62
|
+
|
|
63
|
+
@staticmethod
|
|
64
|
+
def format_status_display(status: HealthStatus) -> str:
|
|
65
|
+
"""Get human-readable display for health status.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
status: HealthStatus to format
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
Formatted status string
|
|
72
|
+
"""
|
|
73
|
+
return status.value.upper()
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"""Specialized health checkers split from HealthCheck class.
|
|
2
|
+
|
|
3
|
+
Organizes health checks by domain concern:
|
|
4
|
+
- DirectoryHealthChecker: File system structure checks
|
|
5
|
+
- DataHealthChecker: Database and data integrity checks
|
|
6
|
+
- EntityHealthChecker: Business entity validation checks
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from roadmap.core.domain.health import HealthStatus
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DirectoryHealthChecker:
|
|
13
|
+
"""Checks health of directory structure and files."""
|
|
14
|
+
|
|
15
|
+
@staticmethod
|
|
16
|
+
def check_roadmap_directory() -> tuple[HealthStatus, str]:
|
|
17
|
+
"""Check if .roadmap directory exists and is accessible."""
|
|
18
|
+
from roadmap.core.services.health.infrastructure_validator_service import (
|
|
19
|
+
RoadmapDirectoryValidator,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
status_str, message = RoadmapDirectoryValidator.check()
|
|
23
|
+
return HealthStatus(status_str), message
|
|
24
|
+
|
|
25
|
+
@staticmethod
|
|
26
|
+
def check_state_file() -> tuple[HealthStatus, str]:
|
|
27
|
+
"""Check if state database exists and is readable."""
|
|
28
|
+
from roadmap.core.services.health.infrastructure_validator_service import (
|
|
29
|
+
StateFileValidator,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
status_str, message = StateFileValidator.check()
|
|
33
|
+
return HealthStatus(status_str), message
|
|
34
|
+
|
|
35
|
+
@staticmethod
|
|
36
|
+
def check_issues_directory() -> tuple[HealthStatus, str]:
|
|
37
|
+
"""Check if issues directory exists and is accessible."""
|
|
38
|
+
from roadmap.core.services.health.infrastructure_validator_service import (
|
|
39
|
+
IssuesDirectoryValidator,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
status_str, message = IssuesDirectoryValidator.check()
|
|
43
|
+
return HealthStatus(status_str), message
|
|
44
|
+
|
|
45
|
+
@staticmethod
|
|
46
|
+
def check_milestones_directory() -> tuple[HealthStatus, str]:
|
|
47
|
+
"""Check if milestones directory exists and is accessible."""
|
|
48
|
+
from roadmap.core.services.health.infrastructure_validator_service import (
|
|
49
|
+
MilestonesDirectoryValidator,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
status_str, message = MilestonesDirectoryValidator.check()
|
|
53
|
+
return HealthStatus(status_str), message
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def check_folder_structure(core) -> tuple[HealthStatus, str]:
|
|
57
|
+
"""Check if issues are in correct milestone folders."""
|
|
58
|
+
from roadmap.core.services.health.data_integrity_validator_service import (
|
|
59
|
+
FolderStructureValidator,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
status_str, message = FolderStructureValidator.check()
|
|
63
|
+
return HealthStatus(status_str), message
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def check_old_backups() -> tuple[HealthStatus, str]:
|
|
67
|
+
"""Check for old backup files that could be cleaned up."""
|
|
68
|
+
from roadmap.core.services.health.data_integrity_validator_service import (
|
|
69
|
+
BackupValidator,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
status_str, message = BackupValidator.check_old_backups()
|
|
73
|
+
return HealthStatus(status_str), message
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class DataHealthChecker:
|
|
77
|
+
"""Checks health of data integrity and database."""
|
|
78
|
+
|
|
79
|
+
@staticmethod
|
|
80
|
+
def check_git_repository() -> tuple[HealthStatus, str]:
|
|
81
|
+
"""Check if Git repository exists and is accessible."""
|
|
82
|
+
from roadmap.core.services.health.infrastructure_validator_service import (
|
|
83
|
+
GitRepositoryValidator,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
status_str, message = GitRepositoryValidator.check()
|
|
87
|
+
return HealthStatus(status_str), message
|
|
88
|
+
|
|
89
|
+
@staticmethod
|
|
90
|
+
def check_database_integrity() -> tuple[HealthStatus, str]:
|
|
91
|
+
"""Check SQLite database integrity."""
|
|
92
|
+
from roadmap.core.services.health.infrastructure_validator_service import (
|
|
93
|
+
DatabaseIntegrityValidator,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
status_str, message = DatabaseIntegrityValidator.check()
|
|
97
|
+
return HealthStatus(status_str), message
|
|
98
|
+
|
|
99
|
+
@staticmethod
|
|
100
|
+
def check_data_integrity() -> tuple[HealthStatus, str]:
|
|
101
|
+
"""Run comprehensive data integrity checks."""
|
|
102
|
+
from roadmap.core.services.health.data_integrity_validator_service import (
|
|
103
|
+
DataIntegrityValidator,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
status_str, message = DataIntegrityValidator.check_data_integrity()
|
|
107
|
+
return HealthStatus(status_str), message
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class EntityHealthChecker:
|
|
111
|
+
"""Checks health of business entities (issues, milestones)."""
|
|
112
|
+
|
|
113
|
+
@staticmethod
|
|
114
|
+
def check_duplicate_issues(core) -> tuple[HealthStatus, str]:
|
|
115
|
+
"""Check for duplicate issues."""
|
|
116
|
+
from roadmap.core.services.health.data_integrity_validator_service import (
|
|
117
|
+
DuplicateIssuesValidator,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
status_str, message = DuplicateIssuesValidator.check()
|
|
121
|
+
return HealthStatus(status_str), message
|
|
122
|
+
|
|
123
|
+
@staticmethod
|
|
124
|
+
def check_archivable_issues(core) -> tuple[HealthStatus, str]:
|
|
125
|
+
"""Check for closed issues that could be archived."""
|
|
126
|
+
from roadmap.core.services.health.data_integrity_validator_service import (
|
|
127
|
+
ArchivableIssuesValidator,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
status_str, message = ArchivableIssuesValidator.check_archivable_issues(core)
|
|
131
|
+
return HealthStatus(status_str), message
|
|
132
|
+
|
|
133
|
+
@staticmethod
|
|
134
|
+
def check_archivable_milestones(core) -> tuple[HealthStatus, str]:
|
|
135
|
+
"""Check for closed milestones that could be archived."""
|
|
136
|
+
from roadmap.core.services.health.data_integrity_validator_service import (
|
|
137
|
+
ArchivableMilestonesValidator,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
status_str, message = ArchivableMilestonesValidator.check_archivable_milestones(
|
|
141
|
+
core
|
|
142
|
+
)
|
|
143
|
+
return HealthStatus(status_str), message
|
|
144
|
+
|
|
145
|
+
@staticmethod
|
|
146
|
+
def check_orphaned_issues(core) -> tuple[HealthStatus, str]:
|
|
147
|
+
"""Check for issues not assigned to any milestone."""
|
|
148
|
+
from roadmap.core.services.health.data_integrity_validator_service import (
|
|
149
|
+
OrphanedIssuesValidator,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
status_str, message = OrphanedIssuesValidator.check_orphaned_issues(core)
|
|
153
|
+
return HealthStatus(status_str), message
|
|
154
|
+
|
|
155
|
+
@staticmethod
|
|
156
|
+
def check_orphaned_milestones(core) -> tuple[HealthStatus, str]:
|
|
157
|
+
"""Check for empty milestones with no issues."""
|
|
158
|
+
from roadmap.core.services.health.data_integrity_validator_service import (
|
|
159
|
+
OrphanedMilestonesValidator,
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
status_str, message = OrphanedMilestonesValidator.check()
|
|
163
|
+
return HealthStatus(status_str), message
|
|
164
|
+
|
|
165
|
+
@staticmethod
|
|
166
|
+
def check_duplicate_milestones(core) -> tuple[HealthStatus, str]:
|
|
167
|
+
"""Check for duplicate milestone names."""
|
|
168
|
+
from roadmap.core.services.health.data_integrity_validator_service import (
|
|
169
|
+
DuplicateMilestonesValidator,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
status_str, message = DuplicateMilestonesValidator.check()
|
|
173
|
+
return HealthStatus(status_str), message
|
|
174
|
+
|
|
175
|
+
@staticmethod
|
|
176
|
+
def check_unlinked_issues(core) -> tuple[HealthStatus, str]:
|
|
177
|
+
"""Check for remote issues not linked to local issues."""
|
|
178
|
+
# Note: UnlinkedIssuesValidator may not exist - skip if not available
|
|
179
|
+
try:
|
|
180
|
+
from roadmap.core.services.health.data_integrity_validator_service import (
|
|
181
|
+
UnlinkedIssuesValidator, # type: ignore[attr-defined]
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
status_str, message = UnlinkedIssuesValidator.check_unlinked_issues(core)
|
|
185
|
+
except (ImportError, AttributeError):
|
|
186
|
+
# If validator not available, skip this check
|
|
187
|
+
return HealthStatus.HEALTHY, "Unlinked issues check skipped"
|
|
188
|
+
return HealthStatus(status_str), message
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""Persistence Gateway - Mediates Core services' access to persistence adapters.
|
|
2
|
+
|
|
3
|
+
This gateway abstracts away direct imports from roadmap.adapters.persistence,
|
|
4
|
+
allowing Core services to request persistence operations without violating
|
|
5
|
+
layer boundaries.
|
|
6
|
+
|
|
7
|
+
The gateway provides:
|
|
8
|
+
- YAML file parsing (issues, milestones, projects)
|
|
9
|
+
- File persistence (save operations)
|
|
10
|
+
- Storage access (StateManager for database-level operations)
|
|
11
|
+
|
|
12
|
+
All imports from roadmap.adapters.persistence are localized to this module.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
from roadmap.core.domain.issue import Issue
|
|
19
|
+
from roadmap.core.domain.milestone import Milestone
|
|
20
|
+
from roadmap.core.domain.project import Project
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class PersistenceGateway:
|
|
24
|
+
"""Mediates Core layer access to persistence adapters."""
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def parse_issue_file(file_path: Path) -> Issue:
|
|
28
|
+
"""Parse an issue YAML file and return Issue domain object.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
file_path: Path to the issue YAML file.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
Parsed Issue domain object.
|
|
35
|
+
"""
|
|
36
|
+
from roadmap.adapters.persistence.parser.issue import IssueParser
|
|
37
|
+
|
|
38
|
+
return IssueParser.parse_issue_file(file_path)
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def save_issue_file(issue: Issue, file_path: Path) -> None:
|
|
42
|
+
"""Save an Issue domain object to YAML file.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
issue: Issue domain object to save.
|
|
46
|
+
file_path: Path to save the issue YAML file.
|
|
47
|
+
"""
|
|
48
|
+
from roadmap.adapters.persistence.parser.issue import IssueParser
|
|
49
|
+
|
|
50
|
+
IssueParser.save_issue_file(issue, file_path)
|
|
51
|
+
|
|
52
|
+
@staticmethod
|
|
53
|
+
def load_sync_metadata(file_path: Path) -> dict | None:
|
|
54
|
+
"""Load sync metadata from issue file.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
file_path: Path to the issue YAML file.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Dictionary of sync metadata or None if not present.
|
|
61
|
+
"""
|
|
62
|
+
from roadmap.adapters.persistence.parser.issue import IssueParser
|
|
63
|
+
|
|
64
|
+
return IssueParser.load_sync_metadata(file_path)
|
|
65
|
+
|
|
66
|
+
@staticmethod
|
|
67
|
+
def update_issue_sync_metadata(file_path: Path, sync_metadata: dict) -> None:
|
|
68
|
+
"""Update sync metadata in issue file.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
file_path: Path to the issue YAML file.
|
|
72
|
+
sync_metadata: Dictionary of sync metadata to update.
|
|
73
|
+
"""
|
|
74
|
+
from roadmap.adapters.persistence.parser.issue import IssueParser
|
|
75
|
+
|
|
76
|
+
IssueParser.update_issue_sync_metadata(file_path, sync_metadata)
|
|
77
|
+
|
|
78
|
+
@staticmethod
|
|
79
|
+
def parse_milestone_file(file_path: Path) -> Milestone:
|
|
80
|
+
"""Parse a milestone YAML file and return Milestone domain object.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
file_path: Path to the milestone YAML file.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
Parsed Milestone domain object.
|
|
87
|
+
"""
|
|
88
|
+
from roadmap.adapters.persistence.parser import MilestoneParser
|
|
89
|
+
|
|
90
|
+
return MilestoneParser.parse_milestone_file(file_path)
|
|
91
|
+
|
|
92
|
+
@staticmethod
|
|
93
|
+
def save_milestone_file(milestone: Milestone, file_path: Path) -> None:
|
|
94
|
+
"""Save a Milestone domain object to YAML file.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
milestone: Milestone domain object to save.
|
|
98
|
+
file_path: Path to save the milestone YAML file.
|
|
99
|
+
"""
|
|
100
|
+
from roadmap.adapters.persistence.parser import MilestoneParser
|
|
101
|
+
|
|
102
|
+
return MilestoneParser.save_milestone_file(milestone, file_path)
|
|
103
|
+
|
|
104
|
+
@staticmethod
|
|
105
|
+
def parse_project_file(file_path: Path) -> Project:
|
|
106
|
+
"""Parse a project YAML file and return Project domain object.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
file_path: Path to the project YAML file.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Parsed Project domain object.
|
|
113
|
+
"""
|
|
114
|
+
from roadmap.adapters.persistence.parser import ProjectParser
|
|
115
|
+
|
|
116
|
+
return ProjectParser.parse_project_file(file_path)
|
|
117
|
+
|
|
118
|
+
@staticmethod
|
|
119
|
+
def parse_frontmatter(content: str) -> tuple[dict[str, Any], str]:
|
|
120
|
+
"""Parse YAML frontmatter from content.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
content: Raw content with frontmatter.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
Tuple of (frontmatter dict, remaining content).
|
|
127
|
+
"""
|
|
128
|
+
from roadmap.adapters.persistence.parser.frontmatter import (
|
|
129
|
+
FrontmatterParser,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
return FrontmatterParser.parse_content(content)
|
|
133
|
+
|
|
134
|
+
@staticmethod
|
|
135
|
+
def get_state_manager() -> Any:
|
|
136
|
+
"""Get the StateManager for database-level operations.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
StateManager instance from persistence adapter.
|
|
140
|
+
"""
|
|
141
|
+
from roadmap.adapters.persistence.storage import StateManager
|
|
142
|
+
from roadmap.common.utils.path_utils import build_roadmap_paths
|
|
143
|
+
|
|
144
|
+
db_dir = build_roadmap_paths(Path.cwd())["db_dir"]
|
|
145
|
+
db_path = db_dir / "state.db"
|
|
146
|
+
|
|
147
|
+
return StateManager(db_path=db_path)
|
|
148
|
+
|
|
149
|
+
@staticmethod
|
|
150
|
+
def get_changed_files_since_commit(ref: str = "HEAD~1", cwd: str = ".") -> set[str]:
|
|
151
|
+
"""Get files changed since a git reference.
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
ref: Git reference (commit, branch, tag).
|
|
155
|
+
cwd: Working directory for git commands.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
Set of file paths that changed.
|
|
159
|
+
"""
|
|
160
|
+
from roadmap.adapters.persistence.git_history import (
|
|
161
|
+
get_changed_files_since_commit,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
return get_changed_files_since_commit(ref, cwd)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Security utilities and credential management."""
|