diff --git a/codeflow_engine/__init__.py b/codeflow_engine/__init__.py index 6aa05ad..8d9fb51 100644 --- a/codeflow_engine/__init__.py +++ b/codeflow_engine/__init__.py @@ -2,6 +2,13 @@ CodeFlow Engine - Automated Code Review and Quality Management System This package provides AI-powered code analysis, automated fixes, and quality assurance workflows. + +Main Components: +- CodeFlowEngine: Main orchestrator for all automation activities +- ActionRegistry: Registry for managing action plugins +- WorkflowEngine: Workflow execution engine +- LLMProviderManager: Multi-provider LLM abstraction +- MetricsCollector: Quality metrics collection """ import logging @@ -9,30 +16,37 @@ from typing import Any, cast from codeflow_engine.actions.registry import ActionRegistry -# from codeflow_engine.agents.agents import AgentManager # Not implemented yet from codeflow_engine.ai.core.base import LLMProvider from codeflow_engine.ai.core.providers.manager import LLMProviderManager from codeflow_engine.config import CodeFlowConfig from codeflow_engine.engine import CodeFlowEngine -from codeflow_engine.exceptions import (CodeFlowException, ConfigurationError, - IntegrationError) +from codeflow_engine.exceptions import ( + ActionError, + AuthenticationError, + CodeFlowException, + CodeFlowPermissionError, + ConfigurationError, + IntegrationError, + LLMProviderError, + RateLimitError, + ValidationError, + WorkflowError, +) from codeflow_engine.integrations.base import Integration -# from codeflow_engine.integrations.bitbucket.bitbucket_integration import \ -# BitbucketIntegration # Not implemented yet -# from codeflow_engine.integrations.github.github_integration import GitHubIntegration # Not implemented yet -# from codeflow_engine.integrations.gitlab.gitlab_integration import GitLabIntegration # Not implemented yet -# from codeflow_engine.integrations.jira.jira_integration import JiraIntegration # Not implemented yet -# from codeflow_engine.integrations.registry import IntegrationRegistry # Not implemented yet -# from codeflow_engine.integrations.slack.slack_integration import SlackIntegration # Not implemented yet from codeflow_engine.quality.metrics_collector import MetricsCollector -# from codeflow_engine.reporting.report_generator import ReportGenerator # Not implemented yet -from codeflow_engine.security.authorization.enterprise_manager import \ - EnterpriseAuthorizationManager + +# Security - guarded import +EnterpriseAuthorizationManager: type[Any] | None = None +try: + from codeflow_engine.security.authorization.enterprise_manager import ( + EnterpriseAuthorizationManager, + ) +except (ImportError, OSError): + pass + from codeflow_engine.workflows.base import Workflow from codeflow_engine.workflows.engine import WorkflowEngine -# from codeflow_engine.workflows.workflow_manager import WorkflowManager # Not implemented yet - # Import structlog with error handling STRUCTLOG_AVAILABLE: bool try: @@ -48,20 +62,47 @@ # Public API exports __all__ = [ - "ActionRegistry", + # Core engine "CodeFlowEngine", - "MetricsCollector", - "EnterpriseAuthorizationManager", + "CodeFlowConfig", + # Registries + "ActionRegistry", + # AI/LLM "LLMProvider", "LLMProviderManager", + # Integrations + "Integration", + # Workflows + "Workflow", + "WorkflowEngine", + # Quality + "MetricsCollector", + # Security + "EnterpriseAuthorizationManager", + # Exceptions + "ActionError", + "AuthenticationError", + "CodeFlowException", + "CodeFlowPermissionError", + "ConfigurationError", + "IntegrationError", + "LLMProviderError", + "RateLimitError", + "ValidationError", + "WorkflowError", + # Utilities + "configure_logging", ] -# Setup logging defaults - def configure_logging(level: str = "INFO", *, format_json: bool = False) -> None: - """Configure default logging for CodeFlow Engine.""" + """ + Configure default logging for CodeFlow Engine. + Args: + level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) + format_json: If True and structlog is available, use JSON logging + """ if format_json and STRUCTLOG_AVAILABLE and structlog_module: # Structured JSON logging structlog_module.configure( @@ -86,6 +127,7 @@ def configure_logging(level: str = "INFO", *, format_json: bool = False) -> None ) +# Configure logging on import log_level = os.getenv("CODEFLOW_LOG_LEVEL", "INFO") json_logging = os.getenv("CODEFLOW_JSON_LOGGING", "false").lower() == "true" configure_logging(level=log_level, format_json=json_logging) diff --git a/codeflow_engine/actions/__init__.py b/codeflow_engine/actions/__init__.py index 3d2855d..5178031 100644 --- a/codeflow_engine/actions/__init__.py +++ b/codeflow_engine/actions/__init__.py @@ -1,225 +1,234 @@ -""" +""" CodeFlow Engine Actions. -Core automation actions for GitHub PR processing +Core automation actions for GitHub PR processing, organized by category: +- analysis: Code analysis actions (PR review, comment analysis) +- generation: Code/content generation (scaffolding, release notes) +- git: Git operations (patches, branches, releases) +- issues: Issue/PR management (labels, comments) +- quality: Quality checks (security, performance, accessibility) +- ai_actions: AI/LLM-powered features (AutoGen, memory systems) +- platform: Platform detection and integration +- scripts: Script/workflow execution +- maintenance: Maintenance tasks """ -# mypy: disable-error-code=unused-ignore -# mypy: ignore-errors - from typing import Any +from codeflow_engine.actions.registry import ActionRegistry -# Import action classes with error handling for optional dependencies -PlatformDetector: type[Any] | None = None +# Import category modules with error handling for optional dependencies +ai_actions = None try: - from codeflow_engine.actions.platform_detector_enhanced import ( - PlatformDetector as _RealPlatformDetector, - ) - - PlatformDetector = _RealPlatformDetector -except ImportError: + from codeflow_engine.actions import ai_actions +except (ImportError, OSError): pass -PrototypeEnhancer: type[Any] | None = None +analysis = None try: - from codeflow_engine.actions.prototype_enhancer import ( - PrototypeEnhancer as _RealPrototypeEnhancer, - ) + from codeflow_engine.actions import analysis +except (ImportError, OSError): + pass - PrototypeEnhancer = _RealPrototypeEnhancer -except ImportError: +base = None +try: + from codeflow_engine.actions import base +except (ImportError, OSError): pass -PlatformDetector: type[Any] | None = None +generation = None try: - from codeflow_engine.actions.platform_detector import ( - PlatformDetector as _RealPlatformDetector, - ) + from codeflow_engine.actions import generation +except (ImportError, OSError): + pass - PlatformDetector = _RealPlatformDetector -except ImportError: +git = None +try: + from codeflow_engine.actions import git +except (ImportError, OSError): pass -AutoGenImplementation: type[Any] | None = None +issues = None try: - from codeflow_engine.actions.autogen_implementation import ( - AutoGenImplementation as _RealAutoGenImplementation, - ) + from codeflow_engine.actions import issues +except (ImportError, OSError): + pass - AutoGenImplementation = _RealAutoGenImplementation -except ImportError: +maintenance = None +try: + from codeflow_engine.actions import maintenance +except (ImportError, OSError): pass -IssueCreator: type[Any] | None = None +platform = None try: - from codeflow_engine.actions.issue_creator import IssueCreator as _RealIssueCreator + from codeflow_engine.actions import platform +except (ImportError, OSError): + pass - IssueCreator = _RealIssueCreator -except ImportError: +quality = None +try: + from codeflow_engine.actions import quality +except (ImportError, OSError): pass -LLMProviderManager: type[Any] | None = None +scripts = None try: - from codeflow_engine.actions.llm import LLMProviderManager as _RealLLMProviderManager + from codeflow_engine.actions import scripts +except (ImportError, OSError): + pass - LLMProviderManager = _RealLLMProviderManager +# Re-export commonly used actions for backward compatibility +# Analysis +AICommentAnalyzer: type[Any] | None = None +try: + from codeflow_engine.actions.analysis import AICommentAnalyzer except ImportError: pass -AutoGenAgentSystem: type[Any] | None = None +PRReviewAnalyzer: type[Any] | None = None try: - from codeflow_engine.actions.autogen_multi_agent import ( - AutoGenAgentSystem as _RealAutoGenAgentSystem, - ) - - AutoGenAgentSystem = _RealAutoGenAgentSystem + from codeflow_engine.actions.analysis import PRReviewAnalyzer except ImportError: pass -Mem0MemoryManager: type[Any] | None = None +# Issues +IssueCreator: type[Any] | None = None try: - from codeflow_engine.actions.mem0_memory_integration import ( - Mem0MemoryManager as _RealMem0MemoryManager, - ) - - Mem0MemoryManager = _RealMem0MemoryManager + from codeflow_engine.actions.issues import IssueCreator except ImportError: pass -QualityGates: type[Any] | None = None +PRCommentHandler: type[Any] | None = None try: - from codeflow_engine.actions.quality_gates import QualityGates as _RealQualityGates - - QualityGates = _RealQualityGates + from codeflow_engine.actions.issues import PRCommentHandler except ImportError: pass -LearningMemorySystem: type[Any] | None = None +CreateOrUpdateIssue: type[Any] | None = None try: - from codeflow_engine.actions.learning_memory_system import ( - LearningMemorySystem as _RealLearningMemorySystem, - ) - - LearningMemorySystem = _RealLearningMemorySystem + from codeflow_engine.actions.issues import CreateOrUpdateIssue except ImportError: pass -MultiPlatformIntegrator: type[Any] | None = None +PostComment: type[Any] | None = None try: - from codeflow_engine.actions.multi_platform_integrator import ( - MultiPlatformIntegrator as _RealMultiPlatformIntegrator, - ) - - MultiPlatformIntegrator = _RealMultiPlatformIntegrator + from codeflow_engine.actions.issues import PostComment except ImportError: pass -AICommentAnalyzer: type[Any] | None = None +LabelPR: type[Any] | None = None try: - from codeflow_engine.actions.ai_comment_analyzer import ( - AICommentAnalyzer as _RealAICommentAnalyzer, - ) - - AICommentAnalyzer = _RealAICommentAnalyzer + from codeflow_engine.actions.issues import LabelPR except ImportError: pass -PRCommentHandler: type[Any] | None = None +# Git +ApplyGitPatch: type[Any] | None = None try: - from codeflow_engine.actions.handle_pr_comment import ( - PRCommentHandler as _RealPRCommentHandler, - ) - - PRCommentHandler = _RealPRCommentHandler + from codeflow_engine.actions.git import ApplyGitPatch except ImportError: pass -# Utility actions -LabelPR: type[Any] | None = None +# Quality +QualityGates: type[Any] | None = None try: - from codeflow_engine.actions.label_pr import LabelPR as _RealLabelPR - - LabelPR = _RealLabelPR + from codeflow_engine.actions.quality import QualityGates except ImportError: pass -PostComment: type[Any] | None = None +RunSecurityAudit: type[Any] | None = None try: - from codeflow_engine.actions.post_comment import PostComment as _RealPostComment - - PostComment = _RealPostComment + from codeflow_engine.actions.quality import RunSecurityAudit except ImportError: pass -CreateOrUpdateIssue: type[Any] | None = None +CheckPerformanceBudget: type[Any] | None = None try: - from codeflow_engine.actions.create_or_update_issue import ( - CreateOrUpdateIssue as _RealCreateOrUpdateIssue, - ) - - CreateOrUpdateIssue = _RealCreateOrUpdateIssue + from codeflow_engine.actions.quality import CheckPerformanceBudget except ImportError: pass -ApplyGitPatch: type[Any] | None = None +VisualRegressionTest: type[Any] | None = None try: - from codeflow_engine.actions.apply_git_patch import ApplyGitPatch as _RealApplyGitPatch - - ApplyGitPatch = _RealApplyGitPatch + from codeflow_engine.actions.quality import VisualRegressionTest except ImportError: pass -RunSecurityAudit: type[Any] | None = None +# AI Actions +AutoGenImplementation: type[Any] | None = None try: - from codeflow_engine.actions.run_security_audit import ( - RunSecurityAudit as _RealRunSecurityAudit, - ) + from codeflow_engine.actions.ai_actions import AutoGenImplementation +except ImportError: + pass - RunSecurityAudit = _RealRunSecurityAudit +AutoGenAgentSystem: type[Any] | None = None +try: + from codeflow_engine.actions.ai_actions import AutoGenAgentSystem except ImportError: pass -CheckPerformanceBudget: type[Any] | None = None +Mem0MemoryManager: type[Any] | None = None try: - from codeflow_engine.actions.check_performance_budget import ( - CheckPerformanceBudget as _RealCheckPerformanceBudget, - ) + from codeflow_engine.actions.ai_actions import Mem0MemoryManager +except ImportError: + pass - CheckPerformanceBudget = _RealCheckPerformanceBudget +LearningMemorySystem: type[Any] | None = None +try: + from codeflow_engine.actions.ai_actions import LearningMemorySystem except ImportError: pass -VisualRegressionTest: type[Any] | None = None +LLMProviderManager: type[Any] | None = None try: - from codeflow_engine.actions.visual_regression_test import ( - VisualRegressionTest as _RealVisualRegressionTest, - ) + from codeflow_engine.actions.ai_actions.llm import LLMProviderManager +except ImportError: + pass - VisualRegressionTest = _RealVisualRegressionTest +# Platform +PlatformDetector: type[Any] | None = None +try: + from codeflow_engine.actions.platform import PlatformDetector except ImportError: pass -GenerateReleaseNotes: type[Any] | None = None +MultiPlatformIntegrator: type[Any] | None = None try: - from codeflow_engine.actions.generate_release_notes import ( - GenerateReleaseNotes as _RealGenerateReleaseNotes, - ) + from codeflow_engine.actions.platform import MultiPlatformIntegrator +except ImportError: + pass - GenerateReleaseNotes = _RealGenerateReleaseNotes +PrototypeEnhancer: type[Any] | None = None +try: + from codeflow_engine.actions.platform import PrototypeEnhancer except ImportError: pass -AIImplementationRoadmap: type[Any] | None = None +# Generation +GenerateReleaseNotes: type[Any] | None = None try: - from codeflow_engine.actions.ai_implementation_roadmap import AIImplementationRoadmap + from codeflow_engine.actions.generation import GenerateReleaseNotes except ImportError: - AIImplementationRoadmap = None + pass -# All available actions +# All available exports __all__ = [ + # Registry + "ActionRegistry", + # Category modules + "ai_actions", + "analysis", + "base", + "generation", + "git", + "issues", + "maintenance", + "platform", + "quality", + "scripts", + # Backward compatible action exports "AICommentAnalyzer", - "AIImplementationRoadmap", "ApplyGitPatch", "AutoGenAgentSystem", "AutoGenImplementation", @@ -228,14 +237,12 @@ "GenerateReleaseNotes", "IssueCreator", "LLMProviderManager", - # Utility actions "LabelPR", "LearningMemorySystem", "Mem0MemoryManager", "MultiPlatformIntegrator", "PRCommentHandler", - # Core AI-powered actions - "PlatformDetector", + "PRReviewAnalyzer", "PlatformDetector", "PostComment", "PrototypeEnhancer", diff --git a/codeflow_engine/actions/ai_actions/__init__.py b/codeflow_engine/actions/ai_actions/__init__.py new file mode 100644 index 0000000..db90918 --- /dev/null +++ b/codeflow_engine/actions/ai_actions/__init__.py @@ -0,0 +1,61 @@ +""" +CodeFlow Engine - AI Actions + +Actions for AI/LLM-powered features including AutoGen, memory systems, and summarization. +""" + +from typing import Any + +# Import with error handling for optional dependencies +AutoGenImplementation: type[Any] | None = None +try: + from codeflow_engine.actions.ai_actions.autogen_implementation import AutoGenImplementation +except ImportError: + pass + +AutoGenAgentSystem: type[Any] | None = None +try: + from codeflow_engine.actions.ai_actions.autogen_multi_agent import AutoGenAgentSystem +except ImportError: + pass + +Mem0MemoryManager: type[Any] | None = None +try: + from codeflow_engine.actions.ai_actions.mem0_memory_integration import Mem0MemoryManager +except ImportError: + pass + +LearningMemorySystem: type[Any] | None = None +try: + from codeflow_engine.actions.ai_actions.learning_memory_system import LearningMemorySystem +except ImportError: + pass + +ConfigurableLLMProvider: type[Any] | None = None +try: + from codeflow_engine.actions.ai_actions.configurable_llm_provider import ConfigurableLLMProvider +except ImportError: + pass + +# Submodule exports with guarded imports +autogen = None +try: + from codeflow_engine.actions.ai_actions import autogen +except (ImportError, OSError): + pass + +llm = None +try: + from codeflow_engine.actions.ai_actions import llm +except (ImportError, OSError): + pass + +__all__ = [ + "AutoGenAgentSystem", + "AutoGenImplementation", + "ConfigurableLLMProvider", + "LearningMemorySystem", + "Mem0MemoryManager", + "autogen", + "llm", +] diff --git a/codeflow_engine/actions/autogen/__init__.py b/codeflow_engine/actions/ai_actions/autogen/__init__.py similarity index 100% rename from codeflow_engine/actions/autogen/__init__.py rename to codeflow_engine/actions/ai_actions/autogen/__init__.py diff --git a/codeflow_engine/actions/autogen/agents.py b/codeflow_engine/actions/ai_actions/autogen/agents.py similarity index 100% rename from codeflow_engine/actions/autogen/agents.py rename to codeflow_engine/actions/ai_actions/autogen/agents.py diff --git a/codeflow_engine/actions/autogen/models.py b/codeflow_engine/actions/ai_actions/autogen/models.py similarity index 100% rename from codeflow_engine/actions/autogen/models.py rename to codeflow_engine/actions/ai_actions/autogen/models.py diff --git a/codeflow_engine/actions/autogen/system.py b/codeflow_engine/actions/ai_actions/autogen/system.py similarity index 100% rename from codeflow_engine/actions/autogen/system.py rename to codeflow_engine/actions/ai_actions/autogen/system.py diff --git a/codeflow_engine/actions/autogen_implementation.py b/codeflow_engine/actions/ai_actions/autogen_implementation.py similarity index 100% rename from codeflow_engine/actions/autogen_implementation.py rename to codeflow_engine/actions/ai_actions/autogen_implementation.py diff --git a/codeflow_engine/actions/autogen_multi_agent.py b/codeflow_engine/actions/ai_actions/autogen_multi_agent.py similarity index 100% rename from codeflow_engine/actions/autogen_multi_agent.py rename to codeflow_engine/actions/ai_actions/autogen_multi_agent.py diff --git a/codeflow_engine/actions/configurable_llm_provider.py b/codeflow_engine/actions/ai_actions/configurable_llm_provider.py similarity index 100% rename from codeflow_engine/actions/configurable_llm_provider.py rename to codeflow_engine/actions/ai_actions/configurable_llm_provider.py diff --git a/codeflow_engine/actions/learning_memory_system.py b/codeflow_engine/actions/ai_actions/learning_memory_system.py similarity index 100% rename from codeflow_engine/actions/learning_memory_system.py rename to codeflow_engine/actions/ai_actions/learning_memory_system.py diff --git a/codeflow_engine/actions/llm/__init__.py b/codeflow_engine/actions/ai_actions/llm/__init__.py similarity index 100% rename from codeflow_engine/actions/llm/__init__.py rename to codeflow_engine/actions/ai_actions/llm/__init__.py diff --git a/codeflow_engine/actions/llm/base.py b/codeflow_engine/actions/ai_actions/llm/base.py similarity index 100% rename from codeflow_engine/actions/llm/base.py rename to codeflow_engine/actions/ai_actions/llm/base.py diff --git a/codeflow_engine/actions/llm/manager.py b/codeflow_engine/actions/ai_actions/llm/manager.py similarity index 100% rename from codeflow_engine/actions/llm/manager.py rename to codeflow_engine/actions/ai_actions/llm/manager.py diff --git a/codeflow_engine/actions/llm/providers/__init__.py b/codeflow_engine/actions/ai_actions/llm/providers/__init__.py similarity index 100% rename from codeflow_engine/actions/llm/providers/__init__.py rename to codeflow_engine/actions/ai_actions/llm/providers/__init__.py diff --git a/codeflow_engine/actions/llm/providers/anthropic.py b/codeflow_engine/actions/ai_actions/llm/providers/anthropic.py similarity index 100% rename from codeflow_engine/actions/llm/providers/anthropic.py rename to codeflow_engine/actions/ai_actions/llm/providers/anthropic.py diff --git a/codeflow_engine/actions/llm/providers/azure_openai.py b/codeflow_engine/actions/ai_actions/llm/providers/azure_openai.py similarity index 100% rename from codeflow_engine/actions/llm/providers/azure_openai.py rename to codeflow_engine/actions/ai_actions/llm/providers/azure_openai.py diff --git a/codeflow_engine/actions/llm/providers/groq.py b/codeflow_engine/actions/ai_actions/llm/providers/groq.py similarity index 100% rename from codeflow_engine/actions/llm/providers/groq.py rename to codeflow_engine/actions/ai_actions/llm/providers/groq.py diff --git a/codeflow_engine/actions/llm/providers/mistral.py b/codeflow_engine/actions/ai_actions/llm/providers/mistral.py similarity index 100% rename from codeflow_engine/actions/llm/providers/mistral.py rename to codeflow_engine/actions/ai_actions/llm/providers/mistral.py diff --git a/codeflow_engine/actions/llm/providers/openai.py b/codeflow_engine/actions/ai_actions/llm/providers/openai.py similarity index 100% rename from codeflow_engine/actions/llm/providers/openai.py rename to codeflow_engine/actions/ai_actions/llm/providers/openai.py diff --git a/codeflow_engine/actions/llm/types.py b/codeflow_engine/actions/ai_actions/llm/types.py similarity index 100% rename from codeflow_engine/actions/llm/types.py rename to codeflow_engine/actions/ai_actions/llm/types.py diff --git a/codeflow_engine/actions/mem0_memory_integration.py b/codeflow_engine/actions/ai_actions/mem0_memory_integration.py similarity index 100% rename from codeflow_engine/actions/mem0_memory_integration.py rename to codeflow_engine/actions/ai_actions/mem0_memory_integration.py diff --git a/codeflow_engine/actions/summarize_pr_with_ai.py b/codeflow_engine/actions/ai_actions/summarize_pr_with_ai.py similarity index 100% rename from codeflow_engine/actions/summarize_pr_with_ai.py rename to codeflow_engine/actions/ai_actions/summarize_pr_with_ai.py diff --git a/codeflow_engine/actions/analysis/__init__.py b/codeflow_engine/actions/analysis/__init__.py new file mode 100644 index 0000000..58c61f9 --- /dev/null +++ b/codeflow_engine/actions/analysis/__init__.py @@ -0,0 +1,25 @@ +""" +CodeFlow Engine - Analysis Actions + +Actions for analyzing code, PRs, and comments. +""" + +from typing import Any + +# Import with error handling for optional dependencies +AICommentAnalyzer: type[Any] | None = None +try: + from codeflow_engine.actions.analysis.ai_comment_analyzer import AICommentAnalyzer +except ImportError: + pass + +PRReviewAnalyzer: type[Any] | None = None +try: + from codeflow_engine.actions.analysis.pr_review_analyzer import PRReviewAnalyzer +except ImportError: + pass + +__all__ = [ + "AICommentAnalyzer", + "PRReviewAnalyzer", +] diff --git a/codeflow_engine/actions/ai_comment_analyzer.py b/codeflow_engine/actions/analysis/ai_comment_analyzer.py similarity index 100% rename from codeflow_engine/actions/ai_comment_analyzer.py rename to codeflow_engine/actions/analysis/ai_comment_analyzer.py diff --git a/codeflow_engine/actions/analyze_console_logs.py b/codeflow_engine/actions/analysis/analyze_console_logs.py similarity index 100% rename from codeflow_engine/actions/analyze_console_logs.py rename to codeflow_engine/actions/analysis/analyze_console_logs.py diff --git a/codeflow_engine/actions/extract_pr_comment_data.py b/codeflow_engine/actions/analysis/extract_pr_comment_data.py similarity index 100% rename from codeflow_engine/actions/extract_pr_comment_data.py rename to codeflow_engine/actions/analysis/extract_pr_comment_data.py diff --git a/codeflow_engine/actions/find_dead_code.py b/codeflow_engine/actions/analysis/find_dead_code.py similarity index 100% rename from codeflow_engine/actions/find_dead_code.py rename to codeflow_engine/actions/analysis/find_dead_code.py diff --git a/codeflow_engine/actions/pr_review_analyzer.py b/codeflow_engine/actions/analysis/pr_review_analyzer.py similarity index 100% rename from codeflow_engine/actions/pr_review_analyzer.py rename to codeflow_engine/actions/analysis/pr_review_analyzer.py diff --git a/codeflow_engine/actions/generation/__init__.py b/codeflow_engine/actions/generation/__init__.py new file mode 100644 index 0000000..2c79028 --- /dev/null +++ b/codeflow_engine/actions/generation/__init__.py @@ -0,0 +1,32 @@ +""" +CodeFlow Engine - Generation Actions + +Actions for generating code, documentation, and scaffolding. +""" + +from typing import Any + +# Import with error handling for optional dependencies +GenerateBarrelFile: type[Any] | None = None +try: + from codeflow_engine.actions.generation.generate_barrel_file import GenerateBarrelFile +except ImportError: + pass + +GeneratePropTable: type[Any] | None = None +try: + from codeflow_engine.actions.generation.generate_prop_table import GeneratePropTable +except ImportError: + pass + +GenerateReleaseNotes: type[Any] | None = None +try: + from codeflow_engine.actions.generation.generate_release_notes import GenerateReleaseNotes +except ImportError: + pass + +__all__ = [ + "GenerateBarrelFile", + "GeneratePropTable", + "GenerateReleaseNotes", +] diff --git a/codeflow_engine/actions/generate_barrel_file.py b/codeflow_engine/actions/generation/generate_barrel_file.py similarity index 100% rename from codeflow_engine/actions/generate_barrel_file.py rename to codeflow_engine/actions/generation/generate_barrel_file.py diff --git a/codeflow_engine/actions/generate_prop_table.py b/codeflow_engine/actions/generation/generate_prop_table.py similarity index 100% rename from codeflow_engine/actions/generate_prop_table.py rename to codeflow_engine/actions/generation/generate_prop_table.py diff --git a/codeflow_engine/actions/generate_release_notes.py b/codeflow_engine/actions/generation/generate_release_notes.py similarity index 100% rename from codeflow_engine/actions/generate_release_notes.py rename to codeflow_engine/actions/generation/generate_release_notes.py diff --git a/codeflow_engine/actions/scaffold_api_route.py b/codeflow_engine/actions/generation/scaffold_api_route.py similarity index 100% rename from codeflow_engine/actions/scaffold_api_route.py rename to codeflow_engine/actions/generation/scaffold_api_route.py diff --git a/codeflow_engine/actions/scaffold_component.py b/codeflow_engine/actions/generation/scaffold_component.py similarity index 100% rename from codeflow_engine/actions/scaffold_component.py rename to codeflow_engine/actions/generation/scaffold_component.py diff --git a/codeflow_engine/actions/scaffold_shared_hook.py b/codeflow_engine/actions/generation/scaffold_shared_hook.py similarity index 100% rename from codeflow_engine/actions/scaffold_shared_hook.py rename to codeflow_engine/actions/generation/scaffold_shared_hook.py diff --git a/codeflow_engine/actions/svg_to_component.py b/codeflow_engine/actions/generation/svg_to_component.py similarity index 100% rename from codeflow_engine/actions/svg_to_component.py rename to codeflow_engine/actions/generation/svg_to_component.py diff --git a/codeflow_engine/actions/git/__init__.py b/codeflow_engine/actions/git/__init__.py new file mode 100644 index 0000000..83feee3 --- /dev/null +++ b/codeflow_engine/actions/git/__init__.py @@ -0,0 +1,32 @@ +""" +CodeFlow Engine - Git Actions + +Actions for Git operations like patches, branches, and releases. +""" + +from typing import Any + +# Import with error handling for optional dependencies +ApplyGitPatch: type[Any] | None = None +try: + from codeflow_engine.actions.git.apply_git_patch import ApplyGitPatch +except ImportError: + pass + +DeleteBranch: type[Any] | None = None +try: + from codeflow_engine.actions.git.delete_branch import DeleteBranch +except ImportError: + pass + +CreateGitHubRelease: type[Any] | None = None +try: + from codeflow_engine.actions.git.create_github_release import CreateGitHubRelease +except ImportError: + pass + +__all__ = [ + "ApplyGitPatch", + "CreateGitHubRelease", + "DeleteBranch", +] diff --git a/codeflow_engine/actions/apply_git_patch.py b/codeflow_engine/actions/git/apply_git_patch.py similarity index 100% rename from codeflow_engine/actions/apply_git_patch.py rename to codeflow_engine/actions/git/apply_git_patch.py diff --git a/codeflow_engine/actions/create_github_release.py b/codeflow_engine/actions/git/create_github_release.py similarity index 100% rename from codeflow_engine/actions/create_github_release.py rename to codeflow_engine/actions/git/create_github_release.py diff --git a/codeflow_engine/actions/delete_branch.py b/codeflow_engine/actions/git/delete_branch.py similarity index 100% rename from codeflow_engine/actions/delete_branch.py rename to codeflow_engine/actions/git/delete_branch.py diff --git a/codeflow_engine/actions/find_merged_branches.py b/codeflow_engine/actions/git/find_merged_branches.py similarity index 100% rename from codeflow_engine/actions/find_merged_branches.py rename to codeflow_engine/actions/git/find_merged_branches.py diff --git a/codeflow_engine/actions/issues/__init__.py b/codeflow_engine/actions/issues/__init__.py new file mode 100644 index 0000000..213ea44 --- /dev/null +++ b/codeflow_engine/actions/issues/__init__.py @@ -0,0 +1,60 @@ +""" +CodeFlow Engine - Issue/PR Actions + +Actions for managing issues, PRs, comments, and labels. +""" + +from typing import Any + +# Import with error handling for optional dependencies +IssueCreator: type[Any] | None = None +try: + from codeflow_engine.actions.issues.issue_creator import IssueCreator +except ImportError: + pass + +PRCommentHandler: type[Any] | None = None +try: + from codeflow_engine.actions.issues.handle_pr_comment import PRCommentHandler +except ImportError: + pass + +CreateOrUpdateIssue: type[Any] | None = None +try: + from codeflow_engine.actions.issues.create_or_update_issue import CreateOrUpdateIssue +except ImportError: + pass + +PostComment: type[Any] | None = None +try: + from codeflow_engine.actions.issues.post_comment import PostComment +except ImportError: + pass + +LabelPR: type[Any] | None = None +try: + from codeflow_engine.actions.issues.label_pr import LabelPR +except ImportError: + pass + +LabelPRBySize: type[Any] | None = None +try: + from codeflow_engine.actions.issues.label_pr_by_size import LabelPRBySize +except ImportError: + pass + +FindStaleIssuesOrPRs: type[Any] | None = None +try: + from codeflow_engine.actions.issues.find_stale_issues_or_prs import FindStaleIssuesOrPRs +except ImportError: + pass + +__all__ = [ + "CreateOrUpdateIssue", + "FindStaleIssuesOrPRs", + "IssueCreator", + "LabelPR", + "LabelPRBySize", + "PRCommentHandler", + "PostComment", +] diff --git a/codeflow_engine/actions/create_or_update_issue.py b/codeflow_engine/actions/issues/create_or_update_issue.py similarity index 100% rename from codeflow_engine/actions/create_or_update_issue.py rename to codeflow_engine/actions/issues/create_or_update_issue.py diff --git a/codeflow_engine/actions/find_stale_issues_or_prs.py b/codeflow_engine/actions/issues/find_stale_issues_or_prs.py similarity index 100% rename from codeflow_engine/actions/find_stale_issues_or_prs.py rename to codeflow_engine/actions/issues/find_stale_issues_or_prs.py diff --git a/codeflow_engine/actions/handle_pr_comment.py b/codeflow_engine/actions/issues/handle_pr_comment.py similarity index 100% rename from codeflow_engine/actions/handle_pr_comment.py rename to codeflow_engine/actions/issues/handle_pr_comment.py diff --git a/codeflow_engine/actions/issue_creator.py b/codeflow_engine/actions/issues/issue_creator.py similarity index 100% rename from codeflow_engine/actions/issue_creator.py rename to codeflow_engine/actions/issues/issue_creator.py diff --git a/codeflow_engine/actions/label_pr.py b/codeflow_engine/actions/issues/label_pr.py similarity index 100% rename from codeflow_engine/actions/label_pr.py rename to codeflow_engine/actions/issues/label_pr.py diff --git a/codeflow_engine/actions/label_pr_by_size.py b/codeflow_engine/actions/issues/label_pr_by_size.py similarity index 100% rename from codeflow_engine/actions/label_pr_by_size.py rename to codeflow_engine/actions/issues/label_pr_by_size.py diff --git a/codeflow_engine/actions/post_comment.py b/codeflow_engine/actions/issues/post_comment.py similarity index 100% rename from codeflow_engine/actions/post_comment.py rename to codeflow_engine/actions/issues/post_comment.py diff --git a/codeflow_engine/actions/maintenance/__init__.py b/codeflow_engine/actions/maintenance/__init__.py new file mode 100644 index 0000000..7e1ee83 --- /dev/null +++ b/codeflow_engine/actions/maintenance/__init__.py @@ -0,0 +1,53 @@ +""" +CodeFlow Engine - Maintenance Actions + +Actions for maintenance tasks like updating dependencies, docs, and code quality. +""" + +from typing import Any + +# Import with error handling for optional dependencies +UpdateDependency: type[Any] | None = None +try: + from codeflow_engine.actions.maintenance.update_dependency import UpdateDependency +except ImportError: + pass + +UpdateDocsFile: type[Any] | None = None +try: + from codeflow_engine.actions.maintenance.update_docs_file import UpdateDocsFile +except ImportError: + pass + +UpdateMigrationPlan: type[Any] | None = None +try: + from codeflow_engine.actions.maintenance.update_migration_plan import UpdateMigrationPlan +except ImportError: + pass + +FindLargeAssets: type[Any] | None = None +try: + from codeflow_engine.actions.maintenance.find_large_assets import FindLargeAssets +except ImportError: + pass + +EnforceImportOrder: type[Any] | None = None +try: + from codeflow_engine.actions.maintenance.enforce_import_order import EnforceImportOrder +except ImportError: + pass + +GenerateTodoReport: type[Any] | None = None +try: + from codeflow_engine.actions.maintenance.generate_todo_report import GenerateTodoReport +except ImportError: + pass + +__all__ = [ + "EnforceImportOrder", + "FindLargeAssets", + "GenerateTodoReport", + "UpdateDependency", + "UpdateDocsFile", + "UpdateMigrationPlan", +] diff --git a/codeflow_engine/actions/enforce_import_order.py b/codeflow_engine/actions/maintenance/enforce_import_order.py similarity index 100% rename from codeflow_engine/actions/enforce_import_order.py rename to codeflow_engine/actions/maintenance/enforce_import_order.py diff --git a/codeflow_engine/actions/find_large_assets.py b/codeflow_engine/actions/maintenance/find_large_assets.py similarity index 100% rename from codeflow_engine/actions/find_large_assets.py rename to codeflow_engine/actions/maintenance/find_large_assets.py diff --git a/codeflow_engine/actions/generate_todo_report.py b/codeflow_engine/actions/maintenance/generate_todo_report.py similarity index 100% rename from codeflow_engine/actions/generate_todo_report.py rename to codeflow_engine/actions/maintenance/generate_todo_report.py diff --git a/codeflow_engine/actions/update_dependency.py b/codeflow_engine/actions/maintenance/update_dependency.py similarity index 100% rename from codeflow_engine/actions/update_dependency.py rename to codeflow_engine/actions/maintenance/update_dependency.py diff --git a/codeflow_engine/actions/update_docs_file.py b/codeflow_engine/actions/maintenance/update_docs_file.py similarity index 100% rename from codeflow_engine/actions/update_docs_file.py rename to codeflow_engine/actions/maintenance/update_docs_file.py diff --git a/codeflow_engine/actions/update_migration_plan.py b/codeflow_engine/actions/maintenance/update_migration_plan.py similarity index 100% rename from codeflow_engine/actions/update_migration_plan.py rename to codeflow_engine/actions/maintenance/update_migration_plan.py diff --git a/codeflow_engine/actions/platform/__init__.py b/codeflow_engine/actions/platform/__init__.py new file mode 100644 index 0000000..af17e26 --- /dev/null +++ b/codeflow_engine/actions/platform/__init__.py @@ -0,0 +1,48 @@ +""" +CodeFlow Engine - Platform Actions + +Actions for platform detection, integration, and prototype enhancement. +Includes file analysis and scoring utilities. +""" + +from typing import Any + +from .config import PlatformConfigManager +from .detector import PlatformDetector +from .file_analyzer import FileAnalyzer +from .models import PlatformDetectorInputs, PlatformDetectorOutputs +from .patterns import PlatformPatterns +from .scoring import PlatformScoringEngine +from .utils import calculate_confidence_score, get_confidence_level + +# Import additional platform-related actions with error handling +MultiPlatformIntegrator: type[Any] | None = None +try: + from codeflow_engine.actions.platform.multi_platform_integrator import ( + MultiPlatformIntegrator, + ) +except ImportError: + pass + +PrototypeEnhancer: type[Any] | None = None +try: + from codeflow_engine.actions.platform.prototype_enhancer import PrototypeEnhancer +except ImportError: + pass + +__all__ = [ + # Core platform detection + "FileAnalyzer", + "PlatformConfigManager", + "PlatformDetector", + "PlatformDetectorInputs", + "PlatformDetectorOutputs", + "PlatformPatterns", + "PlatformScoringEngine", + # Platform integration + "MultiPlatformIntegrator", + "PrototypeEnhancer", + # Utilities + "calculate_confidence_score", + "get_confidence_level", +] diff --git a/codeflow_engine/actions/platform_detection/analysis/__init__.py b/codeflow_engine/actions/platform/analysis/__init__.py similarity index 100% rename from codeflow_engine/actions/platform_detection/analysis/__init__.py rename to codeflow_engine/actions/platform/analysis/__init__.py diff --git a/codeflow_engine/actions/platform_detection/analysis/base.py b/codeflow_engine/actions/platform/analysis/base.py similarity index 100% rename from codeflow_engine/actions/platform_detection/analysis/base.py rename to codeflow_engine/actions/platform/analysis/base.py diff --git a/codeflow_engine/actions/platform_detection/analysis/handlers.py b/codeflow_engine/actions/platform/analysis/handlers.py similarity index 100% rename from codeflow_engine/actions/platform_detection/analysis/handlers.py rename to codeflow_engine/actions/platform/analysis/handlers.py diff --git a/codeflow_engine/actions/platform_detection/analysis/patterns.py b/codeflow_engine/actions/platform/analysis/patterns.py similarity index 100% rename from codeflow_engine/actions/platform_detection/analysis/patterns.py rename to codeflow_engine/actions/platform/analysis/patterns.py diff --git a/codeflow_engine/actions/platform_detection/config.py b/codeflow_engine/actions/platform/config.py similarity index 100% rename from codeflow_engine/actions/platform_detection/config.py rename to codeflow_engine/actions/platform/config.py diff --git a/codeflow_engine/actions/platform_detection/detector.py b/codeflow_engine/actions/platform/detector.py similarity index 100% rename from codeflow_engine/actions/platform_detection/detector.py rename to codeflow_engine/actions/platform/detector.py diff --git a/codeflow_engine/actions/platform_detection/file_analyzer.py b/codeflow_engine/actions/platform/file_analyzer.py similarity index 100% rename from codeflow_engine/actions/platform_detection/file_analyzer.py rename to codeflow_engine/actions/platform/file_analyzer.py diff --git a/codeflow_engine/actions/platform_detection/inputs.py b/codeflow_engine/actions/platform/inputs.py similarity index 100% rename from codeflow_engine/actions/platform_detection/inputs.py rename to codeflow_engine/actions/platform/inputs.py diff --git a/codeflow_engine/actions/platform_detection/models.py b/codeflow_engine/actions/platform/models.py similarity index 100% rename from codeflow_engine/actions/platform_detection/models.py rename to codeflow_engine/actions/platform/models.py diff --git a/codeflow_engine/actions/multi_platform_integrator.py b/codeflow_engine/actions/platform/multi_platform_integrator.py similarity index 100% rename from codeflow_engine/actions/multi_platform_integrator.py rename to codeflow_engine/actions/platform/multi_platform_integrator.py diff --git a/codeflow_engine/actions/platform_detection/patterns.py b/codeflow_engine/actions/platform/patterns.py similarity index 100% rename from codeflow_engine/actions/platform_detection/patterns.py rename to codeflow_engine/actions/platform/patterns.py diff --git a/codeflow_engine/actions/platform_detector.py b/codeflow_engine/actions/platform/platform_detector.py similarity index 100% rename from codeflow_engine/actions/platform_detector.py rename to codeflow_engine/actions/platform/platform_detector.py diff --git a/codeflow_engine/actions/prototype_enhancement/__init__.py b/codeflow_engine/actions/platform/prototype_enhancement/__init__.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/__init__.py rename to codeflow_engine/actions/platform/prototype_enhancement/__init__.py diff --git a/codeflow_engine/actions/prototype_enhancement/config_loader.py b/codeflow_engine/actions/platform/prototype_enhancement/config_loader.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/config_loader.py rename to codeflow_engine/actions/platform/prototype_enhancement/config_loader.py diff --git a/codeflow_engine/actions/prototype_enhancement/enhancement_strategies.py b/codeflow_engine/actions/platform/prototype_enhancement/enhancement_strategies.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/enhancement_strategies.py rename to codeflow_engine/actions/platform/prototype_enhancement/enhancement_strategies.py diff --git a/codeflow_engine/actions/prototype_enhancement/enhancer.py b/codeflow_engine/actions/platform/prototype_enhancement/enhancer.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/enhancer.py rename to codeflow_engine/actions/platform/prototype_enhancement/enhancer.py diff --git a/codeflow_engine/actions/prototype_enhancement/file_generators.py b/codeflow_engine/actions/platform/prototype_enhancement/file_generators.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/file_generators.py rename to codeflow_engine/actions/platform/prototype_enhancement/file_generators.py diff --git a/codeflow_engine/actions/prototype_enhancement/generators/__init__.py b/codeflow_engine/actions/platform/prototype_enhancement/generators/__init__.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/generators/__init__.py rename to codeflow_engine/actions/platform/prototype_enhancement/generators/__init__.py diff --git a/codeflow_engine/actions/prototype_enhancement/generators/base_generator.py b/codeflow_engine/actions/platform/prototype_enhancement/generators/base_generator.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/generators/base_generator.py rename to codeflow_engine/actions/platform/prototype_enhancement/generators/base_generator.py diff --git a/codeflow_engine/actions/prototype_enhancement/generators/ci_cd_generator.py b/codeflow_engine/actions/platform/prototype_enhancement/generators/ci_cd_generator.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/generators/ci_cd_generator.py rename to codeflow_engine/actions/platform/prototype_enhancement/generators/ci_cd_generator.py diff --git a/codeflow_engine/actions/prototype_enhancement/generators/config_generator.py b/codeflow_engine/actions/platform/prototype_enhancement/generators/config_generator.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/generators/config_generator.py rename to codeflow_engine/actions/platform/prototype_enhancement/generators/config_generator.py diff --git a/codeflow_engine/actions/prototype_enhancement/generators/deployment_generator.py b/codeflow_engine/actions/platform/prototype_enhancement/generators/deployment_generator.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/generators/deployment_generator.py rename to codeflow_engine/actions/platform/prototype_enhancement/generators/deployment_generator.py diff --git a/codeflow_engine/actions/prototype_enhancement/generators/docker_generator.py b/codeflow_engine/actions/platform/prototype_enhancement/generators/docker_generator.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/generators/docker_generator.py rename to codeflow_engine/actions/platform/prototype_enhancement/generators/docker_generator.py diff --git a/codeflow_engine/actions/prototype_enhancement/generators/docs_generator.py b/codeflow_engine/actions/platform/prototype_enhancement/generators/docs_generator.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/generators/docs_generator.py rename to codeflow_engine/actions/platform/prototype_enhancement/generators/docs_generator.py diff --git a/codeflow_engine/actions/prototype_enhancement/generators/security_generator.py b/codeflow_engine/actions/platform/prototype_enhancement/generators/security_generator.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/generators/security_generator.py rename to codeflow_engine/actions/platform/prototype_enhancement/generators/security_generator.py diff --git a/codeflow_engine/actions/prototype_enhancement/generators/template_utils.py b/codeflow_engine/actions/platform/prototype_enhancement/generators/template_utils.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/generators/template_utils.py rename to codeflow_engine/actions/platform/prototype_enhancement/generators/template_utils.py diff --git a/codeflow_engine/actions/prototype_enhancement/generators/test_generator.py b/codeflow_engine/actions/platform/prototype_enhancement/generators/test_generator.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/generators/test_generator.py rename to codeflow_engine/actions/platform/prototype_enhancement/generators/test_generator.py diff --git a/codeflow_engine/actions/prototype_enhancement/platform_configs.py b/codeflow_engine/actions/platform/prototype_enhancement/platform_configs.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/platform_configs.py rename to codeflow_engine/actions/platform/prototype_enhancement/platform_configs.py diff --git a/codeflow_engine/actions/prototype_enhancement/template_metadata.py b/codeflow_engine/actions/platform/prototype_enhancement/template_metadata.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancement/template_metadata.py rename to codeflow_engine/actions/platform/prototype_enhancement/template_metadata.py diff --git a/codeflow_engine/actions/prototype_enhancer.py b/codeflow_engine/actions/platform/prototype_enhancer.py similarity index 100% rename from codeflow_engine/actions/prototype_enhancer.py rename to codeflow_engine/actions/platform/prototype_enhancer.py diff --git a/codeflow_engine/actions/platform_detection/schema.py b/codeflow_engine/actions/platform/schema.py similarity index 100% rename from codeflow_engine/actions/platform_detection/schema.py rename to codeflow_engine/actions/platform/schema.py diff --git a/codeflow_engine/actions/platform_detection/scoring.py b/codeflow_engine/actions/platform/scoring.py similarity index 100% rename from codeflow_engine/actions/platform_detection/scoring.py rename to codeflow_engine/actions/platform/scoring.py diff --git a/codeflow_engine/actions/platform_detection/utils.py b/codeflow_engine/actions/platform/utils.py similarity index 100% rename from codeflow_engine/actions/platform_detection/utils.py rename to codeflow_engine/actions/platform/utils.py diff --git a/codeflow_engine/actions/platform_detection/__init__.py b/codeflow_engine/actions/platform_detection/__init__.py deleted file mode 100644 index d68befa..0000000 --- a/codeflow_engine/actions/platform_detection/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -""" -Platform Detection Module - -Detects and analyzes rapid prototyping platforms. -""" - -from .config import PlatformConfigManager -from .detector import PlatformDetector -from .file_analyzer import FileAnalyzer -from .models import PlatformDetectorInputs, PlatformDetectorOutputs -from .patterns import PlatformPatterns -from .scoring import PlatformScoringEngine -from .utils import calculate_confidence_score, get_confidence_level - -__all__ = [ - "PlatformDetector", - "FileAnalyzer", - "PlatformConfigManager", - "PlatformScoringEngine", - "PlatformDetectorInputs", - "PlatformDetectorOutputs", - "PlatformPatterns", - "calculate_confidence_score", - "get_confidence_level" -] diff --git a/codeflow_engine/actions/quality/__init__.py b/codeflow_engine/actions/quality/__init__.py new file mode 100644 index 0000000..da89818 --- /dev/null +++ b/codeflow_engine/actions/quality/__init__.py @@ -0,0 +1,60 @@ +""" +CodeFlow Engine - Quality Actions + +Actions for quality checks, security audits, and performance budgets. +""" + +from typing import Any + +# Import with error handling for optional dependencies +QualityGates: type[Any] | None = None +try: + from codeflow_engine.actions.quality.quality_gates import QualityGates +except ImportError: + pass + +CheckPerformanceBudget: type[Any] | None = None +try: + from codeflow_engine.actions.quality.check_performance_budget import CheckPerformanceBudget +except ImportError: + pass + +CheckLockfileDrift: type[Any] | None = None +try: + from codeflow_engine.actions.quality.check_lockfile_drift import CheckLockfileDrift +except ImportError: + pass + +CheckDependencyLicenses: type[Any] | None = None +try: + from codeflow_engine.actions.quality.check_dependency_licenses import CheckDependencyLicenses +except ImportError: + pass + +RunSecurityAudit: type[Any] | None = None +try: + from codeflow_engine.actions.quality.run_security_audit import RunSecurityAudit +except ImportError: + pass + +RunAccessibilityAudit: type[Any] | None = None +try: + from codeflow_engine.actions.quality.run_accessibility_audit import RunAccessibilityAudit +except ImportError: + pass + +VisualRegressionTest: type[Any] | None = None +try: + from codeflow_engine.actions.quality.visual_regression_test import VisualRegressionTest +except ImportError: + pass + +__all__ = [ + "CheckDependencyLicenses", + "CheckLockfileDrift", + "CheckPerformanceBudget", + "QualityGates", + "RunAccessibilityAudit", + "RunSecurityAudit", + "VisualRegressionTest", +] diff --git a/codeflow_engine/actions/check_dependency_licenses.py b/codeflow_engine/actions/quality/check_dependency_licenses.py similarity index 100% rename from codeflow_engine/actions/check_dependency_licenses.py rename to codeflow_engine/actions/quality/check_dependency_licenses.py diff --git a/codeflow_engine/actions/check_lockfile_drift.py b/codeflow_engine/actions/quality/check_lockfile_drift.py similarity index 100% rename from codeflow_engine/actions/check_lockfile_drift.py rename to codeflow_engine/actions/quality/check_lockfile_drift.py diff --git a/codeflow_engine/actions/check_performance_budget.py b/codeflow_engine/actions/quality/check_performance_budget.py similarity index 100% rename from codeflow_engine/actions/check_performance_budget.py rename to codeflow_engine/actions/quality/check_performance_budget.py diff --git a/codeflow_engine/actions/quality_gates/__init__.py b/codeflow_engine/actions/quality/gates/__init__.py similarity index 100% rename from codeflow_engine/actions/quality_gates/__init__.py rename to codeflow_engine/actions/quality/gates/__init__.py diff --git a/codeflow_engine/actions/quality_gates/evaluator.py b/codeflow_engine/actions/quality/gates/evaluator.py similarity index 100% rename from codeflow_engine/actions/quality_gates/evaluator.py rename to codeflow_engine/actions/quality/gates/evaluator.py diff --git a/codeflow_engine/actions/quality_gates/models.py b/codeflow_engine/actions/quality/gates/models.py similarity index 100% rename from codeflow_engine/actions/quality_gates/models.py rename to codeflow_engine/actions/quality/gates/models.py diff --git a/codeflow_engine/actions/quality_gates.py b/codeflow_engine/actions/quality/quality_gates.py similarity index 100% rename from codeflow_engine/actions/quality_gates.py rename to codeflow_engine/actions/quality/quality_gates.py diff --git a/codeflow_engine/actions/run_accessibility_audit.py b/codeflow_engine/actions/quality/run_accessibility_audit.py similarity index 100% rename from codeflow_engine/actions/run_accessibility_audit.py rename to codeflow_engine/actions/quality/run_accessibility_audit.py diff --git a/codeflow_engine/actions/run_security_audit.py b/codeflow_engine/actions/quality/run_security_audit.py similarity index 100% rename from codeflow_engine/actions/run_security_audit.py rename to codeflow_engine/actions/quality/run_security_audit.py diff --git a/codeflow_engine/actions/visual_regression_test.py b/codeflow_engine/actions/quality/visual_regression_test.py similarity index 100% rename from codeflow_engine/actions/visual_regression_test.py rename to codeflow_engine/actions/quality/visual_regression_test.py diff --git a/codeflow_engine/actions/scripts/__init__.py b/codeflow_engine/actions/scripts/__init__.py new file mode 100644 index 0000000..c663351 --- /dev/null +++ b/codeflow_engine/actions/scripts/__init__.py @@ -0,0 +1,53 @@ +""" +CodeFlow Engine - Script Actions + +Actions for running scripts, tests, deployments, and database operations. +""" + +from typing import Any + +# Import with error handling for optional dependencies +RunScript: type[Any] | None = None +try: + from codeflow_engine.actions.scripts.run_script import RunScript +except ImportError: + pass + +RunChangedTests: type[Any] | None = None +try: + from codeflow_engine.actions.scripts.run_changed_tests import RunChangedTests +except ImportError: + pass + +RunDBMigrations: type[Any] | None = None +try: + from codeflow_engine.actions.scripts.run_db_migrations import RunDBMigrations +except ImportError: + pass + +SeedDatabase: type[Any] | None = None +try: + from codeflow_engine.actions.scripts.seed_database import SeedDatabase +except ImportError: + pass + +TriggerDeployment: type[Any] | None = None +try: + from codeflow_engine.actions.scripts.trigger_deployment import TriggerDeployment +except ImportError: + pass + +PublishPackage: type[Any] | None = None +try: + from codeflow_engine.actions.scripts.publish_package import PublishPackage +except ImportError: + pass + +__all__ = [ + "PublishPackage", + "RunChangedTests", + "RunDBMigrations", + "RunScript", + "SeedDatabase", + "TriggerDeployment", +] diff --git a/codeflow_engine/actions/publish_package.py b/codeflow_engine/actions/scripts/publish_package.py similarity index 100% rename from codeflow_engine/actions/publish_package.py rename to codeflow_engine/actions/scripts/publish_package.py diff --git a/codeflow_engine/actions/run_changed_tests.py b/codeflow_engine/actions/scripts/run_changed_tests.py similarity index 100% rename from codeflow_engine/actions/run_changed_tests.py rename to codeflow_engine/actions/scripts/run_changed_tests.py diff --git a/codeflow_engine/actions/run_db_migrations.py b/codeflow_engine/actions/scripts/run_db_migrations.py similarity index 100% rename from codeflow_engine/actions/run_db_migrations.py rename to codeflow_engine/actions/scripts/run_db_migrations.py diff --git a/codeflow_engine/actions/run_script.py b/codeflow_engine/actions/scripts/run_script.py similarity index 100% rename from codeflow_engine/actions/run_script.py rename to codeflow_engine/actions/scripts/run_script.py diff --git a/codeflow_engine/actions/seed_database.py b/codeflow_engine/actions/scripts/seed_database.py similarity index 100% rename from codeflow_engine/actions/seed_database.py rename to codeflow_engine/actions/scripts/seed_database.py diff --git a/codeflow_engine/actions/take_screenshots.py b/codeflow_engine/actions/scripts/take_screenshots.py similarity index 100% rename from codeflow_engine/actions/take_screenshots.py rename to codeflow_engine/actions/scripts/take_screenshots.py diff --git a/codeflow_engine/actions/trigger_deployment.py b/codeflow_engine/actions/scripts/trigger_deployment.py similarity index 100% rename from codeflow_engine/actions/trigger_deployment.py rename to codeflow_engine/actions/scripts/trigger_deployment.py diff --git a/codeflow_engine/ai/extensions/__init__.py b/codeflow_engine/ai/extensions/__init__.py index 5a3644e..5fa6f76 100644 --- a/codeflow_engine/ai/extensions/__init__.py +++ b/codeflow_engine/ai/extensions/__init__.py @@ -2,13 +2,42 @@ AI Extensions Module AI extensions and implementation roadmap functionality. +Re-exports from the implementation_roadmap module for backward compatibility. """ -# Import the implementation module itself -from . import implementation +from typing import Any -# Import all public names from the implementation module -from .implementation import * +# Re-export from implementation_roadmap for backward compatibility +Phase1ExtensionImplementor: type[Any] | None = None +PhaseExecution: type[Any] | None = None +PhaseManager: type[Any] | None = None +ReportGenerator: type[Any] | None = None +Task: type[Any] | None = None +TaskExecution: type[Any] | None = None +TaskExecutor: type[Any] | None = None +TaskRegistry: type[Any] | None = None -# Set __all__ to include both the module and its public names -__all__ = ["implementation"] + getattr(implementation, "__all__", []) +try: + from codeflow_engine.ai.implementation_roadmap import ( + Phase1ExtensionImplementor, + PhaseExecution, + PhaseManager, + ReportGenerator, + Task, + TaskExecution, + TaskExecutor, + TaskRegistry, + ) +except ImportError: + pass + +__all__ = [ + "Phase1ExtensionImplementor", + "PhaseExecution", + "PhaseManager", + "ReportGenerator", + "Task", + "TaskExecution", + "TaskExecutor", + "TaskRegistry", +] diff --git a/codeflow_engine/ai/extensions/implementation/__init__.py b/codeflow_engine/ai/extensions/implementation/__init__.py deleted file mode 100644 index 7832df6..0000000 --- a/codeflow_engine/ai/extensions/implementation/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -Implementation Roadmap Package - -Modular implementation system for CodeFlow extension roadmap. -""" - -from .implementor import Phase1ExtensionImplementor -from .phase_manager import PhaseExecution, PhaseManager -from .report_generator import ReportGenerator -from .task_definitions import Task, TaskRegistry -from .task_executor import TaskExecution, TaskExecutor - -__all__ = [ - "Phase1ExtensionImplementor", - "PhaseExecution", - "PhaseManager", - "ReportGenerator", - "Task", - "TaskExecution", - "TaskExecutor", - "TaskRegistry", -] - -__version__ = "1.0.0" diff --git a/codeflow_engine/ai/extensions/implementation/implementor.py b/codeflow_engine/ai/extensions/implementation/implementor.py deleted file mode 100644 index 6f66681..0000000 --- a/codeflow_engine/ai/extensions/implementation/implementor.py +++ /dev/null @@ -1,356 +0,0 @@ -""" -Main Implementation Orchestrator - -Provides the same interface as the original Phase1ExtensionImplementor while using modular components. -""" - -import logging -from pathlib import Path -from typing import Any - -from .phase_manager import PhaseManager -from .report_generator import ReportGenerator -from .task_definitions import Task, TaskRegistry -from .task_executor import TaskExecutor - -logger = logging.getLogger(__name__) - - -class Phase1ExtensionImplementor: - """ - Modular implementation orchestrator that maintains backward compatibility - with the original Phase1ExtensionImplementor interface. - """ - - def __init__(self) -> None: - self.project_root = Path.cwd() - self.implementation_log: list[dict[str, Any]] = [] - self.current_phase: str | None = None - self.tasks: dict[str, Task] = {} - - # Initialize modular components - self.task_executor = TaskExecutor(self.project_root) - self.phase_manager = PhaseManager(self.task_executor) - self.report_generator = ReportGenerator( - self.phase_manager, self.task_executor, self.project_root - ) - - # Maintain backward compatibility with original interface - self.implementation_phases = TaskRegistry.get_phase_definitions() - self._initialize_tasks() - - def _initialize_tasks(self) -> None: - """Initialize task objects from task definitions.""" - task_definitions = TaskRegistry.get_task_definitions() - - for task_id, task_info in task_definitions.items(): - self.tasks[task_id] = Task( - id=task_id, - description=task_info.get("description", ""), - dependencies=task_info.get("dependencies", []), - metadata=task_info, - ) - - async def run_implementation( - self, phase: str = "immediate", dry_run: bool = False - ) -> None: - """ - Run implementation for a specific phase. - Maintains backward compatibility with original method signature. - """ - try: - self.current_phase = phase - logger.info(f"Starting implementation phase: {phase}") - - # Log start of implementation - self._log_implementation_event( - { - "event": "phase_start", - "phase": phase, - "dry_run": dry_run, - "timestamp": self._get_timestamp(), - } - ) - - # Execute the phase using the modular phase manager - phase_execution = await self.phase_manager.execute_phase( - phase_id=phase, dry_run=dry_run - ) - - # Update current phase based on execution result - if phase_execution.is_completed: - logger.info(f"Phase {phase} completed successfully") - self._log_implementation_event( - { - "event": "phase_completed", - "phase": phase, - "duration_seconds": ( - phase_execution.duration.total_seconds() - if phase_execution.duration - else 0 - ), - "timestamp": self._get_timestamp(), - } - ) - else: - logger.error(f"Phase {phase} failed") - self._log_implementation_event( - { - "event": "phase_failed", - "phase": phase, - "timestamp": self._get_timestamp(), - } - ) - - except Exception as e: - logger.exception(f"Implementation failed for phase {phase}: {e}") - self._log_implementation_event( - { - "event": "phase_error", - "phase": phase, - "error": str(e), - "timestamp": self._get_timestamp(), - } - ) - raise - - async def run_all_phases(self, dry_run: bool = False) -> None: - """Run all implementation phases in order.""" - try: - logger.info("Starting all implementation phases") - - self._log_implementation_event( - { - "event": "full_implementation_start", - "dry_run": dry_run, - "timestamp": self._get_timestamp(), - } - ) - - # Execute all phases using the phase manager - phase_executions = await self.phase_manager.execute_all_phases( - dry_run=dry_run, stop_on_failure=True - ) - - # Log completion - completed_phases = sum( - 1 for e in phase_executions.values() if e.is_completed - ) - failed_phases = sum(1 for e in phase_executions.values() if e.is_failed) - - self._log_implementation_event( - { - "event": "full_implementation_completed", - "completed_phases": completed_phases, - "failed_phases": failed_phases, - "timestamp": self._get_timestamp(), - } - ) - - logger.info( - f"Implementation completed: {completed_phases} phases successful, {failed_phases} failed" - ) - - except Exception as e: - logger.exception(f"Full implementation failed: {e}") - self._log_implementation_event( - { - "event": "full_implementation_error", - "error": str(e), - "timestamp": self._get_timestamp(), - } - ) - raise - - def get_implementation_status(self) -> dict[str, Any]: - """Get current implementation status.""" - overall_status = self.phase_manager.get_overall_status() - execution_summary = self.task_executor.get_execution_summary() - - return { - "current_phase": self.current_phase, - "overall_progress": overall_status.get("overall_progress_percentage", 0), - "phases": overall_status.get("phases", {}), - "tasks": execution_summary.get("executions", {}), - "implementation_log": self.implementation_log[-10:], # Last 10 events - "next_steps": self.phase_manager.get_next_steps(), - } - - def generate_implementation_report(self) -> dict[str, Any]: - """Generate comprehensive implementation report.""" - return self.report_generator.generate_progress_report() - - def save_implementation_report(self, filename: str | None = None) -> Path: - """Save implementation report to file.""" - report = self.generate_implementation_report() - return self.report_generator.save_report(report, filename) - - def get_phase_status(self, phase_id: str) -> dict[str, Any]: - """Get status of a specific phase.""" - return self.phase_manager.get_phase_status(phase_id) - - def get_task_status(self, task_id: str) -> dict[str, Any]: - """Get status of a specific task.""" - if task_id in self.task_executor.executions: - execution = self.task_executor.executions[task_id] - return { - "task_id": task_id, - "status": execution.status, - "start_time": ( - execution.start_time.isoformat() if execution.start_time else None - ), - "end_time": ( - execution.end_time.isoformat() if execution.end_time else None - ), - "duration_seconds": ( - execution.duration.total_seconds() if execution.duration else None - ), - "error_message": execution.error_message, - "output": execution.output, - "logs": execution.logs, - } - return { - "task_id": task_id, - "status": "not_started", - "message": "Task has not been executed yet", - } - - def pause_implementation(self, phase_id: str | None = None) -> bool: - """Pause implementation of a specific phase or current phase.""" - target_phase = phase_id or self.current_phase - if target_phase: - return self.phase_manager.pause_phase(target_phase) - return False - - def resume_implementation(self, phase_id: str | None = None) -> bool: - """Resume implementation of a specific phase or current phase.""" - target_phase = phase_id or self.current_phase - if target_phase: - return self.phase_manager.resume_phase(target_phase) - return False - - def reset_phase(self, phase_id: str) -> bool: - """Reset a phase to allow re-execution.""" - return self.phase_manager.reset_phase(phase_id) - - def get_available_tasks(self) -> list[dict[str, Any]]: - """Get list of all available tasks.""" - task_definitions = TaskRegistry.get_task_definitions() - return [ - { - "task_id": task_id, - "name": task_info.get("name", task_id), - "description": task_info.get("description", ""), - "category": task_info.get("category", "uncategorized"), - "complexity": task_info.get("complexity", "unknown"), - "estimated_time": task_info.get("estimated_time", "unknown"), - "dependencies": task_info.get("dependencies", []), - } - for task_id, task_info in task_definitions.items() - ] - - def get_available_phases(self) -> list[dict[str, Any]]: - """Get list of all available phases.""" - return [ - { - "phase_id": phase_id, - "name": phase_info.get("name", phase_id), - "description": phase_info.get("description", ""), - "priority": phase_info.get("priority", 999), - "duration_days": phase_info.get("duration_days", 0), - "tasks": phase_info.get("tasks", []), - "depends_on": phase_info.get("depends_on", []), - } - for phase_id, phase_info in self.implementation_phases.items() - ] - - def get_dependency_graph(self) -> dict[str, list[str]]: - """Get the complete task dependency graph.""" - return TaskRegistry.get_dependency_graph() - - def validate_dependencies(self, task_ids: list[str]) -> dict[str, Any]: - """Validate that task dependencies can be satisfied.""" - dependency_graph = self.get_dependency_graph() - issues = [] - - for task_id in task_ids: - dependencies = dependency_graph.get(task_id, []) - missing_deps = [dep for dep in dependencies if dep not in task_ids] - - if missing_deps: - issues.append( - {"task_id": task_id, "missing_dependencies": missing_deps} - ) - - return {"valid": len(issues) == 0, "issues": issues} - - def _get_next_steps(self) -> list[dict[str, Any]]: - """ - Get recommended next steps based on current progress. - Maintains backward compatibility with original method. - """ - return self.phase_manager.get_next_steps() - - def _log_implementation_event(self, event: dict[str, Any]) -> None: - """Log an implementation event.""" - self.implementation_log.append(event) - - # Keep only the last 100 events to prevent memory bloat - if len(self.implementation_log) > 100: - self.implementation_log = self.implementation_log[-100:] - - def _get_timestamp(self) -> str: - """Get current timestamp as ISO string.""" - from datetime import datetime - - return datetime.now().isoformat() - - # Backward compatibility methods - - @property - def tasks_completed(self) -> int: - """Get number of completed tasks (backward compatibility).""" - return sum(1 for e in self.task_executor.executions.values() if e.is_completed) - - @property - def tasks_failed(self) -> int: - """Get number of failed tasks (backward compatibility).""" - return sum(1 for e in self.task_executor.executions.values() if e.is_failed) - - @property - def implementation_progress(self) -> float: - """Get overall implementation progress percentage (backward compatibility).""" - overall_status = self.phase_manager.get_overall_status() - return ( - overall_status.get("overall_progress_percentage", 0.0) - if overall_status - else 0.0 - ) - - def get_implementation_summary(self) -> dict[str, Any]: - """ - Get implementation summary (backward compatibility). - This method maintains the same interface as the original implementation. - """ - overall_status = self.phase_manager.get_overall_status() - execution_summary = self.task_executor.get_execution_summary() - - return { - "current_phase": self.current_phase, - "total_phases": overall_status.get("total_phases", 0), - "completed_phases": overall_status.get("completed_phases", 0), - "failed_phases": overall_status.get("failed_phases", 0), - "total_tasks": execution_summary.get("total_tasks", 0), - "completed_tasks": execution_summary.get("completed", 0), - "failed_tasks": execution_summary.get("failed", 0), - "success_rate": execution_summary.get("success_rate", 0.0), - "overall_progress": overall_status.get("overall_progress_percentage", 0.0), - "implementation_log": self.implementation_log, - "next_steps": self._get_next_steps(), - } - - def get_progress_percentage(self) -> float: - """Get overall implementation progress percentage (backward compatibility).""" - overall_status = self.phase_manager.get_overall_status() - progress = overall_status.get("overall_progress_percentage", 0.0) - return float(progress) if progress is not None else 0.0 diff --git a/codeflow_engine/ai/extensions/implementation/phase_manager.py b/codeflow_engine/ai/extensions/implementation/phase_manager.py deleted file mode 100644 index e33f15a..0000000 --- a/codeflow_engine/ai/extensions/implementation/phase_manager.py +++ /dev/null @@ -1,350 +0,0 @@ -""" -Phase Manager Module - -Handles phase orchestration, workflow management, and progress tracking for implementation roadmap. -""" - -import logging -from dataclasses import dataclass, field -from datetime import datetime, timedelta -from typing import Any - -from .task_definitions import TaskRegistry -from .task_executor import TaskExecution, TaskExecutor - -logger = logging.getLogger(__name__) - - -@dataclass -class PhaseExecution: - """Represents a phase execution instance.""" - - phase_id: str - start_time: datetime | None = None - end_time: datetime | None = None - status: str = "pending" # pending, running, completed, failed, paused - task_executions: dict[str, TaskExecution] = field(default_factory=dict) - progress_percentage: float = 0.0 - - @property - def duration(self) -> timedelta | None: - """Get phase execution duration.""" - if self.start_time and self.end_time: - return self.end_time - self.start_time - return None - - @property - def is_completed(self) -> bool: - """Check if phase completed successfully.""" - return self.status == "completed" - - @property - def is_failed(self) -> bool: - """Check if phase failed.""" - return self.status == "failed" - - def update_progress(self) -> None: - """Update progress percentage based on task completion.""" - if not self.task_executions: - self.progress_percentage = 0.0 - return - - completed_tasks = sum( - 1 for execution in self.task_executions.values() if execution.is_completed - ) - total_tasks = len(self.task_executions) - self.progress_percentage = (completed_tasks / total_tasks) * 100.0 - - -class PhaseManager: - """Manages implementation phases and their execution.""" - - def __init__(self, task_executor: TaskExecutor) -> None: - self.task_executor = task_executor - self.phase_executions: dict[str, PhaseExecution] = {} - self.current_phase: str | None = None - self.phase_definitions = TaskRegistry.get_phase_definitions() - - async def execute_phase( - self, phase_id: str, dry_run: bool = False, force: bool = False - ) -> PhaseExecution: - """Execute a specific phase.""" - if phase_id not in self.phase_definitions: - msg = f"Unknown phase: {phase_id}" - raise ValueError(msg) - - # Check dependencies unless forced - if not force and not await self._check_phase_dependencies(phase_id): - msg = f"Phase dependencies not satisfied for: {phase_id}" - raise ValueError(msg) - - # Initialize phase execution - if phase_id not in self.phase_executions: - self.phase_executions[phase_id] = PhaseExecution(phase_id=phase_id) - - phase_execution = self.phase_executions[phase_id] - phase_definition = self.phase_definitions[phase_id] - - try: - phase_execution.start_time = datetime.now() - phase_execution.status = "running" - self.current_phase = phase_id - - logger.info(f"Starting phase: {phase_id}") - - # Get tasks for this phase - task_ids = phase_definition.get("tasks", []) - - # Execute tasks with dependencies - task_executions = await self.task_executor.execute_tasks_with_dependencies( - task_ids, dry_run - ) - - # Update phase execution with task results - phase_execution.task_executions.update(task_executions) - phase_execution.update_progress() - - # Determine phase status based on task results - failed_tasks = [ - task_id - for task_id, execution in task_executions.items() - if execution.is_failed - ] - - if failed_tasks: - phase_execution.status = "failed" - logger.error( - f"Phase {phase_id} failed due to failed tasks: {failed_tasks}" - ) - else: - phase_execution.status = "completed" - logger.info(f"Phase {phase_id} completed successfully") - - phase_execution.end_time = datetime.now() - - except Exception as e: - phase_execution.end_time = datetime.now() - phase_execution.status = "failed" - logger.exception(f"Phase {phase_id} failed with exception: {e}") - raise - - return phase_execution - - async def execute_all_phases( - self, dry_run: bool = False, stop_on_failure: bool = True - ) -> dict[str, PhaseExecution]: - """Execute all phases in order.""" - # Get phases sorted by priority - phases = sorted( - self.phase_definitions.items(), key=lambda x: x[1].get("priority", 999) - ) - - for phase_id, _phase_definition in phases: - try: - await self.execute_phase(phase_id, dry_run) - - if self.phase_executions[phase_id].is_failed and stop_on_failure: - logger.error(f"Stopping execution due to failed phase: {phase_id}") - break - - except Exception as e: - logger.exception(f"Failed to execute phase {phase_id}: {e}") - if stop_on_failure: - break - - return self.phase_executions - - async def _check_phase_dependencies(self, phase_id: str) -> bool: - """Check if phase dependencies are satisfied.""" - phase_definition = self.phase_definitions[phase_id] - dependencies = phase_definition.get("depends_on", []) - - for dep_phase_id in dependencies: - if dep_phase_id not in self.phase_executions: - logger.warning(f"Dependency phase {dep_phase_id} not executed") - return False - - if not self.phase_executions[dep_phase_id].is_completed: - logger.warning(f"Dependency phase {dep_phase_id} not completed") - return False - - return True - - def get_phase_status(self, phase_id: str) -> dict[str, Any]: - """Get detailed status of a specific phase.""" - if phase_id not in self.phase_executions: - return { - "phase_id": phase_id, - "status": "not_started", - "progress_percentage": 0.0, - } - - execution = self.phase_executions[phase_id] - phase_definition = self.phase_definitions[phase_id] - - return { - "phase_id": phase_id, - "name": phase_definition.get("name", phase_id), - "description": phase_definition.get("description", ""), - "status": execution.status, - "progress_percentage": execution.progress_percentage, - "start_time": ( - execution.start_time.isoformat() if execution.start_time else None - ), - "end_time": execution.end_time.isoformat() if execution.end_time else None, - "duration_seconds": ( - execution.duration.total_seconds() if execution.duration else None - ), - "total_tasks": len(phase_definition.get("tasks", [])), - "completed_tasks": sum( - 1 for e in execution.task_executions.values() if e.is_completed - ), - "failed_tasks": sum( - 1 for e in execution.task_executions.values() if e.is_failed - ), - "task_status": { - task_id: { - "status": task_execution.status, - "duration_seconds": ( - task_execution.duration.total_seconds() - if task_execution.duration - else None - ), - "error": task_execution.error_message, - } - for task_id, task_execution in execution.task_executions.items() - }, - } - - def get_overall_status(self) -> dict[str, Any]: - """Get overall implementation status across all phases.""" - total_phases = len(self.phase_definitions) - completed_phases = sum( - 1 for execution in self.phase_executions.values() if execution.is_completed - ) - failed_phases = sum( - 1 for execution in self.phase_executions.values() if execution.is_failed - ) - - # Calculate overall progress - if total_phases == 0: - overall_progress = 0.0 - else: - phase_weights = {"immediate": 0.4, "medium": 0.4, "strategic": 0.2} - - weighted_progress = 0.0 - total_weight = 0.0 - - for phase_id, execution in self.phase_executions.items(): - weight = phase_weights.get(phase_id, 1.0 / total_phases) - weighted_progress += execution.progress_percentage * weight - total_weight += weight - - overall_progress = ( - weighted_progress / total_weight if total_weight > 0 else 0.0 - ) - - # Determine overall status - if failed_phases > 0: - overall_status = "failed" - elif completed_phases == total_phases: - overall_status = "completed" - elif any(e.status == "running" for e in self.phase_executions.values()): - overall_status = "running" - else: - overall_status = "pending" - - return { - "overall_status": overall_status, - "overall_progress_percentage": overall_progress, - "current_phase": self.current_phase, - "total_phases": total_phases, - "completed_phases": completed_phases, - "failed_phases": failed_phases, - "phases": { - phase_id: self.get_phase_status(phase_id) - for phase_id in self.phase_definitions - }, - } - - def get_next_steps(self) -> list[dict[str, Any]]: - """Get recommended next steps based on current progress.""" - next_steps = [] - - # Find the next phase to execute - for phase_id in ["immediate", "medium", "strategic"]: - if phase_id not in self.phase_executions: - phase_definition = self.phase_definitions[phase_id] - next_steps.append( - { - "type": "phase", - "action": f"Execute {phase_definition.get('name', phase_id)}", - "description": phase_definition.get("description", ""), - "priority": "high" if phase_id == "immediate" else "medium", - "estimated_duration_days": phase_definition.get( - "duration_days", 0 - ), - } - ) - break - if not self.phase_executions[phase_id].is_completed: - # Find failed tasks in current phase - execution = self.phase_executions[phase_id] - failed_tasks = [ - task_id - for task_id, task_execution in execution.task_executions.items() - if task_execution.is_failed - ] - - if failed_tasks: - next_steps.append( - { - "type": "retry", - "action": f"Retry failed tasks in {phase_id}", - "description": f"Retry tasks: {', '.join(failed_tasks)}", - "priority": "high", - "tasks": failed_tasks, - } - ) - break - - # Add general recommendations - if not next_steps: - next_steps.append( - { - "type": "maintenance", - "action": "Monitor and maintain implemented features", - "description": "All phases completed. Focus on monitoring and optimization.", - "priority": "low", - } - ) - - return next_steps - - def pause_phase(self, phase_id: str) -> bool: - """Pause execution of a specific phase.""" - if phase_id in self.phase_executions: - execution = self.phase_executions[phase_id] - if execution.status == "running": - execution.status = "paused" - logger.info(f"Phase {phase_id} paused") - return True - return False - - def resume_phase(self, phase_id: str) -> bool: - """Resume execution of a paused phase.""" - if phase_id in self.phase_executions: - execution = self.phase_executions[phase_id] - if execution.status == "paused": - execution.status = "running" - logger.info(f"Phase {phase_id} resumed") - return True - return False - - def reset_phase(self, phase_id: str) -> bool: - """Reset a phase to allow re-execution.""" - if phase_id in self.phase_executions: - del self.phase_executions[phase_id] - logger.info(f"Phase {phase_id} reset") - return True - return False diff --git a/codeflow_engine/ai/extensions/implementation/report_generator.py b/codeflow_engine/ai/extensions/implementation/report_generator.py deleted file mode 100644 index 548c63d..0000000 --- a/codeflow_engine/ai/extensions/implementation/report_generator.py +++ /dev/null @@ -1,535 +0,0 @@ -""" -Report Generator Module - -Generates comprehensive reports and analytics for implementation roadmap execution. -""" - -import json -import logging -import operator -from datetime import datetime, timedelta -from pathlib import Path -from typing import Any - -from .phase_manager import PhaseManager -from .task_executor import TaskExecution, TaskExecutor - -logger = logging.getLogger(__name__) - - -class ReportGenerator: - """Generates comprehensive reports for implementation progress.""" - - def __init__( - self, - phase_manager: PhaseManager, - task_executor: TaskExecutor, - project_root: Path, - ) -> None: - self.phase_manager = phase_manager - self.task_executor = task_executor - self.project_root = project_root - - def generate_progress_report(self) -> dict[str, Any]: - """Generate a comprehensive progress report.""" - overall_status = self.phase_manager.get_overall_status() - execution_summary = self.task_executor.get_execution_summary() - - return { - "report_metadata": { - "generated_at": datetime.now().isoformat(), - "report_type": "progress_report", - "version": "1.0", - }, - "executive_summary": self._generate_executive_summary( - overall_status, execution_summary - ), - "overall_status": overall_status, - "execution_summary": execution_summary, - "phase_details": self._generate_phase_details(), - "task_analysis": self._generate_task_analysis(), - "recommendations": self._generate_recommendations(), - "next_steps": self.phase_manager.get_next_steps(), - "metrics": self._generate_metrics(), - "timeline": self._generate_timeline(), - } - - def _generate_executive_summary( - self, overall_status: dict[str, Any], execution_summary: dict[str, Any] - ) -> dict[str, Any]: - """Generate executive summary.""" - total_phases = overall_status.get("total_phases", 0) - completed_phases = overall_status.get("completed_phases", 0) - failed_phases = overall_status.get("failed_phases", 0) - - total_tasks = execution_summary.get("total_tasks", 0) - completed_tasks = execution_summary.get("completed", 0) - failed_tasks = execution_summary.get("failed", 0) - - # Calculate health score - phase_health = ( - (completed_phases / total_phases * 100) if total_phases > 0 else 0 - ) - task_health = (completed_tasks / total_tasks * 100) if total_tasks > 0 else 0 - overall_health = (phase_health + task_health) / 2 - - # Determine status color via shared utility - from codeflow_engine.reporting.html_utils import status_color_name - - status_color = status_color_name(overall_health) - - return { - "overall_health_score": round(overall_health, 1), - "status_color": status_color, - "current_phase": overall_status.get("current_phase"), - "progress_percentage": round( - overall_status.get("overall_progress_percentage", 0), 1 - ), - "phases_completed": f"{completed_phases}/{total_phases}", - "tasks_completed": f"{completed_tasks}/{total_tasks}", - "critical_issues": failed_phases + failed_tasks, - "estimated_completion": self._estimate_completion_date(), - "key_achievements": self._get_key_achievements(), - "major_blockers": self._get_major_blockers(), - } - - def _generate_phase_details(self) -> dict[str, Any]: - """Generate detailed phase information.""" - phase_details = {} - - for phase_id in self.phase_manager.phase_definitions: - status = self.phase_manager.get_phase_status(phase_id) - phase_details[phase_id] = { - **status, - "success_criteria": self.phase_manager.phase_definitions[phase_id].get( - "success_criteria", [] - ), - "risk_assessment": self._assess_phase_risk(phase_id), - "resource_utilization": self._calculate_resource_utilization(phase_id), - "quality_metrics": self._calculate_quality_metrics(phase_id), - } - - return phase_details - - def _generate_task_analysis(self) -> dict[str, Any]: - """Generate task-level analysis.""" - task_categories = {} - task_complexity_analysis = {} - - # Group tasks by category - from .task_definitions import TaskRegistry - - categories = TaskRegistry.get_task_categories() - - for category, task_ids in categories.items(): - completed = sum( - 1 - for task_id in task_ids - if task_id in self.task_executor.executions - and self.task_executor.executions[task_id].is_completed - ) - failed = sum( - 1 - for task_id in task_ids - if task_id in self.task_executor.executions - and self.task_executor.executions[task_id].is_failed - ) - - task_categories[category] = { - "total_tasks": len(task_ids), - "completed": completed, - "failed": failed, - "success_rate": (completed / len(task_ids) * 100) if task_ids else 0, - } - - # Analyze task complexity vs success rate - task_definitions = TaskRegistry.get_task_definitions() - complexity_levels = ["low", "medium", "high", "very_high"] - - for complexity in complexity_levels: - matching_tasks = [ - task_id - for task_id, task_info in task_definitions.items() - if task_info.get("complexity") == complexity - ] - - if matching_tasks: - completed = sum( - 1 - for task_id in matching_tasks - if task_id in self.task_executor.executions - and self.task_executor.executions[task_id].is_completed - ) - - task_complexity_analysis[complexity] = { - "total_tasks": len(matching_tasks), - "completed": completed, - "success_rate": ( - (completed / len(matching_tasks) * 100) if matching_tasks else 0 - ), - } - - return { - "category_breakdown": task_categories, - "complexity_analysis": task_complexity_analysis, - "longest_running_tasks": self._get_longest_running_tasks(), - "most_failed_tasks": self._get_most_failed_tasks(), - } - - def _generate_recommendations(self) -> list[dict[str, Any]]: - """Generate actionable recommendations.""" - recommendations = [] - - # Analyze failed tasks - failed_executions = [ - execution - for execution in self.task_executor.executions.values() - if execution.is_failed - ] - - if failed_executions: - recommendations.append( - { - "type": "critical", - "title": "Address Failed Tasks", - "description": f"{len(failed_executions)} tasks have failed and need attention", - "action": "Review error logs and retry failed tasks", - "priority": "high", - "impact": "Blocks progress on dependent tasks", - } - ) - - # Check for slow phases - slow_phases = [] - for phase_id, execution in self.phase_manager.phase_executions.items(): - if execution.duration and execution.duration > timedelta(days=7): - slow_phases.append(phase_id) - - if slow_phases: - recommendations.append( - { - "type": "performance", - "title": "Optimize Slow Phases", -"description": f"Phases {', '.join(slow_phases)} are taking longer than expected", - "action": "Review task dependencies and consider parallel execution", - "priority": "medium", - "impact": "Delays overall implementation timeline", - } - ) - - # Check resource utilization - overall_status = self.phase_manager.get_overall_status() - if overall_status.get("overall_progress_percentage", 0) < 50: - recommendations.append( - { - "type": "strategic", - "title": "Accelerate Implementation", - "description": "Implementation progress is below 50%", - "action": "Consider allocating more resources or simplifying scope", - "priority": "medium", - "impact": "Affects delivery timeline", - } - ) - - return recommendations - - def _generate_metrics(self) -> dict[str, Any]: - """Generate key performance metrics.""" - execution_summary = self.task_executor.get_execution_summary() - self.phase_manager.get_overall_status() - - # Calculate timeline metrics - all_executions: list[TaskExecution] = [] - for phase_exec in self.phase_manager.phase_executions.values(): - all_executions.extend(phase_exec.task_executions.values()) - - if all_executions: - # Extract non-None start times directly - start_times = [ - exec.start_time - for exec in all_executions - if exec.start_time is not None - ] - if start_times: - earliest_start = min(start_times) - # Extract non-None end times directly - end_times = [ - exec.end_time - for exec in all_executions - if exec.end_time is not None - ] - if end_times: - latest_end = max(end_times) - total_duration = latest_end - earliest_start - else: - total_duration = None - else: - total_duration = None - else: - total_duration = None - - # Calculate velocity (tasks completed per day) - completed_executions = [ - execution - for execution in self.task_executor.executions.values() - if execution.is_completed and execution.start_time - ] - - if completed_executions: - # Extract non-None start times directly - start_times = [ - e.start_time for e in completed_executions if e.start_time is not None - ] - if start_times: - earliest_start = min(start_times) - days_elapsed = (datetime.now() - earliest_start).days or 1 - velocity = len(completed_executions) / days_elapsed - else: - velocity = 0 - else: - velocity = 0 - - # Calculate average task duration - completed_durations = [ - execution.duration.total_seconds() / 3600 # Convert to hours - for execution in completed_executions - if execution.duration - ] - avg_task_duration = ( - sum(completed_durations) / len(completed_durations) - if completed_durations - else 0 - ) - - return { - "velocity_tasks_per_day": round(velocity, 2), - "average_task_duration_hours": round(avg_task_duration, 2), - "success_rate_percentage": round( - execution_summary.get("success_rate", 0) * 100, 1 - ), - "total_implementation_time_hours": round( - execution_summary.get("total_duration_seconds", 0) / 3600, 2 - ), - "phases_on_track": self._count_phases_on_track(), - "critical_path_tasks": self._identify_critical_path_tasks(), - "resource_efficiency": self._calculate_resource_efficiency(), - "total_duration": total_duration, - } - - def _generate_timeline(self) -> list[dict[str, Any]]: - """Generate implementation timeline.""" - timeline = [] - - for phase_id, phase_execution in self.phase_manager.phase_executions.items(): - if phase_execution.start_time: - timeline.append( - { - "date": phase_execution.start_time.isoformat(), - "event": f"Started phase: {phase_id}", - "type": "phase_start", - "phase_id": phase_id, - } - ) - - if phase_execution.end_time: - timeline.append( - { - "date": phase_execution.end_time.isoformat(), - "event": f"Completed phase: {phase_id}", - "type": "phase_end", - "phase_id": phase_id, - "status": phase_execution.status, - } - ) - - # Add task milestones - for task_id, task_execution in self.task_executor.executions.items(): - if task_execution.is_completed and task_execution.end_time: - timeline.append( - { - "date": task_execution.end_time.isoformat(), - "event": f"Completed task: {task_id}", - "type": "task_completion", - "task_id": task_id, - } - ) - - # Sort by date - timeline.sort(key=operator.itemgetter("date")) - - return timeline - - def save_report(self, report: dict[str, Any], filename: str | None = None) -> Path: - """Save report to file.""" - if not filename: - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - filename = f"implementation_report_{timestamp}.json" - - report_path = self.project_root / "reports" / filename - report_path.parent.mkdir(exist_ok=True) - - with open(report_path, "w", encoding="utf-8") as f: - json.dump(report, f, indent=2, default=str) - - logger.info(f"Report saved to: {report_path}") - return report_path - - def generate_html_report(self, report: dict[str, Any]) -> str: - """Generate HTML version of the report.""" - from codeflow_engine.reporting.html_page import PageHeader, build_basic_page - - extra_css = """ -.metric { display: inline-block; margin: 10px; padding: 15px; -.phase { margin: 20px 0; padding: 15px; border-left: 4px solid #007bff; background: #f8f9fa; } -.recommendation { margin: 10px 0; padding: 10px; border-radius: 5px; } -.critical { background: #f8d7da; border: 1px solid #f5c6cb; } -.performance { background: #fff3cd; border: 1px solid #ffeaa7; } -.strategic { background: #d1ecf1; border: 1px solid #bee5eb; } -""" - - # Format recommendations - recommendations_html = "" - for rec in report.get("recommendations", []): - recommendations_html += f""" -
Status: {phase_data.get("status", "unknown")}
-Progress: {phase_data.get("progress_percentage", 0)}%
-Tasks: {phase_data.get("completed_tasks", 0)}/ -
Health Score: {executive.get("overall_health_score", 0)}%
-