{"id":45697958,"url":"https://github.com/danwt/demo-fast-commit","last_synced_at":"2026-02-24T21:09:02.379Z","repository":{"id":334386453,"uuid":"1141173025","full_name":"danwt/demo-fast-commit","owner":"danwt","description":"Zero-config CLI tool that analyses git diffs with an LLM and creates atomic conventional commits","archived":false,"fork":false,"pushed_at":"2026-02-20T16:47:07.000Z","size":219,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-20T21:11:33.032Z","etag":null,"topics":["claude-code","cli","conventional-commits","developer-tools","git","llm","openrouter","python"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danwt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-24T11:39:59.000Z","updated_at":"2026-02-20T16:47:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/danwt/demo-fast-commit","commit_stats":null,"previous_names":["danwt/demo-fast-commit"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/danwt/demo-fast-commit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danwt%2Fdemo-fast-commit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danwt%2Fdemo-fast-commit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danwt%2Fdemo-fast-commit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danwt%2Fdemo-fast-commit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danwt","download_url":"https://codeload.github.com/danwt/demo-fast-commit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danwt%2Fdemo-fast-commit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29800990,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T21:02:39.706Z","status":"ssl_error","status_checked_at":"2026-02-24T21:02:21.834Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","cli","conventional-commits","developer-tools","git","llm","openrouter","python"],"created_at":"2026-02-24T21:09:01.723Z","updated_at":"2026-02-24T21:09:02.372Z","avatar_url":"https://github.com/danwt.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# fastc\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\n[![uv](https://img.shields.io/badge/uv-script-blueviolet.svg)](https://docs.astral.sh/uv/)\n\nZero-config CLI tool that analyses your git diff with an LLM and creates atomic, conventional commits.\n\n```\n$ fastc\nanalysing all changes (12 files)...\n  using two-phase approach for large diff\n  phase 1: grouping files...\n  phase 2: generating message for group 1/2...\n  phase 2: generating message for group 2/2...\n  feat(auth): add JWT token validation\n  refactor(db): extract connection pool config\n  chore: update lockfiles\npushed\n```\n\n## Features\n\n- **Atomic commits** - Groups related changes into logical commits\n- **Conventional commit format** - `feat`, `fix`, `refactor`, `chore`, `docs`, `style`, `test`, `perf`\n- **Smart diff handling** - Two-phase approach for large diffs (15+ files)\n- **Lockfile separation** - Commits lockfiles separately with `chore: update lockfiles`\n- **Diff compression** - Reduces token usage for large diffs while preserving context\n- **Retry with backoff** - Automatic retry on API rate limits or transient errors\n- **Rename detection** - Properly handles renamed files\n\n## Install\n\nRequires [uv](https://docs.astral.sh/uv/getting-started/installation/).\n\n```bash\n# Clone and symlink (use absolute path)\ngit clone https://github.com/danwt/demo-fast-commit.git\ncd demo-fast-commit \u0026\u0026 ln -s \"$(pwd)/fc\" ~/.local/bin/fastc \u0026\u0026 cd ..\n\n# Create config\nmkdir -p ~/.config/fast-commit\ncat \u003e ~/.config/fast-commit/.env \u003c\u003c 'EOF'\nOPENROUTER_API_KEY=sk-or-v1-your-key-here\nMODEL=google/gemini-2.0-flash-001\nEOF\n```\n\nGet an API key from [openrouter.ai/keys](https://openrouter.ai/keys).\n\n## Usage\n\n```bash\ncd your-git-repo\nfastc                # analyse, commit, and push\nfastc --dry-run      # preview commits without executing\nfastc --no-push      # commit but don't push\nfastc --no-verify    # bypass pre-commit hooks\n```\n\nThe tool will:\n- Use staged changes if any exist\n- Otherwise stage and commit all changes\n- Push after committing (unless `--no-push`)\n\n## Config\n\n`~/.config/fast-commit/.env`:\n\n| Variable | Description |\n|----------|-------------|\n| `OPENROUTER_API_KEY` | Your OpenRouter API key (required) |\n| `MODEL` | Model to use (required). Any model on OpenRouter works. |\n| `STRUCTURED_OUTPUT` | Set to `false` to disable JSON mode (default: `true`) |\n\n### Recommended models\n\n| Model | Speed | Quality | Cost |\n|-------|-------|---------|------|\n| `google/gemini-2.0-flash-001` | Fast | Good | Low |\n| `anthropic/claude-3.5-sonnet` | Medium | Excellent | Medium |\n| `openai/gpt-4o-mini` | Fast | Good | Low |\n\n## How it works\n\n1. **Detect changes** - Uses staged changes if any, otherwise stages everything\n2. **Exclude noise** - Filters out lockfiles and generated files from analysis\n3. **Analyse diff** - For small diffs, sends directly to LLM. For large diffs (15+ files), uses two-phase approach:\n   - Phase 1: Send file summary to group files by logical change\n   - Phase 2: Generate commit message for each group\n4. **Create commits** - Stages files per group and commits with generated message\n5. **Commit lockfiles** - Any lockfiles get a separate `chore: update lockfiles` commit\n6. **Push** - Pushes all commits to remote\n\n### Excluded from analysis\n\nThese files are excluded from LLM analysis (but still committed):\n\n- **Lockfiles**: `pnpm-lock.yaml`, `package-lock.json`, `yarn.lock`, `bun.lockb`, `Cargo.lock`, `poetry.lock`, `Pipfile.lock`, `go.sum`, `composer.lock`, `Gemfile.lock`\n- **Generated**: `*.min.js`, `*.min.css`, `*.map`\n\n## Claude Code integration\n\nCopy [`SKILL.md`](SKILL.md) to your `.claude/skills/fastc/` directory:\n\n```bash\nmkdir -p ~/.claude/skills/fastc\ncp SKILL.md ~/.claude/skills/fastc/SKILL.md\n```\n\nThen invoke with `/fastc` in Claude Code.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanwt%2Fdemo-fast-commit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanwt%2Fdemo-fast-commit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanwt%2Fdemo-fast-commit/lists"}