ChadSaglam commited on
Commit
57dc491
·
verified ·
1 Parent(s): 3075ea7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +126 -479
app.py CHANGED
@@ -1,512 +1,159 @@
1
  import streamlit as st
2
  import os
3
- from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
4
- from langchain_community.llms import HuggingFacePipeline
5
- from langchain.agents import AgentType, initialize_agent, load_tools
6
- from langchain.memory import ConversationBufferMemory
7
- from crewai import Agent, Task, Crew, Process
8
- import warnings
9
- import json
10
  from datetime import datetime
11
  import logging
12
  import uuid
13
  import pytz
14
- import numexpr
15
 
16
  # Configure logging
17
- logging.basicConfig(
18
- level=logging.INFO,
19
- format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
20
- )
21
  logger = logging.getLogger(__name__)
22
 
23
- # Suppress warnings
24
- warnings.filterwarnings('ignore')
25
-
26
- # Global variables for current user and time
27
  CURRENT_USER = "ChadSaglam"
28
- CURRENT_UTC_TIME = datetime.strptime("2025-02-04 18:53:13", "%Y-%m-%d %H:%M:%S")
29
-
30
- # Cache the model loading
31
- @st.cache_resource
32
- def load_model():
33
- try:
34
- model_name = "EleutherAI/gpt-neo-125M"
35
- tokenizer = AutoTokenizer.from_pretrained(model_name)
36
- model = AutoModelForCausalLM.from_pretrained(model_name)
37
- return tokenizer, model
38
- except Exception as e:
39
- st.error(f"Error loading model: {str(e)}")
40
- return None, None
41
 
42
- # Initialize the LLM and tools at the module level
43
- def initialize_llm():
44
- tokenizer, model = load_model()
45
- if tokenizer is None or model is None:
46
- st.error("Failed to initialize model")
47
- return None
48
-
49
- llm_pipeline = pipeline(
50
- "text-generation",
51
- model=model,
52
- tokenizer=tokenizer,
53
- max_new_tokens=200,
54
- temperature=0.7,
55
- top_p=0.95,
56
- repetition_penalty=1.15,
57
- device="cpu"
58
- )
59
-
60
- return HuggingFacePipeline(pipeline=llm_pipeline)
61
 
62
- def initialize_tools(llm):
63
- try:
64
- return load_tools(["llm-math"], llm=llm)
65
- except ImportError as e:
66
- st.error(f"Error loading tools: {str(e)}")
67
- return []
68
-
69
- class ProjectCrew:
70
- def __init__(self, project_name, project_type):
71
  self.project_name = project_name
72
  self.project_type = project_type
