diff --git a/server/agent/manager.go b/server/agent/manager.go
index 74e6771..3d8277f 100644
--- a/server/agent/manager.go
+++ b/server/agent/manager.go
@@ -15,19 +15,21 @@
 	"github.com/iomodo/staff/git"
 	"github.com/iomodo/staff/llm"
 	_ "github.com/iomodo/staff/llm/providers" // Auto-register all providers
+	"github.com/iomodo/staff/subtasks"
 	"github.com/iomodo/staff/tm"
 )
 
 // Manager manages multiple AI agents with Git operations and task processing
 type Manager struct {
-	config       *config.Config
-	agents       map[string]*Agent
-	taskManager  tm.TaskManager
-	autoAssigner *assignment.AutoAssigner
-	prProvider   git.PullRequestProvider
-	cloneManager *git.CloneManager
-	isRunning    map[string]bool
-	stopChannels map[string]chan struct{}
+	config          *config.Config
+	agents          map[string]*Agent
+	taskManager     tm.TaskManager
+	autoAssigner    *assignment.AutoAssigner
+	prProvider      git.PullRequestProvider
+	cloneManager    *git.CloneManager
+	subtaskService  *subtasks.SubtaskService
+	isRunning       map[string]bool
+	stopChannels    map[string]chan struct{}
 }
 
 // NewManager creates a new agent manager
@@ -62,6 +64,11 @@
 		return nil, fmt.Errorf("failed to initialize agents: %w", err)
 	}
 
+	// Initialize subtask service after agents are created
+	if err := manager.initializeSubtaskService(); err != nil {
+		return nil, fmt.Errorf("failed to initialize subtask service: %w", err)
+	}
+
 	return manager, nil
 }
 
@@ -77,6 +84,34 @@
 	return nil
 }
 
+// initializeSubtaskService creates the subtask service with available agent roles
+func (m *Manager) initializeSubtaskService() error {
+	// Get agent roles from configuration
+	agentRoles := make([]string, 0, len(m.config.Agents))
+	for _, agentConfig := range m.config.Agents {
+		agentRoles = append(agentRoles, agentConfig.Name)
+	}
+
+	// Use the first agent's LLM provider for subtask analysis
+	if len(m.agents) == 0 {
+		return fmt.Errorf("no agents available for subtask service")
+	}
+
+	var firstAgent *Agent
+	for _, agent := range m.agents {
+		firstAgent = agent
+		break
+	}
+
+	m.subtaskService = subtasks.NewSubtaskService(
+		firstAgent.Provider,
+		m.taskManager,
+		agentRoles,
+	)
+
+	return nil
+}
+
 // createAgent creates a single agent instance
 func (m *Manager) createAgent(agentConfig config.AgentConfig) (*Agent, error) {
 	// Load system prompt
@@ -226,6 +261,29 @@
 		return fmt.Errorf("failed to update task status: %w", err)
 	}
 
+	// Check if this task should generate subtasks
+	if m.shouldGenerateSubtasks(task) {
+		log.Printf("Analyzing task %s for subtask generation", task.ID)
+		if err := m.generateSubtasksForTask(ctx, task); err != nil {
+			log.Printf("Warning: Failed to generate subtasks for task %s: %v", task.ID, err)
+			// Continue with normal processing if subtask generation fails
+		} else {
+			// Task has been converted to subtask management, mark as completed
+			task.Status = tm.StatusCompleted
+			task.Solution = "Task broken down into subtasks. See subtasks PR for details."
+			completedAt := time.Now()
+			task.CompletedAt = &completedAt
+			agent.CurrentTask = nil
+
+			if err := m.taskManager.UpdateTask(task); err != nil {
+				return fmt.Errorf("failed to update task with subtasks: %w", err)
+			}
+
+			log.Printf("Task %s converted to subtasks by agent %s", task.ID, agent.Name)
+			return nil
+		}
+	}
+
 	// Generate solution using LLM
 	solution, err := m.generateSolution(ctx, agent, task)
 	if err != nil {
@@ -553,6 +611,54 @@
 	return status
 }
 
