You can't push until you prove you understand your code.
PokéPush hooks into git push and forces you to battle a Pokémon trainer before your code ships. Answer questions about your own diff to win. Lose, and the push is blocked.
git push
→ pre-push hook (bash)
→ pokepush CLI (Python)
→ extracts git diff
→ calls Gemini API (single parallel call)
→ generates questions, trash talk, opponent team, diff summary
→ starts FastAPI server (localhost:5173)
→ opens browser tab
→ React UI battle plays out
→ user answers questions
→ browser POSTs result
→ server shuts down
→ hook exits 0 (push allowed) or 1 (push blocked)
pokepush/
├── README.md
├── cli
│ ├── gemeni_client.py
│ ├── git_utils.py
│ ├── hook_installer.py
│ └── pokepush.py
├── frontend
│ ├── index.html
│ ├── package.json
│ ├── public
│ ├── src
│ │ ├── App.jsx
│ │ ├── components
│ │ │ ├── BattleResult.jsx
│ │ │ ├── DialogBox.jsx
│ │ │ ├── HPBar.jsx
│ │ │ ├── MoveSelectPanel.jsx
│ │ │ ├── QuestionPanel.jsx
│ │ │ └── PokemonSprite.jsx
│ │ ├── hooks
│ │ │ └── useBattle.js
│ │ └── main.jsx
│ └── vite.config.js
├── install.sh
├── requirements.txt
└── server
├── main.py
└── models.py
# 1. Clone and install
git clone https://github.com/you/pokepush
cd pokepush
chmod +x install.sh
sudo ./install.sh
# 2. Set your Gemini API key
export GEMINI_API_KEY=your_key_here
# 3. Install the git hook in any repo
cd your-project
pokepush install
# 4. Now just code and push
git add .
git commit -m "feat: add user auth"
git push # 🔴 battle startsGEMINI_API_KEY= # Required
SUPABASE_URL= # Optional - for leaderboard
SUPABASE_ANON_KEY= # Optional - for leaderboard