73
- self.meeting_notes = []
74
- self.tasks = {}
75
- self.priorities = {}
76
- self.created_by = CURRENT_USER
77
- self.created_at = CURRENT_UTC_TIME
78
- self.llm = llm_global
79
-
80
- # Initialize crew with dynamic name
81
- self.crew = self._create_crew()
82
-
83
- def _create_crew(self):
84
- crew_name = f"{self.project_type.lower()}_crew_{self.created_at.strftime('%Y%m%d')}"
85
- return Crew(
86
- agents=self._create_all_agents(),
87
- tasks=self._initialize_tasks(),
88
- manager_llm=self.llm,
89
- process=Process.hierarchical,
90
- verbose=True
91
- )
92
-
93
- def _create_all_agents(self):
94
- """Combine all teams into a single list of agents"""
95
- return (
96
- self._create_executive_team() +
97
- self._create_product_team() +
98
- self._create_engineering_team() +
99
- self._create_qa_team()
100
- )
101
-
102
- def _create_agent(self, role, goal, backstory):
103
- return Agent(
104
- role=role,
105
- goal=goal,
106
- backstory=backstory,
107
- tools=tools,
108
- verbose=True,
109
- allow_delegation=True,
110
- llm=self.llm
111
- )
112
-
113
- def _create_executive_team(self):
114
- return [
115
- self._create_agent(
116
- role="CEO",
117
- goal="Define and execute company strategy",
118
- backstory="Experienced leader with focus on growth"
119
- ),
120
- self._create_agent(
121
- role="CTO",
122
- goal="Technical strategy and architecture",
123
- backstory="Technical leader with extensive experience"
124
- ),
125
- self._create_agent(
126
- role="CPO",
127
- goal="Product strategy and vision",
128
- backstory="Product leader focused on user needs"
129
- )
130
- ]
131
-
132
- def _create_product_team(self):
133
- return [
134
- self._create_agent(
135
- role="Product Manager",
136
- goal="Define and prioritize product features",
137
- backstory="Experienced in product development and user needs"
138
- ),
139
- self._create_agent(
140
- role="UX Designer",
141
- goal="Create user-centered designs",
142
- backstory="Expert in user experience and interface design"
143
- )
144
- ]
145
-
146
- def _create_engineering_team(self):
147
- return [
148
- self._create_agent(
149
- role="Engineering Manager",
150
- goal="Lead technical implementation",
151
- backstory="Technical leader with team management experience"
152
- ),
153
- self._create_agent(
154
- role="Senior Engineer",
155
- goal="Implement complex features",
156
- backstory="Experienced in software architecture"
157
- ),
158
- self._create_agent(
159
- role="Frontend Engineer",
160
- goal="Implement user interfaces",
161
- backstory="Expert in frontend technologies"
162
- ),
163
- self._create_agent(
164
- role="Backend Engineer",
165
- goal="Implement server-side features",
166
- backstory="Expert in backend technologies"
167
- )
168
- ]
169
-
170
- def _create_qa_team(self):
171
- return [
172
- self._create_agent(
173
- role="QA Lead",
174
- goal="Ensure product quality",
175
- backstory="Expert in quality assurance"
176
- ),
177
- self._create_agent(
178
- role="QA Engineer",
179
- goal="Test and validate features",
180
- backstory="Experienced in software testing"
181
- )
182
- ]
183
-
184
- def _initialize_tasks(self):
185
- return [] # Initialize with empty task list
186
-
187
- class TaskManagementSystem:
188
- def __init__(self):
189
- self.priorities = {
190
- "P0": "Critical - Must be done immediately",
191
- "P1": "High - Must be done this sprint",
192
- "P2": "Medium - Should be done this sprint",
193
- "P3": "Low - Nice to have"
194
- }
195
 
196
- self.task_types = {
197
- "FEATURE": "New feature development",
198
- "BUG": "Bug fix",
199
- "TECH_DEBT": "Technical debt",
200
- "IMPROVEMENT": "Improvement to existing feature"
201
- }
202
-
203
- self.departments = {
204
- "ENGINEERING": ["Backend", "Frontend", "DevOps"],
205
- "PRODUCT": ["Design", "Product Management"],
206
- "QA": ["Testing", "Automation"],
207
- "MANAGEMENT": ["Executive", "Team Lead"]
208
- }
209
-
210
- def create_sprint_tasks(self, meeting_output):
211
- sprint_tasks = []
212
-
213
- for item in meeting_output["action_items"]:
214
- task = {
215
- "id": str(uuid.uuid4()),
216
- "title": item["title"],
217
- "description": item["description"],
218
- "assignee": {
219
- "name": item["assignee"],
220
- "department": self._get_department(item.get("assignee_role", "Unknown")),
221
- "role": item.get("assignee_role", "Unknown")
222
- },
223
- "priority": item["priority"],
224
- "type": item["task_type"],
225
- "estimated_hours": item["estimated_hours"],
226
- "due_date": item["due_date"],
227
- "dependencies": item.get("dependencies", []),
228
- "subtasks": self._create_subtasks(item),
229
- "acceptance_criteria": item["acceptance_criteria"],
230
- "resources_needed": item.get("resources_needed", []),
231
- "status": "TO_DO",
232
- "progress": 0,
233
- "reviews_required": self._get_required_reviews(item),
234
- "created_by": CURRENT_USER,
235
- "created_at": CURRENT_UTC_TIME,
236
- "updated_at": CURRENT_UTC_TIME,
237
- "tags": item.get("tags", []),
238
- "related_documents": item.get("related_documents", [])
239
- }
240
-
241
- sprint_tasks.append(task)
242
-
243
- return sprint_tasks
244
-
245
- def _get_department(self, role):
246
- for dept, roles in self.departments.items():
247
- if any(r in role for r in roles):
248
- return dept
249
- return "UNKNOWN"
250
-
251
- def _create_subtasks(self, task_item):
252
- subtasks = []
253
- if "subtasks" in task_item:
254
- for subtask in task_item["subtasks"]:
255
- subtask_obj = {
256
- "id": str(uuid.uuid4()),
257
- "title": subtask["title"],
258
- "description": subtask["description"],
259
- "assignee": subtask["assignee"],
260
- "status": "TO_DO",
261
- "estimated_hours": subtask["estimated_hours"],
262
- "dependencies": subtask.get("dependencies", []),
263
- "created_by": CURRENT_USER,
264
- "created_at": CURRENT_UTC_TIME
265
- }
266
- subtasks.append(subtask_obj)
267
- return subtasks
268
-
269
- def _get_required_reviews(self, task_item):
270
- reviews = {
271
- "code_review": {
272
- "required": True if task_item["type"] in ["FEATURE", "BUG", "TECH_DEBT"] else False,
273
- "reviewers": []
274
- },
275
- "design_review": {
276
- "required": True if task_item["type"] == "FEATURE" else False,
277
- "reviewers": []
278
- },
279
- "qa_review": {
280
- "required": True,
281
- "reviewers": []
282
- }
283
- }
284
- return reviews
285
-
286
- def generate_sprint_report(self, tasks):
287
  return {
288
- "sprint_summary": {
289
- "total_tasks": len(tasks),
290
- "completed_tasks": len([t for t in tasks if t["status"] == "DONE"]),
291
- "in_progress": len([t for t in tasks if t["status"] == "IN_PROGRESS"]),
292
- "blocked": len([t for t in tasks if t["status"] == "BLOCKED"]),
293
- "total_hours": sum(t["estimated_hours"] for t in tasks)
294
- },
295
- "priority_breakdown": self._get_priority_breakdown(tasks),
296
- "department_breakdown": self._get_department_breakdown(tasks),
297
- "risk_assessment": self._assess_risks(tasks),
298
- "recommendations": self._generate_recommendations(tasks)
299
  }
