feat: add CLI commands for usage analysis, cost breakdown, and setup

Implement the complete Cobra command tree (11 subcommands):

- cmd/root.go: Root command with persistent flags (--days, --project,
  --model, --no-cache, --data-dir, --quiet, --no-subagents). Shared
  loadData() orchestrates the full pipeline: tries cache-assisted
  loading first, falls back to uncached parse on cache failure,
  reports progress to stderr. applyFilters() applies project/model
  substring filters and computes the time window.

- cmd/summary.go: Default command (also "cburn summary"). Renders a
  bordered metrics table with token breakdown (5 types), cost with
  cache savings, and per-day rates with period-over-period deltas.

- cmd/costs.go: Detailed cost analysis — breaks down costs by token
  type (output, cache_write_1h, input, cache_write_5m, cache_read)
  with share percentages, period comparison bar chart, and per-model
  cost breakdown (input/output/cache/total columns).

- cmd/daily.go: Daily usage table (date, weekday, sessions, prompts,
  tokens, cost) sorted most-recent-first.

- cmd/hourly.go: Activity heatmap showing prompt distribution across
  24 hours with Unicode block bars, reports peak hour.

- cmd/models.go: Model usage ranking with API call counts, token
  volumes, cost, and usage share percentage.

- cmd/projects.go: Project ranking by cost with session/prompt/token
  counts.

- cmd/sessions.go: Session list sorted by recency with --limit flag
  (default 20). Shows start time, project, duration, tokens, cost.
  Marks subagent sessions with "(sub)" suffix.

- cmd/config_cmd.go: Displays current configuration across all
  sections (general, admin API, appearance, budget) with auto-
  detected plan ceiling.

- cmd/setup.go: Interactive first-run wizard — configures Admin API
  key, default time range (7/30/90 days), and color theme (Flexoki
  Dark, Catppuccin Mocha, Tokyo Night, Terminal). Saves to
  ~/.config/cburn/config.toml.

- cmd/tui.go: Launches the interactive Bubble Tea TUI dashboard,
  passing through all filter flags and applying the configured theme.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
teernisse
2026-02-19 13:02:13 -05:00
parent f7d8fea140
commit 5aa184a7ab
11 changed files with 976 additions and 0 deletions

62
cmd/daily.go Normal file
View File

@@ -0,0 +1,62 @@
package cmd
import (
"fmt"
"cburn/internal/cli"
"cburn/internal/pipeline"
"github.com/spf13/cobra"
)
var dailyCmd = &cobra.Command{
Use: "daily",
Short: "Daily usage table",
RunE: runDaily,
}
func init() {
rootCmd.AddCommand(dailyCmd)
}
func runDaily(_ *cobra.Command, _ []string) error {
result, err := loadData()
if err != nil {
return err
}
if len(result.Sessions) == 0 {
fmt.Println("\n No sessions found.")
return nil
}
filtered, since, until := applyFilters(result.Sessions)
days := pipeline.AggregateDays(filtered, since, until)
if len(days) == 0 {
fmt.Println("\n No data for the selected period.")
return nil
}
fmt.Println()
fmt.Println(cli.RenderTitle(fmt.Sprintf("DAILY USAGE Last %dd", flagDays)))
fmt.Println()
rows := make([][]string, 0, len(days))
for _, d := range days {
rows = append(rows, []string{
d.Date.Format("2006-01-02"),
cli.FormatDayOfWeek(int(d.Date.Weekday())),
cli.FormatNumber(int64(d.Sessions)),
cli.FormatNumber(int64(d.Prompts)),
cli.FormatTokens(d.InputTokens + d.OutputTokens + d.CacheCreation5m + d.CacheCreation1h),
cli.FormatCost(d.EstimatedCost),
})
}
fmt.Print(cli.RenderTable(cli.Table{
Headers: []string{"Date", "Day", "Sessions", "Prompts", "Tokens", "Cost"},
Rows: rows,
}))
return nil
}