Three interconnected CLI improvements: New status command (cmd/status.go): - Fetches live claude.ai subscription data using the claudeai client - Renders rate-limit windows (5-hour, 7-day all/Opus/Sonnet) with color-coded progress bars: green <50%, orange 50-80%, red >80% - Shows overage spend limits and usage percentage - Handles partial data gracefully (renders what's available) - Clear onboarding guidance when no session key is configured Setup wizard rewrite (cmd/setup.go): - Replace raw bufio.Reader prompts with charmbracelet/huh multi-step form - Three form groups: welcome screen, credentials (session key + admin key with password echo mode), and preferences (time range + theme select) - Pre-populates from existing config, preserves existing keys on empty input - Dracula theme for the form UI - Graceful Ctrl+C handling via huh.ErrUserAborted Table renderer modernization (internal/cli/render.go): - Replace 120-line manual box-drawing table renderer with lipgloss/table - Automatic column width calculation, rounded borders, right-aligned numeric columns (all except first) - Filter out "---" separator sentinels (not supported by lipgloss/table) - Remove unused style variables (valueStyle, costStyle, tokenStyle, warnStyle) and Table.Widths field Config display update (cmd/config_cmd.go): - Show claude.ai session key and org ID in config output Dependencies (go.mod): - Add charmbracelet/huh v0.8.0 for form-based TUI wizards - Upgrade golang.org/x/text v0.3.8 -> v0.23.0 - Add transitive deps: catppuccin/go, harmonica, hashstructure, etc.
83 lines
1.9 KiB
Go
83 lines
1.9 KiB
Go
// Package cmd implements the cburn CLI commands.
|
|
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"cburn/internal/config"
|
|
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var configCmd = &cobra.Command{
|
|
Use: "config",
|
|
Short: "Show current configuration",
|
|
RunE: runConfig,
|
|
}
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(configCmd)
|
|
}
|
|
|
|
func runConfig(_ *cobra.Command, _ []string) error {
|
|
cfg, err := config.Load()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Printf(" Config file: %s\n", config.Path())
|
|
if config.Exists() {
|
|
fmt.Println(" Status: loaded")
|
|
} else {
|
|
fmt.Println(" Status: using defaults (no config file)")
|
|
}
|
|
fmt.Println()
|
|
|
|
fmt.Println(" [General]")
|
|
fmt.Printf(" Default days: %d\n", cfg.General.DefaultDays)
|
|
fmt.Printf(" Include subagents: %v\n", cfg.General.IncludeSubagents)
|
|
if cfg.General.ClaudeDir != "" {
|
|
fmt.Printf(" Claude directory: %s\n", cfg.General.ClaudeDir)
|
|
}
|
|
fmt.Println()
|
|
|
|
fmt.Println(" [Claude.ai]")
|
|
sessionKey := config.GetSessionKey(cfg)
|
|
if sessionKey != "" {
|
|
fmt.Printf(" Session key: %s\n", maskAPIKey(sessionKey))
|
|
} else {
|
|
fmt.Println(" Session key: not configured")
|
|
}
|
|
if cfg.ClaudeAI.OrgID != "" {
|
|
fmt.Printf(" Org ID: %s\n", cfg.ClaudeAI.OrgID)
|
|
}
|
|
fmt.Println()
|
|
|
|
fmt.Println(" [Admin API]")
|
|
apiKey := config.GetAdminAPIKey(cfg)
|
|
if apiKey != "" {
|
|
fmt.Printf(" API key: %s\n", maskAPIKey(apiKey))
|
|
} else {
|
|
fmt.Println(" API key: not configured")
|
|
}
|
|
fmt.Println()
|
|
|
|
fmt.Println(" [Appearance]")
|
|
fmt.Printf(" Theme: %s\n", cfg.Appearance.Theme)
|
|
fmt.Println()
|
|
|
|
fmt.Println(" [Budget]")
|
|
if cfg.Budget.MonthlyUSD != nil {
|
|
fmt.Printf(" Monthly budget: $%.0f\n", *cfg.Budget.MonthlyUSD)
|
|
} else {
|
|
fmt.Println(" Monthly budget: not set")
|
|
}
|
|
|
|
planInfo := config.DetectPlan(flagDataDir)
|
|
fmt.Printf(" Plan ceiling: $%.0f (auto-detected)\n", planInfo.PlanCeiling)
|
|
fmt.Println()
|
|
|
|
fmt.Println(" Run `cburn setup` to reconfigure.")
|
|
return nil
|
|
}
|