from src.dev_pilot.state.sdlc_state import SDLCState, DesignDocument from src.dev_pilot.utils.Utility import Utility from loguru import logger class DesingDocumentNode: """ Graph Node for the Desing Documents """ def __init__(self, model): self.llm = model self.utility = Utility() def create_design_documents(self, state: SDLCState): """ Generates the Design document functional and technical """ logger.info("----- Creating Design Document ----") requirements = state.get('requirements', '') user_stories = state.get('user_stories', '') project_name = state.get('project_name', '') design_feedback = None if 'design_documents' in state: design_feedback = state.get('design_documents_feedback','') functional_documents = self.generate_functional_design( project_name=project_name, requirements=requirements, user_stories=user_stories, design_feedback=design_feedback ) technical_documents = self.generate_technical_design( project_name=project_name, requirements=requirements, user_stories=user_stories, design_feedback=design_feedback ) design_documents = DesignDocument( functional=functional_documents, technical = technical_documents ) return { **state, "design_documents": design_documents, "technical_documents": technical_documents } def generate_functional_design(self, project_name, requirements, user_stories, design_feedback): """ Helper method to generate functional design document """ logger.info("----- Creating Functional Design Document ----") prompt = f""" Create a comprehensive functional design document for {project_name} in Markdown format. The document should use proper Markdown syntax with headers (# for main titles, ## for sections, etc.), bullet points, tables, and code blocks where appropriate. Requirements: {self.utility.format_list(requirements)} User Stories: {self.utility.format_user_stories(user_stories)} {f"When creating this functional design document, please incorporate the following feedback about the requirements: {design_feedback}" if design_feedback else ""} The functional design document should include the following sections, each with proper Markdown formatting: # Functional Design Document: {project_name} ## 1. Introduction and Purpose ## 2. Project Scope ## 3. User Roles and Permissions ## 4. Functional Requirements Breakdown ## 5. User Interface Design Guidelines ## 6. Business Process Flows ## 7. Data Entities and Relationships ## 8. Validation Rules ## 9. Reporting Requirements ## 10. Integration Points Make sure to maintain proper Markdown formatting throughout the document. """ # invoke the llm response = self.llm.invoke(prompt) return response.content def generate_technical_design(self, project_name, requirements, user_stories, design_feedback): """ Helper method to generate technical design document in Markdown format """ logger.info("----- Creating Technical Design Document ----") prompt = f""" Create a comprehensive technical design document for {project_name} in Markdown format. The document should use proper Markdown syntax with headers (# for main titles, ## for sections, etc.), bullet points, tables, code blocks, and diagrams described in text form where appropriate. Requirements: {self.utility.format_list(requirements)} User Stories: {self.utility.format_user_stories(user_stories)} {f"When creating this technical design document, please incorporate the following feedback about the requirements: {design_feedback}" if design_feedback else ""} The technical design document should include the following sections, each with proper Markdown formatting: # Technical Design Document: {project_name} ## 1. System Architecture ## 2. Technology Stack and Justification ## 3. Database Schema ## 4. API Specifications ## 5. Security Considerations ## 6. Performance Considerations ## 7. Scalability Approach ## 8. Deployment Strategy ## 9. Third-party Integrations ## 10. Development, Testing, and Deployment Environments For any code examples, use ```language-name to specify the programming language. For database schemas, represent tables and relationships using Markdown tables. Make sure to maintain proper Markdown formatting throughout the document. """ response = self.llm.invoke(prompt) return response.content def review_design_documents(self, state: SDLCState): return state def revise_design_documents(self, state: SDLCState): pass def review_design_documents_router(self, state: SDLCState): """ Evaluates design review is required or not. """ return state.get("design_documents_review_status", "approved") # default to "approved" if not present