300
 
301
- def _get_priority_breakdown(self, tasks):
302
- breakdown = {"P0": 0, "P1": 0, "P2": 0, "P3": 0}
303
- for task in tasks:
304
- breakdown[task["priority"]] += 1
305
- return breakdown
306
-
307
- def _get_department_breakdown(self, tasks):
308
- breakdown = {dept: 0 for dept in self.departments.keys()}
309
- for task in tasks:
310
- dept = task["assignee"]["department"]
311
- breakdown[dept] = breakdown.get(dept, 0) + 1
312
- return breakdown
313
-
314
- def _assess_risks(self, tasks):
315
- risks = []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
316
  for task in tasks:
317
- if task["priority"] in ["P0", "P1"] and task["status"] != "DONE":
318
- risks.append({
319
- "task_id": task["id"],
320
- "title": task["title"],
321
- "risk_level": "HIGH" if task["priority"] == "P0" else "MEDIUM",
322
- "reason": "High priority task not completed"
323
- })
324
- return risks
325
-
326
- def _generate_recommendations(self, tasks):
327
- recommendations = []
328
- priority_breakdown = self._get_priority_breakdown(tasks)
329
-
330
- if priority_breakdown["P0"] > 3:
331
- recommendations.append("Too many critical tasks. Consider re-evaluating priorities.")
332
-
333
- blocked_tasks = [t for t in tasks if t["status"] == "BLOCKED"]
334
- if blocked_tasks:
335
- recommendations.append(f"Address {len(blocked_tasks)} blocked tasks to improve sprint velocity.")
336
-
337
- return recommendations
338
-
339
- def create_meeting_ui(project):
340
- st.subheader("Meeting Notes")
341
- attendees = st.multiselect("Attendees", ["CEO", "CTO", "CPO", "Engineering Team", "Product Team"])
342
- agenda = st.text_area("Agenda")
343
- decisions = st.text_area("Decisions")
344
-
345
- st.subheader("Action Items")
346
- action_items = []
347
-
348
- num_items = st.number_input("Number of Action Items", min_value=1, value=1)
349
-
350
- for i in range(int(num_items)):
351
- with st.expander(f"Action Item {i+1}"):
352
- action_item = create_action_item_ui(i)
353
- action_items.append(action_item)
354
-
355
- if st.button("Generate Tasks"):
356
- task_system = TaskManagementSystem()
357
- tasks = task_system.create_sprint_tasks({"action_items": action_items})
358
- st.session_state.tasks = tasks
359
- st.success(f"Generated {len(tasks)} tasks successfully!")
360
-
361
- def create_action_item_ui(index):
362
- return {
363
- "title": st.text_input(f"Title #{index+1}"),
364
- "description": st.text_area(f"Description #{index+1}"),
365
- "assignee": st.selectbox(f"Assignee #{index+1}", ["CEO", "CTO", "CPO", "Engineer 1", "Engineer 2"]),
366
- "priority": st.selectbox(f"Priority #{index+1}", ["P0", "P1", "P2", "P3"]),
367
- "due_date": st.date_input(f"Due Date #{index+1}"),
368
- "task_type": st.selectbox(f"Task Type #{index+1}", ["FEATURE", "BUG", "TECH_DEBT", "IMPROVEMENT"]),
369
- "estimated_hours": st.number_input(f"Estimated Hours #{index+1}", min_value=1),
370
- "acceptance_criteria": st.text_area(f"Acceptance Criteria #{index+1}"),
371
- "dependencies": st.multiselect(f"Dependencies #{index+1}", ["Task A", "Task B", "Task C"]),
372
- }
373
-
374
- def display_tasks_ui(project):
375
- if "tasks" in st.session_state:
376
- for task in st.session_state.tasks:
377
  with st.expander(f"Task: {task['title']}"):
