No description
Find a file
autocommit 6d79bc2753 deps-upgrade(deps): ⬆️ Update dependencies to latest stable versions in pyproject.toml
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-04-17 21:20:13 -07:00
.forgejo/workflows fix(README): update README.md for new commit hash format 2026-01-05 18:00:18 -08:00
docs feat(@ml/auto-commit-service): implement per-repo atomic workflow for commit and push 2026-01-09 22:13:03 -08:00
scripts/cli feat(@ml/auto-commit-service): add initial commit service implementation 2026-01-09 22:17:12 -08:00
src/auto_commit_service feat(@ml/auto-commit-service): add stalled repo notifications 2026-04-15 22:23:55 -07:00
tests fix(@ml/auto-commit-service): 🐛 update stashed check to skipped_dirty 2026-04-12 23:18:47 -07:00
.gitignore chore: add .gitignore for Python build artifacts 2026-01-09 11:27:10 -08:00
commits-tray feat(@ml): add menu-bar tray agent for local commits 2026-04-12 19:43:37 -07:00
pyproject.toml deps-upgrade(deps): ⬆️ Update dependencies to latest stable versions in pyproject.toml 2026-04-17 21:20:13 -07:00
README.md feat(cli): add commits CLI for multi-daemon management 2026-01-09 19:41:35 -08:00

Auto-Commit Service

Automated commit message generation service using local LLM inference. Commits and pushes changes across lilith-platform repos every 15 minutes.

Features

  • Generates commit messages using llama-service (local 3B model)
  • Processes multiple repositories in a cycle
  • Automatic push with conflict resolution
  • Claude Code fallback for complex failures
  • FastAPI endpoints for monitoring and manual triggers
  • CLI for multi-daemon management (commits command)

Installation

# Install the package
cd /var/home/lilith/Code/@packages/@ml/auto-commit-service
pip install -e .

# Or with model-boss integration (recommended)
pip install -e ".[model-boss]"

# Or with dev dependencies
pip install -e ".[dev]"

After installation, the commits CLI is available system-wide.

Model Configuration

The service requires a language model to generate commit messages. You have three options:

  1. Auto-load via model-boss (recommended):

    pip install -e ".[model-boss]"
    # Models will be auto-downloaded and cached
    # Default: ministral-3b-instruct
    
  2. Manual model path:

    export LLAMA_SERVICE_MODEL_PATH=/path/to/model.gguf
    
  3. Disable auto-start (use external llama-service):

    export AUTO_COMMIT_LLAMA_SERVICE_AUTOSTART=false
    

Important: If no model is configured, the service will fail to start and report as down. This prevents making commits with placeholder messages.

CLI Usage

The commits CLI manages multiple auto-commit daemon instances.

Quick Start

# Start daemon for current directory
cd ~/Code/@packages
commits start 5m -R              # Every 5 min, recursive discovery

# Check status
commits status                   # Current directory
commits status --all             # All daemons

# View report
commits report                   # Comprehensive report
commits report -A                # All daemons summary

# Trigger immediate cycle
commits once                     # Refresh repos and commit
commits once -A                  # All daemons

# Stop daemon
commits stop

Commands

Command Description
commits start [interval] [OPTIONS] Start daemon for current directory
commits stop Stop daemon for current directory
commits status [-A] Show daemon status
commits once [-A] Refresh repos and trigger cycle
commits report [-A] [-C N] [--raw] Show comprehensive report
commits trigger Manually trigger a commit cycle
commits enable Enable the daemon
commits disable Disable the daemon
commits logs Tail daemon logs
commits list List all running daemons
commits install-systemd DIR [OPTIONS] Install systemd user service

Start Options

commits start [interval] [OPTIONS]

Options:
  -R, --recursive        Enable recursive git discovery
  --depth INT            Recursion depth limit
  -C, --cache-update STR Cache refresh interval (default: 60m)

Examples:
  commits start 5m              # Every 5 minutes
  commits start -R 1h           # Every hour, recursive
  commits start -R --depth 1 5m # Every 5 min, depth 1

Report Options

commits report [OPTIONS]

Options:
  -A, --all-daemons    Show reports for all daemons
  -C INT               Show last N commits grouped by repo
  --raw                Show raw JSON output

Examples:
  commits report             # Summary for current directory
  commits report -A          # Summary for all daemons
  commits report -C 20       # Last 20 commits

