{"id":27010749,"url":"https://github.com/mayurifag/yawn","last_synced_at":"2026-04-19T13:04:42.871Z","repository":{"id":285562397,"uuid":"958483159","full_name":"Mayurifag/yawn","owner":"Mayurifag","description":"ai generated commits with convenience ","archived":false,"fork":false,"pushed_at":"2025-06-27T11:46:28.000Z","size":217,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-27T12:35:33.886Z","etag":null,"topics":["ai","commit","gemini","git","golang"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Mayurifag.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}},"created_at":"2025-04-01T09:16:37.000Z","updated_at":"2025-05-16T17:16:45.000Z","dependencies_parsed_at":null,"dependency_job_id":"0fb634a4-5277-4fb4-a3d3-e2b81d1a8c4d","html_url":"https://github.com/Mayurifag/yawn","commit_stats":null,"previous_names":["mayurifag/yawn"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/Mayurifag/yawn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mayurifag%2Fyawn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mayurifag%2Fyawn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mayurifag%2Fyawn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mayurifag%2Fyawn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Mayurifag","download_url":"https://codeload.github.com/Mayurifag/yawn/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mayurifag%2Fyawn/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265769357,"owners_count":23825255,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["ai","commit","gemini","git","golang"],"created_at":"2025-04-04T11:27:16.708Z","updated_at":"2026-04-17T09:31:53.596Z","avatar_url":"https://github.com/Mayurifag.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Yawn\n\n[![Go Version](https://img.shields.io/github/go-mod/go-version/Mayurifag/yawn)](https://github.com/Mayurifag/yawn/blob/main/go.mod)\n[![Go Report Card](https://goreportcard.com/badge/github.com/Mayurifag/yawn)](https://goreportcard.com/report/github.com/Mayurifag/yawn)\n[![CI](https://github.com/Mayurifag/yawn/actions/workflows/ci.yml/badge.svg)](https://github.com/Mayurifag/yawn/actions/workflows/ci.yml)\n[![Release](https://github.com/Mayurifag/yawn/actions/workflows/release.yml/badge.svg)](https://github.com/Mayurifag/yawn/actions/workflows/release.yml)\n\n**Writing Git commit messages makes you yawn?** 🥱 Here is a tool that will stage/commit/push for you!\n\n---\n\n## Why Yawn?\n\nIn its most basic form, you make changes, run `yawn`, and boom – your code is staged (if needed), committed with AI-generated message, and pushed. All in one go!\n\nBut \"simple\" doesn't mean \"limited\". Under the hood, `yawn` is **super customizable**:\n\n* Tweak the AI prompt or use different Gemini model? ✅\n* Automatically stage changes, commit and push? ✅\n* Override defaults using environment variables or additional parameters? ✅\n* Override config per project? ✅\n* Avoid Gemini API limits? ✅\n* Sensible defaults? ✅\n* Need to push skipping Git hooks (`git push --no-verify`)? You may even force push, if you want. ✅\n\nIt **really** adapts to your workflow, that's why I made it and why it is better\nthan any other Git commit message generator I've tried.\n\n---\n\n## Installation\n\n### Binary\n\nPlace `yawn` binary from Releases in your `PATH` folder and make it executable.\n\nPro-tip: `alias q=\"yawn\"` is very useful, add it after first tries + config\nadaptations and your workflow will be changed forever. 😉 Same goes for\n`alias sq=\"yawn squash\"` — squash your branch in two keystrokes.\n\n### Building from Source\n\nRequires Go 1.24+. Make sure `$GOPATH/bin` or `$HOME/go/bin` is in your `PATH`.\n\nRun: `go install github.com/Mayurifag/yawn/cmd/yawn@latest`\n\n---\n\n## Commands\n\n### `yawn` (default)\n\nStages, commits with AI-generated message, and pushes.\n\n### `yawn squash`\n\nSquashes all commits on the current branch (since it diverged from `main`/`master`/`dev`) into a single AI-generated commit.\n\n- Must not be on a default branch (`main`, `master`, `dev`)\n- Shows how many commits were squashed\n- Streams the AI-generated commit message\n- Shows repository link after squash\n- If the working tree is dirty, you are asked what to do:\n  - **Enter** — cancel\n  - **s** — stash changes, squash, then restore\n  - **a** — add dirty changes into the squashed commit\n- After squashing, optionally force-pushes with `--force-with-lease` (auto if `squash_auto_push = true`)\n\n---\n\n## Customization\n\nWant to tweak things? `yawn` is flexible!\n\n* **See all options:** Run `yawn --generate-config` to see a commented default configuration file (`.yawn.toml`).\n* **Common tweaks:**\n  * `prompt`: Rewrite the instructions for the AI.\n  * `ask_stage`: Set to `false` to never stage automatically.\n  * `auto_push`: Set to `true` to always push after commit.\n  * `push_command`: Change how `yawn` pushes (e.g., `git push --no-verify origin HEAD`).\n  * `squash_auto_push`: Set to `true` to automatically force-push after `yawn squash`. Defaults to `false`.\n  * `wait_for_ssh_keys`: Set to `true` to make yawn wait until SSH keys are available via `ssh-add -l` before pushing. Useful for workflows involving tools like KeePassXC where the agent might not have keys immediately. Defaults to `false`.\n\nPlace your customizations in `./.yawn.toml` (project-specific) or `~/.config/yawn/config.toml` (global), or use `YAWN_*` environment variables.\n\nBy default, `yawn` generates commit messages following the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification, which provides a standardized format for commit messages. This makes your commit history more readable and enables automated tools to parse your commit messages.\n\n---\n\n## Contributing\n\nFound a bug or have an idea? Issues and Pull Requests are welcome on the [GitHub repository](https://github.com/Mayurifag/yawn)!\n\n---\n\n## License\n\nThis project is released into the public domain under The Unlicense. See the [LICENSE](LICENSE) file for details.\n\n---\n\n## Roadmap\n\n* Fix\n\n```\nAuto-pushing changes (enabled via user home config)...\nThe authenticity of host '[git.nnnnn.cfd]:222 ([152.89.168.232]:222)' can't be established.\nED25519 key fingerprint is: SHA256:OkSB/zuvLttvf9VShx9xIITF6l3gUjhay2zb85OAXRE\nThis key is not known by any other names.\n```\n\n* Remove verbose mode - it is not needed and complicates code\n* Think of better config handling. Current solution is complex. Though I also need source of config, koanf seems missing this functionality. Plus better init file handling. I need to write custom provider for those. Maybe koanf rewrite with custom provider.\n* git pull before commit\n* git push force with lease confirmation if already there is commit in origin. [y/N]. Also show 3 latest commits from origin in such case with authors.\n* If commited manually something and accidently type `q` after — that means user wants to push, lets do it for him - on agreement (enter)\n* If pushed not in default branch - we may suggest to open PR for github / move to PR link (if we can get it from git somehow or if user have gh cli). Same for gitlab maybe..\n* Rewrite README.md\n* Make installation easier for all OSes (i.e. homebrew installation) and README.md better\n* Release 1.0.0 when it will be mature enough\n* Change release process makefile command\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmayurifag%2Fyawn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmayurifag%2Fyawn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmayurifag%2Fyawn/lists"}