refactor(task): use lipgloss/table for list output

Amolith created

Assisted-by: Claude Opus 4.5 via Crush

Change summary

cmd/task/list.go | 29 ++++++++++++++++++-----------
1 file changed, 18 insertions(+), 11 deletions(-)

Detailed changes

cmd/task/list.go 🔗

@@ -8,7 +8,6 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
-	"text/tabwriter"
 	"time"
 
 	"git.secluded.site/go-lunatask"
@@ -16,6 +15,8 @@ import (
 	"git.secluded.site/lune/internal/completion"
 	"git.secluded.site/lune/internal/config"
 	"git.secluded.site/lune/internal/ui"
+	"github.com/charmbracelet/lipgloss"
+	"github.com/charmbracelet/lipgloss/table"
 	"github.com/spf13/cobra"
 )
 
@@ -180,11 +181,7 @@ func outputJSON(cmd *cobra.Command, tasks []lunatask.Task) error {
 }
 
 func outputTable(cmd *cobra.Command, tasks []lunatask.Task) error {
-	writer := tabwriter.NewWriter(cmd.OutOrStdout(), 0, 0, 2, ' ', 0)
-
-	header := ui.Bold.Render("ID") + "\t" + ui.Bold.Render("STATUS") + "\t" +
-		ui.Bold.Render("SCHEDULED") + "\t" + ui.Bold.Render("CREATED")
-	fmt.Fprintln(writer, header)
+	rows := make([][]string, 0, len(tasks))
 
 	for _, task := range tasks {
 		status := "-"
@@ -194,17 +191,27 @@ func outputTable(cmd *cobra.Command, tasks []lunatask.Task) error {
 
 		scheduled := "-"
 		if task.ScheduledOn != nil {
-			scheduled = task.ScheduledOn.String()
+			scheduled = ui.FormatDate(task.ScheduledOn.Time)
 		}
 
 		created := ui.FormatDate(task.CreatedAt)
 
-		fmt.Fprintf(writer, "%s\t%s\t%s\t%s\n", task.ID, status, scheduled, created)
+		rows = append(rows, []string{task.ID, status, scheduled, created})
 	}
 
-	if err := writer.Flush(); err != nil {
-		return fmt.Errorf("writing output: %w", err)
-	}
+	tbl := table.New().
+		Headers("ID", "STATUS", "SCHEDULED", "CREATED").
+		Rows(rows...).
+		StyleFunc(func(row, col int) lipgloss.Style {
+			if row == table.HeaderRow {
+				return ui.Bold
+			}
+
+			return lipgloss.NewStyle()
+		}).
+		Border(lipgloss.HiddenBorder())
+
+	fmt.Fprintln(cmd.OutOrStdout(), tbl.Render())
 
 	return nil
 }