159 lines
6.7 KiB
YAML
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
|
|
});
|
|
}
|