{"id":49002808,"url":"https://github.com/orsharon7/rinse","last_synced_at":"2026-05-16T21:16:29.709Z","repository":{"id":352128204,"uuid":"1175579133","full_name":"orsharon7/rinse","owner":"orsharon7","description":"PR reviews without the mess.","archived":false,"fork":false,"pushed_at":"2026-05-07T23:32:06.000Z","size":13657,"stargazers_count":0,"open_issues_count":22,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-08T00:09:56.125Z","etag":null,"topics":["ai","automation","cli","code-review","developer-tools","github-copilot","go","tui"],"latest_commit_sha":null,"homepage":"https://github.com/orsharon7/rinse","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/orsharon7.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","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-03-07T22:34:19.000Z","updated_at":"2026-05-07T22:59:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/orsharon7/rinse","commit_stats":null,"previous_names":["orsharon7/rinse"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/orsharon7/rinse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orsharon7%2Frinse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orsharon7%2Frinse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orsharon7%2Frinse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orsharon7%2Frinse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/orsharon7","download_url":"https://codeload.github.com/orsharon7/rinse/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orsharon7%2Frinse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33119101,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T18:38:32.183Z","status":"ssl_error","status_checked_at":"2026-05-16T18:38:29.903Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["ai","automation","cli","code-review","developer-tools","github-copilot","go","tui"],"created_at":"2026-04-18T19:06:09.895Z","updated_at":"2026-05-16T21:16:29.703Z","avatar_url":"https://github.com/orsharon7.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RINSE\n\n```\n ██████╗ ██╗███╗  ██╗███████╗███████╗\n ██╔══██╗██║████╗ ██║██╔════╝██╔════╝\n ██████╔╝██║██╔██╗██║███████╗█████╗  \n ██╔══██╗██║██║╚████║╚════██║██╔══╝  \n ██║  ██║██║██║  ███║███████║███████╗\n ╚═╝  ╚═╝╚═╝╚═╝  ╚══╝╚══════╝╚══════╝\n  PR reviews without the mess.\n```\n\n[![Go version](https://img.shields.io/github/go-mod/go-version/orsharon7/rinse)](https://go.dev/)\n[![License: BSL 1.1](https://img.shields.io/badge/License-BSL_1.1-purple.svg)](./LICENSE)\n[![Latest release](https://img.shields.io/github/v/release/orsharon7/rinse)](https://github.com/orsharon7/rinse/releases)\n[![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/orsharon7/rinse/pulls)\n[![Landing page](https://img.shields.io/badge/site-orsharon7.github.io%2Frinse-blue)](https://orsharon7.github.io/rinse)\n\n---\n\n**Rinse drives GitHub Copilot through your PR review loop so you don't have to.**\n\nRequest review → wait → read comments → fix → repeat. Rinse handles every step, in a loop, until Copilot approves. One command. Walk away.\n\n---\n\n## ⚡ Install\n\n```bash\nbrew tap orsharon7/rinse https://github.com/orsharon7/rinse\nbrew install rinse\n```\n\nThat's it.\n\n\u003cdetails\u003e\n\u003csummary\u003eOther install methods\u003c/summary\u003e\n\n**Direct download (macOS / Linux):**\n```bash\ncurl -fsSL https://raw.githubusercontent.com/orsharon7/rinse/master/install.sh | sh\n```\n\n**Build from source (requires Go ≥ 1.24):**\n```bash\ngit clone https://github.com/orsharon7/rinse.git\ncd rinse\nmake install\n```\n\n\u003e **Note:** `make install` installs only the `rinse` binary. Set `RINSE_SCRIPT_DIR` to your local `scripts/` directory if the runner scripts are needed.\n\nPre-built binaries are also available on the [Releases](https://github.com/orsharon7/rinse/releases) page.\n\n\u003c/details\u003e\n\nThe `--model` flag accepts any valid opencode model string (e.g. `github-copilot/claude-sonnet-4.6`).\n\n---\n\n## 🚀 Quick start\n\n```bash\n# Interactive TUI wizard — recommended first run\n# Requires staged changes: run `git add \u003cfiles\u003e` first.\n# To review an existing PR without staging, use: rinse start \u003cpr\u003e --repo owner/repo\nrinse\n\n# Predict what Copilot will comment on — before you open the PR\nrinse predict\n\n# Create a per-repo config (.rinse.json) for shared team settings\nrinse init\n\n# Show session history, aggregate metrics, and recent sessions table\n# Requires opt-in: run `rinse opt-in` once to enable stats collection\nrinse stats\n\n# Show today's PR review dashboard (approval rate, timing)\nrinse report\n\n# Check the Copilot review status of a PR (great for CI scripts)\nrinse status 42 --repo owner/repo\n\n# Start the review loop non-interactively (no TTY required)\nrinse start 42 --repo owner/repo\n\n# Print version\nrinse --version\n```\n\nThe interactive TUI walks you through setup — pick a PR, configure the runner, and let Rinse handle the loop.\n\n---\n\n## 🔄 How it works\n\n1. **Detects** the current PR state (no review? pending? unresolved comments?)\n2. **Requests** a Copilot review if none is pending\n3. **Waits** for Copilot to finish (animated progress)\n4. **Reads** every unresolved comment and hands them to your AI fix agent\n5. **Pushes** the fixes and requests the next review\n6. **Loops** until approved — then shows a merge menu\n\n---\n\n## 🛠 Options\n\n```\nrinse              # launch interactive TUI (PR picker)\nrinse predict      # predict Copilot comments before you push\nrinse init         # scaffold a per-repo .rinse.json config (guided setup)\nrinse stats        # show session history, aggregate metrics, and recent sessions\nrinse report       # show today's PR review dashboard (approval rate, timing)\nrinse status \u003cpr\u003e  # print Copilot review status (agent/CI use)\nrinse start \u003cpr\u003e   # start review loop non-interactively (no TTY)\nrinse run \u003cpr\u003e     # native Go runner — NDJSON lifecycle events (CI)\nrinse opt-in       # enable session stats collection (required for stats/report)\nrinse opt-out      # disable session stats collection\nrinse --version    # print installed version\nrinse --help       # show full help\n```\n\n### `rinse predict`\n\nFlags what Copilot will likely comment on **before you open the PR** — from your staged diff, locally, in under a second.\n\n```\n$ rinse predict\n\n◇  rinse predict  —  3 likely Copilot comments detected\n\n  ◇ Missing error handling: os.WriteFile return discarded         91%\n   internal/runner/runner.go:147\n\n  ◇ Unused variable: 'ctx' declared but not referenced            85%\n   internal/runner/runner.go:203\n\n  ◇ Naked return in named-return function                         72%\n   internal/engine/engine.go:89\n\n   3 predictions · run `rinse` to fix automatically\n```\n\nAST-based analysis — no network call, no LLM. Confidence scores tell you which issues Copilot is most likely to flag. Fix the high-confidence ones before review, ship cleaner PRs.\n\n**Pro (v0.4):** `rinse predict --interactive` (or `-i`) opens a TUI review loop so you can step through predictions and fix or open each one in your editor (`e` to open in `$EDITOR`). `rinse predict --doc-drift` uses an LLM to detect where your docs have drifted from your code.\n\n### `rinse init`\n\nScaffolds a `.rinse.json` config file in the current directory. Prompts for engine, model, reflection settings, and auto-merge preference. Commit this file to share consistent defaults with your team — every developer on the repo gets the same starting point.\n\n### `rinse report`\n\nShows a today-focused PR review dashboard. Falls back to all-time data if no sessions were recorded today.\n\n```\n● RINSE  Today's Report · April 18, 2026\n\nCycles run              3\nPRs reviewed            3\nPRs approved            2 (67%)\n\nTime saved              ~1.2 hours (est.)\nComments fixed          14\nAvg per PR              5 comments, 2.1 iters\n\nFastest cycle           4 min  PR #42\nLongest cycle           18 min  PR #38\n```\n\nUse `rinse stats` instead for an all-sessions aggregate summary.\n\n### `rinse status`\n\n```bash\nrinse status [\u003cpr\u003e] [--repo \u003cowner/repo\u003e] [--json]\n```\n\nPrints the current Copilot review status of a PR without launching the TUI. Suitable for CI pipelines and agent scripts. When `\u003cpr\u003e` is omitted, auto-detects from the current branch.\n\nOutput statuses: `approved` / `pending` / `new_review` / `no_reviews` / `merged` / `closed` / `error`\n\n### `rinse start`\n\n```bash\nrinse start \u003cpr\u003e [--repo \u003cowner/repo\u003e] [--cwd \u003cpath\u003e] [--runner opencode|claude] \\\n            [--model \u003cmodel\u003e] [--reflect] [--auto-merge] [--notify] [--json]\n```\n\nStarts the PR review fix loop without the TUI — no TTY required. Suitable for agent pipelines and CI. Streaming output goes to stderr; use `--json` to get a machine-readable result on stdout after the run completes.\n\n### Interactive TUI settings (press `s` inside the PR picker)\n\n| Setting | Options | Description |\n|---------|---------|-------------|\n| `runner` | `opencode` (default), `claude` | AI agent to drive |\n| `model` | any model string | AI model; leave blank for runner default |\n| `reflect` | on/off | Enable reflection agent to improve rules each cycle |\n| `branch` | branch name | Target branch for reflection commits (default: `main`) |\n| `auto-merge` | on/off | Auto-merge PR once Copilot approves |\n| `notify` | on/off | Send a desktop notification when the cycle completes (macOS: osascript, Linux: notify-send) |\n\nInteractive TUI preferences are saved in your user config directory under `rinse/config.json` (for example, `~/.config/rinse/config.json` on Linux). Other Rinse data such as session history or runtime state may still appear under `~/.rinse/`.\n\n### Example Copilot models (non-exhaustive)\n\nConfigure any valid model string via the TUI `model` setting (or by invoking the underlying runner scripts directly), not via a `rinse --model` flag. The table below shows a few examples — any model string accepted by your runner can be used.\n\n| Model | Model string |\n|-------|--------------|\n| Claude Sonnet 4.6 | `github-copilot/claude-sonnet-4.6` |\n| Claude Sonnet 4.5 | `github-copilot/claude-sonnet-4.5` |\n| Claude Sonnet 4   | `github-copilot/claude-sonnet-4` |\n\n---\n\n## 📁 Config file (`.rinse.json`)\n\nRun `rinse init` to create a per-repo config file. Commit it so your whole team shares the same defaults.\n\n```json\n{\n  \"engine\":         \"opencode\",\n  \"model\":          \"\",\n  \"reflect\":        false,\n  \"reflect_branch\": \"main\",\n  \"auto_merge\":     false\n}\n```\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `engine` | string | `\"opencode\"` | Runner to use: `\"opencode\"` or `\"claude\"` |\n| `model` | string | `\"\"` | AI model string. Empty = runner default (`github-copilot/claude-sonnet-4.6` for opencode) |\n| `reflect` | bool | `false` | Enable the reflection agent to update `AGENTS.md` / `CLAUDE.md` after each cycle |\n| `reflect_branch` | string | `\"main\"` | Branch where reflection rules are committed |\n| `auto_merge` | bool | `false` | Auto-merge the PR once Copilot approves |\n\nSettings in `.rinse.json` are shared team defaults. Individual overrides can be set in the TUI settings panel (`s`) or passed as flags to `rinse start`.\n\n---\n\n## 🪞 Reflection agent\n\nThe `reflect` setting runs a reflection pass in parallel with each fix cycle.\n\nIt reads Copilot's comments, extracts generalizable coding rules, and permanently updates `AGENTS.md` + `CLAUDE.md` in your repo — **pushed directly to `main` via a git worktree, never polluting the PR branch**.\n\nEvery future cycle loads those rules automatically, so the AI makes fewer mistakes and Copilot leaves fewer comments. The loop gets faster over time.\n\nEnable reflection via the TUI settings (press `s` inside the PR picker and toggle `reflect` on), or pass `--reflect` directly to the underlying runner scripts:\n\n```bash\n./scripts/pr-review-opencode.sh 42 --repo owner/repo --cwd ~/dev/my-repo --reflect\n```\n\n---\n\n## 🔔 Desktop notifications\n\nPass `--notify` to `rinse start` to receive a native desktop notification when the review cycle completes:\n\n```bash\nrinse start 42 --repo owner/repo --notify\n```\n\n- **macOS** — uses `osascript` (built-in, no extra tools needed)\n- **Linux** — uses `notify-send` (install `libnotify-bin` if missing)\n- **CI / headless** — automatically skipped when `TERM=dumb` or `DISPLAY` is unset; never breaks a pipeline\n\nNotifications are best-effort — a failure to notify never interrupts or fails the CLI.\n\n---\n\n## 📋 Requirements\n\n| Dependency | Notes |\n|------------|-------|\n| `opencode` CLI | Authentication via GitHub Copilot OAuth |\n| `claude` CLI | Required when using the `claude` runner |\n| `gh` CLI ≥ v2.88 | `gh --version` to check |\n| `jq` | JSON processing |\n| `git` | Required for `--reflect` worktree |\n\n---\n\n## 🤖 CI / pipeline usage\n\n`rinse start`, `rinse run`, and `rinse status` are designed for non-interactive use in agent pipelines and CI.\n\n### Run the review loop in CI\n\n**`rinse run`** is the preferred CI command — it's the native Go runner with structured NDJSON output, no shell-script wrapper, and automatic JSON mode when stdout is not a TTY:\n\n```bash\n# Stream NDJSON lifecycle events on stdout, exit with structured result\nrinse run 42 --repo owner/repo --json\n```\n\nEach output line is a JSON event (`phase`, `iteration_start`, `poll`, `iteration_complete`, `done`, `error`). See `rinse --help` for the full event schema.\n\nExit codes: `0` = approved · `1` = max iterations · `2` = error\n\n**`rinse start`** wraps the shell-script runners and is useful when you need the `claude` runner or want shell-level output:\n\n```bash\nrinse start 42 --repo owner/repo --json\n```\n\n### Check PR status\n\n```bash\n# Human-readable\nrinse status 42 --repo owner/repo\n\n# Machine-readable (for scripts and pipelines)\nrinse status 42 --repo owner/repo --json\n```\n\nJSON schema:\n```json\n{\"ok\": true,  \"pr\": \"42\", \"repo\": \"owner/repo\", \"status\": \"approved\"}\n{\"ok\": false, \"pr\": \"42\", \"repo\": \"owner/repo\", \"status\": \"error\", \"error\": \"...\"}\n```\n\n`status` values: `approved` · `pending` · `new_review` · `no_reviews` · `merged` · `closed` · `error`\n\n### Environment variables for CI\n\n| Variable | Purpose |\n|----------|---------|\n| `RINSE_STATS_OPTIN` | Force stats opt-in (`1` or `true`) or opt-out (`0` or `false`) without touching `~/.rinse/config.json`. Useful in ephemeral CI environments. |\n| `RINSE_SESSIONS_DIR` | Override the directory where session JSON files are written and read (default: `~/.rinse/sessions/`). Use when redirecting session storage to a shared or mounted path. |\n| `RINSE_SCRIPT_DIR` | Override the directory where runner shell scripts are found. Default: searches relative to the binary. |\n| `RINSE_API_URL` | Override the pro backend URL used by the first-run onboarding wizard (default: `http://localhost:7433`). The OSS distribution ships no backend on this port — onboarding detects the unreachable backend and completes anyway. Only set this if you are running the (unreleased) RINSE pro backend on a custom port. |\n| `RINSE_PRO` | Set to `1` to enable Pro features (`--interactive`, `--doc-drift`) without a config file. Useful for CI pipelines. |\n| `RINSE_COPILOT_TOKEN` | Override the Copilot auth token used by `--doc-drift`. Normally obtained via `gh auth token`. Set this in CI environments where `gh` is not authenticated. |\n\nFor the full list of environment variables, run `rinse --help` and see the **ENVIRONMENT** section.\n\n---\n\n## Excluding files with .rinseignore\n\nPlace a `.rinseignore` file at your repo root to tell RINSE which files and paths to skip during review cycles. Uses the same syntax as `.gitignore`.\n\n```\n# Generated files\n*.pb.go\n*.gen.go\nvendor/\n\n# Auto-generated mocks\ninternal/mocks/\n\n# Database migrations (auto-generated)\n# internal/db/migrations/*.sql\n```\n\nWhen Copilot comments on an ignored path, RINSE:\n1. **Skips** the comment — does not pass it to the AI agent for fixing.\n2. **Replies** to the comment with `Skipped — file is excluded by .rinseignore`.\n\n`rinse init` creates a starter `.rinseignore` with common patterns. Commit it so the whole team benefits.\n\n---\n\n## 🤝 Contributing\n\n1. Fork the repo and create a branch: `git checkout -b feat/my-change`\n2. Make your changes — keep code POSIX-compatible where possible\n3. Test against a real PR: `rinse` (launch the TUI and select the PR)\n4. Open a PR — Copilot reviews it automatically\n5. To update coding rules for future sessions, enable the TUI `reflect` setting when reviewing the PR (press `s` in the PR picker and toggle `reflect` on)\n\n**Dev tips:**\n\n- TUI source is in `internal/tui/` (Go + Charm Bubble Tea)\n- Run `make` to build, `make install` to install locally\n- Logs: session data is stored in `~/.rinse/sessions/`; shell script runner logs land in `~/.pr-review/logs/` (set `RINSE_SCRIPT_DIR` to your local `scripts/` dir if needed)\n\n---\n\n## 📄 License\n\nBSL 1.1 — see [LICENSE](LICENSE). Or Sharon's IP.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forsharon7%2Frinse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Forsharon7%2Frinse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forsharon7%2Frinse/lists"}