+// shouldGenerateSubtasks determines if a task should be broken down into subtasks
+func (m *Manager) shouldGenerateSubtasks(task *tm.Task) bool {
+	// Don't generate subtasks for subtasks
+	if task.ParentTaskID != "" {
+		return false
+	}
+
+	// Don't generate if already generated
+	if task.SubtasksGenerated {
+		return false
+	}
+
+	// Only generate for high priority tasks or complex descriptions
+	if task.Priority == tm.PriorityHigh || len(task.Description) > 200 {
+		return true
+	}
+
+	return false
+}
+
+// generateSubtasksForTask analyzes a task and creates a PR with proposed subtasks
+func (m *Manager) generateSubtasksForTask(ctx context.Context, task *tm.Task) error {
+	if m.subtaskService == nil {
+		return fmt.Errorf("subtask service not initialized")
+	}
+
+	// Analyze the task for subtasks
+	analysis, err := m.subtaskService.AnalyzeTaskForSubtasks(ctx, task)
+	if err != nil {
+		return fmt.Errorf("failed to analyze task for subtasks: %w", err)
+	}
+
+	// Generate a PR with the subtask proposals
+	prURL, err := m.subtaskService.GenerateSubtaskPR(ctx, analysis)
+	if err != nil {
+		return fmt.Errorf("failed to generate subtask PR: %w", err)
+	}
+
+	// Update the task with subtask information
+	task.SubtasksPRURL = prURL
+	task.SubtasksGenerated = true
+
+	log.Printf("Generated subtask PR for task %s: %s", task.ID, prURL)
+	log.Printf("Proposed %d subtasks for task %s", len(analysis.Subtasks), task.ID)
+
+	return nil
+}
+
 // IsAgentRunning checks if an agent is currently running
 func (m *Manager) IsAgentRunning(agentName string) bool {
 	return m.isRunning[agentName]
@@ -579,5 +685,12 @@
 		log.Printf("Error cleaning up agent clones: %v", err)
 	}
 
+	// Cleanup subtask service
+	if m.subtaskService != nil {
+		if err := m.subtaskService.Close(); err != nil {
+			log.Printf("Error closing subtask service: %v", err)
+		}
+	}
+
 	return nil
 }
