Critical fix for workflow routing that was causing 3x duplication on every
@codebot mention. All three workflows (ai-chat, ai-comment-reply, ai-issue-triage)
were triggering simultaneously.
Changes:
- ai-issue-triage.yml: Only runs on '@codebot triage' (unchanged, already specific)
- ai-comment-reply.yml: Only runs on specific commands (help, explain, suggest, etc)
- ai-chat.yml: Only runs on free-form questions (excludes all specific commands)
Workflow routing logic:
1. '@codebot triage' → ai-issue-triage.yml ONLY
2. '@codebot <command>' → ai-comment-reply.yml ONLY
3. '@codebot <question>' → ai-chat.yml ONLY (fallback)
This prevents the massive duplication issue where every @codebot mention
triggered all three workflows simultaneously, causing 10+ redundant runs.
Updated documentation in CLAUDE.md with workflow routing architecture.
- Replace inline toJSON() with environment variables
- Use Python to parse JSON and dispatch events properly
- Avoid bash syntax errors with parentheses in JSON
- Maintain same functionality for PR vs issue comment handling
Fixes: /var/run/act/workflow/4: line 25: syntax error near unexpected token
- Add review-again command to trigger PR review without new commits
- Implement review comparison logic to show resolved/new/changed issues
- Update workflow to handle PR comments via dispatcher
- Add comprehensive help documentation in README and CLAUDE.md
- Show diff from previous review with resolved/new issues count
- Update PR labels based on new severity assessment
- Support re-evaluation after config changes or false positive clarification
Key features:
- ✅ Shows diff from previous review (resolved/new/changed issues)
- 🏷️ Updates labels based on new severity
- ⚡ No need for empty commits to trigger review
- 🔧 Respects latest .ai-review.yml configuration
Closes feature request for manual PR re-review capability
Implements help command that shows all available bot commands with examples and categories.
Users can now type '@codebot help' to see complete command list without reading docs.
PRAgent was trying to use dict as hashable key, causing TypeError.
Added _get_label_config() helper to support both old string and new
dict format, matching the fix in IssueAgent.