Implement task resumption feature so participant can resume last task

This commit is contained in:
Robin Olsen
2026-04-03 15:28:48 +02:00
parent 8201a2f310
commit b8303147ab
2 changed files with 56 additions and 4 deletions

View File

@@ -130,6 +130,45 @@ func runStartCmd(cmd *cobra.Command, args []string) error {
survey.Task: surveyTasks[survey.Task],
}
}
startIndex := 0
var resumeFromLast bool
if !cmd.Flags().Changed("task") && !cmd.Flags().Changed("interface") && app.Stats != nil {
stats, err := app.Stats.GetStatistics()
if err == nil && stats.LastTaskName != "" {
taskNames := task.ListTasks()
lastTaskIndex := -1
for i, name := range taskNames {
if t, ok := surveyTasks[name]; ok {
var title string
for _, iface := range interfaces {
title = t.Details(tasks.InterfaceToType(iface)).Title
break
}
if title == stats.LastTaskName {
lastTaskIndex = i
break
}
}
}
if lastTaskIndex >= 0 {
tasksCompleted := lastTaskIndex + 1
if err := huh.NewConfirm().
Title(fmt.Sprintf("Resume from last task? (completed %d/%d tasks)", tasksCompleted, len(taskNames))).
Description("You have uncompleted tasks from a previous session. Would you like to resume where you left off?").
Value(&resumeFromLast).
WithTheme(style.Base16Theme{}).
RunAccessible(cmd.OutOrStdout(), cmd.InOrStdin()); err != nil {
return fmt.Errorf("failed to read user input: %w", err)
}
if resumeFromLast {
startIndex = lastTaskIndex
}
}
}
}
if !cmd.Flags().Changed("dev") {
if err := newIntroModel().Run(); err != nil {
return returnIfUserQuit(err, "failed to run intro")
@@ -147,7 +186,7 @@ func runStartCmd(cmd *cobra.Command, args []string) error {
}
}
if err := taskLoop(cmd.Context(), app, surveyTasks, interfaces); err != nil {
if err := taskLoop(cmd.Context(), app, surveyTasks, interfaces, startIndex); err != nil {
return returnIfUserQuit(err, "task loop failed")
}
@@ -163,6 +202,7 @@ func taskLoop(
application *task.App,
surveyTasks map[string]task.Tasker,
interfaces map[string]task.Interface,
startIndex int,
) error {
var iNames []string
for name := range interfaces {
@@ -182,8 +222,12 @@ func taskLoop(
iNames[i], iNames[j] = iNames[j], iNames[i]
})
idx := 0
for _, taskName := range taskNames {
idx := startIndex
for taskIdx, taskName := range taskNames {
if taskIdx < startIndex {
continue
}
t, ok := surveyTasks[taskName]
if !ok {
continue
@@ -214,8 +258,10 @@ func taskLoop(
if err := runner.Run(ctx, t, selected, tasks.InterfaceToType(selected)); err != nil {
return err
}
idx++
}
return nil
}

View File

@@ -18,10 +18,16 @@ type StatisticsService struct {
mu sync.Mutex
}
func NewStatisticsService(storage *storage.Storage[models.Statistics], logger *slog.Logger) (*StatisticsService, error) {
func NewStatisticsService(
storage *storage.Storage[models.Statistics],
logger *slog.Logger,
) (*StatisticsService, error) {
if err := storage.Init(); err != nil {
return nil, err
}
if err := storage.Load(); err != nil {
return nil, err
}
return &StatisticsService{
storage: storage,
logger: logger,