378
- st.write(f"**Assignee:** {task['assignee']['name']}")
379
  st.write(f"**Priority:** {task['priority']}")
380
- st.write(f"**Due Date:** {task['due_date']}")
381
  st.write(f"**Description:** {task['description']}")
 
 
 
 
382
 
383
- if task['subtasks']:
384
- st.subheader("Subtasks")
385
- for subtask in task['subtasks']:
386
- st.write(f"- {subtask['title']}")
387
-
388
- def display_reports_ui(project):
389
- if "tasks" in st.session_state:
390
- task_system = TaskManagementSystem()
391
- report = task_system.generate_sprint_report(st.session_state.tasks)
392
-
393
- st.subheader("Sprint Summary")
394
- col1, col2, col3, col4 = st.columns(4)
395
-
396
- with col1:
397
- st.metric("Total Tasks", report["sprint_summary"]["total_tasks"])
398
- with col2:
399
- st.metric("Completed", report["sprint_summary"]["completed_tasks"])
400
- with col3:
401
- st.metric("In Progress", report["sprint_summary"]["in_progress"])
402
- with col4:
403
- st.metric("Blocked", report["sprint_summary"]["blocked"])
404
-
405
- st.subheader("Priority Breakdown")
406
- st.bar_chart(report["priority_breakdown"])
407
-
408
- st.subheader("Department Distribution")
409
- st.bar_chart(report["department_breakdown"])
410
-
411
- st.subheader("Risk Assessment")
412
- risks = report["risk_assessment"]
413
- if risks:
414
- for risk in risks:
415
- with st.expander(f"Risk: {risk['title']}"):
416
- st.write(f"**Risk Level:** {risk['risk_level']}")
417
- st.write(f"**Reason:** {risk['reason']}")
418
- else:
419
- st.success("No high-risk items identified")
420
-
421
- # Recommendations
422
- st.subheader("Recommendations")
423
- for rec in report["recommendations"]:
424
- st.info(rec)
425
-
426
- # Export Options
427
- st.subheader("Export Report")
428
- report_json = json.dumps(report, indent=2, default=str)
429
- st.download_button(
430
- label="Download Report (JSON)",
431
- data=report_json,
432
- file_name=f"sprint_report_{CURRENT_UTC_TIME.strftime('%Y%m%d_%H%M%S')}.json",
433
- mime="application/json"
434
- )
435
 
436
  def main():
437
- st.set_page_config(page_title="AI Project Management", layout="wide")
438
 
439
- # Display current user and time
440
  st.sidebar.info(f"Current User: {CURRENT_USER}")
441
  st.sidebar.info(f"Current Time (UTC): {CURRENT_UTC_TIME.strftime('%Y-%m-%d %H:%M:%S')}")
442
 
443
- # Initialize LLM
444
- llm = initialize_llm()
445
- if llm is None:
446
- st.error("Failed to initialize the application")
447
- return
448
-
449
- # Initialize tools
450
- global tools
451
- tools = initialize_tools(llm)
452
- if not tools:
453
- st.warning("Some tools failed to initialize. Limited functionality available.")
454
-
455
- # Set global LLM
456
- global llm_global
457
- llm_global = llm
458
-
459
- # Project Setup
460
- with st.sidebar:
461
- project_name = st.text_input("Project Name", "E-commerce Platform")
462
- project_type = st.selectbox("Project Type", ["E-commerce", "SaaS", "Mobile App", "Enterprise"])
463
 
