Skip to main content

Local AI layer for git: orchestrates policies & plugins between commit and push.

Project description

giton

AI Cost Tracking

PyPI Version Python License AI Cost Human Time Model

  • ๐Ÿค– LLM usage: $0.6135 (9 commits)
  • ๐Ÿ‘ค Human dev: ~$319 (3.2h @ $100/h, 30min dedup)

Generated on 2026-05-27 using openrouter/qwen/qwen3-coder-next


giton is a local AI layer for Git that works between commit and push. It helps standardize commits, propose safe code fixes, and orchestrate external tools via plugins.

Does something like this already exist?

Partially: there are tools for AI commit messages, git hooks, and commit-history rewriting. What is still missing is one local operator that:

  • interacts with the user right after commit,
  • proposes code fixes as additional commits (fixup!),
  • cleans up history before push,
  • integrates plugins via MCP/REST/CLI/gRPC.

Proposed direction for giton

  1. Local-first with safe defaults

    • AI proposes changes, user approves them.
    • Prefer fixup! commits over automatic history rewriting.
  2. Git hook layer

    • pre-commit: policy validation and quick fixes.
    • post-commit: inspect the fresh commit and propose follow-up patches.
    • pre-push: standardize history (autosquash, commit naming, final checks).
  3. Plugin architecture

    • Shared input/output contract (JSON schema).
    • Plugin adapters: MCP, REST, CLI shell, gRPC/protobuf.

MVP usage example

After giton init, hooks are installed and run automatically from Git lifecycle events. The commands below show equivalent manual execution for demonstration/debugging.

# 1) initialize hooks in the repository
giton init

# 2) user makes a normal commit
git add -p
git commit -m "update stuff"

# 3) equivalent manual run: post-commit hook logic
giton hook post-commit

# 4) equivalent manual run: pre-push hook logic
giton hook pre-push

Example interaction:

giton: Found 2 issues (example: null check, commit message policy).
giton: Apply patch and add commit "fixup! ..."? [Y/n]

MVP plan

  • MVP 1: hooks + policy engine + interactive CLI
  • MVP 2: patching + fixup workflow + pre-push autosquash
  • MVP 3: stable plugin API and MCP/REST/CLI/gRPC integrations

Install

pip install giton

Development

Setup

# Clone the repository
git clone <repo-url>
cd gix

# Install in development mode
pip install -e .[dev]

Dependencies

Runtime:

  • typer>=0.12
  • rich>=13.7
  • PyYAML>=6.0

Development:

  • pytest>=8.0
  • goal>=2.1.0
  • costs>=0.1.20
  • pfix>=0.1.60

Testing

# Run all tests
pytest

# Run specific test file
pytest tests/test_history.py

# Run with coverage
pytest --cov=src/giton

Environment Variables

Create a .env file in the project root (see .env.example):

