package cmd import ( "fmt" "os" "github.com/spf13/cobra" "github.com/nextlevelbuilder/goclaw/pkg/protocol" ) // Version is set at build time via -ldflags "-X github.com/nextlevelbuilder/goclaw/cmd.Version=v1.0.0" var Version = "dev" // CommitSHA is set at build time via -ldflags "-X github.com/nextlevelbuilder/goclaw/cmd.CommitSHA=". // It records the exact source commit the binary was built from, so a running // image/binary can be lined up with a commit even when VCS metadata is // unavailable (e.g. Docker builds, where .git is excluded from the context). var CommitSHA = "unknown" // commitSuffix returns " (commit )" when CommitSHA was injected at build // time, so version/doctor/upgrade output can carry release provenance. func commitSuffix() string { if CommitSHA == "" || CommitSHA == "unknown" { return "" } return " (commit " + CommitSHA + ")" } var ( cfgFile string verbose bool gatewayServerOverride string gatewayTokenOverride string gatewayOutputFormat string ) var rootCmd = &cobra.Command{ Use: "goclaw", Short: "GoClaw — AI agent gateway", Long: "GoClaw: multi-agent AI platform with WebSocket RPC, tool execution, and channel integration. A Go port of OpenClaw with enhanced security and multi-tenant support.", Run: func(cmd *cobra.Command, args []string) { runGateway() }, } func init() { rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default: config.json or $GOCLAW_CONFIG)") rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "enable debug logging") rootCmd.PersistentFlags().StringVar(&gatewayServerOverride, "server", "", "gateway server URL override") rootCmd.PersistentFlags().StringVar(&gatewayTokenOverride, "token", "", "gateway bearer token override") rootCmd.AddCommand(onboardCmd()) rootCmd.AddCommand(versionCmd()) rootCmd.AddCommand(pairingCmd()) rootCmd.AddCommand(agentCmd()) rootCmd.AddCommand(doctorCmd()) rootCmd.AddCommand(configCmd()) rootCmd.AddCommand(providersCmd()) rootCmd.AddCommand(channelsCmd()) rootCmd.AddCommand(bitrixPortalCmd()) rootCmd.AddCommand(cronCmd()) rootCmd.AddCommand(skillsCmd()) rootCmd.AddCommand(sessionsCmd()) rootCmd.AddCommand(tracesCmd()) rootCmd.AddCommand(migrateCmd()) rootCmd.AddCommand(upgradeCmd()) rootCmd.AddCommand(backupCmd()) rootCmd.AddCommand(restoreCmd()) rootCmd.AddCommand(tenantBackupCmd()) rootCmd.AddCommand(tenantRestoreCmd()) rootCmd.AddCommand(authCmd()) rootCmd.AddCommand(setupCmd()) } func versionCmd() *cobra.Command { return &cobra.Command{ Use: "version", Short: "Print version information", Run: func(cmd *cobra.Command, args []string) { fmt.Printf("goclaw %s%s (protocol %d)\n", Version, commitSuffix(), protocol.ProtocolVersion) }, } } func resolveConfigPath() string { if cfgFile != "" { return cfgFile } if v := os.Getenv("GOCLAW_CONFIG"); v != "" { return v } return "config.json" } // Execute runs the root cobra command. func Execute() { if err := rootCmd.Execute(); err != nil { os.Exit(1) } }