diff --git a/CLAUDE.md b/CLAUDE.md index e52a28c..58dad14 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -318,6 +318,7 @@ pytest tests/test_ai_review.py::TestSecurityScanner -v 5. Add tests in `tests/test_ai_review.py` Example commands: +- `@codebot help` - Show all available commands with examples - `@codebot triage` - Full issue triage with labeling - `@codebot explain` - Explain the issue - `@codebot suggest` - Suggest solutions diff --git a/README.md b/README.md index 6bc8be8..98694f0 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,7 @@ In any issue comment: | Command | Description | |---------|-------------| +| `@codebot help` | **Help:** Show all available commands with examples | | `@codebot setup-labels` | **Setup:** Automatically create/map repository labels for auto-labeling | | `@codebot triage` | Full issue triage with auto-labeling and analysis | | `@codebot summarize` | Summarize the issue in 2-3 sentences | @@ -180,6 +181,8 @@ In any issue comment: | `@codebot suggest` | Suggest solutions or next steps | | `@codebot` (any question) | Chat with AI using codebase/web search tools | +**New to OpenRabbit?** Just type `@codebot help` in any issue to see all available commands! + ### Label Setup Command The `@codebot setup-labels` command intelligently detects your existing label schema and sets up auto-labeling: diff --git a/tests/test_ai_review.py b/tests/test_ai_review.py index a12f728..4f16f37 100644 --- a/tests/test_ai_review.py +++ b/tests/test_ai_review.py @@ -263,6 +263,84 @@ class TestMetrics: assert summary["requests"]["success"] == 1 +class TestHelpCommand: + """Test help command functionality.""" + + def test_help_command_returns_text(self): + """Test that help command returns formatted help text.""" + from agents.issue_agent import IssueAgent + + agent = IssueAgent( + gitea_client=None, + llm_client=None, + config={ + "interaction": { + "mention_prefix": "@codebot", + "commands": ["help", "triage", "explain"], + } + }, + ) + + help_text = agent._command_help() + + assert help_text is not None + assert len(help_text) > 100 + assert "@codebot" in help_text + assert "help" in help_text.lower() + assert "triage" in help_text.lower() + + def test_help_includes_all_sections(self): + """Test that help text includes all major sections.""" + from agents.issue_agent import IssueAgent + + agent = IssueAgent( + gitea_client=None, + llm_client=None, + config={"interaction": {"mention_prefix": "@codebot"}}, + ) + + help_text = agent._command_help() + + # Check for main sections + assert "Issue Triage" in help_text + assert "Interactive Chat" in help_text + assert "Setup & Utility" in help_text + assert "Pull Request" in help_text + assert "Quick Examples" in help_text + + def test_help_uses_custom_bot_name(self): + """Test that help command uses custom bot name from config.""" + from agents.issue_agent import IssueAgent + + agent = IssueAgent( + gitea_client=None, + llm_client=None, + config={"interaction": {"mention_prefix": "@mybot"}}, + ) + + help_text = agent._command_help() + + assert "@mybot" in help_text + assert "@codebot" not in help_text + + def test_help_includes_examples(self): + """Test that help text includes usage examples.""" + from agents.issue_agent import IssueAgent + + agent = IssueAgent( + gitea_client=None, + llm_client=None, + config={"interaction": {"mention_prefix": "@codebot"}}, + ) + + help_text = agent._command_help() + + # Check for example commands + assert "triage" in help_text + assert "explain" in help_text + assert "setup-labels" in help_text + + class TestLabelSetup: """Test label setup and schema detection.""" diff --git a/tools/ai-review/agents/issue_agent.py b/tools/ai-review/agents/issue_agent.py index 3c6e5e9..f5bafc0 100644 --- a/tools/ai-review/agents/issue_agent.py +++ b/tools/ai-review/agents/issue_agent.py @@ -380,7 +380,9 @@ class IssueAgent(BaseAgent): title = issue.get("title", "") body = issue.get("body", "") - if command == "summarize": + if command == "help": + return self._command_help() + elif command == "summarize": return self._command_summarize(title, body) elif command == "explain": return self._command_explain(title, body) @@ -445,6 +447,68 @@ Be practical and concise.""" except Exception as e: return f"{self.AI_DISCLAIMER}\n\nSorry, I was unable to generate suggestions. Error: {e}" + def _command_help(self) -> str: + """Generate help message with all available commands.""" + mention_prefix = self.config.get("interaction", {}).get( + "mention_prefix", "@codebot" + ) + + help_text = f"""{self.AI_DISCLAIMER} + +## Available {mention_prefix} Commands + +### Issue Triage & Analysis +- `{mention_prefix} triage` - Full issue triage with auto-labeling and priority assignment +- `{mention_prefix} summarize` - Generate 2-3 sentence summary of the issue +- `{mention_prefix} explain` - Detailed explanation of what the issue is about +- `{mention_prefix} suggest` - Solution suggestions or next steps +- `{mention_prefix} security` - Security-focused analysis of the issue + +### Interactive Chat +- `{mention_prefix} [question]` - Ask questions about the codebase (uses search & file reading tools) + - Example: `{mention_prefix} how does authentication work?` + - Example: `{mention_prefix} find all API endpoints` + +### Setup & Utility +- `{mention_prefix} help` - Show this help message +- `{mention_prefix} setup-labels` - Auto-create/map repository labels for auto-labeling + +### Pull Request Analysis +PR reviews run automatically when you open or update a pull request. The bot provides: +- Inline code review comments +- Security vulnerability scanning +- Approval or change-request recommendations + +--- + +### Quick Examples + +**Triage an issue:** +``` +{mention_prefix} triage +``` + +**Get help understanding:** +``` +{mention_prefix} explain +``` + +**Ask about the codebase:** +``` +{mention_prefix} how does the authentication system work? +``` + +**Setup repository labels:** +``` +{mention_prefix} setup-labels +``` + +--- + +*For full documentation, see the [README](https://github.com/YourOrg/OpenRabbit/blob/main/README.md)* +""" + return help_text + def _command_triage(self, context: AgentContext, issue: dict) -> str: """Perform full triage analysis on the issue.""" title = issue.get("title", "") diff --git a/tools/ai-review/config.yml b/tools/ai-review/config.yml index 969d1cd..0e76fb2 100644 --- a/tools/ai-review/config.yml +++ b/tools/ai-review/config.yml @@ -59,6 +59,7 @@ interaction: respond_to_mentions: true mention_prefix: "@codebot" # Change this to customize your bot's name! commands: + - help - explain - suggest - security