Systemd Integration

# Install systemd user service
commits install-systemd ~/Code/@packages 5m -R

# Service commands
systemctl --user status commits-var-home-lilith-Code-@packages
systemctl --user stop commits-var-home-lilith-Code-@packages
journalctl --user -u commits-var-home-lilith-Code-@packages -f

Configuration

Environment variables (prefix: AUTO_COMMIT_):

Variable Default Description
AUTO_COMMIT_LLAMA_SERVICE_URL http://localhost:8000 llama-service URL
AUTO_COMMIT_LLAMA_SERVICE_AUTOSTART true Auto-start llama-service if down
AUTO_COMMIT_LLAMA_MODEL_ID qwen2.5-1.5b-instruct Model ID for model-boss
AUTO_COMMIT_USE_MODEL_BOSS true Use model-boss for model loading
AUTO_COMMIT_CYCLE_INTERVAL_SECONDS 900 Seconds between cycles (15 min)
AUTO_COMMIT_ENABLED true Enable daemon on startup
AUTO_COMMIT_CLAUDE_FALLBACK_ENABLED true Enable Claude Code recovery
AUTO_COMMIT_HOST 0.0.0.0 Service host
AUTO_COMMIT_PORT 8200 Service port

Direct Service Usage

If you prefer to run the service directly without the CLI:

Run directly

python -m auto_commit_service

Run with uvicorn

uvicorn auto_commit_service:create_auto_commit_service --host 0.0.0.0 --port 8200

API Endpoints

Endpoint Method Description
/health GET Service health check
/status GET Daemon status and last cycle
/trigger POST Manually trigger a cycle
/enable POST Enable the daemon
/disable POST Disable the daemon
/repos GET List configured repositories
/repos/refresh-and-run POST Refresh repo cache and trigger cycle
/report/summary GET Comprehensive daemon report
/report/commits GET Commit history

Examples

# Check health
curl http://localhost:8200/health

# Get status
curl http://localhost:8200/status

# Trigger manual cycle
curl -X POST http://localhost:8200/trigger

# Disable daemon
curl -X POST http://localhost:8200/disable

Commit Style

Generated commits follow the Lilith Platform convention:

  • feat: New feature
  • 🔧 chore: Maintenance, config changes
  • ♻️ refactor: Code restructuring
  • 🐛 fix: Bug fix
  • 📝 docs: Documentation
  • test: Tests
  • 🔥 remove: Removing code/files

Error Handling

  1. No model configured: Service fails to start, reported as down (prevents bad commits)
  2. Push rejected: Attempts git pull --rebase and retries
  3. Merge conflict: Invokes Claude Code to resolve
  4. Hook failure: Invokes Claude Code to fix
  5. LLM unavailable: Service auto-starts if configured, otherwise skips cycle
  6. Infrastructure errors (network, auth): Skips Claude recovery, reports error
  7. Auth failure: Skips repo (requires manual fix)

Development

# Install dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run tests with coverage
pytest --cov=auto_commit_service

Architecture

auto_commit_service/
├── __init__.py         # Package exports
├── __main__.py         # Entry point
├── app.py              # FastAPI application factory
├── config.py           # Settings (AutoCommitSettings)
├── models.py           # Pydantic models
├── cli/                # CLI module
│   ├── __init__.py     # Typer app and commands
│   ├── registry.py     # Daemon registry management
│   └── utils.py        # CLI utilities
├── git/
│   ├── operations.py   # Async git commands
│   ├── repository.py   # Repository abstraction
│   └── diff_parser.py  # Diff summarization
├── llm/
│   ├── client.py       # llama-service HTTP client
│   └── prompts.py      # Commit message prompts
├── scheduler/
│   ├── daemon.py       # Main 900s loop
│   └── processor.py    # Per-repo commit logic
└── recovery/
    ├── handlers.py     # Error type routing
    └── claude_fallback.py  # Claude Code invocation

Dependencies

  • lilith-ml-service-base: FastAPI patterns, lifespan, health checks
  • httpx: Async HTTP client for llama-service
  • pydantic: Configuration and models
  • uvicorn: ASGI server
  • typer: CLI framework

Configuration Files

File Location Purpose
Daemon registry ~/.config/commits/daemons.json Tracks running daemon instances
Logs /tmp/auto-commit-{port}.log Per-daemon log files