Add inital implementation of an agent

Change-Id: Ib60c33e8c1a44bc9341cac5c1f1fdc518fb5ed1e
diff --git a/server/agent/README.md b/server/agent/README.md
new file mode 100644
index 0000000..0015d90
--- /dev/null
+++ b/server/agent/README.md
@@ -0,0 +1,298 @@
+# Agent Package
+
+The `agent` package provides an AI agent system that can autonomously process tasks using LLM services, manage tasks through a task management system, and create pull requests with solutions.
+
+## Overview
+
+The agent system consists of:
+
+- **AI Agent**: Processes tasks using LLM services
+- **Task Manager**: Manages task lifecycle and assignment
+- **Git Integration**: Creates pull requests with solutions
+- **Infinite Loop**: Continuously processes assigned tasks
+
+## Features
+
+- **Autonomous Task Processing**: Agents automatically pick up and process assigned tasks
+- **LLM Integration**: Uses configurable LLM providers (OpenAI, Claude, etc.)
+- **Task Management**: Integrates with task management systems
+- **Git Operations**: Creates branches and pull requests for solutions
+- **Configurable Roles**: Different agents can have different roles and system prompts
+- **Error Handling**: Robust error handling with graceful recovery
+
+## Quick Start
+
+### 1. Basic Setup
+
+```go
+package main
+
+import (
+    "log"
+    "time"
+    
+    "github.com/iomodo/staff/agent"
+    "github.com/iomodo/staff/git"
+    "github.com/iomodo/staff/llm"
+    "github.com/iomodo/staff/tm"
+    "github.com/iomodo/staff/tm/git_tm"
+)
+
+func main() {
+    // 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",
+        BaseURL:  "https://api.openai.com/v1",
+        Timeout:  30 * time.Second,
+    }
+
+    // Create agent configuration
+    config := agent.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`,
+        TaskManager: taskManager,
+        GitRepoPath: "./code-repo",
+        GitRemote:   "origin",
+        GitBranch:   "main",
+    }
+
+    // Create agent
+    agent, err := agent.NewAgent(config)
+    if err != nil {
+        log.Fatalf("Failed to create agent: %v", err)
+    }
+
+    // Run the agent
+    if err := agent.Run(); err != nil {
+        log.Fatalf("Agent failed: %v", err)
+    }
+}
+```
+
+### 2. Create a Task
+
+```go
+// Create a task for the agent to process
+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:     "backend-engineer-1", // Must match agent name
+    Priority:    tm.PriorityHigh,
+})
+if err != nil {
+    log.Fatalf("Failed to create task: %v", err)
+}
+```
+
+## Configuration
+
+### AgentConfig
+
+The `AgentConfig` struct contains all configuration for an agent:
+
+```go
+type AgentConfig struct {
+    Name        string        // Agent identifier
+    Role        string        // Agent role (e.g., "Backend Engineer")
+    GitUsername string        // Git username for commits
+    GitEmail    string        // Git email for commits
+    WorkingDir  string        // Working directory for files
+    
+    // LLM Configuration
+    LLMProvider llm.Provider  // LLM provider type
+    LLMModel    string        // Model name (e.g., "gpt-4")
+    LLMConfig   llm.Config    // LLM provider configuration
+    
+    // System prompt for the agent
+    SystemPrompt string       // Instructions for the LLM
+    
+    // Task Manager Configuration
+    TaskManager tm.TaskManager // Task management interface
+    
+    // Git Configuration
+    GitRepoPath string        // Path to git repository
+    GitRemote   string        // Remote name (usually "origin")
+    GitBranch   string        // Default branch name
+}
+```
+
+### System Prompts
+
+System prompts define the agent's behavior and expertise. Here are some examples:
+
+#### Backend Engineer
+```
+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
+```
+
+#### Frontend Engineer
+```
+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
+```
+
+#### Product Manager
+```
+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
+```
+
+## How It Works
+
+### 1. Task Processing Loop
+
+The agent runs in an infinite loop that:
+
+1. **Fetches Tasks**: Gets tasks assigned to the agent from the task manager
+2. **Filters Tasks**: Looks for tasks with "todo" status
+3. **Starts Task**: Marks the task as "in progress"
+4. **Processes with LLM**: Sends task description to LLM for solution
+5. **Creates PR**: Creates a git branch and pull request with the solution
+6. **Completes Task**: Marks the task as completed
+
+### 2. Git Operations
+
+For each task, the agent:
+
+1. Creates a new branch: `task/{task-id}-{clean-title}`
+2. Writes solution to a markdown file
+3. Commits the solution
+4. Pushes the branch to create a pull request
+
+### 3. Solution Format
+
+Solutions are formatted as markdown files containing:
+
+- Task metadata (ID, title, agent info)
+- Original task description
+- LLM-generated solution
+- Timestamp and attribution
+
+## Multiple Agents
+
+You can run multiple agents with different roles:
+
+```go
+// Create agents with different roles
+agents := []agent.AgentConfig{
+    {
+        Name:        "backend-engineer-1",
+        Role:        "Backend Engineer",
+        // ... backend configuration
+    },
+    {
+        Name:        "frontend-engineer-1",
+        Role:        "Frontend Engineer",
+        // ... frontend configuration
+    },
+    {
+        Name:        "product-manager-1",
+        Role:        "Product Manager",
+        // ... product manager configuration
+    },
+}
+
+// Start all agents
+for _, config := range agents {
+    agent, err := agent.NewAgent(config)
+    if err != nil {
+        log.Printf("Failed to create agent %s: %v", config.Name, err)
+        continue
+    }
+
+    go func(agent *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)
+}
+```
+
+## Error Handling
+
+The agent includes robust error handling:
+
+- **Configuration Validation**: Validates all required fields
+- **Graceful Recovery**: Continues running even if individual tasks fail
+- **Logging**: Comprehensive logging of all operations
+- **Resource Cleanup**: Proper cleanup of LLM connections
+
+## Testing
+
+Run the tests with:
+
+```bash
+go test ./server/agent/...
+```
+
+The test suite includes:
+
+- Configuration validation
+- Branch name generation
+- Task prompt building
+- Solution formatting
+- Error handling
+
+## Dependencies
+
+The agent package depends on:
+
+- `github.com/iomodo/staff/llm` - LLM service interface
+- `github.com/iomodo/staff/tm` - Task management interface
+- `github.com/iomodo/staff/git` - Git operations interface
+
+## Examples
+
+See `example.go` for complete working examples:
+
+- `ExampleAgent()` - Single agent setup
+- `ExampleMultipleAgents()` - Multiple agents with different roles
+
+## Best Practices
+
+1. **Unique Agent Names**: Ensure each agent has a unique name
+2. **Role-Specific Prompts**: Tailor system prompts to the agent's role
+3. **Task Assignment**: Assign tasks to agents by setting the `OwnerID` to the agent's name
+4. **Monitoring**: Monitor agent logs for errors and performance
+5. **Resource Management**: Ensure proper cleanup when stopping agents 
\ No newline at end of file