Archon/.github/workflows/claude-fix.yml

159 lines
6.7 KiB
YAML

name: Claude Code Fix (Write Access)
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
jobs:
claude-fix:
# Only trigger on @claude-fix command from authorized users
if: |
(
github.event_name == 'issue_comment' ||
github.event_name == 'pull_request_review_comment'
) &&
contains(github.event.comment.body, '@claude-fix') &&
contains(fromJSON('["Wirasm", "coleam00", "sean-eskerium"]'), github.event.comment.user.login)
runs-on: ubuntu-latest
permissions:
contents: write # Allow creating branches and editing files
pull-requests: write # Allow creating and updating pull requests
issues: write # Allow commenting on and updating issues
id-token: write # Required for OIDC authentication
actions: read # Read CI results
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Full history for better context
- name: Run Claude Code Fix
id: claude
uses: anthropics/claude-code-action@beta
timeout-minutes: 30
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
# Custom trigger phrase for fix workflow
trigger_phrase: "@claude-fix"
# Fix-specific instructions
custom_instructions: |
You are authorized to IMPLEMENT FIXES and CREATE PULL REQUESTS.
## Your Role
You are fixing issues in Archon V2 Alpha. Follow CLAUDE.md for project principles and commands.
## Architecture Context
- Frontend: React + TypeScript + Vite (port 3737)
- Backend: FastAPI + Socket.IO + Python (port 8181)
- MCP Service: MCP protocol server (port 8051)
- Agents Service: PydanticAI agents (port 8052)
- Database: Supabase (PostgreSQL + pgvector)
## Fix Workflow - MINIMAL CHANGES ONLY
### 1. ROOT CAUSE ANALYSIS (RCA)
- **Reproduce**: Can you reproduce the issue? If not, state why
- **Identify**: Use ripgrep to search for error messages, function names, patterns
- **Trace**: Follow the execution path using git blame and code navigation
- **Root Cause**: What is the ACTUAL cause vs symptoms?
- Is it a typo/syntax error?
- Is it a logic error?
- Is it a missing dependency?
- Is it a type mismatch?
- Is it an async/timing issue?
- Is it a state management issue?
### 2. MINIMAL FIX STRATEGY
- **Scope**: Fix ONLY the root cause, nothing else
- **Pattern Match**: Look for similar code in the codebase - follow existing patterns
- **Side Effects**: Will this break anything else? Check usages with ripgrep
- **Alternative**: If fix seems too invasive, document alternative approaches
### 3. IMPLEMENTATION
- Create branch: `fix/issue-{number}` or `fix/pr-{number}-{description}` or `fix/{brief-description}`
- Make the minimal change that fixes the root cause
- If existing tests break, understand why before changing them
- Add test to prevent regression (especially for bug fixes)
### 4. VERIFICATION LOOP
- Run tests according to CLAUDE.md commands
- If tests fail:
- Analyze why they failed
- Is it your fix or unrelated?
- Fix and retry until all green
- If fix breaks something else:
- Do another RCA on the new issue
- Consider alternative approach
- Document tradeoffs in PR
### 5. PULL REQUEST
Use the template in .github/pull_request_template.md:
- Fill all sections accurately
- Mark type as "Bug fix"
- Show test evidence with actual command outputs
- If can't fix completely, document what's blocking in Additional Notes
## Decision Points
- **Don't fix if**: Needs product decision, requires major refactoring, or changes core architecture
- **Document blockers**: If something prevents a complete fix, explain in PR
- **Ask for guidance**: Use PR description to ask questions if uncertain
## Remember
- The person triggering this workflow wants a fix - deliver one or explain why you can't
- Follow CLAUDE.md for all commands and project principles
- Prefer ripgrep over grep for searching
- Keep changes minimal - resist urge to refactor
- Alpha project: Quick fixes over perfect solutions
# Commented out - using default tools
# allowed_tools: "Edit(*),MultiEdit(*),Write(*),Read(*),Grep(*),LS(*),Glob(*),TodoWrite(*),NotebookEdit(*),Bash(git *),Bash(npm *),Bash(uv *),Bash(python *),Bash(pip *),Bash(cd *),Bash(pwd),Bash(ls *),Bash(cat *),Bash(head *),Bash(tail *),Bash(wc *),Bash(find *),Bash(grep *),Bash(rg *),Bash(sed *),Bash(awk *),Bash(curl *),Bash(wget *),Bash(echo *),Bash(mkdir *),Bash(rm -rf node_modules),Bash(rm -rf __pycache__),Bash(rm -rf .pytest_cache),WebSearch(*),WebFetch(*)"
unauthorized-message:
# Post message for unauthorized users
if: |
(
github.event_name == 'issue_comment' ||
github.event_name == 'pull_request_review_comment'
) &&
contains(github.event.comment.body, '@claude-fix') &&
!contains(fromJSON('["Wirasm", "coleam00", "sean-eskerium"]'), github.event.comment.user.login)
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- name: Post unauthorized message
uses: actions/github-script@v7
with:
script: |
const comment = {
owner: context.repo.owner,
repo: context.repo.repo,
body: `❌ @${context.actor} - You are not authorized to trigger Claude fixes.\n\nOnly maintainers can trigger Claude: Please ask a maintainer to run the fix command.`
};
if (context.eventName === 'issue_comment') {
await github.rest.issues.createComment({
...comment,
issue_number: context.issue.number
});
} else if (context.eventName === 'pull_request_review_comment') {
await github.rest.pulls.createReplyForReviewComment({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
comment_id: context.payload.comment.id,
body: comment.body
});
}