blob: e283e4f602a812c9bd392b05bce19119bf45bfb7 [file] [log] [blame]
package commands
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
"github.com/spf13/cobra"
)
var startAgentCmd = &cobra.Command{
Use: "start-agent [agent-name]",
Short: "Start an agent to process tasks",
Long: `Start a specific agent to continuously process assigned tasks.
The agent will:
1. Check for assigned tasks every 30 seconds
2. Process tasks using the configured LLM
3. Create GitHub PRs for solutions
4. Mark tasks as completed
Examples:
staff start-agent backend-engineer
staff start-agent frontend-engineer`,
Args: cobra.ExactArgs(1),
RunE: runStartAgent,
}
var (
agentInterval time.Duration = 30 * time.Second
)
func init() {
startAgentCmd.Flags().DurationVar(&agentInterval, "interval", 30*time.Second, "Task check interval")
}
func runStartAgent(cmd *cobra.Command, args []string) error {
agentName := args[0]
// Check if agent exists in configuration
var agentExists bool
for _, agent := range cfg.Agents {
if agent.Name == agentName {
agentExists = true
break
}
}
if !agentExists {
return fmt.Errorf("agent '%s' not found in configuration", agentName)
}
fmt.Printf("Starting agent: %s\n", agentName)
fmt.Printf("Task check interval: %v\n", agentInterval)
fmt.Printf("Press Ctrl+C to stop the agent\n\n")
// Set up signal handling for graceful shutdown
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigChan
fmt.Printf("\nReceived shutdown signal, stopping agent...\n")
cancel()
}()
// Start the agent
err := agentManager.StartAgent(agentName, agentInterval)
if err != nil {
return fmt.Errorf("failed to start agent: %w", err)
}
// Wait for context cancellation (Ctrl+C)
<-ctx.Done()
fmt.Printf("Agent %s stopped\n", agentName)
return nil
}