Variable Default Description
OPENROUTER_API_KEY (not set) Required: OpenRouter API key (https://openrouter.ai/keys)
LLM_MODEL openrouter/qwen/qwen3-coder-next Model to use for AI operations
PFIX_AUTO_APPLY true Automatically apply fixes without asking
PFIX_AUTO_INSTALL_DEPS true Automatically pip/uv install dependencies
PFIX_AUTO_RESTART false Restart process after fix using os.execv
PFIX_MAX_RETRIES 3 Maximum retry attempts
PFIX_DRY_RUN false Run in dry-run mode without making changes
PFIX_ENABLED true Enable automatic fixing
PFIX_GIT_COMMIT false Automatically commit fixes
PFIX_GIT_PREFIX pfix: Commit message prefix for fixes
PFIX_CREATE_BACKUPS false Create backups in .pfix_backups/ directory

Project Structure

gix/
โ”œโ”€โ”€ src/giton/           # Main source code
โ”‚   โ”œโ”€โ”€ __init__.py      # Package initialization
โ”‚   โ”œโ”€โ”€ __main__.py      # Entry point for `python -m giton`
โ”‚   โ”œโ”€โ”€ catalog.py       # Plugin catalog management
โ”‚   โ”œโ”€โ”€ cli.py           # Command-line interface (Typer)
โ”‚   โ”œโ”€โ”€ config.py        # User plugin configuration
โ”‚   โ”œโ”€โ”€ context.py       # Git context collection
โ”‚   โ”œโ”€โ”€ history.py       # Safe history operations (fixup, autosquash)
โ”‚   โ”œโ”€โ”€ hooks.py         # Git hook installation
โ”‚   โ”œโ”€โ”€ interactive.py   # Interactive prompts
โ”‚   โ”œโ”€โ”€ plugins.py       # Plugin installation/management
โ”‚   โ”œโ”€โ”€ policies.py      # Built-in policy engine
โ”‚   โ”œโ”€โ”€ repo_config.py   # Repository configuration
โ”‚   โ”œโ”€โ”€ runner.py        # Plugin execution runner
โ”‚   โ””โ”€โ”€ shell.py         # Interactive REPL shell
โ”œโ”€โ”€ tests/               # Test suite
โ”‚   โ”œโ”€โ”€ test_basic.py    # Basic functionality tests
โ”‚   โ”œโ”€โ”€ test_history.py  # History operations tests
โ”‚   โ””โ”€โ”€ test_policies.py # Policy engine tests
โ”œโ”€โ”€ examples/            # Usage examples
โ”‚   โ”œโ”€โ”€ basic/           # Basic library usage
โ”‚   โ”œโ”€โ”€ advanced/        # Advanced features demo
โ”‚   โ””โ”€โ”€ testing/         # CI/CD integration example
โ”œโ”€โ”€ pyproject.toml       # Project configuration
โ”œโ”€โ”€ README.md            # This file
โ”œโ”€โ”€ SUMD.md              # System documentation (SUMD)
โ”œโ”€โ”€ TODO.md              # Auto-generated TODO list
โ””โ”€โ”€ CHANGELOG.md         # Version history

Quick start

giton init                # install git hooks + 3 default plugins
giton shell               # interactive REPL
giton plugin catalog      # browse all available plugins
giton plugin install domd # install a specific extension
giton plugin install-category lang:python   # install everything for a language

Default plugins

The 3 plugins activated by giton init cover the most common day-to-day needs in a commit โ†’ push loop:

name category trigger role
pyqual lang:python pre-commit Python lint / type / complexity checks
vallm task:validate post-commit Validate AI-generated code/patches
pretest task:test pre-push Run / generate tests before push

Quick-extend categories

Each plugin in the catalog is tagged with a category, so you can install groups at once:

  • languages: lang:python, lang:markdown, lang:any
  • tasks: task:validate, task:test, task:refactor, task:autofix, task:fix, task:docs, task:security
  • integrations: integration:mcp
giton plugin install-category task:autofix

Interactive shell

$ giton shell
giton> help
giton> install-defaults
giton> hook pre-commit
giton> catalog
giton> install prefact

Built-in policies

giton ships with a small zero-dependency policy engine that runs on every hook trigger โ€” even before any plugin is installed:

  • conventional_commits โ€” subject must match type(scope)?: subject and stay within max_subject_length.
  • no_wip_commits โ€” blocks subjects matching wip, tmp, xxx, fixme.
  • no_secrets โ€” scans staged additions for AWS keys, private-key headers and api_key=/secret= patterns.
  • max_file_size โ€” rejects staged files larger than kb (default 512 KB).

Inspect or customize them per repo:

giton policy list                    # show active policies
giton policy check -t pre-commit     # evaluate without running plugins
giton policy init                    # write .giton/config.yaml

.giton/config.yaml is a deep-merge over the defaults โ€” disable a single check or tweak max_subject_length without restating everything:

policies:
  no_wip_commits:
    enabled: false
  conventional_commits:
    max_subject_length: 100
hooks:
  post-commit:
    fail_on_policy: true   # turn advisory checks into blocking

Plugin contract

A plugin is any executable command (CLI). The catalog entry declares its trigger, category, install target (PyPI/local path) and command template. The runner expands {paths}, {diff_file} and {root} placeholders with the current git context before invocation.

Future exec types (mcp, rest) will share the same JSON in/out contract: input = git context + policy findings, output = list of proposed actions (patches, fixup commits, warnings).

Examples

The examples/ directory contains working demonstrations of giton:

  • examples/basic - Basic usage example showing how to use giton as a Python library to collect git context, run triggers, and handle policy findings and plugin results. Can be run directly or with pytest.

  • examples/advanced - Advanced usage example demonstrating plugin management (add, remove, list), custom policy configuration, hook installation/uninstallation, and running multiple triggers in sequence.

  • examples/testing - Testing example with pytest integration and Docker support. Shows how to integrate giton into CI/CD pipelines with containerized testing environments. Includes Dockerfile and docker-compose.yml for easy setup.

Running examples with Docker

All examples include Dockerfiles for containerized execution:

# Basic example
docker build -f examples/basic/Dockerfile -t giton-example-basic .
docker run --rm -v $(pwd)/examples/basic/logs:/app/logs giton-example-basic

# Advanced example
docker build -f examples/advanced/Dockerfile -t giton-example-advanced .
docker run --rm -v $(pwd)/examples/advanced/logs:/app/logs giton-example-advanced

# Testing example
docker build -f examples/testing/Dockerfile -t giton-test .
docker run --rm -v $(pwd)/examples/testing/logs:/app/logs giton-test

See each example's README.md for detailed usage instructions.

License

Licensed under Apache-2.0.

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

giton-0.1.6.tar.gz (739.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

giton-0.1.6-py3-none-any.whl (29.5 kB view details)

Uploaded Python 3

File details

Details for the file giton-0.1.6.tar.gz.

File metadata

  • Download URL: giton-0.1.6.tar.gz
  • Upload date:
  • Size: 739.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for giton-0.1.6.tar.gz
Algorithm Hash digest
SHA256 c6ea9a7b8d4bc2eda6ad6edf972ae35d20dc057174d644e625aaa848b42a2b9f
MD5 e22bb949a51c6672ee88e1092c47d64c
BLAKE2b-256 d7c586cce675c727bfc7e48a32d5e5aaa07d1b2eb3e4b4156b3d0359b674a194

See more details on using hashes here.

File details

Details for the file giton-0.1.6-py3-none-any.whl.

File metadata

  • Download URL: giton-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 29.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for giton-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 463f2ddcb4f319c7945f924d7da35b79312a79dada8f97c31557bcbb1181740c
MD5 5f951558e3f935afa8d19196c0cbe44f
BLAKE2b-256 94cd8faca748d85cb19c25098231bdc196b077ce6b78b7a547796642fe244cea

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page