# gai **AI-powered git commit message generator** [![Version](https://img.shields.io/badge/version-0.1.0-blue.svg)](https://github.com/mplan/git-ai) [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE) [![Bun](https://img.shields.io/badge/runtime-Bun-f9d71c.svg)](https://bun.sh) [![TypeScript](https://img.shields.io/badge/lang-TypeScript-3178c6.svg)](https://www.typescriptlang.org/) Generate **Conventional Commits** messages using AI — based on your project context, code diff, and commit history.
--- ## Features - **3-layer context** — project overview, staged diff, and recent commit history - **Conventional Commits** — `feat(scope): description` format by default - **Interactive file selection** — ↑/↓ to navigate, space to select, top-level "Select all" - **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 ```bash # Install dependencies bun install # Configure your API key bun run gai config # Generate a commit message bun run gai ``` ## Usage ``` gai Generate commit message (interactive file selection) gai --auto Auto-stage all changed files gai --dry-run Generate message without committing gai config Configure API settings gai --help Show help gai --version Show version ``` ### Interactive Flow ``` $ gai Select files to stage: ❯ ◉ Select all ◉ src/git.ts (modified) ○ src/ai.ts (modified) ◉ src/newfile.ts (new) ↑/↓ navigate, space select, enter confirm Generating commit message... Generated commit message: feat(git): add interactive file staging and commit wrapper Use this message? [Y/n/e] Y Committed successfully! ``` ## Configuration ### Via `gai config` (interactive) ```bash bun run 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-v4-flash` | 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: ```bash GAI_API_KEY=sk-your-key GAI_API_BASE=https://api.deepseek.com/v1 GAI_MODEL=deepseek-v4-flash ``` ### Using other providers
OpenAI ```bash GAI_API_KEY=sk-xxx GAI_API_BASE=https://api.openai.com/v1 GAI_MODEL=gpt-4o ```
Ollama (local) ```bash GAI_API_KEY=ollama GAI_API_BASE=http://localhost:11434/v1 GAI_MODEL=llama3 ```
OpenRouter ```bash 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: ```bash bun run build # Output: ./gai ``` ## Test ```bash bun test ``` ## License [MIT](./LICENSE)