package cmd import ( "fmt" "os" "strings" "github.com/kb-search/kb/internal/api" "github.com/kb-search/kb/internal/config" "github.com/spf13/cobra" ) // Version is set at build time via -ldflags. var Version = "dev" // MinEngineVersion is set at build time via -ldflags. var MinEngineVersion = "dev" var ( flagEngine string flagFormat string flagAPIKey string ) var rootCmd = &cobra.Command{ Use: "kb [\"note text\" | command]", Short: "kb-search CLI client", Long: "A CLI client for the kb-search v2 engine API.\nRun 'kb examples' for common usage patterns.", Args: cobra.ArbitraryArgs, PersistentPreRunE: func(cmd *cobra.Command, args []string) error { if err := config.Load(); err != nil { return err } config.ApplyFlags(flagEngine, flagFormat, flagAPIKey) return nil }, RunE: func(cmd *cobra.Command, args []string) error { if len(args) == 0 { return cmd.Help() } if len(args) == 1 { return fmt.Errorf("unknown command %q\nTo add a note, use: kb \"%s ...\" or pass multiple words", args[0], args[0]) } note := strings.Join(args, " ") tags, _ := cmd.Flags().GetString("tags") client := api.NewClient() return submitNote(client, note, tags) }, } func init() { api.SetVersionInfo(Version, MinEngineVersion) rootCmd.Version = Version rootCmd.SetUsageTemplate(`Quick note taking (must be more than one word): kb "note text here" [flags] Normal usage: kb [command] [flags]{{if .HasAvailableSubCommands}} Available Commands:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}} {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} Flags: {{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} Global Flags: {{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}} Use "{{.CommandPath}} [command] --help" for more information about a command. `) rootCmd.PersistentFlags().StringVar(&flagEngine, "engine", "", "engine API URL") rootCmd.PersistentFlags().StringVar(&flagFormat, "format", "", "output format (human|json)") rootCmd.PersistentFlags().StringVar(&flagAPIKey, "api-key", "", "API key for authentication") rootCmd.Flags().String("tags", "", "tags for note shorthand (comma-separated)") } // Execute runs the root command. func Execute() { if err := rootCmd.Execute(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }