{"id":51569447,"url":"https://github.com/artttj/llama-review","last_synced_at":"2026-07-10T18:30:35.033Z","repository":{"id":360124295,"uuid":"1248798175","full_name":"artttj/llama-review","owner":"artttj","description":"Multi-model code review. Different models, different strengths, one report, reasonable actions.","archived":false,"fork":false,"pushed_at":"2026-06-05T23:54:46.000Z","size":3543,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-06T01:20:03.655Z","etag":null,"topics":["claude-code","claude-code-plugin","code-review","developer-tools","multi-model","ollama"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/artttj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-25T04:06:43.000Z","updated_at":"2026-06-05T23:54:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/artttj/llama-review","commit_stats":null,"previous_names":["artttj/llama-review"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/artttj/llama-review","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artttj%2Fllama-review","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artttj%2Fllama-review/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artttj%2Fllama-review/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artttj%2Fllama-review/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/artttj","download_url":"https://codeload.github.com/artttj/llama-review/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artttj%2Fllama-review/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35339931,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-10T02:00:06.465Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","claude-code-plugin","code-review","developer-tools","multi-model","ollama"],"created_at":"2026-07-10T18:30:34.475Z","updated_at":"2026-07-10T18:30:35.018Z","avatar_url":"https://github.com/artttj.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Llama Review\n\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg?style=for-the-badge)](LICENSE) ![Claude Code](https://img.shields.io/badge/Claude%20Code-D97757?style=for-the-badge\u0026logo=anthropic\u0026logoColor=white) ![Ollama](https://img.shields.io/badge/Ollama-000000?style=for-the-badge\u0026logo=ollama\u0026logoColor=white)\n\n![Llama Review](llama_review_header.png)\n\n🫟 **[Live demo → sonto.space/llama-review](https://sonto.space/llama-review/)**\n\nDifferent models have different strengths. Llama Review assigns the right model to the right task.\n\nFive review lanes, each running on a model chosen for that domain:\n\n- **Qwen 3.5**: frontend review with vision, layout checks, state management, accessibility\n- **GLM-5.1**: backend bugs, N+1 queries, race conditions, unhandled exceptions, architecture\n- **Kimi K2.6**: security across large diffs using a 262K context window\n- **DeepSeek V4-Flash**: test gaps, broken assertions, coverage holes\n- **MiniMax M2.7**: dead code, duplicate logic, over-engineering\n\nResults merge, deduplicate, and rank into a single report.\n\n## What you get\n\n- **Critical**: security holes, data loss risks, auth bypasses\n- **Needs attention**: real bugs, edge cases, performance regressions, unnecessary complexity\n- **Noted**: things that passed, lanes that found nothing, low-confidence flags\n- **Models Used**: which model ran each lane, effort level, and result\n- **Suggested test commands**: what to run to verify the changes\n- **One-paragraph summary**: ready to paste into a PR or Slack\n- **Structured JSON output**: `--json` flag writes machine-readable findings to a file\n- **Next Steps**: concrete subagent commands to fix each finding\n\nEvery finding has the file, line, what's broken, and how to fix it. No generic filler.\n\n## Verdict\n\nEvery run ends with one verdict, derived from the ranked findings:\n\n| Verdict | When | Exit code |\n|---------|------|-----------|\n| **BLOCK** | any critical finding | `2` |\n| **REVIEW** | only needs-attention items | `0` |\n| **CLEAN** | nothing actionable | `0` |\n\n```\n## Verdict: BLOCK\n1 critical, 4 to review · fix before merge (exit 2)\n```\n\nPass `--strict` to also block on needs-attention items (REVIEW becomes BLOCK, exit `2`) — useful as a CI gate. The verdict is included in `--json` output under the `verdict` key.\n\n## Install\n\n```\n/plugin marketplace add artttj/llama-review\n/plugin install llama-review\n/reload-plugins\n```\n\nThen run:\n```\n/llama-review\n```\n\nRequires the `ollama` CLI on PATH and Node.js 18+ (bundled with Claude Code). On first run without a config file, llama-review offers to create `.llama-review.yml` from defaults.\n\n## Usage\n\n```\n/llama-review                                        # defaults: all lanes, origin/main, normal effort\n/llama-review target=origin/staging                  # diff against a branch\n/llama-review lanes=frontend,security               # only specific lanes\n/llama-review --local                               # use local ollama models\n/llama-review --init                                # create .llama-review.yml from defaults\n/llama-review --effort deep                         # 64k tokens per lane\n/llama-review --jira                                # append a Jira comment block\n/llama-review --json                               # write structured findings to JSON file\n```\n\nThe `llama-review.mjs` script handles the full pipeline: detects changed files with `git diff`, applies exclude patterns, auto-assigns files to lanes by pattern, scales token budgets by diff size, dispatches parallel Ollama API calls with per-lane timeout and retry, handles thinking model output (falls back to `message.thinking` when `message.content` is empty), parses structured JSON output with text fallback, then merges and ranks the findings.\n\n## Configuration\n\nDrop a `.llama-review.yml` in your project root:\n\n```yaml\n# Global exclude patterns — strip from diff before dispatch\nexclude:\n  - \"packages/exercises/src/data/exercises/**\"\n  - \"**/seed.sql\"\n  - \"**/messages.js\"\n  - \"**/messages.po\"\n\nmodels:\n  frontend: \"qwen3.5:cloud\"\n  backend: \"glm-5.1:cloud\"\n  security: \"kimi-k2.6:cloud\"\n  tests: \"deepseek-v4-flash:cloud\"\n  simplify: \"minimax-m2.7:cloud\"\n\neffort:\n  quick: 8000\n  normal: 32000\n  deep: 64000\n\nlocal: false\n\n# Per-lane overrides\nlane_config:\n  backend:\n    timeout: 240    # seconds\n    retries: 1\n    thinking: true  # increase num_predict for reasoning models\n  security:\n    timeout: 180\n    retries: 1\n    thinking: true\n\n# Custom lanes\nlanes:\n  infra:\n    files: \"terraform/**, docker/**, .github/**, k8s/**\"\n    focus: \"misconfigured resources, missing secrets, unsafe defaults\"\n    model: \"kimi-k2.6:cloud\"\n    timeout: 180\n    retries: 1\n```\n\nSet a lane's model to `false` to disable it. Custom lanes extend the built-in ones.\n\n## Custom prompt templates\n\nOverride the review prompt for any lane by creating a markdown file:\n\n- **User-level** (all projects): `~/.claude/skills/llama-review/prompts/\u003clane\u003e.md`\n- **Project-level**: `\u003cproject-root\u003e/.llama-review/prompts/\u003clane\u003e.md`\n\nFor example, `.llama-review/prompts/security.md` replaces the built-in security prompt. User-level files take priority over project-level. If neither exists, the built-in default is used.\n\n## Review lanes\n\n| Lane | Files | Default model | Type | Why this model |\n|------|-------|---------------|------|----------------|\n| frontend | `*.tsx, *.jsx, *.vue, *.svelte, *.astro, *.css, *.scss, *.less, *.html, *.mdx, *.d.ts, *.j2, *.twig, *.blade.php, templates/` | qwen3.5:cloud | cloud | Vision + thinking + tools for UI review |\n| backend | `*.php, *.py, *.rb, *.go, *.java, *.rs, *.kt, *.ts, *.js, *.cs, *.scala, *.c, *.cpp, *.h, *.hpp, *.sql, *.graphql, *.proto, *.tf` (excludes test and frontend files) | glm-5.1:cloud | cloud | Strongest code reasoning, 9.5/10 |\n| security | all files | kimi-k2.6:cloud | cloud | 262K context for full attack surface review |\n| tests | `*.test.*, *_test.*, *.spec.*, *_spec.*, *.phpunit.*, *.cy.*, *.e2e.*, *.integration.*, *.stories.*, tests/, __tests__/, spec/` | deepseek-v4-flash:cloud | cloud | Fast structured analysis |\n| simplify | all files | minimax-m2.7:cloud | cloud | Cheap pattern matching for dead code and over-engineering |\n\nEach lane only gets files matching its patterns. Security and simplify always get the full diff. Empty lanes are skipped. Files are auto-assigned by the script — no manual categorization needed.\n\n## Model setup\n\n### Cloud models (default)\n\nModels with the `:cloud` suffix are dispatched through the standard Ollama HTTP API (`/api/chat`). The suffix is a naming convention — there is no separate cloud endpoint or proxy. Both cloud and local models hit the same `OLLAMA_HOST`.\n\nThis means cloud models only work if your Ollama server actually serves a model with that name. Plain `ollama serve` won't have them unless you've set up a proxy or custom model names. If a cloud model is unavailable, the lane fails and reports the error.\n\nTo make cloud models work, point `OLLAMA_HOST` to an Ollama-compatible server that serves them:\n\n```bash\nOLLAMA_HOST=https://your-proxy.example.com /llama-review\n```\n\nOr run locally with `--local` instead.\n\n### Local models\n\nPass `--local` to strip `:cloud` suffixes and dispatch to your local Ollama instance. If a local model isn't pulled, the lane fails and reports the error.\n\n```bash\nollama pull qwen3:8b    # example\n/llama-review --local\n```\n\nRecommended local models:\n- `qwen3:8b`: fits in 8GB VRAM, good for quick reviews\n- `deepseek-r1:14b`: reasoning-focused, good for security lanes\n- `devstral:24b`: agentic coding, good for backend lanes\n\n## License\n\nMIT. See [LICENSE](LICENSE).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartttj%2Fllama-review","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fartttj%2Fllama-review","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartttj%2Fllama-review/lists"}