464
- try:
465
- # Initialize Project Crew
466
- project = ProjectCrew(project_name, project_type)
467
-
468
- # Main content tabs
469
- tab1, tab2, tab3 = st.tabs(["Meeting Management", "Task Management", "Reports"])
470
-
471
- with tab1:
472
- st.header("Meeting Management")
473
- meeting_type = st.selectbox("Meeting Type", ["Sprint Planning", "Daily Standup", "Retrospective"])
474
-
475
- if st.button("Start Meeting"):
476
- create_meeting_ui(project)
477
-
478
- with tab2:
479
- st.header("Task Management")
480
- display_tasks_ui(project)
481
-
482
- with tab3:
483
- st.header("Reports")
484
- display_reports_ui(project)
485
-
486
- except Exception as e:
487
- st.error(f"An error occurred: {str(e)}")
488
- logger.exception("Error in main application flow")
489
 
490
  if __name__ == "__main__":
491
- try:
492
- # Set timezone and current time
493
- CURRENT_UTC_TIME = datetime.strptime("2025-02-04 19:05:18", "%Y-%m-%d %H:%M:%S")
494
- CURRENT_USER = "ChadSaglam"
495
-
496
- # Initialize session state if not exists
497
- if 'tasks' not in st.session_state:
498
- st.session_state.tasks = []
499
-
500
- if 'project' not in st.session_state:
501
- st.session_state.project = None
502
-
503
- # Initialize global variables
504
- global llm
505
- global tools
506
- global llm_global
507
-
508
- main()
509
-
510
- except Exception as e:
511
- st.error("Application failed to start")
512
- logger.exception("Fatal error in application startup")
 
1
  import streamlit as st
2
  import os
 
 
 
 
 
 
 
3
  from datetime import datetime
4
  import logging
5
  import uuid
6
  import pytz
7
+ from typing import List, Dict
8
 
9
  # Configure logging
10
+ logging.basicConfig(level=logging.INFO)
 
 
 
11
  logger = logging.getLogger(__name__)
12
 
13
+ # Global variables
14
+ CURRENT_UTC_TIME = datetime.strptime("2025-02-04 19:14:50", "%Y-%m-%d %H:%M:%S")
 
 
15
  CURRENT_USER = "ChadSaglam"
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
+ class MeetingParticipant:
18
+ def __init__(self, role: str, department: str):
19
+ self.role = role
20
+ self.department = department
21
+ self.comments: List[str] = []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
+ class Meeting:
24
+ def __init__(self, meeting_type: str, project_name: str, project_type: str):
25
+ self.meeting_type = meeting_type
 
 
 
 
 
 
26
  self.project_name = project_name
27
  self.project_type = project_type
28
+ self.date = CURRENT_UTC_TIME
29
+ self.participants = self._initialize_participants()
30
+ self.discussion_points: List[str] = []
31
+ self.action_items: List[Dict] = []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
+ def _initialize_participants(self) -> Dict[str, MeetingParticipant]:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  return {
35
+ "CEO": MeetingParticipant("CEO", "Executive"),
36
+ "CTO": MeetingParticipant("CTO", "Executive"),
37
+ "CPO": MeetingParticipant("CPO", "Executive"),
38
+ "Engineering Manager": MeetingParticipant("Engineering Manager", "Engineering"),
39
+ "Product Manager": MeetingParticipant("Product Manager", "Product")
 
 
 
 
 
 
40
  }
41
 
