From afa10c5eb9c84e8a78233446ec4c2803b1c868d8 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 30 Sep 2025 17:53:53 -0300 Subject: [PATCH] feat: crush dirs (#551) Signed-off-by: Carlos Alexandro Becker Co-authored-by: Christian Rocha --- internal/cmd/dirs.go | 66 +++++++++++++++++++++++++++++++++++++++++ internal/cmd/logs.go | 1 - internal/cmd/root.go | 9 ++++-- internal/cmd/schema.go | 4 --- internal/config/load.go | 5 ++-- 5 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 internal/cmd/dirs.go diff --git a/internal/cmd/dirs.go b/internal/cmd/dirs.go new file mode 100644 index 0000000000000000000000000000000000000000..d3bc0bd4fb1482e2657eedaab9ce4cee30a09373 --- /dev/null +++ b/internal/cmd/dirs.go @@ -0,0 +1,66 @@ +package cmd + +import ( + "os" + "path/filepath" + + "github.com/charmbracelet/crush/internal/config" + "github.com/charmbracelet/lipgloss/v2" + "github.com/charmbracelet/lipgloss/v2/table" + "github.com/charmbracelet/x/term" + "github.com/spf13/cobra" +) + +var dirsCmd = &cobra.Command{ + Use: "dirs", + Short: "Print directories used by Crush", + Long: `Print the directories where Crush stores its configuration and data files. +This includes the global configuration directory and data directory.`, + Example: ` +# Print all directories +crush dirs + +# Print only the config directory +crush dirs config + +# Print only the data directory +crush dirs data + `, + Run: func(cmd *cobra.Command, args []string) { + if term.IsTerminal(os.Stdout.Fd()) { + // We're in a TTY: make it fancy. + t := table.New(). + Border(lipgloss.RoundedBorder()). + StyleFunc(func(row, col int) lipgloss.Style { + return lipgloss.NewStyle().Padding(0, 2) + }). + Row("Config", filepath.Dir(config.GlobalConfig())). + Row("Data", filepath.Dir(config.GlobalConfigData())) + lipgloss.Println(t) + return + } + // Not a TTY. + cmd.Println(filepath.Dir(config.GlobalConfig())) + cmd.Println(filepath.Dir(config.GlobalConfigData())) + }, +} + +var configDirCmd = &cobra.Command{ + Use: "config", + Short: "Print the configuration directory used by Crush", + Run: func(cmd *cobra.Command, args []string) { + cmd.Println(filepath.Dir(config.GlobalConfig())) + }, +} + +var dataDirCmd = &cobra.Command{ + Use: "data", + Short: "Print the datauration directory used by Crush", + Run: func(cmd *cobra.Command, args []string) { + cmd.Println(filepath.Dir(config.GlobalConfigData())) + }, +} + +func init() { + dirsCmd.AddCommand(configDirCmd, dataDirCmd) +} diff --git a/internal/cmd/logs.go b/internal/cmd/logs.go index 85921c4e4354194d0d260e814fc61222c114d3ef..e7160f4a1307406be20f1fe00a59e93de5232d67 100644 --- a/internal/cmd/logs.go +++ b/internal/cmd/logs.go @@ -68,7 +68,6 @@ var logsCmd = &cobra.Command{ func init() { logsCmd.Flags().BoolP("follow", "f", false, "Follow log output") logsCmd.Flags().IntP("tail", "t", defaultTailLines, "Show only the last N lines default: 1000 for performance") - rootCmd.AddCommand(logsCmd) } func followLogs(ctx context.Context, logsFile string, tailLines int) error { diff --git a/internal/cmd/root.go b/internal/cmd/root.go index 825c35419f17248d1ea854a1a0ae2aca27bcaa20..0a2be1cbe6e480fe5719640711bd4caffb430229 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -33,8 +33,13 @@ func init() { rootCmd.Flags().BoolP("help", "h", false, "Help") rootCmd.Flags().BoolP("yolo", "y", false, "Automatically accept all permissions (dangerous mode)") - rootCmd.AddCommand(runCmd) - rootCmd.AddCommand(updateProvidersCmd) + rootCmd.AddCommand( + runCmd, + dirsCmd, + updateProvidersCmd, + logsCmd, + schemaCmd, + ) } var rootCmd = &cobra.Command{ diff --git a/internal/cmd/schema.go b/internal/cmd/schema.go index f835e250c24ea91a9d5084c9a414ed0e1ae28474..6070eb9144dc0e46bf0f374b2cb1a860f09e83e9 100644 --- a/internal/cmd/schema.go +++ b/internal/cmd/schema.go @@ -24,7 +24,3 @@ var schemaCmd = &cobra.Command{ return nil }, } - -func init() { - rootCmd.AddCommand(schemaCmd) -} diff --git a/internal/config/load.go b/internal/config/load.go index e39074f78bdb8df0ddc98bfbc7322541175b71d6..b36813084049a89b5e67d79d6342335cb85230e3 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -520,7 +520,7 @@ func (c *Config) configureSelectedModels(knownProviders []catwalk.Provider) erro func lookupConfigs(cwd string) []string { // prepend default config paths configPaths := []string{ - globalConfig(), + GlobalConfig(), GlobalConfigData(), } @@ -596,7 +596,8 @@ func hasAWSCredentials(env env.Env) bool { return false } -func globalConfig() string { +// GlobalConfig returns the global configuration file path for the application. +func GlobalConfig() string { xdgConfigHome := os.Getenv("XDG_CONFIG_HOME") if xdgConfigHome != "" { return filepath.Join(xdgConfigHome, appName, fmt.Sprintf("%s.json", appName))