Add inital implementation of an agent

Change-Id: Ib60c33e8c1a44bc9341cac5c1f1fdc518fb5ed1e
diff --git a/server/agent/example.go b/server/agent/example.go
new file mode 100644
index 0000000..1233bdc
--- /dev/null
+++ b/server/agent/example.go
@@ -0,0 +1,196 @@
+package agent
+
+import (
+	"context"
+	"log"
+	"time"
+
+	"github.com/iomodo/staff/git"
+	"github.com/iomodo/staff/llm"
+	"github.com/iomodo/staff/tm"
+	"github.com/iomodo/staff/tm/git_tm"
+)
+
+// ExampleAgent demonstrates how to create and run an agent
+func ExampleAgent() {
+	// Create git interface for task management
+	gitInterface := git.DefaultGit("./tasks-repo")
+
+	// Create task manager
+	taskManager := git_tm.NewGitTaskManager(gitInterface, "./tasks-repo")
+
+	// Create LLM configuration
+	llmConfig := llm.Config{
+		Provider: llm.ProviderOpenAI,
+		APIKey:   "your-openai-api-key-here", // Replace with actual API key
+		BaseURL:  "https://api.openai.com/v1",
+		Timeout:  30 * time.Second,
+	}
+
+	// Create agent configuration
+	config := AgentConfig{
+		Name:        "backend-engineer-1",
+		Role:        "Backend Engineer",
+		GitUsername: "backend-agent",
+		GitEmail:    "backend-agent@company.com",
+		WorkingDir:  "./workspace",
+		LLMProvider: llm.ProviderOpenAI,
+		LLMModel:    "gpt-4",
+		LLMConfig:   llmConfig,
+		SystemPrompt: `You are a skilled backend engineer. Your role is to:
+1. Analyze tasks and provide technical solutions
+2. Write clean, maintainable code
+3. Consider performance, security, and scalability
+4. Provide clear documentation for your solutions
+5. Follow best practices and coding standards
+
+When responding to tasks, provide:
+- Detailed technical analysis
+- Code examples where appropriate
+- Implementation considerations
+- Testing recommendations
+- Documentation suggestions`,
+		TaskManager: taskManager,
+		GitRepoPath: "./code-repo",
+		GitRemote:   "origin",
+		GitBranch:   "main",
+	}
+
+	// Create agent
+	agent, err := NewAgent(config)
+	if err != nil {
+		log.Fatalf("Failed to create agent: %v", err)
+	}
+
+	// Create a sample task
+	ctx := context.Background()
+	task, err := taskManager.CreateTask(ctx, &tm.TaskCreateRequest{
+		Title:       "Implement user authentication API",
+		Description: "Create a REST API endpoint for user authentication with JWT tokens. Include login, logout, and token refresh functionality.",
+		OwnerID:     config.Name,
+		Priority:    tm.PriorityHigh,
+	})
+	if err != nil {
+		log.Fatalf("Failed to create task: %v", err)
+	}
+
+	log.Printf("Created task: %s", task.ID)
+
+	// Run the agent (this will process tasks in an infinite loop)
+	go func() {
+		if err := agent.Run(); err != nil {
+			log.Printf("Agent stopped with error: %v", err)
+		}
+	}()
+
+	// Let the agent run for a while
+	time.Sleep(5 * time.Minute)
+
+	// Stop the agent
+	agent.Stop()
+}
+
+// ExampleMultipleAgents demonstrates how to create multiple agents with different roles
+func ExampleMultipleAgents() {
+	// Create shared git interface for task management
+	gitInterface := git.DefaultGit("./tasks-repo")
+	taskManager := git_tm.NewGitTaskManager(gitInterface, "./tasks-repo")
+
+	// Create agents with different roles
+	agents := []AgentConfig{
+		{
+			Name:        "backend-engineer-1",
+			Role:        "Backend Engineer",
+			GitUsername: "backend-agent",
+			GitEmail:    "backend-agent@company.com",
+			WorkingDir:  "./workspace/backend",
+			LLMProvider: llm.ProviderOpenAI,
+			LLMModel:    "gpt-4",
+			LLMConfig: llm.Config{
+				Provider: llm.ProviderOpenAI,
+				APIKey:   "your-openai-api-key",
+				BaseURL:  "https://api.openai.com/v1",
+				Timeout:  30 * time.Second,
+			},
+			SystemPrompt: `You are a backend engineer. Focus on:
+- API design and implementation
+- Database design and optimization
+- Security best practices
+- Performance optimization
+- Code quality and testing`,
+			TaskManager: taskManager,
+			GitRepoPath: "./code-repo",
+			GitRemote:   "origin",
+			GitBranch:   "main",
+		},
+		{
+			Name:        "frontend-engineer-1",
+			Role:        "Frontend Engineer",
+			GitUsername: "frontend-agent",
+			GitEmail:    "frontend-agent@company.com",
+			WorkingDir:  "./workspace/frontend",
+			LLMProvider: llm.ProviderOpenAI,
+			LLMModel:    "gpt-4",
+			LLMConfig: llm.Config{
+				Provider: llm.ProviderOpenAI,
+				APIKey:   "your-openai-api-key",
+				BaseURL:  "https://api.openai.com/v1",
+				Timeout:  30 * time.Second,
+			},
+			SystemPrompt: `You are a frontend engineer. Focus on:
+- User interface design and implementation
+- React/Vue/Angular development
+- Responsive design and accessibility
+- Performance optimization
+- User experience best practices`,
+			TaskManager: taskManager,
+			GitRepoPath: "./code-repo",
+			GitRemote:   "origin",
+			GitBranch:   "main",
+		},
+		{
+			Name:        "product-manager-1",
+			Role:        "Product Manager",
+			GitUsername: "pm-agent",
+			GitEmail:    "pm-agent@company.com",
+			WorkingDir:  "./workspace/product",
+			LLMProvider: llm.ProviderOpenAI,
+			LLMModel:    "gpt-4",
+			LLMConfig: llm.Config{
+				Provider: llm.ProviderOpenAI,
+				APIKey:   "your-openai-api-key",
+				BaseURL:  "https://api.openai.com/v1",
+				Timeout:  30 * time.Second,
+			},
+			SystemPrompt: `You are a product manager. Focus on:
+- Product strategy and roadmap
+- User research and requirements gathering
+- Feature prioritization and planning
+- Stakeholder communication
+- Product documentation and specifications`,
+			TaskManager: taskManager,
+			GitRepoPath: "./docs-repo",
+			GitRemote:   "origin",
+			GitBranch:   "main",
+		},
+	}
+
+	// Create and start all agents
+	for _, config := range agents {
+		agent, err := NewAgent(config)
+		if err != nil {
+			log.Printf("Failed to create agent %s: %v", config.Name, err)
+			continue
+		}
+
+		go func(agent *Agent, name string) {
+			log.Printf("Starting agent: %s", name)
+			if err := agent.Run(); err != nil {
+				log.Printf("Agent %s stopped with error: %v", name, err)
+			}
+		}(agent, config.Name)
+	}
+
+	// Let agents run for a while
+	time.Sleep(10 * time.Minute)
+}