42
+ def simulate_sprint_planning():
43
+ discussion = [
44
+ ("CEO", "Our goal this quarter is to increase user engagement by 25%."),
45
+ ("CPO", "We should focus on improving the user interface and adding personalization features."),
46
+ ("CTO", "We'll need to optimize our backend services to handle increased traffic."),
47
+ ("Engineering Manager", "We can split the work into frontend improvements and backend optimization."),
48
+ ("Product Manager", "Let's prioritize the shopping cart experience and recommendation engine.")
49
+ ]
50
+
51
+ tasks = [
52
+ {
53
+ "id": str(uuid.uuid4()),
54
+ "title": "Implement Personalized Product Recommendations",
55
+ "owner": "Engineering Team",
56
+ "priority": "P1",
57
+ "description": "Develop AI-powered recommendation engine for product suggestions",
58
+ "subtasks": [
59
+ "Design recommendation algorithm",
60
+ "Implement data collection pipeline",
61
+ "Create API endpoints",
62
+ "Add frontend components"
63
+ ],
64
+ "estimated_hours": 80,
65
+ "dependencies": [],
66
+ "status": "TO_DO"
67
+ },
68
+ {
69
+ "id": str(uuid.uuid4()),
70
+ "title": "Optimize Shopping Cart Experience",
71
+ "owner": "Product Team",
72
+ "priority": "P0",
73
+ "description": "Improve cart UI/UX and add one-click checkout",
74
+ "subtasks": [
75
+ "Redesign cart interface",
76
+ "Implement quick checkout flow",
77
+ "Add saved payment methods",
78
+ "Optimize mobile experience"
79
+ ],
80
+ "estimated_hours": 60,
81
+ "dependencies": [],
82
+ "status": "TO_DO"
83
+ }
84
+ ]
85
+
86
+ return discussion, tasks
87
+
88
+ def simulate_daily_standup():
89
+ discussion = [
90
+ ("Engineering Manager", "Yesterday we completed the basic recommendation engine setup."),
91
+ ("Product Manager", "The new cart design mockups are ready for review."),
92
+ ("CTO", "Any blocking issues we need to address?"),
93
+ ("Engineering Manager", "We need more test data for the recommendation engine."),
94
+ ("Product Manager", "Waiting for feedback on the checkout flow from the UX team.")
95
+ ]
96
+ return discussion
97
+
98
+ def simulate_retrospective():
99
+ discussion = [
100
+ ("CPO", "What went well in this sprint?"),
101
+ ("Engineering Manager", "Team completed all high-priority tasks on time."),
102
+ ("Product Manager", "User feedback on new features has been positive."),
103
+ ("CTO", "What could we improve?"),
104
+ ("Engineering Manager", "We need better test coverage for new features.")
105
+ ]
106
+ return discussion
107
+
108
+ def display_meeting(meeting_type: str):
109
+ st.header(f"{meeting_type} - E-commerce Platform (Website)")
110
+ st.subheader("Meeting Details")
111
+ st.write(f"Date: {CURRENT_UTC_TIME.strftime('%Y-%m-%d %H:%M:%S UTC')}")
112
+ st.write(f"Project: E-commerce Platform")
113
+ st.write(f"Type: Website")
114
+
115
+ if meeting_type == "Sprint Planning":
116
+ discussion, tasks = simulate_sprint_planning()
117
+
118
+ st.subheader("Discussion")
119
+ for role, comment in discussion:
120
+ st.write(f"**{role}**: {comment}")
121
+
122
+ st.subheader("Sprint Tasks")
123
  for task in tasks:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  with st.expander(f"Task: {task['title']}"):
125
+ st.write(f"**Owner:** {task['owner']}")
126
  st.write(f"**Priority:** {task['priority']}")
 
127
  st.write(f"**Description:** {task['description']}")
128
+ st.write(f"**Estimated Hours:** {task['estimated_hours']}")
129
+ st.write("**Subtasks:**")
130
+ for subtask in task['subtasks']:
131
+ st.write(f"- {subtask}")
132
 
133
+ elif meeting_type == "Daily Standup":
134
+ discussion = simulate_daily_standup()
135
+ st.subheader("Updates")
136
+ for role, update in discussion:
137
+ st.write(f"**{role}**: {update}")
138
+
139
+ elif meeting_type == "Retrospective":
140
+ discussion = simulate_retrospective()
141
+ st.subheader("Discussion Points")
142
+ for role, point in discussion:
143
+ st.write(f"**{role}**: {point}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
145
  def main():
146
+ st.set_page_config(page_title="E-commerce Platform Meetings", layout="wide")
147
 
 
148
  st.sidebar.info(f"Current User: {CURRENT_USER}")
149
  st.sidebar.info(f"Current Time (UTC): {CURRENT_UTC_TIME.strftime('%Y-%m-%d %H:%M:%S')}")
150
 
151
+ meeting_type = st.selectbox(
152
+ "Select Meeting Type",
153
+ ["Sprint Planning", "Daily Standup", "Retrospective"]
154
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
 
156
+ display_meeting(meeting_type)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
 
158
  if __name__ == "__main__":
159
+ main()