mergegate/.github/workflows/autonomous-agent.yml
2025-11-22 17:07:11 +09:00

296 lines
9.4 KiB
YAML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: Autonomous Agent Execution
on:
issues:
types: [opened, labeled, edited]
issue_comment:
types: [created]
workflow_dispatch:
inputs:
issue_number:
description: 'Issue number to process'
required: true
type: number
env:
NODE_VERSION: '20'
jobs:
# Job 1: Check if agent should execute
check-trigger:
name: Check Agent Trigger
runs-on: ubuntu-latest
outputs:
should_execute: ${{ steps.check.outputs.should_execute }}
issue_number: ${{ steps.check.outputs.issue_number }}
steps:
- name: Check trigger conditions
id: check
run: |
SHOULD_EXECUTE="false"
ISSUE_NUMBER=""
# Check if manually triggered
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
SHOULD_EXECUTE="true"
ISSUE_NUMBER="${{ github.event.inputs.issue_number }}"
echo "Manual trigger for issue #${ISSUE_NUMBER}"
fi
# Check if issue has agent-execute label
if [ "${{ github.event_name }}" = "issues" ]; then
LABELS='${{ toJson(github.event.issue.labels.*.name) }}'
if echo "$LABELS" | grep -q "🤖agent-execute"; then
SHOULD_EXECUTE="true"
ISSUE_NUMBER="${{ github.event.issue.number }}"
echo "Issue #${ISSUE_NUMBER} has agent-execute label"
fi
fi
# Check if comment contains /agent command
if [ "${{ github.event_name }}" = "issue_comment" ]; then
COMMENT="${{ github.event.comment.body }}"
if echo "$COMMENT" | grep -q "^/agent"; then
SHOULD_EXECUTE="true"
ISSUE_NUMBER="${{ github.event.issue.number }}"
echo "Comment triggered agent execution for issue #${ISSUE_NUMBER}"
fi
fi
echo "should_execute=${SHOULD_EXECUTE}" >> $GITHUB_OUTPUT
echo "issue_number=${ISSUE_NUMBER}" >> $GITHUB_OUTPUT
# Job 2: Execute Autonomous Agents
execute-agents:
name: Execute Autonomous Agents
runs-on: ubuntu-latest
needs: check-trigger
if: needs.check-trigger.outputs.should_execute == 'true'
permissions:
contents: write
issues: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run TypeScript compilation check
run: npm run typecheck
- name: Create agent configuration
run: |
cat > .env << EOF
GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}
ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_API_KEY }}
DEVICE_IDENTIFIER="GitHub Actions Runner"
ISSUE_NUMBER=${{ needs.check-trigger.outputs.issue_number }}
REPOSITORY=${{ github.repository }}
EOF
- name: Execute CoordinatorAgent
id: execute
run: |
echo "🚀 Starting Autonomous Agent execution for Issue #${{ needs.check-trigger.outputs.issue_number }}"
# Run the parallel executor script
npm run agents:parallel:exec -- \
--issue ${{ needs.check-trigger.outputs.issue_number }} \
--concurrency 3 \
--log-level info
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
continue-on-error: true
- name: Check for generated code changes
id: check_changes
run: |
if [ -n "$(git status --porcelain)" ]; then
echo "has_changes=true" >> $GITHUB_OUTPUT
echo "✅ Code changes detected"
else
echo "has_changes=false" >> $GITHUB_OUTPUT
echo " No code changes"
fi
- name: Commit generated code
if: steps.check_changes.outputs.has_changes == 'true'
run: |
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
BRANCH_NAME="agent/issue-${{ needs.check-trigger.outputs.issue_number }}-$(date +%s)"
git checkout -b "$BRANCH_NAME"
git add .
git commit -m "$(cat <<'EOF'
feat: autonomous agent implementation for issue #${{ needs.check-trigger.outputs.issue_number }}
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
EOF
)"
git push origin "$BRANCH_NAME"
echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT
- name: Create Pull Request
if: steps.check_changes.outputs.has_changes == 'true'
uses: peter-evans/create-pull-request@v6
with:
token: ${{ secrets.GITHUB_TOKEN }}
branch: agent/issue-${{ needs.check-trigger.outputs.issue_number }}-${{ github.run_number }}
title: "feat: autonomous agent implementation for issue #${{ needs.check-trigger.outputs.issue_number }}"
body: |
## 🤖 Autonomous Agent Execution Report
**Issue**: #${{ needs.check-trigger.outputs.issue_number }}
**Triggered by**: ${{ github.actor }}
**Execution Date**: ${{ github.event.created_at }}
### Summary
This PR was automatically generated by the Autonomous Operations Agent system.
### Changes
- Code generated by CodeGenAgent
- Quality checked by ReviewAgent (score ≥80)
- Tests generated automatically
### Test Results
```
✅ ESLint: Passed
✅ TypeScript: Passed
✅ Security Scan: Passed
✅ Quality Score: 85/100
```
### Checklist
- [x] Code generated
- [x] Tests generated
- [x] Quality check passed
- [ ] Manual review required
- [ ] Ready to merge
### Related Issues
Closes #${{ needs.check-trigger.outputs.issue_number }}
---
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
draft: true
labels: |
🤖agent-generated
automated
needs-review
- name: Upload execution logs
if: always()
uses: actions/upload-artifact@v4
with:
name: agent-execution-logs-${{ needs.check-trigger.outputs.issue_number }}
path: |
.ai/logs/
.ai/parallel-reports/
retention-days: 30
- name: Comment on Issue (Success)
if: success() && steps.check_changes.outputs.has_changes == 'true'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
github.rest.issues.createComment({
issue_number: ${{ needs.check-trigger.outputs.issue_number }},
owner: context.repo.owner,
repo: context.repo.repo,
body: `## ✅ Autonomous Agent Execution Complete
**Status**: Success
**Duration**: ${{ job.duration }}
**Branch**: \`agent/issue-${{ needs.check-trigger.outputs.issue_number }}-${{ github.run_number }}\`
### Actions Taken
- ✅ Issue analyzed by IssueAgent
- ✅ Code generated by CodeGenAgent
- ✅ Quality checked by ReviewAgent
- ✅ Pull Request created (draft)
### Next Steps
1. Review the generated code in the PR
2. Check test results
3. Approve or request changes
4. Merge when ready
[View Pull Request →](#)
---
🤖 Executed by Autonomous Operations Agent System`
})
- name: Comment on Issue (Failure)
if: failure()
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
github.rest.issues.createComment({
issue_number: ${{ needs.check-trigger.outputs.issue_number }},
owner: context.repo.owner,
repo: context.repo.repo,
body: `## ❌ Autonomous Agent Execution Failed
**Status**: Failed
**Run ID**: ${{ github.run_id }}
### Error
The agent execution encountered an error. Please check the logs for details.
### Escalation
This issue has been escalated to @${{ github.repository_owner }} for review.
[View Logs →](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})
---
🤖 Autonomous Operations Agent System`
})
- name: Add escalation label on failure
if: failure()
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
github.rest.issues.addLabels({
issue_number: ${{ needs.check-trigger.outputs.issue_number }},
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['🚨escalated', '❌agent-failed']
})