| package commands |
| |
| import ( |
| "fmt" |
| "log/slog" |
| "os" |
| "os/signal" |
| "syscall" |
| |
| "github.com/iomodo/staff/server" |
| "github.com/spf13/cobra" |
| ) |
| |
| var serverCmd = &cobra.Command{ |
| Use: "server", |
| Short: "Start the Staff server with automatic agent startup", |
| Long: `Start the Staff server which automatically loads configuration from config.yaml |
| and starts all configured agents to process tasks continuously. |
| |
| The server will: |
| - Load agent configurations from config.yaml |
| - Start all configured agents in the background |
| - Continuously process assigned tasks |
| - Create GitHub PRs for completed tasks |
| - Run until manually stopped with Ctrl+C |
| |
| Example: |
| staff server # Start server with default config.yaml |
| staff server --config custom.yaml # Start server with custom config`, |
| RunE: runServer, |
| } |
| |
| var configPath string |
| |
| func init() { |
| serverCmd.Flags().StringVarP(&configPath, "config", "c", "config.yaml", "Path to configuration file") |
| rootCmd.AddCommand(serverCmd) |
| } |
| |
| func runServer(cmd *cobra.Command, args []string) error { |
| // Create logger |
| logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ |
| Level: slog.LevelInfo, |
| })) |
| |
| // Create server instance |
| srv, err := server.NewServer(logger, configPath) |
| if err != nil { |
| return fmt.Errorf("failed to create server: %w", err) |
| } |
| |
| // Start server |
| if err := srv.Start(); err != nil { |
| return fmt.Errorf("failed to start server: %w", err) |
| } |
| |
| // Setup graceful shutdown |
| sigChan := make(chan os.Signal, 1) |
| signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) |
| |
| logger.Info("Server is running. Press Ctrl+C to stop...") |
| |
| // Wait for shutdown signal |
| <-sigChan |
| |
| logger.Info("Shutdown signal received, stopping server...") |
| srv.Shutdown() |
| |
| return nil |
| } |