BMAD-METHOD/bmad-system/communication/agent-messenger.md

14 KiB

Agent Messenger Protocol

Inter-Persona Communication System for Claude Code Integration

The Agent Messenger enables seamless communication between BMAD personas when working within Claude Code, allowing for collaborative problem-solving and knowledge sharing.

Message Format Specification

Standard Message Structure

message:
  header:
    id: "{uuid}"
    timestamp: "{iso-8601}"
    sender: "{persona-name}"
    recipients: ["{persona-names}"]
    type: "consultation|broadcast|response|escalation"
    priority: "critical|high|normal|low"
    
  context:
    project_phase: "{discovery|design|implementation|testing|deployment}"
    task_id: "{task-identifier}"
    related_artifacts: ["{file-paths}"]
    claude_code_session: "{session-context}"
    
  body:
    subject: "{message-subject}"
    content: "{message-content}"
    required_expertise: ["{expertise-areas}"]
    response_deadline: "{iso-8601}"
    claude_tools_used: ["{tool-names}"]
    
  metadata:
    thread_id: "{conversation-thread}"
    parent_message: "{parent-id}"
    tags: ["{relevant-tags}"]
    claude_code_context: "{current-workspace}"

Communication Patterns for Claude Code

1. Multi-Tool Consultation Pattern

async def consult_multiple_personas_with_tools(problem_context):
    """
    Consult multiple personas using Claude Code tools for comprehensive analysis
    """
    # Architect consultation using code analysis tools
    architect_consultation = {
        'message_type': 'consultation',
        'sender': 'orchestrator',
        'recipient': 'architect',
        'context': problem_context,
        'request': {
            'analyze_files': await glob_pattern_files("**/*.{ts,tsx}"),
            'assess_architecture': await read_architecture_files(),
            'recommend_patterns': 'based_on_codebase_analysis'
        }
    }
    
    # Security consultation using security scanning tools
    security_consultation = {
        'message_type': 'consultation', 
        'sender': 'orchestrator',
        'recipient': 'security',
        'context': problem_context,
        'request': {
            'scan_vulnerabilities': await grep_security_patterns(),
            'assess_dependencies': await analyze_package_json(),
            'recommend_fixes': 'prioritized_by_risk'
        }
    }
    
    # QA consultation using testing tools
    qa_consultation = {
        'message_type': 'consultation',
        'sender': 'orchestrator', 
        'recipient': 'qa',
        'context': problem_context,
        'request': {
            'analyze_test_coverage': await run_coverage_report(),
            'identify_test_gaps': await analyze_test_files(),
            'recommend_testing': 'comprehensive_strategy'
        }
    }
    
    # Send consultations in parallel using Claude Code's concurrent capabilities
    responses = await asyncio.gather(
        send_persona_consultation(architect_consultation),
        send_persona_consultation(security_consultation),
        send_persona_consultation(qa_consultation)
    )
    
    # Synthesize responses for unified recommendation
    unified_response = synthesize_persona_responses(responses)
    
    return unified_response

async def collaborative_code_review(file_paths):
    """
    Coordinate multi-persona code review using Claude Code tools
    """
    # Read files for analysis
    file_contents = await asyncio.gather(*[
        claude_code_read(file_path) for file_path in file_paths
    ])
    
    # Create collaboration workspace
    collaboration_session = {
        'session_id': generate_uuid(),
        'participants': ['architect', 'security', 'qa', 'dev'],
        'files_under_review': file_paths,
        'review_criteria': ['architecture', 'security', 'quality', 'performance']
    }
    
    # Coordinate parallel review by each persona
    review_requests = []
    for persona in collaboration_session['participants']:
        review_request = create_review_request(
            persona, 
            file_contents, 
            collaboration_session
        )
        review_requests.append(review_request)
    
    # Execute reviews in parallel
    review_responses = await asyncio.gather(*[
        execute_persona_review(request) for request in review_requests
    ])
    
    # Consolidate reviews and identify consensus/conflicts
    consolidated_review = consolidate_review_feedback(
        review_responses,
        collaboration_session
    )
    
    # Generate unified review report using Write tool
    await write_review_report(consolidated_review, file_paths)
    
    return consolidated_review

2. Progressive Problem-Solving Pattern

async def progressive_problem_solving(initial_problem):
    """
    Solve complex problems through progressive persona engagement
    """
    solution_context = {
        'problem': initial_problem,
        'current_phase': 'analysis',
        'accumulated_insights': [],
        'next_steps': []
    }
    
    # Phase 1: Analyst examines the problem
    analyst_insights = await engage_persona('analyst', {
        'task': 'problem_analysis',
        'context': solution_context,
        'tools_available': ['WebSearch', 'Read', 'Task'],
        'deliverable': 'comprehensive_problem_breakdown'
    })
    
    solution_context['accumulated_insights'].append(analyst_insights)
    solution_context['current_phase'] = 'design'
    
    # Phase 2: Architect designs solution based on analysis
    architect_design = await engage_persona('architect', {
        'task': 'solution_design',
        'context': solution_context,
        'previous_insights': analyst_insights,
        'tools_available': ['Write', 'Edit', 'MultiEdit'],
        'deliverable': 'technical_architecture'
    })
    
    solution_context['accumulated_insights'].append(architect_design)
    solution_context['current_phase'] = 'validation'
    
    # Phase 3: Security validates the design
    security_validation = await engage_persona('security', {
        'task': 'security_validation',
        'context': solution_context,
        'previous_insights': [analyst_insights, architect_design],
        'tools_available': ['Grep', 'Bash', 'WebFetch'],
        'deliverable': 'security_assessment'
    })
    
    solution_context['accumulated_insights'].append(security_validation)
    solution_context['current_phase'] = 'implementation'
    
    # Phase 4: Developer implements with QA oversight
    implementation_plan = await collaborative_implementation(
        solution_context,
        ['dev', 'qa']
    )
    
    return {
        'solution_path': solution_context,
        'final_implementation': implementation_plan,
        'quality_assurance': 'multi_persona_validated'
    }

