diff --git a/.github/workflows/webhook-handler.yml b/.github/workflows/webhook-handler.yml new file mode 100644 index 0000000..925e57f --- /dev/null +++ b/.github/workflows/webhook-handler.yml @@ -0,0 +1,197 @@ +name: πŸ”” Webhook Event Handler + +# Central event router for GitHub OS Event Bus +# Addresses Issue #5 - Phase B: Event Bus Implementation + +on: + issues: + types: [opened, labeled, closed, assigned, milestoned] + pull_request: + types: [opened, synchronize, closed, review_requested] + issue_comment: + types: [created] + pull_request_review: + types: [submitted] + push: + branches: [main] + workflow_run: + workflows: ["*"] + types: [completed] + +permissions: + issues: write + pull-requests: write + actions: write + contents: read + +jobs: + route-event: + runs-on: ubuntu-latest + name: Route Event to Appropriate Handler + + steps: + - uses: actions/checkout@v4 + + - name: Log Event + run: | + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "πŸ”” WEBHOOK EVENT RECEIVED" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "Event: ${{ github.event_name }}" + echo "Action: ${{ github.event.action }}" + echo "Actor: ${{ github.actor }}" + echo "Timestamp: $(date -u +%Y-%m-%dT%H:%M:%SZ)" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + + - name: Route to Agent - Issue Opened + if: github.event_name == 'issues' && github.event.action == 'opened' + run: | + echo "πŸ€– Routing to: IssueAgent" + echo "Task: Analyze new Issue #${{ github.event.issue.number }}" + + # Check if Issue has agent-related labels + LABELS="${{ toJson(github.event.issue.labels.*.name) }}" + + if echo "$LABELS" | grep -q "πŸ€–agent"; then + echo "βœ… Agent label detected, will auto-process" + # TODO: Trigger IssueAgent workflow when implemented + else + echo "ℹ️ Regular issue, manual triage required" + fi + + - name: Route to Agent - Issue Labeled with Execute + if: | + github.event_name == 'issues' && + github.event.action == 'labeled' && + github.event.label.name == 'πŸ€–agent-execute' + run: | + echo "πŸš€ AGENT EXECUTION TRIGGERED" + echo "Issue: #${{ github.event.issue.number }}" + echo "Title: ${{ github.event.issue.title }}" + + # Trigger CoordinatorAgent workflow + gh workflow run agent-runner.yml \ + -f issue_number=${{ github.event.issue.number }} \ + -f mode=autonomous \ + || echo "⚠️ agent-runner.yml not found yet (will be created in Issue #4)" + + - name: Route to Agent - PR Opened + if: github.event_name == 'pull_request' && github.event.action == 'opened' + run: | + echo "πŸ“ Routing to: ReviewAgent" + echo "PR: #${{ github.event.pull_request.number }}" + echo "Draft: ${{ github.event.pull_request.draft }}" + + if [ "${{ github.event.pull_request.draft }}" == "false" ]; then + echo "βœ… Ready for review, triggering ReviewAgent" + # TODO: Trigger ReviewAgent workflow + else + echo "ℹ️ Draft PR, skipping auto-review" + fi + + - name: Route to Agent - Comment Command + if: github.event_name == 'issue_comment' && github.event.action == 'created' + run: | + COMMENT_BODY="${{ github.event.comment.body }}" + + if echo "$COMMENT_BODY" | grep -q "^/agent"; then + echo "πŸ’¬ Agent command detected in comment" + echo "Command: $COMMENT_BODY" + + # Parse command + COMMAND=$(echo "$COMMENT_BODY" | sed 's/^\/agent //') + + case "$COMMAND" in + "analyze") + echo "πŸ” Triggering IssueAgent for analysis" + ;; + "execute") + echo "πŸš€ Triggering CoordinatorAgent for execution" + ;; + "review") + echo "πŸ“ Triggering ReviewAgent for code review" + ;; + "status") + echo "πŸ“Š Fetching current status" + ;; + *) + echo "❌ Unknown command: $COMMAND" + gh api \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + /repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/comments \ + -f body="❌ Unknown command: \`$COMMAND\` + + Available commands: + - \`/agent analyze\` - Analyze Issue + - \`/agent execute\` - Start autonomous execution + - \`/agent review\` - Request code review + - \`/agent status\` - Check current status" + ;; + esac + fi + + - name: Route to Agent - PR Merged + if: | + github.event_name == 'pull_request' && + github.event.action == 'closed' && + github.event.pull_request.merged == true + run: | + echo "πŸŽ‰ PR #${{ github.event.pull_request.number }} merged!" + echo "Branch: ${{ github.event.pull_request.head.ref }} β†’ ${{ github.event.pull_request.base.ref }}" + + # If merged to main, may trigger deployment + if [ "${{ github.event.pull_request.base.ref }}" == "main" ]; then + echo "πŸš€ Merged to main, considering deployment..." + # TODO: Trigger DeploymentAgent if applicable + fi + + - name: Route to Agent - Workflow Failed + if: | + github.event_name == 'workflow_run' && + github.event.workflow_run.conclusion == 'failure' + run: | + echo "🚨 WORKFLOW FAILURE DETECTED" + echo "Workflow: ${{ github.event.workflow_run.name }}" + echo "Conclusion: ${{ github.event.workflow_run.conclusion }}" + echo "Run ID: ${{ github.event.workflow_run.id }}" + + # Escalate to Guardian for critical failures + if echo "${{ github.event.workflow_run.name }}" | grep -qE "(agent-runner|economic-circuit-breaker)"; then + echo "🚨 Critical workflow failed, escalating to Guardian" + + gh issue create \ + --title "🚨 Critical Workflow Failure: ${{ github.event.workflow_run.name }}" \ + --label "πŸ”₯Sev.1-Critical,πŸ€–AI-システム" \ + --assignee "${{ github.repository_owner }}" \ + --body "## 🚨 Critical Workflow Failure + + **Workflow**: ${{ github.event.workflow_run.name }} + **Conclusion**: ${{ github.event.workflow_run.conclusion }} + **Run ID**: ${{ github.event.workflow_run.id }} + **Run URL**: ${{ github.event.workflow_run.html_url }} + + This workflow is critical to Agentic OS operations. Immediate Guardian attention required. + + ### Next Steps + 1. Review workflow logs + 2. Identify root cause + 3. Fix or rollback changes + 4. Re-run workflow + + --- + **Escalated by**: Webhook Handler + **Timestamp**: $(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + || echo "⚠️ Failed to create escalation Issue" + fi + + - name: Event Summary + if: always() + run: | + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "πŸ“Š EVENT ROUTING SUMMARY" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "βœ… Event processed: ${{ github.event_name }}.${{ github.event.action }}" + echo "🎯 Routing completed at: $(date -u +%H:%M:%S)" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"