') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - leonado10000/CodeBunny: AST-powered AI reviewer; Groq x Llama. · GitHub
Skip to content

Repository files navigation

CodeBunny Logo

🐰 CodeBunny

The Blunt AI Code Reviewer

CodeBunny is a high-speed AI agent that acts as a Principal Engineer for your Pull Requests. It skips the fluff and tells you exactly what needs to be fixed to meet professional standards.
Install AppView DemoReport Bug

🚀 Overview

Most AI tools just summarize code changes. CodeBunny audits them. By deconstructing your code structure before analysis, it focuses strictly on logic, architectural risk, and best practices. It behaves like a senior developer who has seen it all and wants your code to be production-ready—now.

🛠️ Key Features

FeatureDescription
👔 Principal PersonaProvides blunt, corrective feedback and one-line code examples.
🏗️ Structural AwarenessUnderstands function boundaries and logic flow via AST mapping.
Instant ReviewsPowered by Groq LPUs for near-instant feedback on your PRs.
🚥 Quality GatesAutomatically flags missing docs, complex functions, and naming violations.

📦 Tech Stack

  • Brain: Llama 3.3 (70B) via Groq for high-speed inference.
  • Analysis: Python AST (Abstract Syntax Tree) for deterministic code mapping.
  • Linter: Pylint integration for automated code quality scoring.
  • Backend: FastAPI & Uvicorn.
  • Infrastructure: GitHub Actions & Render.

📥 How to Use

Add CodeBunny to your repo in 2 minutes:

1️⃣ Install the App

Grant the CodeBunny GitHub App access to your repository.

2️⃣ Add the Workflow

Create .github/workflows/codebunny.yml in your repo:

name: '🐰 CodeBunny Agent' on: pull\_request: types: \[opened, reopened, synchronize\]
jobs: review: runs-on: ubuntu-latest permissions: { pull-requests: write } steps: \- name: 🔍 Wellness Check id: health run: | STATUS=$(curl \-s \-o /dev/null \-w "%{http\_code}" "https://codebunny-5o9o.onrender.com/") if \[ "$STATUS" \-eq 200 \]; then echo "status=online" \>\> $GITHUB\_OUTPUT; fi
\- name: 📡 Dispatch Analysis if: steps.health.outputs.status \== 'online' run: | curl \-X POST "https://codebunny-5o9o.onrender.com/webhook/github" \\ \-H "Content-Type: application/json" \-d '${{ toJSON(github) }}' \--fail \--max-time 30

🧪 Local Testing

Test the logic on your machine:

  1. Clone & Install
 git clone https://github.com/leonado10000/CodeBunny.git cd CodeBunny pip install \-r requirements.txt
  1. Run Audit Simulation
 python local\_run.py