Mplan 4b384a7581 refactor(ui): update menu, selector for TTY detection; thin dispatcher
- Update menu.ts and selector.ts to use isStdinTTY() and function-based
  terminal colors
- Refactor index.ts from 995-line monolith to ~270-line dispatcher that
  registers all commands via the CLI parser and delegates to modules
- Add initTTY() call at startup for correct pipe/TTY detection
- Interactive menu expanded to include new commands (explain, review,
  changelog, suggest, amend)
2026-06-16 02:01:05 +08:00
2026-06-11 00:01:40 +08:00
2026-06-09 17:20:53 +08:00
2026-06-11 20:10:34 +08:00

gai

AI-powered Git commit and pull request helper

Release License: MIT Bun TypeScript

Generate Conventional Commits messages and pull request descriptions using AI, based on your project context, code diff, branch changes, and commit history.


Features

  • Interactive menugai opens a menu, select actions with ↑/↓ + space/enter
  • Context-aware commits — reads project overview, staged diff, and recent commit history
  • Conventional Commitsfeat(scope): description format 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
  • AI-generated PRs — create GitHub, Gitea, or GitLab pull requests with generated title and body
  • OpenAI-compatible API — works with DeepSeek, OpenAI, Ollama, OpenRouter, and more
  • Review before commit — confirm, edit, or abort the generated message
  • Bun-native runtime — built on Bun APIs with no runtime npm dependencies

Quick Start

# Install dependencies
bun install

# Configure your API key
gai config

# Open interactive menu
gai

# Or directly generate a commit message
gai commit

# Or create an AI-generated pull request
gai pr

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 pr             Create a PR with AI-generated title and body
gai pr --draft     Create a draft PR
gai config         Configure API settings
gai --help         Show help
gai --version      Show version

Interactive Menu

$ gai

  gai
  Choose a workflow
  ↑/↓ navigate · enter/space select · ctrl+c cancel

   ● commit  Generate AI commit message
    ○ pr      Create a PR with AI-generated title
    ○ config  Configure API settings

Commit Flow

$ gai commit

  Staged files (will be included):
    ✓ src/git.ts (modified)

  Select files to stage:
  2 unstaged files available
  ↑/↓ navigate · space toggle · enter confirm · ←/backspace back · ctrl+c cancel

   □ 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(-)

Pull Request Flow

gai pr detects the remote platform from origin:

  • GitHub remotes use the gh CLI
  • Gitea remotes use the tea CLI
  • GitLab remotes use the glab CLI
  • Unknown remotes prompt you to choose a platform

The command compares your current branch against the default branch, pushes the branch if needed, generates a PR title/body from the branch commits and diff, then asks for confirmation before creating the PR.

gai pr
gai pr --draft

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-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:

GAI_API_KEY=sk-your-key
GAI_API_BASE=https://api.deepseek.com/v1
GAI_MODEL=deepseek-v4-flash

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 for commits         │
│     └─ branch diff for pull requests         │
│                                              │
│  3. Collect commit history                   │
│     ├─ git log --oneline -10 for commits     │
│     └─ branch commits for pull requests      │
│                                              │
│  4. Build prompt → Call AI API               │
│                                              │
│  5. Review → Confirm → Commit or Create PR   │
└─────────────────────────────────────────────┘

Build

Compile to a standalone binary:

bun run build
# Output: ./gai

Test

bun test

License

MIT

S
Description
No description provided
Readme MIT 362 KiB
v0.1.3 Latest
2026-06-17 21:32:17 +08:00
Languages
TypeScript 100%