Message Priority and Routing

Intelligent Message Routing

routing_strategy:
  priority_based_routing:
    critical_messages:
      - immediate_delivery: "Interrupt current task"
      - all_hands_notification: "Alert all relevant personas"
      - escalation_chain: "Notify management personas"
      
    high_priority:
      - fast_track_processing: "Priority queue handling"
      - relevant_persona_notification: "Alert specific experts"
      - context_preservation: "Maintain full context"
      
    normal_priority:
      - standard_processing: "Regular queue handling"
      - context_aware_delivery: "Deliver when persona available"
      - batch_similar_messages: "Group related communications"
      
  expertise_based_routing:
    automatic_routing:
      - security_questions: "Route to security persona"
      - performance_issues: "Route to architect and qa"
      - user_experience: "Route to design-architect"
      - deployment_problems: "Route to platform-engineer"
      
    multi_expert_consultation:
      - complex_decisions: "Engage multiple relevant experts"
      - conflicting_requirements: "Mediated discussion"
      - innovation_opportunities: "Creative collaboration"

Context-Aware Communication

Claude Code Context Integration

async def context_aware_message_handling():
    """
    Handle messages with full awareness of Claude Code context
    """
    # Get current Claude Code workspace context
    current_context = {
        'active_files': await get_currently_open_files(),
        'recent_commands': await get_recent_tool_usage(),
        'project_structure': await analyze_project_structure(),
        'git_status': await get_git_status(),
        'todo_context': await get_current_todos()
    }
    
    # Enhance message routing with context
    def enhance_message_with_context(message):
        message['claude_code_context'] = current_context
        message['relevant_files'] = identify_relevant_files(
            message['content'], 
            current_context['active_files']
        )
        message['suggested_tools'] = suggest_tools_for_message(
            message['content'],
            current_context['recent_commands']
        )
        return message
    
    # Process incoming messages with context awareness
    async def process_contextual_message(message):
        enhanced_message = enhance_message_with_context(message)
        
        # Route to appropriate persona with full context
        persona_response = await route_to_persona(
            enhanced_message['recipient'],
            enhanced_message
        )
        
        # Include context in response for better continuity
        persona_response['context_continuation'] = maintain_context_continuity(
            enhanced_message,
            persona_response
        )
        
        return persona_response
    
    return process_contextual_message

Error Handling and Recovery

Robust Communication Patterns

error_handling:
  message_delivery_failures:
    retry_mechanisms:
      - exponential_backoff: "Increasing delays between retries"
      - circuit_breaker: "Prevent cascade failures"
      - alternative_routing: "Try different delivery paths"
      
    fallback_strategies:
      - degrade_gracefully: "Provide partial functionality"
      - queue_for_later: "Retry when conditions improve"
      - manual_intervention: "Alert user to communication failure"
      
  persona_unavailability:
    substitution_strategies:
      - similar_expertise: "Route to persona with overlapping skills"
      - collaborative_replacement: "Multiple personas cover missing expert"
      - knowledge_base_lookup: "Provide stored expertise"
      
  context_corruption:
    recovery_mechanisms:
      - context_reconstruction: "Rebuild from available information"
      - partial_context_warning: "Inform about missing information"
      - fresh_context_request: "Ask for context reestablishment"

Integration with Claude Code TodoWrite System

Enhanced Todo-Based Coordination

async def coordinate_with_claude_todos(message, todo_context):
    """
    Integrate persona communication with Claude Code's TodoWrite system
    """
    # Analyze message for todo implications
    todo_implications = analyze_message_for_todos(message)
    
    if todo_implications['creates_tasks']:
        # Create todos for identified tasks
        new_todos = []
        for task in todo_implications['tasks']:
            todo_item = {
                'id': generate_uuid(),
                'content': task['description'],
                'status': 'pending',
                'priority': task['priority'],
                'assigned_persona': task['best_suited_persona'],
                'dependencies': task.get('dependencies', []),
                'message_thread': message['thread_id']
            }
            new_todos.append(todo_item)
        
        # Update Claude Code todos
        await claude_code_todo_write(new_todos)
        
        # Notify relevant personas about their assignments
        for todo in new_todos:
            await notify_persona_of_assignment(
                todo['assigned_persona'],
                todo,
                message['thread_id']
            )
    
    if todo_implications['updates_status']:
        # Update existing todo status based on message content
        todo_updates = todo_implications['status_updates']
        await update_todos_from_message(todo_updates, message)
    
    return {
        'todos_created': todo_implications.get('creates_tasks', False),
        'todos_updated': todo_implications.get('updates_status', False),
        'coordination_complete': True
    }

Communication Commands for Claude Code

# Inter-persona communication commands
bmad message send --to "architect" --subject "API design review" --priority "high"
bmad collaborate --personas "architect,security,qa" --task "feature-implementation"
bmad consult --expert "security" --about "authentication-strategy"

# Communication management
bmad messages list --unread --persona "current"
bmad conversation --thread-id "uuid" --show-history
bmad broadcast --all-personas --message "project-update"

# Context-aware communication
bmad discuss --file "src/api/auth.ts" --with "security,architect"
bmad review --collaborative --files "src/**/*.ts"
bmad handoff --from "design" --to "development" --context "feature-spec"

This Agent Messenger system transforms Claude Code into a collaborative environment where multiple AI personas can work together seamlessly, each contributing their specialized expertise while maintaining awareness of the development context and tool usage.