{"id":14530194,"url":"https://github.com/mritd/gitflow-toolkit","last_synced_at":"2026-02-24T04:16:58.581Z","repository":{"id":38338094,"uuid":"123890578","full_name":"mritd/gitflow-toolkit","owner":"mritd","description":"A simple toolkit for GitFlow.","archived":false,"fork":false,"pushed_at":"2026-01-24T00:58:43.000Z","size":9504,"stargazers_count":231,"open_issues_count":2,"forks_count":19,"subscribers_count":3,"default_branch":"master","last_synced_at":"2026-01-24T05:36:32.988Z","etag":null,"topics":["gitflow","gitflow-toolkit","toolkit"],"latest_commit_sha":null,"homepage":"","language":"Go","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/mritd.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}},"created_at":"2018-03-05T08:45:08.000Z","updated_at":"2026-01-24T00:58:47.000Z","dependencies_parsed_at":"2024-06-20T14:46:16.695Z","dependency_job_id":"01afb288-7479-42a2-bf09-df573cbea773","html_url":"https://github.com/mritd/gitflow-toolkit","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/mritd/gitflow-toolkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mritd%2Fgitflow-toolkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mritd%2Fgitflow-toolkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mritd%2Fgitflow-toolkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mritd%2Fgitflow-toolkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mritd","download_url":"https://codeload.github.com/mritd/gitflow-toolkit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mritd%2Fgitflow-toolkit/sbom","scorecard":{"id":664108,"data":{"date":"2025-08-11","repo":{"name":"github.com/mritd/gitflow-toolkit","commit":"a4c37cda0ef23df4bd48f50e264c1edd4f6e0eda"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v2.1.5 not signed: https://api.github.com/repos/mritd/gitflow-toolkit/releases/66868853","Warn: release artifact v2.1.4 not signed: https://api.github.com/repos/mritd/gitflow-toolkit/releases/56711592","Warn: release artifact v2.1.3 not signed: https://api.github.com/repos/mritd/gitflow-toolkit/releases/56685914","Warn: release artifact v2.1.1 not signed: https://api.github.com/repos/mritd/gitflow-toolkit/releases/50292413","Warn: release artifact v2.1.0 not signed: https://api.github.com/repos/mritd/gitflow-toolkit/releases/50192707","Warn: release artifact v2.1.5 does not have provenance: https://api.github.com/repos/mritd/gitflow-toolkit/releases/66868853","Warn: release artifact v2.1.4 does not have provenance: https://api.github.com/repos/mritd/gitflow-toolkit/releases/56711592","Warn: release artifact v2.1.3 does not have provenance: https://api.github.com/repos/mritd/gitflow-toolkit/releases/56685914","Warn: release artifact v2.1.1 does not have provenance: https://api.github.com/repos/mritd/gitflow-toolkit/releases/50292413","Warn: release artifact v2.1.0 does not have provenance: https://api.github.com/repos/mritd/gitflow-toolkit/releases/50192707"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T17:19:37.152Z","repository_id":38338094,"created_at":"2025-08-21T17:19:37.152Z","updated_at":"2025-08-21T17:19:37.152Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29771268,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T04:01:02.180Z","status":"ssl_error","status_checked_at":"2026-02-24T03:59:49.901Z","response_time":75,"last_error":"SSL_read: 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":["gitflow","gitflow-toolkit","toolkit"],"created_at":"2024-09-05T00:01:05.621Z","updated_at":"2026-02-24T04:16:58.575Z","avatar_url":"https://github.com/mritd.png","language":"Go","readme":"# GitFlow Toolkit\n\nGitFlow Toolkit is a CLI tool written in Go for standardizing git commit messages following the [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/) specification. It provides an interactive TUI for creating commits, branches, and managing git operations.\n\n[demo.webm](https://github.com/user-attachments/assets/f50ea867-3be3-46c0-905c-e0a092f9d6a0)\n\n## Features\n\n- Interactive TUI for commit message creation (Conventional Commits 1.0.0)\n- AI-powered commit message generation (OpenRouter, Groq, OpenAI, Ollama)\n- Git subcommand integration (`git ci`, `git ps`, `git feat`, etc.)\n- Lucky commit hash prefix support\n- Adaptive terminal UI with light/dark theme\n\n## Requirements\n\n- Git\n- macOS or Linux (Windows is not fully tested)\n\n## Installation\n\n### Homebrew (macOS/Linux)\n\n```bash\nbrew install mritd/gitflow-toolkit/gitflow-toolkit\n```\n\n### Manual\n\nDownload the latest binary from the [Release page](https://github.com/mritd/gitflow-toolkit/releases) and run the install command:\n\n```bash\n# Download the latest release (replace PLATFORM with: linux-amd64, darwin-arm64, etc.)\ncurl -fsSL https://github.com/mritd/gitflow-toolkit/releases/latest/download/gitflow-toolkit-PLATFORM -o gitflow-toolkit\nchmod +x gitflow-toolkit\n\n# Install (creates symlinks for git subcommands)\nsudo ./gitflow-toolkit install\n```\n\n### Go\n\n```bash\ngo install github.com/mritd/gitflow-toolkit/v3@latest\n```\n\nNote: When installing via `go install`, you need to manually run `gitflow-toolkit install` to create git subcommand symlinks.\n\n## Usage\n\nAfter installation, you can use the following git subcommands:\n\n### Commit\n\n```bash\ngit ci\n```\n\nThis opens an interactive TUI to create a commit message with:\n- Type selection (feat, fix, docs, build, etc.)\n- Scope input (optional)\n- Subject line (required)\n- Optional body (supports external editor with `Ctrl+E`)\n- Optional footer\n- Optional breaking change description (auto adds `!` marker)\n\n### Push\n\n```bash\ngit ps\n```\n\nPush the current branch to origin with a progress indicator.\n\n### Create Branch\n\n```bash\ngit feat my-feature    # Creates feat/my-feature\ngit fix bug-123        # Creates fix/bug-123\ngit docs readme        # Creates docs/readme\n```\n\n## Commands\n\n| Command             | Description                                    |\n|---------------------|------------------------------------------------|\n| `git ci`            | Interactive commit message creation            |\n| `git ps`            | Push current branch to remote                  |\n| `git feat NAME`     | Create branch `feat/NAME`                      |\n| `git fix NAME`      | Create branch `fix/NAME`                       |\n| `git hotfix NAME`   | Create branch `hotfix/NAME`                    |\n| `git docs NAME`     | Create branch `docs/NAME`                      |\n| `git style NAME`    | Create branch `style/NAME`                     |\n| `git refactor NAME` | Create branch `refactor/NAME`                  |\n| `git chore NAME`    | Create branch `chore/NAME`                     |\n| `git perf NAME`     | Create branch `perf/NAME`                      |\n| `git test NAME`     | Create branch `test/NAME`                      |\n| `git build NAME`    | Create branch `build/NAME`                     |\n\n## Commit Message Format\n\nThe tool follows the [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/) specification:\n\n```\n\u003ctype\u003e[optional scope]: \u003cdescription\u003e\n\n[optional body]\n\n[optional footer(s)]\n```\n\n**Supported types:** `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`, `perf`, `hotfix`, `build`\n\n## Configuration\n\nAll settings are configured via `~/.gitconfig` under the `[gitflow]` section.\n\n```ini\n[gitflow]\n    # LLM API key (required for cloud providers)\n    llm-api-key = sk-or-v1-xxxxx\n    \n    # LLM settings\n    llm-api-host = https://openrouter.ai\n    llm-api-path = /api/v1/chat/completions\n    llm-model = mistralai/devstral-2512:free\n    llm-temperature = 0.3\n    llm-diff-context = 5\n    llm-max-diff-lines = 500\n    llm-request-timeout = 2m\n    llm-max-retries = 0\n    llm-output-lang = en\n    llm-max-concurrency = 3\n    llm-api-debug = false\n\n    # Custom prompts (optional, language-specific)\n    llm-file-analysis-prompt = \"Summarize this diff briefly.\"\n    llm-commit-prompt-en = \"Your custom English commit prompt.\"\n    llm-commit-prompt-zh = \"Your custom Chinese commit prompt.\"\n    llm-commit-prompt-bilingual = \"Your custom bilingual commit prompt.\"\n    \n    # Lucky commit prefix (hex characters, max 12)\n    lucky-commit-prefix = abc\n    \n    # SSH strict host key checking (default: false)\n    ssh-strict-host-key = false\n    \n    # Auto-detect commit type from branch name (default: false)\n    branch-auto-detect = true\n\n    # Require optional fields (default: false)\n    require-scope = false\n    require-body = false\n    require-footer = false\n```\n\n### Configuration Reference\n\n| Key | Description | Default |\n|-----|-------------|---------|\n| `llm-api-key` | API key for cloud LLM providers | - |\n| `llm-api-host` | LLM API endpoint | see below |\n| `llm-api-path` | API path (auto-detected for known providers) | see below |\n| `llm-model` | LLM model name | see below |\n| `llm-temperature` | Model temperature | `0.3` |\n| `llm-diff-context` | Diff context lines | `5` |\n| `llm-request-timeout` | Request timeout (Go duration, e.g., `2m`, `30s`) | `2m` |\n| `llm-max-retries` | Max retry count on failure | `0` |\n| `llm-output-lang` | Output language (`en`, `zh`, `bilingual`) | `en` |\n| `llm-max-concurrency` | Max parallel file analysis | `3` |\n| `llm-max-diff-lines` | Max diff lines to analyze | `500` |\n| `llm-api-debug` | Enable debug logging to temp file | `false` |\n| `llm-file-analysis-prompt` | Custom file analysis prompt | - |\n| `llm-commit-prompt-en` | Custom English commit prompt | - |\n| `llm-commit-prompt-zh` | Custom Chinese commit prompt | - |\n| `llm-commit-prompt-bilingual` | Custom bilingual commit prompt | - |\n| `lucky-commit-prefix` | Lucky commit hex prefix (max 12 chars) | - |\n| `ssh-strict-host-key` | SSH strict host key checking | `false` |\n| `branch-auto-detect` | Auto-detect commit type from branch name | `false` |\n| `require-scope` | Require scope field | `false` |\n| `require-body` | Require body field | `false` |\n| `require-footer` | Require footer field | `false` |\n\n### Auto Generate (AI)\n\nGenerate commit messages automatically using LLM:\n\n1. Run `git ci` and press `Tab` to switch to the `Auto Generate` button (or press `a`)\n2. Wait for AI to generate the commit message\n3. Review the generated message, then choose:\n   - **Commit**: Use the message as-is\n   - **Edit**: Open in `$EDITOR` for modifications\n   - **Retry**: Regenerate the message\n\n**Provider Selection:**\n\n| Provider | When | Default Path | Default Model |\n|----------|------|--------------|---------------|\n| OpenRouter | API key set, no custom host | `/api/v1/chat/completions` | `mistralai/devstral-2512:free` |\n| Groq | Host contains `groq.com` | `/openai/v1/chat/completions` | - |\n| Ollama | No API key | `/api/chat` | `deepseek-coder-v2:16b` |\n| OpenAI-compatible | Other hosts (openai.com, deepseek.com, mistral.ai, etc.) | `/v1/chat/completions` | - |\n\n**Custom API Path:**\n\nIf your provider uses a non-standard path, set it explicitly:\n```bash\ngit config --global gitflow.llm-api-path \"/custom/v1/chat/completions\"\n```\n\n**Quick Start with OpenRouter (recommended):**\n```bash\ngit config --global gitflow.llm-api-key \"sk-or-v1-xxxxx\"\ngit ci  # Press 'a' or Tab to Auto Generate\n```\n\n**Quick Start with Local Ollama:**\n```bash\nollama pull deepseek-coder-v2:16b\ngit ci\n```\n\n**Language Options:**\n- `en` - English only (default)\n- `zh` - Chinese subject and body (type/scope remain English)\n- `bilingual` - Bilingual subject `english (中文)` with Chinese body\n\n### Lucky Commit\n\nGenerate commit hashes with a specific prefix using [lucky_commit](https://github.com/not-an-aardvark/lucky-commit):\n\n```bash\n# Install lucky_commit first\ncargo install lucky_commit\n\n# Set the desired prefix (hex characters, max 12)\ngit config --global gitflow.lucky-commit-prefix abc\n\n# Commit as usual - hash will start with \"abc\"\ngit ci\n```\n\n- Prefix must be valid hex characters (0-9, a-f)\n- Maximum prefix length is 12 characters\n- Press Ctrl+C during search to skip and keep original commit\n\n### Branch Auto-Detection\n\nAutomatically pre-select the commit type based on your current branch name:\n\n```bash\n# Enable the feature\ngit config --global gitflow.branch-auto-detect true\n\n# Now when you're on a branch like \"feat/login\" or \"feature-new-ui\"\ngit ci  # Cursor will auto-select \"feat\" type\n```\n\n**Supported branch prefixes:**\n\n| Branch Prefix | Commit Type |\n|---------------|-------------|\n| `feat`, `feature` | feat |\n| `fix`, `bugfix`, `bug` | fix |\n| `docs`, `doc`, `document` | docs |\n| `style` | style |\n| `refactor`, `refact` | refactor |\n| `test`, `testing` | test |\n| `chore` | chore |\n| `perf`, `performance` | perf |\n| `hotfix` | hotfix |\n| `build` | build |\n\nSupports separators: `/`, `-`, `_` (e.g., `feat/login`, `fix-bug-123`, `docs_readme`)\n\n## Uninstall\n\n### Homebrew\n\n```bash\nbrew uninstall gitflow-toolkit\nbrew untap mritd/gitflow-toolkit\n```\n\n### Manual\n\n```bash\nsudo gitflow-toolkit uninstall\n```\n\n## License\n\nMIT\n","funding_links":[],"categories":["Go","Applications"],"sub_categories":["Development Tools"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmritd%2Fgitflow-toolkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmritd%2Fgitflow-toolkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmritd%2Fgitflow-toolkit/lists"}