diff --git a/cmd/pm/tasks/backlogRefinement.go b/cmd/pm/tasks/backlogRefinement.go index f1ed46b..61be858 100644 --- a/cmd/pm/tasks/backlogRefinement.go +++ b/cmd/pm/tasks/backlogRefinement.go @@ -36,8 +36,8 @@ func (t *BacklogRefinementTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/refinement-task-stats.json") } -func (t *BacklogRefinementTask) Details() TaskDetails { - return BaseDetails(). +func (t *BacklogRefinementTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType). WithTitle("Backlog Refinement Task"). WithDescription(backlogRefinementDescription). WithTimeToComplete("12m"). diff --git a/cmd/pm/tasks/base.go b/cmd/pm/tasks/base.go index ca78479..4c5c4d5 100644 --- a/cmd/pm/tasks/base.go +++ b/cmd/pm/tasks/base.go @@ -51,12 +51,37 @@ func InterfaceToType(it Interface) InterfaceType { } } -func BaseDetails() TaskDetails { +func BaseDetails(interfaceType InterfaceType) TaskDetails { + + var interfaceDesc string + + switch interfaceType { + case InterfaceTypeREPL: + interfaceDesc = `How to use the REPL Interface +- The REPL interface allows you to interact with the task using a command-line interface. +- You can type commands to perform actions related to the task, such as creating issues, updating statuses, etc. +- The interface will provide prompts and feedback based on your inputs.` + case InterfaceTypeTUI: + interfaceDesc = `How to use the TUI Interface +- The TUI (Text User Interface) provides a more interactive experience in the terminal. +- You can navigate through menus, select options, and view task details in a structured format. +- Use keyboard shortcuts to perform actions and explore different sections of the interface.` + case InterfaceTypeWeb: + interfaceDesc = `How to use the Web Interface +- The Web interface allows you to interact with the task through a web browser. +- You can access the interface by navigating to the provided URL. +- The interface will have buttons, forms, and other interactive elements to help you complete the task.` + default: + interfaceDesc = "Unknown Interface" + } + return TaskDetails{ - Title: "Base Task", - Description: "This is a base task.", - TimeToComplete: "10m", - Difficulty: "Easy", + Title: "Base Task", + Description: "This is a base task.", + TimeToComplete: "10m", + Difficulty: "Easy", + InterfaceType: interfaceType, + InterfaceDescription: interfaceDesc, } } diff --git a/cmd/pm/tasks/codingTask.go b/cmd/pm/tasks/codingTask.go index 754f94c..d2a4f3a 100644 --- a/cmd/pm/tasks/codingTask.go +++ b/cmd/pm/tasks/codingTask.go @@ -84,8 +84,8 @@ func (t *CodingTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/coding-task-stats.json") } -func (t *CodingTask) Details() TaskDetails { - return BaseDetails().WithTitle("Coding Task").WithDescription(codingDescription) +func (t *CodingTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType).WithTitle("Coding Task").WithDescription(codingDescription) } func (t *CodingTask) Questions(interfaceType InterfaceType) (questions Questions) { diff --git a/cmd/pm/tasks/createIssue.go b/cmd/pm/tasks/createIssue.go index a600c47..6f0b7e5 100644 --- a/cmd/pm/tasks/createIssue.go +++ b/cmd/pm/tasks/createIssue.go @@ -34,8 +34,8 @@ func (t *CreateIssueTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/create-issue-stats.json") } -func (t *CreateIssueTask) Details() TaskDetails { - return BaseDetails().WithTitle("Create Issue Task").WithDescription(description) +func (t *CreateIssueTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType).WithTitle("Create Issue Task").WithDescription(description) } func (t *CreateIssueTask) Questions(interfaceType InterfaceType) Questions { diff --git a/cmd/pm/tasks/dependencyManagement.go b/cmd/pm/tasks/dependencyManagement.go index c7c92f3..e2554d4 100644 --- a/cmd/pm/tasks/dependencyManagement.go +++ b/cmd/pm/tasks/dependencyManagement.go @@ -34,8 +34,8 @@ func (t *DependencyManagementTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/dependency-task-stats.json") } -func (t *DependencyManagementTask) Details() TaskDetails { - return BaseDetails(). +func (t *DependencyManagementTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType). WithTitle("Dependency Management Task"). WithDescription(dependencyManagementDescription). WithTimeToComplete("15m"). diff --git a/cmd/pm/tasks/gitTask.go b/cmd/pm/tasks/gitTask.go index a98d2cf..3ff56f5 100644 --- a/cmd/pm/tasks/gitTask.go +++ b/cmd/pm/tasks/gitTask.go @@ -47,8 +47,8 @@ func (t *GitTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/git-task-stats.json") } -func (t *GitTask) Details() TaskDetails { - return BaseDetails().WithTitle("Git Task").WithDescription(gitTaskDescription) +func (t *GitTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType).WithTitle("Git Task").WithDescription(gitTaskDescription) } func (t *GitTask) Questions(interfaceType InterfaceType) Questions { diff --git a/cmd/pm/tasks/issueTriage.go b/cmd/pm/tasks/issueTriage.go index a2c64ce..7d5429a 100644 --- a/cmd/pm/tasks/issueTriage.go +++ b/cmd/pm/tasks/issueTriage.go @@ -34,8 +34,8 @@ func (t *IssueTriageTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/triage-task-stats.json") } -func (t *IssueTriageTask) Details() TaskDetails { - return BaseDetails(). +func (t *IssueTriageTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType). WithTitle("Issue Triage Task"). WithDescription(issueTriageDescription). WithTimeToComplete("12m"). diff --git a/cmd/pm/tasks/milestoneTracking.go b/cmd/pm/tasks/milestoneTracking.go index f6ce7fd..5e6210e 100644 --- a/cmd/pm/tasks/milestoneTracking.go +++ b/cmd/pm/tasks/milestoneTracking.go @@ -35,8 +35,8 @@ func (t *MilestoneTrackingTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/milestone-task-stats.json") } -func (t *MilestoneTrackingTask) Details() TaskDetails { - return BaseDetails(). +func (t *MilestoneTrackingTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType). WithTitle("Milestone Tracking Task"). WithDescription(milestoneTrackingDescription). WithTimeToComplete("10m"). diff --git a/cmd/pm/tasks/priorityManagement.go b/cmd/pm/tasks/priorityManagement.go index a5b2b5c..2c27113 100644 --- a/cmd/pm/tasks/priorityManagement.go +++ b/cmd/pm/tasks/priorityManagement.go @@ -35,8 +35,8 @@ func (t *PriorityManagementTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/priority-task-stats.json") } -func (t *PriorityManagementTask) Details() TaskDetails { - return BaseDetails(). +func (t *PriorityManagementTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType). WithTitle("Priority Management Task"). WithDescription(priorityManagementDescription). WithTimeToComplete("8m"). diff --git a/cmd/pm/tasks/reportGeneration.go b/cmd/pm/tasks/reportGeneration.go index 2b3e735..3a0cc7a 100644 --- a/cmd/pm/tasks/reportGeneration.go +++ b/cmd/pm/tasks/reportGeneration.go @@ -35,8 +35,8 @@ func (t *ReportGenerationTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/report-task-stats.json") } -func (t *ReportGenerationTask) Details() TaskDetails { - return BaseDetails(). +func (t *ReportGenerationTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType). WithTitle("Status Report Generation"). WithDescription(reportGenerationDescription). WithTimeToComplete("10m"). diff --git a/cmd/pm/tasks/sprintPlanning.go b/cmd/pm/tasks/sprintPlanning.go index 9d5a5fd..a7ecf66 100644 --- a/cmd/pm/tasks/sprintPlanning.go +++ b/cmd/pm/tasks/sprintPlanning.go @@ -36,8 +36,8 @@ func (t *SprintPlanningTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/sprint-planning-stats.json") } -func (t *SprintPlanningTask) Details() TaskDetails { - return BaseDetails(). +func (t *SprintPlanningTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType). WithTitle("Sprint Planning Task"). WithDescription(sprintPlanningDescription). WithTimeToComplete("15m"). diff --git a/cmd/pm/tasks/stakeholderUpdate.go b/cmd/pm/tasks/stakeholderUpdate.go index de34665..67ecf6b 100644 --- a/cmd/pm/tasks/stakeholderUpdate.go +++ b/cmd/pm/tasks/stakeholderUpdate.go @@ -36,8 +36,8 @@ func (t *StakeholderUpdateTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/stakeholder-task-stats.json") } -func (t *StakeholderUpdateTask) Details() TaskDetails { - return BaseDetails(). +func (t *StakeholderUpdateTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType). WithTitle("Stakeholder Update Task"). WithDescription(stakeholderUpdateDescription). WithTimeToComplete("10m"). diff --git a/cmd/pm/tasks/teamCapacity.go b/cmd/pm/tasks/teamCapacity.go index 3f3fb03..8cfbbab 100644 --- a/cmd/pm/tasks/teamCapacity.go +++ b/cmd/pm/tasks/teamCapacity.go @@ -35,8 +35,8 @@ func (t *TeamCapacityTask) Config() Config { return BaseConfig().WithStatisticsStoragePath("./.pm/capacity-task-stats.json") } -func (t *TeamCapacityTask) Details() TaskDetails { - return BaseDetails(). +func (t *TeamCapacityTask) Details(interfaceType InterfaceType) TaskDetails { + return BaseDetails(interfaceType). WithTitle("Team Capacity Management"). WithDescription(teamCapacityDescription). WithTimeToComplete("12m"). diff --git a/internal/models/task.go b/internal/models/task.go index 88d385a..50ad3e5 100644 --- a/internal/models/task.go +++ b/internal/models/task.go @@ -8,7 +8,7 @@ import ( type Tasker interface { Config() Config - Details() TaskDetails + Details(InterfaceType) TaskDetails Setup(context.Context) error Questions(InterfaceType) Questions Validate(context.Context) ValidationFeedback @@ -32,10 +32,12 @@ type ValidatedInterface interface { } type TaskDetails struct { - Title string - Description string - TimeToComplete string - Difficulty string + Title string + Description string + TimeToComplete string + Difficulty string + InterfaceType InterfaceType + InterfaceDescription string } func (td TaskDetails) WithTitle(title string) TaskDetails { @@ -58,6 +60,16 @@ func (td TaskDetails) WithDifficulty(difficulty string) TaskDetails { return td } +func (td TaskDetails) WithInterfaceType(interfaceType InterfaceType) TaskDetails { + td.InterfaceType = interfaceType + return td +} + +func (td TaskDetails) WithInterfaceDescription(desc string) TaskDetails { + td.InterfaceDescription = desc + return td +} + type Questions []*huh.Group func (q Questions) With(group *huh.Group) Questions { diff --git a/pkg/task/runner.go b/pkg/task/runner.go index 17597ef..0349c84 100644 --- a/pkg/task/runner.go +++ b/pkg/task/runner.go @@ -42,7 +42,7 @@ func NewTaskRunner(app *App) *TaskRunner { func (r *TaskRunner) Run(ctx context.Context, t Tasker, i Interface, iType InterfaceType) (runErr error) { config := t.Config() - details := t.Details() + details := t.Details(iType) lifecycle := NewRunLifecycle(r.app, config, details, iType, r.logger) diff --git a/pkg/task/taskui.go b/pkg/task/taskui.go index 2f7086b..0d50afd 100644 --- a/pkg/task/taskui.go +++ b/pkg/task/taskui.go @@ -18,11 +18,13 @@ type TaskModel struct { keys TaskHelpKeys width, height int userQuit bool + aboutVisible bool } type TaskHelpKeys struct { Quit key.Binding Start key.Binding + About key.Binding } var DefaultTaskKeys = TaskHelpKeys{ @@ -34,6 +36,10 @@ var DefaultTaskKeys = TaskHelpKeys{ key.WithKeys("enter"), key.WithHelp("enter", "Start"), ), + About: key.NewBinding( + key.WithKeys("?"), + key.WithHelp("?", "Details about the interface"), + ), } func NewTaskModel(details TaskDetails) TaskModel { @@ -58,8 +64,12 @@ func (m TaskModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, tea.Quit case key.Matches(msg, m.keys.Start): return m, tea.Quit + case key.Matches(msg, m.keys.About): + m.aboutVisible = !m.aboutVisible + return m, nil } } + return m, nil } @@ -71,10 +81,9 @@ func (m TaskModel) View() string { boxWidth := min(m.width-10, 120) - detailsText := fmt.Sprintf("Time to complete: %s | Difficulty: %s", m.TimeToComplete, m.Difficulty) + detailsText := fmt.Sprintf("Interface Type: %s | Time to complete: %s | Difficulty: %s", m.InterfaceType, m.TimeToComplete, m.Difficulty) - boxStyle := style.BorderStyle. - Margin(1, 0).Padding(2, 4).Width(boxWidth) + boxStyle := style.BorderStyle.Padding(2, 4).Width(boxWidth) var b strings.Builder @@ -88,10 +97,16 @@ func (m TaskModel) View() string { style.TextStyle.Foreground(style.SecondaryColor).Render(detailsText), ) - b.WriteString(boxStyle.Render(content)) + if m.aboutVisible { + b.WriteString(boxStyle.Render(m.InterfaceDescription)) + } else { + b.WriteString(boxStyle.Render(content)) + + } + b.WriteString("\n") - helpText := "Press " + m.keys.Start.Help().Key + " to start • " + m.keys.Quit.Help().Key + " to quit" + helpText := "Press " + m.keys.Start.Help().Key + " to start • " + m.keys.Quit.Help().Key + " to quit • " + m.keys.About.Help().Key + " " + m.keys.About.Help().Desc b.WriteString(style.HelpStyle.Render(helpText)) final := lipgloss.Place(m.width, m.height, lipgloss.Center, lipgloss.Center, b.String())