Initial MVP implementation of Claudia Docs CLI

- Auth commands: login, logout, status
- Document commands: create, list, get, update, delete
- Project commands: list, get
- Folder commands: list, create
- Tag commands: list, create, add
- Search command
- Reasoning save command
- JSON output format with --output text option
- Viper-based configuration management
- Cobra CLI framework
This commit is contained in:
Claudia CLI Bot
2026-03-31 01:25:15 +00:00
commit aca95d90f3
17 changed files with 3270 additions and 0 deletions

124
internal/config/config.go Normal file
View File

@@ -0,0 +1,124 @@
package config
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/spf13/viper"
)
// Config holds all configuration
type Config struct {
Server string
Token string
Output string
Timeout string
Quiet bool
Verbose bool
}
var cfg *Config
// Load initializes the configuration
func Load() (*Config, error) {
home, err := os.UserHomeDir()
if err != nil {
return nil, fmt.Errorf("failed to get home directory: %w", err)
}
viper.SetConfigName(".claudia-docs")
viper.SetConfigType("yaml")
viper.AddConfigPath(home)
// Set defaults
viper.SetDefault("server", "http://localhost:8000")
viper.SetDefault("output", "json")
viper.SetDefault("timeout", "30s")
// Environment variables
viper.SetEnvPrefix("CLAUDIA")
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
viper.AutomaticEnv()
// Read config file if exists
_ = viper.ReadInConfig()
cfg = &Config{
Server: viper.GetString("server"),
Token: viper.GetString("token"),
Output: viper.GetString("output"),
Timeout: viper.GetString("timeout"),
Quiet: viper.GetBool("quiet"),
Verbose: viper.GetBool("verbose"),
}
return cfg, nil
}
// GetToken returns the current token
func GetToken() string {
if cfg == nil {
return ""
}
return cfg.Token
}
// GetServer returns the current server URL
func GetServer() string {
if cfg == nil {
return "http://localhost:8000"
}
return cfg.Server
}
// SaveToken saves a token to the config file
func SaveToken(token string) error {
home, err := os.UserHomeDir()
if err != nil {
return fmt.Errorf("failed to get home directory: %w", err)
}
configPath := filepath.Join(home, ".claudia-docs.yaml")
viper.SetConfigFile(configPath)
viper.Set("token", token)
return viper.WriteConfig()
}
// ClearToken removes the token from config
func ClearToken() error {
home, err := os.UserHomeDir()
if err != nil {
return fmt.Errorf("failed to get home directory: %w", err)
}
configPath := filepath.Join(home, ".claudia-docs.yaml")
viper.SetConfigFile(configPath)
viper.Set("token", "")
return viper.WriteConfig()
}
// GetConfig returns the current config
func GetConfig() *Config {
return cfg
}
// UpdateFromFlags updates config from CLI flags
func UpdateFromFlags(server, token, output string, quiet, verbose bool) {
if server != "" {
cfg.Server = server
}
if token != "" {
cfg.Token = token
}
if output != "" {
cfg.Output = output
}
cfg.Quiet = quiet
cfg.Verbose = verbose
}