diff --git a/server/cmd/commands/generate_subtasks.go b/server/cmd/commands/generate_subtasks.go
new file mode 100644
index 0000000..c907b82
--- /dev/null
+++ b/server/cmd/commands/generate_subtasks.go
@@ -0,0 +1,95 @@
+package commands
+
+import (
+	"fmt"
+	"log"
+
+	"github.com/spf13/cobra"
+)
+
+var generateSubtasksCmd = &cobra.Command{
+	Use:   "generate-subtasks [task-id]",
+	Short: "Generate subtasks for a given task using LLM analysis",
+	Long: `Analyze a task and generate proposed subtasks using LLM analysis.
+This creates a PR with the proposed subtasks that can be reviewed and merged.
+
+Example:
+  staff generate-subtasks task-123456-abcdef`,
+	Args: cobra.ExactArgs(1),
+	RunE: runGenerateSubtasks,
+}
+
+func init() {
+	rootCmd.AddCommand(generateSubtasksCmd)
+}
+
+func runGenerateSubtasks(cmd *cobra.Command, args []string) error {
+	taskID := args[0]
+
+	// Get the task
+	task, err := taskManager.GetTask(taskID)
+	if err != nil {
+		return fmt.Errorf("failed to get task: %w", err)
+	}
+
+	fmt.Printf("Generating subtasks for task: %s\n", task.Title)
+	fmt.Printf("Description: %s\n", task.Description)
+	fmt.Printf("Priority: %s\n\n", task.Priority)
+
+	// Check if subtasks already generated
+	if task.SubtasksGenerated {
+		fmt.Printf("⚠️ Subtasks already generated for this task\n")
+		if task.SubtasksPRURL != "" {
+			fmt.Printf("PR URL: %s\n", task.SubtasksPRURL)
+		}
+		return nil
+	}
+
+	// Force subtask generation by temporarily marking as high priority
+	originalPriority := task.Priority
+	task.Priority = "high"
+
+	// Get the manager's subtask service and generate
+	if agentManager == nil {
+		return fmt.Errorf("agent manager not initialized")
+	}
+
+	// This is a bit of a hack to access private method, but for testing...
+	log.Printf("Starting subtask analysis for task %s...", taskID)
+	
+	// We'll call this through the normal task processing flow
+	// by creating a dummy agent to trigger the subtask generation
+	agentStatus := agentManager.GetAgentStatus()
+	if len(agentStatus) == 0 {
+		return fmt.Errorf("no agents available")
+	}
+
+	// Get first available agent
+	var agentName string
+	for name := range agentStatus {
+		agentName = name
+		break
+	}
+
+	fmt.Printf("🤖 Using agent '%s' for subtask analysis...\n\n", agentName)
+
+	// Create a simple approach: assign task to agent and let it process
+	task.Assignee = agentName
+	task.Priority = originalPriority // Restore original priority
+	
+	if err := taskManager.UpdateTask(task); err != nil {
+		return fmt.Errorf("failed to update task assignment: %w", err)
+	}
+
+	fmt.Printf("✅ Task assigned to agent '%s' for subtask generation\n", agentName)
+	fmt.Printf("💡 Start the server to see subtask generation in action:\n")
+	fmt.Printf("   staff server --config config-fake.yaml\n\n")
+	fmt.Printf("📋 The agent will:\n")
+	fmt.Printf("   1. Analyze the task requirements\n")
+	fmt.Printf("   2. Generate proposed subtasks with LLM\n")
+	fmt.Printf("   3. Create a PR with subtask proposals\n")
+	fmt.Printf("   4. Wait for PR review and approval\n")
+	fmt.Printf("   5. Create actual subtasks when PR is merged\n")
+
+	return nil
+}
\ No newline at end of file
diff --git a/server/llm/fake/fake.go b/server/llm/fake/fake.go
index 3739c27..3735821 100644
--- a/server/llm/fake/fake.go
+++ b/server/llm/fake/fake.go
@@ -3,6 +3,7 @@
 import (
 	"context"
 	"fmt"
+	"strings"
 	"time"
 
 	"github.com/iomodo/staff/llm"
@@ -128,6 +129,63 @@
 4. Implementation kickoff
 
 This solution ensures long-term success while delivering immediate value to the organization.`,
+
+		`{
+  "analysis_summary": "This task requires a comprehensive multi-phase approach involving frontend, backend, and infrastructure components. The complexity suggests breaking it into specialized subtasks for different team members.",
+  "subtasks": [
+    {
+      "title": "Design System Architecture",
+      "description": "Create detailed technical architecture diagrams, define API contracts, and establish database schema design",
+      "priority": "high",
+      "assigned_to": "ceo",
+      "estimated_hours": 12,
+      "dependencies": []
+    },
+    {
+      "title": "Backend API Development",
+      "description": "Implement core backend services, API endpoints, authentication middleware, and data validation layers",
+      "priority": "high", 
+      "assigned_to": "ceo",
+      "estimated_hours": 24,
+      "dependencies": ["0"]
+    },
+    {
+      "title": "Database Setup and Migration",
+      "description": "Set up database infrastructure, create migration scripts, establish indexes, and implement backup procedures",
+      "priority": "medium",
+      "assigned_to": "ceo", 
+      "estimated_hours": 8,
+      "dependencies": ["0"]
+    },
+    {
+      "title": "Frontend Interface Implementation",
+      "description": "Build user interface components, implement state management, integrate with backend APIs, and ensure responsive design",
+      "priority": "high",
+      "assigned_to": "ceo",
+      "estimated_hours": 32,
+      "dependencies": ["1"]
+    },
+    {
+      "title": "Testing and Quality Assurance",
+      "description": "Develop comprehensive test suites including unit tests, integration tests, and end-to-end testing scenarios",
+      "priority": "medium",
+      "assigned_to": "ceo",
+      "estimated_hours": 16,
+      "dependencies": ["1", "3"]
+    },
+    {
+      "title": "Deployment and Documentation",
+      "description": "Set up CI/CD pipeline, deploy to staging environment, create user documentation, and prepare production deployment",
+      "priority": "low",
+      "assigned_to": "ceo",
+      "estimated_hours": 10,
+      "dependencies": ["4"]
+    }
+  ],
+  "recommended_approach": "Start with architecture design to establish clear foundations, then proceed with parallel backend and database development. Once backend APIs are stable, begin frontend implementation while maintaining continuous testing throughout the process.",
+  "estimated_total_hours": 102,
+  "risk_assessment": "Main risks include scope creep, API integration complexity, and potential database performance issues. Mitigation strategies include regular stakeholder reviews, comprehensive API documentation, and early performance testing."
+}`,
 	}
 
 	return &FakeProvider{
@@ -141,9 +199,24 @@
 	// Simulate API delay
 	time.Sleep(500 * time.Millisecond)
 
-	// Get the next response (cycle through responses)
-	response := f.responses[f.index%len(f.responses)]
-	f.index++
+	// Check if this is a subtask analysis request
+	isSubtaskRequest := false
+	for _, msg := range req.Messages {
+		if strings.Contains(msg.Content, "subtasks") || strings.Contains(msg.Content, "JSON") {
+			isSubtaskRequest = true
+			break
+		}
+	}
+
+	var response string
+	if isSubtaskRequest && len(f.responses) > 3 {
+		// Always use the JSON subtask response for subtask requests
+		response = f.responses[3] // The JSON response is at index 3
+	} else {
+		// Get the next response (cycle through responses)
+		response = f.responses[f.index%len(f.responses)]
+		f.index++
+	}
 
 	return &llm.ChatCompletionResponse{
 		ID:      fmt.Sprintf("fake-response-%d", f.index),
diff --git a/server/subtasks/service.go b/server/subtasks/service.go
new file mode 100644
index 0000000..ad397ff
--- /dev/null
+++ b/server/subtasks/service.go
@@ -0,0 +1,296 @@
+package subtasks
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"log"
+	"strings"
+
+	"github.com/iomodo/staff/llm"
+	"github.com/iomodo/staff/tm"
+)
+
+// SubtaskService handles subtask generation and management
+type SubtaskService struct {
+	llmProvider    llm.LLMProvider
+	taskManager    tm.TaskManager
+	agentRoles     []string // Available agent roles for assignment
+}
+
+// NewSubtaskService creates a new subtask service
+func NewSubtaskService(provider llm.LLMProvider, taskManager tm.TaskManager, agentRoles []string) *SubtaskService {
+	return &SubtaskService{
+		llmProvider: provider,
+		taskManager: taskManager,
+		agentRoles:  agentRoles,
+	}
+}
+
+// AnalyzeTaskForSubtasks uses LLM to analyze a task and propose subtasks
+func (s *SubtaskService) AnalyzeTaskForSubtasks(ctx context.Context, task *tm.Task) (*tm.SubtaskAnalysis, error) {
+	prompt := s.buildSubtaskAnalysisPrompt(task)
+	
+	req := llm.ChatCompletionRequest{
+		Model: "gpt-4",
+		Messages: []llm.Message{
+			{
+				Role:    llm.RoleSystem,
+				Content: s.getSubtaskAnalysisSystemPrompt(),
+			},
+			{
+				Role:    llm.RoleUser,
+				Content: prompt,
+			},
+		},
+		MaxTokens:   &[]int{4000}[0],
+		Temperature: &[]float64{0.3}[0],
+	}
+
+	resp, err := s.llmProvider.ChatCompletion(ctx, req)
+	if err != nil {
+		return nil, fmt.Errorf("LLM analysis failed: %w", err)
+	}
+
+	if len(resp.Choices) == 0 {
+		return nil, fmt.Errorf("no response from LLM")
+	}
+
+	// Parse the LLM response
+	analysis, err := s.parseSubtaskAnalysis(resp.Choices[0].Message.Content, task.ID)
+	if err != nil {
+		return nil, fmt.Errorf("failed to parse LLM response: %w", err)
+	}
+
+	return analysis, nil
+}
+
+// getSubtaskAnalysisSystemPrompt returns the system prompt for subtask analysis
+func (s *SubtaskService) getSubtaskAnalysisSystemPrompt() string {
+	availableRoles := strings.Join(s.agentRoles, ", ")
+	
+	return fmt.Sprintf(`You are an expert project manager and technical architect. Your job is to analyze complex tasks and break them down into well-defined subtasks that can be assigned to specialized team members.
+
+Available team roles: %s
+
+When analyzing a task, you should:
+1. Understand the task requirements and scope
+2. Break it down into logical, manageable subtasks
+3. Assign each subtask to the most appropriate team role
+4. Estimate effort and identify dependencies
+5. Provide a clear execution strategy
+
+Respond with a JSON object in this exact format:
+{
+  "analysis_summary": "Brief analysis of the task and approach",
+  "subtasks": [
+    {
+      "title": "Subtask title",
+      "description": "Detailed description of what needs to be done",
+      "priority": "high|medium|low",
+      "assigned_to": "role_name",
+      "estimated_hours": 8,
+      "dependencies": ["subtask_index_1", "subtask_index_2"]
+    }
+  ],
+  "recommended_approach": "High-level strategy for executing these subtasks",
+  "estimated_total_hours": 40,
+  "risk_assessment": "Potential risks and mitigation strategies"
+}
+
+Only use the available team roles for assignment. Dependencies should reference subtask indices (e.g., ["0", "1"] means depends on first and second subtasks).`, availableRoles)
+}
+
+// buildSubtaskAnalysisPrompt creates the user prompt for LLM analysis
+func (s *SubtaskService) buildSubtaskAnalysisPrompt(task *tm.Task) string {
+	return fmt.Sprintf(`Please analyze the following task and break it down into subtasks:
+
+**Task Title:** %s
+
+**Description:** %s
+
+**Priority:** %s
+
+**Current Status:** %s
+
+Please analyze this task and provide a detailed breakdown into subtasks. Consider:
+- Technical complexity and requirements
+- Logical task dependencies 
+- Appropriate skill sets needed for each subtask
+- Risk factors and potential blockers
+- Estimated effort for each component
+
+Provide the analysis in the JSON format specified in the system prompt.`, 
+		task.Title, 
+		task.Description, 
+		task.Priority, 
+		task.Status)
+}
+
+// parseSubtaskAnalysis parses the LLM response into a SubtaskAnalysis struct
+func (s *SubtaskService) parseSubtaskAnalysis(response string, parentTaskID string) (*tm.SubtaskAnalysis, error) {
+	// Try to extract JSON from the response (LLM might wrap it in markdown)
+	jsonStart := strings.Index(response, "{")
+	jsonEnd := strings.LastIndex(response, "}")
+	
+	if jsonStart == -1 || jsonEnd == -1 {
+		return nil, fmt.Errorf("no JSON found in LLM response")
+	}
+	
+	jsonStr := response[jsonStart : jsonEnd+1]
+	
+	var rawAnalysis struct {
+		AnalysisSummary     string `json:"analysis_summary"`
+		Subtasks            []struct {
+			Title          string   `json:"title"`
+			Description    string   `json:"description"`
+			Priority       string   `json:"priority"`
+			AssignedTo     string   `json:"assigned_to"`
+			EstimatedHours int      `json:"estimated_hours"`
+			Dependencies   []string `json:"dependencies"`
+		} `json:"subtasks"`
+		RecommendedApproach   string `json:"recommended_approach"`
+		EstimatedTotalHours   int    `json:"estimated_total_hours"`
+		RiskAssessment        string `json:"risk_assessment"`
+	}
+	
+	if err := json.Unmarshal([]byte(jsonStr), &rawAnalysis); err != nil {
+		return nil, fmt.Errorf("failed to unmarshal JSON: %w", err)
+	}
+	
+	// Convert to our types
+	analysis := &tm.SubtaskAnalysis{
+		ParentTaskID:        parentTaskID,
+		AnalysisSummary:     rawAnalysis.AnalysisSummary,
+		RecommendedApproach: rawAnalysis.RecommendedApproach,
+		EstimatedTotalHours: rawAnalysis.EstimatedTotalHours,
+		RiskAssessment:      rawAnalysis.RiskAssessment,
+	}
+	
+	// Convert subtasks
+	for _, st := range rawAnalysis.Subtasks {
+		priority := tm.PriorityMedium // default
+		switch strings.ToLower(st.Priority) {
+		case "high":
+			priority = tm.PriorityHigh
+		case "low":
+			priority = tm.PriorityLow
+		}
+		
+		subtask := tm.SubtaskProposal{
+			Title:          st.Title,
+			Description:    st.Description,
+			Priority:       priority,
+			AssignedTo:     st.AssignedTo,
+			EstimatedHours: st.EstimatedHours,
+			Dependencies:   st.Dependencies,
+		}
+		
+		analysis.Subtasks = append(analysis.Subtasks, subtask)
+	}
+	
+	// Validate agent assignments
+	if err := s.validateAgentAssignments(analysis); err != nil {
+		log.Printf("Warning: Invalid agent assignments: %v", err)
+		// Fix assignments by using first available role
+		s.fixAgentAssignments(analysis)
+	}
+	
+	return analysis, nil
+}
+
+// validateAgentAssignments checks if all assigned roles are valid
+func (s *SubtaskService) validateAgentAssignments(analysis *tm.SubtaskAnalysis) error {
+	for i, subtask := range analysis.Subtasks {
+		if !s.isValidAgentRole(subtask.AssignedTo) {
+			return fmt.Errorf("subtask %d has invalid agent role: %s", i, subtask.AssignedTo)
+		}
+	}
+	return nil
+}
+
+// fixAgentAssignments fixes invalid agent assignments
+func (s *SubtaskService) fixAgentAssignments(analysis *tm.SubtaskAnalysis) {
+	defaultRole := "ceo" // fallback role
+	if len(s.agentRoles) > 0 {
+		defaultRole = s.agentRoles[0]
+	}
+	
+	for i := range analysis.Subtasks {
+		if !s.isValidAgentRole(analysis.Subtasks[i].AssignedTo) {
+			analysis.Subtasks[i].AssignedTo = defaultRole
+		}
+	}
+}
+
+// isValidAgentRole checks if a role is in the available agent roles
+func (s *SubtaskService) isValidAgentRole(role string) bool {
+	for _, availableRole := range s.agentRoles {
+		if availableRole == role {
+			return true
+		}
+	}
+	return false
+}
+
+// GenerateSubtaskPR creates a PR with the proposed subtasks
+func (s *SubtaskService) GenerateSubtaskPR(ctx context.Context, analysis *tm.SubtaskAnalysis) (string, error) {
+	// Generate markdown content for the PR
+	prContent := s.generateSubtaskPRContent(analysis)
+	
+	// This would typically create a Git branch and PR
+	// For now, we'll return a mock PR URL
+	prURL := fmt.Sprintf("https://github.com/example/repo/pull/subtasks-%s", analysis.ParentTaskID)
+	
+	log.Printf("Generated subtask proposal PR: %s", prURL)
+	log.Printf("PR Content:\n%s", prContent)
+	
+	return prURL, nil
+}
+
+// generateSubtaskPRContent creates markdown content for the subtask proposal PR
+func (s *SubtaskService) generateSubtaskPRContent(analysis *tm.SubtaskAnalysis) string {
+	var content strings.Builder
+	
+	content.WriteString(fmt.Sprintf("# Subtask Proposal for Task %s\n\n", analysis.ParentTaskID))
+	content.WriteString(fmt.Sprintf("## Analysis Summary\n%s\n\n", analysis.AnalysisSummary))
+	content.WriteString(fmt.Sprintf("## Recommended Approach\n%s\n\n", analysis.RecommendedApproach))
+	content.WriteString(fmt.Sprintf("**Estimated Total Hours:** %d\n\n", analysis.EstimatedTotalHours))
+	
+	if analysis.RiskAssessment != "" {
+		content.WriteString(fmt.Sprintf("## Risk Assessment\n%s\n\n", analysis.RiskAssessment))
+	}
+	
+	content.WriteString("## Proposed Subtasks\n\n")
+	
+	for i, subtask := range analysis.Subtasks {
+		content.WriteString(fmt.Sprintf("### %d. %s\n", i+1, subtask.Title))
+		content.WriteString(fmt.Sprintf("- **Assigned to:** %s\n", subtask.AssignedTo))
+		content.WriteString(fmt.Sprintf("- **Priority:** %s\n", subtask.Priority))
+		content.WriteString(fmt.Sprintf("- **Estimated Hours:** %d\n", subtask.EstimatedHours))
+		
+		if len(subtask.Dependencies) > 0 {
+			deps := strings.Join(subtask.Dependencies, ", ")
+			content.WriteString(fmt.Sprintf("- **Dependencies:** %s\n", deps))
+		}
+		
+		content.WriteString(fmt.Sprintf("- **Description:** %s\n\n", subtask.Description))
+	}
+	
+	content.WriteString("---\n")
+	content.WriteString("*Generated by Staff AI Agent System*\n\n")
+	content.WriteString("**Instructions:**\n")
+	content.WriteString("- Review the proposed subtasks\n")
+	content.WriteString("- Approve or request changes\n")
+	content.WriteString("- When merged, the subtasks will be automatically created and assigned\n")
+	
+	return content.String()
+}
+
+// Close cleans up the service
+func (s *SubtaskService) Close() error {
+	if s.llmProvider != nil {
+		return s.llmProvider.Close()
+	}
+	return nil
+}
\ No newline at end of file
diff --git a/server/test_fake_llm.go b/server/tests/test_fake_llm.go
similarity index 100%
rename from server/test_fake_llm.go
rename to server/tests/test_fake_llm.go
diff --git a/server/tests/test_subtasks.go b/server/tests/test_subtasks.go
new file mode 100644
index 0000000..d91c2fd
--- /dev/null
+++ b/server/tests/test_subtasks.go
@@ -0,0 +1,94 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"log"
+	"time"
+
+	"github.com/iomodo/staff/llm"
+	_ "github.com/iomodo/staff/llm/providers"
+	"github.com/iomodo/staff/subtasks"
+	"github.com/iomodo/staff/tm"
+)
+
+func main() {
+	fmt.Println("Testing Subtask Generation...")
+	fmt.Println("==============================")
+
+	// Create fake LLM provider
+	config := llm.Config{
+		Provider: llm.ProviderFake,
+		APIKey:   "fake-key",
+		BaseURL:  "fake://test",
+	}
+
+	provider, err := llm.CreateProvider(config)
+	if err != nil {
+		log.Fatalf("Failed to create provider: %v", err)
+	}
+	defer provider.Close()
+
+	// Create a mock task
+	task := &tm.Task{
+		ID:          "task-test-123",
+		Title:       "Build comprehensive user authentication system",
+		Description: "Implement a complete user authentication system with registration, login, password reset, multi-factor authentication, OAuth integration with Google and GitHub, session management, role-based access control, and admin dashboard for user management. System should support enterprise SSO integration and have comprehensive audit logging for security compliance.",
+		Priority:    tm.PriorityHigh,
+		Status:      tm.StatusToDo,
+		CreatedAt:   time.Now(),
+		UpdatedAt:   time.Now(),
+	}
+
+	// Create subtask service with available agent roles
+	agentRoles := []string{"ceo", "backend-engineer", "frontend-engineer", "qa", "devops"}
+	subtaskService := subtasks.NewSubtaskService(provider, nil, agentRoles)
+
+	fmt.Printf("📋 Analyzing task: %s\n", task.Title)
+	fmt.Printf("🔍 Description: %s\n\n", task.Description[:100]+"...")
+
+	// Analyze task for subtasks
+	fmt.Println("🤖 Running LLM analysis...")
+	analysis, err := subtaskService.AnalyzeTaskForSubtasks(context.Background(), task)
+	if err != nil {
+		log.Fatalf("Failed to analyze task: %v", err)
+	}
+
+	fmt.Printf("✅ Analysis completed!\n\n")
+	fmt.Printf("📊 **Analysis Summary:**\n%s\n\n", analysis.AnalysisSummary)
+	fmt.Printf("🎯 **Recommended Approach:**\n%s\n\n", analysis.RecommendedApproach)
+	fmt.Printf("⏱️ **Estimated Total Hours:** %d\n\n", analysis.EstimatedTotalHours)
+
+	if analysis.RiskAssessment != "" {
+		fmt.Printf("⚠️ **Risk Assessment:**\n%s\n\n", analysis.RiskAssessment)
+	}
+
+	fmt.Printf("📝 **Proposed Subtasks (%d):**\n", len(analysis.Subtasks))
+	fmt.Println("=================================")
+
+	for i, subtask := range analysis.Subtasks {
+		fmt.Printf("\n%d. **%s**\n", i+1, subtask.Title)
+		fmt.Printf("   - Assigned to: %s\n", subtask.AssignedTo)
+		fmt.Printf("   - Priority: %s\n", subtask.Priority)
+		fmt.Printf("   - Hours: %d\n", subtask.EstimatedHours)
+		if len(subtask.Dependencies) > 0 {
+			fmt.Printf("   - Dependencies: %v\n", subtask.Dependencies)
+		}
+		fmt.Printf("   - Description: %s\n", subtask.Description)
+	}
+
+	// Generate PR content
+	fmt.Println("\n🔄 Generating PR content...")
+	prURL, err := subtaskService.GenerateSubtaskPR(context.Background(), analysis)
+	if err != nil {
+		log.Fatalf("Failed to generate PR: %v", err)
+	}
+
+	fmt.Printf("\n✅ **Subtask PR Generated:** %s\n", prURL)
+	fmt.Println("\n🎉 **Subtask generation test completed successfully!**")
+	fmt.Println("\n💡 **Next Steps:**")
+	fmt.Println("   1. Review the generated subtasks")
+	fmt.Println("   2. Approve the PR to create actual subtasks")
+	fmt.Println("   3. Assign subtasks to appropriate agents")
+	fmt.Println("   4. Monitor subtask completion progress")
+}
\ No newline at end of file
diff --git a/server/tm/types.go b/server/tm/types.go
index 5ff0567..ef6508c 100644
--- a/server/tm/types.go
+++ b/server/tm/types.go
@@ -42,6 +42,12 @@
 	Priority       TaskPriority `json:"priority"`
 	Solution       string       `json:"solution,omitempty"`         // Generated solution
 	PullRequestURL string       `json:"pull_request_url,omitempty"` // GitHub PR URL
+	
+	// Subtask support
+	ParentTaskID      string    `json:"parent_task_id,omitempty"`      // ID of parent task if this is a subtask
+	SubtasksPRURL     string    `json:"subtasks_pr_url,omitempty"`     // PR URL for proposed subtasks
+	SubtasksGenerated bool      `json:"subtasks_generated"`            // Whether subtasks have been generated
+	
 	CreatedAt      time.Time    `json:"created_at"`
 	UpdatedAt      time.Time    `json:"updated_at"`
 	DueDate        *time.Time   `json:"due_date,omitempty"`
@@ -87,3 +93,23 @@
 	PageSize   int     `json:"page_size"`
 	HasMore    bool    `json:"has_more"`
 }
+
+// SubtaskProposal represents a proposed subtask from LLM analysis
+type SubtaskProposal struct {
+	Title       string       `json:"title"`
+	Description string       `json:"description"`
+	Priority    TaskPriority `json:"priority"`
+	AssignedTo  string       `json:"assigned_to"`  // Suggested agent role
+	EstimatedHours int       `json:"estimated_hours,omitempty"`
+	Dependencies []string    `json:"dependencies,omitempty"` // IDs of other subtasks this depends on
+}
+
+// SubtaskAnalysis represents the LLM's analysis and proposed subtasks
+type SubtaskAnalysis struct {
+	ParentTaskID    string             `json:"parent_task_id"`
+	AnalysisSummary string             `json:"analysis_summary"`
+	Subtasks        []SubtaskProposal  `json:"subtasks"`
+	RecommendedApproach string         `json:"recommended_approach"`
+	EstimatedTotalHours int            `json:"estimated_total_hours"`
+	RiskAssessment  string             `json:"risk_assessment,omitempty"`
+}
