Independent AI peer review of git diffs for Claude Code and other coding agents
Project description
fresh-eyes
Independent AI peer review of git diffs, designed for use alongside Claude Code (or any coding agent). Sends your latest changes to a different model so you get a second opinion with different blind spots from the one that wrote the code.
Install
uv tool install fresh-eyes
Or from a local checkout:
uv tool install --from . fresh-eyes
This installs two equivalent commands: fresh-eyes (canonical) and fe (typeable alias).
Setup
Export your Gemini API key (get one at https://aistudio.google.com/apikey):
export GEMINI_API_KEY=your-key-here
Activation
fresh-eyes is opt-in per repo, so it doesn't fire in every git repo you cd into. Enable it once per repo:
fresh-eyes --init # enables fresh-eyes in this repo (writes .git/fresh_eyes_enabled)
fresh-eyes --disable # disables it again
Running any other command in a non-activated repo prints a friendly message and exits without making API calls.
Usage
From inside an activated git repository:
fresh-eyes # review commits since the last review (or HEAD~1 on first run)
fresh-eyes --full # review the entire branch against the default branch
fresh-eyes --all # one-time baseline: review the entire current codebase
fresh-eyes --staged # review staged-but-uncommitted changes
fresh-eyes --reset # interactively reset the marker (after a rebase, etc.)
fe is the short alias — fe --full works identically.
Claude Code integration
Copy the slash command files from this repo into your Claude Code commands directory:
cp commands/fresh-eyes.md commands/fe.md ~/.claude/commands/
You can now invoke /fresh-eyes or /fe in a Claude Code session. The command tells Claude to run the CLI, read its output, synthesize the findings against the current task context, and raise genuine concerns before continuing.
How it works
- Marker file:
.git/fresh_eyes_last_<branch>stores the last reviewed commit per branch. Switching branches doesn't invalidate other branches' markers. - Each run diffs from the marker to the HEAD captured at startup, sends it to Gemini, prints the review under a
## Gemini 2.5 Flashheader, then advances the marker. - Noise filtering: lockfiles, minified assets, and
dist//build/are excluded from the diff so they don't burn tokens. - Size guard: bails out with a message (exit
0) if the diff exceeds ~10k estimated tokens. - No synthesis in the tool: with multiple reviewers (coming in 0.2.0 with Mistral), the tool emits each reviewer's output verbatim under its own header. Claude Code does the synthesis using its task context.
Exit codes
| Code | Meaning |
|---|---|
0 |
Review ran successfully, OR diff was too large to send (the tool reports; it does not gate) |
1 |
Marker commit missing (after rebase/force push), or git error |
2 |
Missing/invalid GEMINI_API_KEY |
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fresh_eyes-0.2.0.tar.gz.
File metadata
- Download URL: fresh_eyes-0.2.0.tar.gz
- Upload date:
- Size: 8.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
839906a13ce2155f5a9e3c0aa814e2b7470469ed56fb242000564933a00cddff
|
|
| MD5 |
0d1d866156930bc39888ae7e2db71045
|
|
| BLAKE2b-256 |
d7588ce15c0445136b0e03abc4eda1e2cba8c3266ef8bcd88a8b0d233e53aeb8
|
Provenance
The following attestation bundles were made for fresh_eyes-0.2.0.tar.gz:
Publisher:
release.yml on lucasgerads/fresh-eyes
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fresh_eyes-0.2.0.tar.gz -
Subject digest:
839906a13ce2155f5a9e3c0aa814e2b7470469ed56fb242000564933a00cddff - Sigstore transparency entry: 1644944947
- Sigstore integration time:
-
Permalink:
lucasgerads/fresh-eyes@f536c61f5bd2051868a2c95fc6979d003ddba796 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/lucasgerads
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f536c61f5bd2051868a2c95fc6979d003ddba796 -
Trigger Event:
push
-
Statement type:
File details
Details for the file fresh_eyes-0.2.0-py3-none-any.whl.
File metadata
- Download URL: fresh_eyes-0.2.0-py3-none-any.whl
- Upload date:
- Size: 9.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a7e1762948ba8285843239b2f40b5d8a8dc468b50b146ccb372cbe46eee183f
|
|
| MD5 |
575826a5bbda3c0591ec19e47456c17f
|
|
| BLAKE2b-256 |
1f8bc4c1e78eebe0801db792e66d55bed859a7cd7a12f71954439d87a9351aa3
|
Provenance
The following attestation bundles were made for fresh_eyes-0.2.0-py3-none-any.whl:
Publisher:
release.yml on lucasgerads/fresh-eyes
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fresh_eyes-0.2.0-py3-none-any.whl -
Subject digest:
7a7e1762948ba8285843239b2f40b5d8a8dc468b50b146ccb372cbe46eee183f - Sigstore transparency entry: 1644945030
- Sigstore integration time:
-
Permalink:
lucasgerads/fresh-eyes@f536c61f5bd2051868a2c95fc6979d003ddba796 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/lucasgerads
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f536c61f5bd2051868a2c95fc6979d003ddba796 -
Trigger Event:
push
-
Statement type: