296 lines
9.4 KiB
YAML
296 lines
9.4 KiB
YAML
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']
|
||
})
|