# Staff MVP - AI Multi-Agent Development System

## Quick Start (5 minutes)

Staff MVP is a lean AI multi-agent system where specialized AI agents autonomously handle development tasks and create GitHub pull requests. 

### 1. Prerequisites

- **Go 1.21+** installed
- **OpenAI API key** (get one at [platform.openai.com](https://platform.openai.com))
- **GitHub personal access token** with repo permissions

### 2. Setup

```bash
# Clone and setup
git clone <your-repo>
cd staff
./setup.sh

# Configure (edit with your API keys)
cp config.example.yaml config.yaml
nano config.yaml
```

### 3. Configuration

Edit `config.yaml` with your credentials:

```yaml
openai:
  api_key: "sk-your-openai-key-here"
  
github:
  token: "ghp_your-github-token-here"
  owner: "your-github-username"
  repo: "your-repo-name"
```

Or use environment variables:
```bash
export OPENAI_API_KEY="sk-your-openai-key-here"
export GITHUB_TOKEN="ghp_your-github-token-here"
```

### 4. Usage

```bash
cd server

# Create a task
./staff create-task "Add user authentication system" --priority high --agent backend-engineer

# Start an agent to process tasks
./staff start-agent backend-engineer

# List all tasks
./staff list-tasks

# Check agent status
./staff list-agents
```

## How It Works

1. **Create Tasks**: You create development tasks with descriptions and assign them to specialized agents
2. **Agent Processing**: Agents fetch their assigned tasks and process them using OpenAI GPT-4
3. **GitHub Integration**: Completed tasks automatically create pull requests in your repository
4. **Human Review**: You review and merge the PRs like any normal development workflow

## Available Agents

- **CEO**: Strategic decisions and business direction
- **Product Manager**: Requirements, user stories, specifications  
- **Backend Engineer**: Server-side code, APIs, databases
- **Frontend Engineer**: UI/UX, client-side applications

## Task Workflow

```
Create Task → Assign to Agent → Agent Processes → Creates PR → Human Review → Merge
```

Tasks are stored as markdown files in the `tasks/` directory and use Git for version control.

## Commands

```bash
# Task Management
./staff create-task <description> [--priority high|medium|low] [--agent <agent-name>]
./staff list-tasks [--status pending|in_progress|completed]
./staff assign-task <task-id> <agent-name>

# Agent Management  
./staff start-agent <agent-name> [--loop] [--interval 30s]
./staff list-agents
./staff stop-agent <agent-name>

# Utilities
./staff config-check
./staff --help
```

## Project Structure

```
├── config.yaml              # Main configuration
├── tasks/                   # Task storage (Git-tracked)
│   ├── task-001.md         # Individual tasks
│   └── completed/          # Completed tasks
├── operations/
│   └── agents/             # Agent system prompts
│       ├── ceo/
│       ├── product-manager/
│       ├── backend-engineer/
│       └── frontend-engineer/
└── server/                 # Go backend
    ├── cmd/                # CLI commands
    ├── config/             # Configuration system
    ├── agent/              # Agent processing logic
    ├── llm/                # LLM integration
    └── git/                # Git/GitHub operations
```

## Example Task

```markdown
# Task: Add User Authentication

**ID**: task-001  
**Priority**: high  
**Agent**: backend-engineer  
**Status**: pending

## Description
Implement a complete user authentication system with:
- User registration and login
- JWT token-based authentication
- Password hashing and validation
- Basic user profile management

## Acceptance Criteria
- [ ] Users can register with email/password
- [ ] Users can login and receive JWT token
- [ ] Protected routes require valid token
- [ ] Passwords are securely hashed
- [ ] Basic user profile endpoints
```

## GitHub Integration

When agents complete tasks, they automatically:

1. Create a new branch: `task/001-add-user-authentication`
2. Commit their solution with detailed commit message
3. Create a pull request with:
   - Task description and solution summary
   - List of files changed
   - Agent identification

## Limitations (MVP)

- Single user only (no user management)
- Manual task assignment
- No PR comment handling
- No self-learning or improvement
- OpenAI only (no other LLM providers yet)

## Troubleshooting

**"API key required" error**: 
- Check your `config.yaml` has the correct OpenAI API key
- Or set `OPENAI_API_KEY` environment variable

**"GitHub token invalid" error**:
- Ensure your GitHub token has `repo` permissions
- Check the owner/repo settings in config

**Build errors**:
- Ensure Go 1.21+ is installed: `go version`
- Run `go mod tidy` in the server directory

## Next Steps

This MVP can be extended with:
- Multi-user support and authentication
- Additional LLM providers (Claude, Gemini)
- PR comment handling and iteration
- Agent learning and improvement
- Web UI for task management
- Integration with project management tools

---

**Built with ❤️ using Go + OpenAI + GitHub**