78b9c7a0a06ed2151a8e9d9e22f704ce34555ef3
gai
AI-powered git commit message generator
Generate Conventional Commits messages using AI — based on your project context, code diff, and commit history.
Features
- Interactive menu —
gaiopens a menu, select actions with ↑/↓ + space/enter - 3-layer context — project overview, staged diff, and recent commit history
- Conventional Commits —
feat(scope): descriptionformat by default - Interactive file selection — ↑/↓ to navigate, space to select, top-level "Select all"
- Inline editing — edit AI-generated messages right in the terminal with cursor movement
- OpenAI-compatible API — works with DeepSeek, OpenAI, Ollama, and more
- Review before commit — confirm, edit, or abort the generated message
- Zero dependencies — built entirely on Bun native APIs
Quick Start
# Install dependencies
bun install
# Configure your API key
gai config
# Open interactive menu
gai
# Or directly generate a commit message
gai commit
Usage
gai Open interactive menu
gai commit Generate commit message (interactive file selection)
gai commit --auto Auto-stage all changed files
gai commit -d Generate message without committing
gai config Configure API settings
gai --help Show help
gai --version Show version
Interactive Menu
$ gai
gai
↑/↓ navigate, space/enter select
❯ ◉ commit Generate AI commit message
Commit Flow
$ gai commit
Staged files (will be included):
✓ src/git.ts (modified)
Unstaged files:
1. src/ai.ts (modified)
2. src/newfile.ts (new)
Select files to stage:
❯ ◉ Select all
○ src/ai.ts (modified)
◉ src/newfile.ts (new)
Generating commit message...
Generated commit message:
feat(git): add interactive file staging and commit wrapper
Use this message? [Y/n/e] Y
✔ Committed successfully!
[main a3f7c2b] feat(git): add interactive file staging and commit wrapper
1 file changed, 45 insertions(+), 12 deletions(-)
Configuration
Via gai config (interactive)
gai config
Via environment variables
| Variable | Default | Description |
|---|---|---|
GAI_API_KEY |
— | Required. Your API key |
GAI_API_BASE |
https://api.deepseek.com/v1 |
API base URL |
GAI_MODEL |
deepseek-chat |
Model name |
GAI_MAX_TOKENS |
500 |
Max response tokens |
GAI_TEMPERATURE |
0.7 |
Sampling temperature |
Via .env file
Bun auto-loads .env — no dotenv needed:
GAI_API_KEY=sk-your-key
GAI_API_BASE=https://api.deepseek.com/v1
GAI_MODEL=deepseek-chat
Using other providers
OpenAI
GAI_API_KEY=sk-xxx
GAI_API_BASE=https://api.openai.com/v1
GAI_MODEL=gpt-4o
Ollama (local)
GAI_API_KEY=ollama
GAI_API_BASE=http://localhost:11434/v1
GAI_MODEL=llama3
OpenRouter
GAI_API_KEY=sk-or-xxx
GAI_API_BASE=https://openrouter.ai/api/v1
GAI_MODEL=anthropic/claude-sonnet-4
How It Works
┌─────────────────────────────────────────────┐
│ gai │
├─────────────────────────────────────────────┤
│ 1. Collect project context │
│ ├─ README.md / package.json │
│ └─ Directory structure │
│ │
│ 2. Collect code changes │
│ └─ git diff --staged │
│ │
│ 3. Collect commit history │
│ └─ git log --oneline -10 │
│ │
│ 4. Build prompt → Call AI API │
│ │
│ 5. Review → Confirm → Commit │
└─────────────────────────────────────────────┘
Build
Compile to a standalone binary:
bun run build
# Output: ./gai
Test
bun test