github-code-review 3.6.0__tar.gz → 4.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- github_code_review-3.6.0/README.md → github_code_review-4.0.0/PKG-INFO +100 -5
- github_code_review-3.6.0/PKG-INFO → github_code_review-4.0.0/README.md +56 -38
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/bootstrap.py +16 -4
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/cli.py +87 -37
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/cli_base.py +8 -5
- github_code_review-4.0.0/gito/commands/deploy.py +486 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/fix.py +2 -1
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/gh_post_review_comment.py +30 -9
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/gh_react_to_comment.py +10 -10
- github_code_review-4.0.0/gito/commands/gitlab_post_review_comment.py +246 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/linear_comment.py +15 -7
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/repl.py +15 -1
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/version.py +1 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/config.toml +4 -3
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/constants.py +4 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/context.py +2 -2
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/core.py +78 -24
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/gh_api.py +4 -4
- github_code_review-4.0.0/gito/gitlab.py +79 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/issue_trackers.py +23 -8
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/pipeline.py +23 -6
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/pipeline_steps/jira.py +16 -1
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/project_config.py +8 -3
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/report_struct.py +77 -21
- {github_code_review-3.6.0/gito/tpl/github_workflows → github_code_review-4.0.0/gito/tpl/workflows/github}/gito-code-review.yml.j2 +2 -2
- {github_code_review-3.6.0/gito/tpl/github_workflows → github_code_review-4.0.0/gito/tpl/workflows/github}/gito-react-to-comments.yml.j2 +2 -2
- github_code_review-4.0.0/gito/tpl/workflows/gitlab/.gitlab-ci.yml.j2 +4 -0
- github_code_review-4.0.0/gito/tpl/workflows/gitlab/gito-code-review.yml.j2 +29 -0
- github_code_review-4.0.0/gito/utils/__init__.py +3 -0
- github_code_review-4.0.0/gito/utils/cli.py +140 -0
- github_code_review-4.0.0/gito/utils/git.py +27 -0
- github_code_review-4.0.0/gito/utils/git_platform/__init__.py +21 -0
- github_code_review-4.0.0/gito/utils/git_platform/adapters/__init__.py +47 -0
- github_code_review-4.0.0/gito/utils/git_platform/adapters/base.py +82 -0
- github_code_review-4.0.0/gito/utils/git_platform/adapters/github.py +42 -0
- github_code_review-4.0.0/gito/utils/git_platform/adapters/gitlab.py +42 -0
- github_code_review-4.0.0/gito/utils/git_platform/github.py +131 -0
- github_code_review-4.0.0/gito/utils/git_platform/gitlab.py +111 -0
- github_code_review-4.0.0/gito/utils/git_platform/platform_types.py +108 -0
- github_code_review-4.0.0/gito/utils/git_platform/shared.py +80 -0
- github_code_review-4.0.0/gito/utils/html.py +11 -0
- github_code_review-4.0.0/gito/utils/markdown.py +90 -0
- github_code_review-4.0.0/gito/utils/package_metadata.py +9 -0
- github_code_review-4.0.0/gito/utils/python.py +31 -0
- github_code_review-4.0.0/gito/utils/string.py +56 -0
- github_code_review-4.0.0/pyproject.toml +99 -0
- github_code_review-3.6.0/gito/commands/deploy.py +0 -138
- github_code_review-3.6.0/gito/utils.py +0 -270
- github_code_review-3.6.0/pyproject.toml +0 -61
- {github_code_review-3.6.0 → github_code_review-4.0.0}/LICENSE +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/__init__.py +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/__main__.py +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/__init__.py +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/entrypoint.py +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/env.py +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/git_installation_check.py +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/pipeline_steps/__init__.py +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/pipeline_steps/linear.py +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/tpl/answer.j2 +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/tpl/partial/aux_files.j2 +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/tpl/questions/changes_summary.j2 +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/tpl/questions/release_notes.j2 +0 -0
- {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/tpl/questions/test_cases.j2 +0 -0
- {github_code_review-3.6.0/gito/tpl/github_workflows → github_code_review-4.0.0/gito/tpl/workflows/github}/components/env-vars.j2 +0 -0
- {github_code_review-3.6.0/gito/tpl/github_workflows → github_code_review-4.0.0/gito/tpl/workflows/github}/components/installs.j2 +0 -0
|
@@ -1,9 +1,53 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: github-code-review
|
|
3
|
+
Version: 4.0.0
|
|
4
|
+
Summary: AI code review tool that works with any language model provider. It detects issues in GitHub pull requests or local changes—instantly, reliably, and without vendor lock-in.
|
|
5
|
+
License: MIT
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Keywords: static code analysis,code review,code quality,ai,coding,assistant,llm,github,automation,devops,developer tools,github actions,workflows,github-actions,git,pull-request,jira,linear,gitlab,ci-cd,static analysis
|
|
8
|
+
Author: Nayjest
|
|
9
|
+
Author-email: mail@vitaliy.in
|
|
10
|
+
Requires-Python: >=3.11,<4.0
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: System Administrators
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
23
|
+
Classifier: Topic :: Software Development
|
|
24
|
+
Classifier: Topic :: Software Development :: Bug Tracking
|
|
25
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
26
|
+
Classifier: Topic :: Software Development :: Testing
|
|
27
|
+
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
28
|
+
Requires-Dist: GitPython (>=3.1.44,<4.0.0)
|
|
29
|
+
Requires-Dist: ai-microcore (==5.0.0.dev6)
|
|
30
|
+
Requires-Dist: anthropic (>=0.57.1,<1)
|
|
31
|
+
Requires-Dist: fastcore (>=1.11.3,<1.12.0)
|
|
32
|
+
Requires-Dist: ghapi (>=1.0.8,<1.1.0)
|
|
33
|
+
Requires-Dist: google-genai (>=1.56.0,<1.57.0)
|
|
34
|
+
Requires-Dist: jira (>=3.10.5,<4.0.0)
|
|
35
|
+
Requires-Dist: pydantic (>=2.12.5,<3.0.0)
|
|
36
|
+
Requires-Dist: typer (>=0.16.0,<0.22)
|
|
37
|
+
Requires-Dist: unidiff (>=0.7.5,<0.8.0)
|
|
38
|
+
Project-URL: Bug Tracker, https://github.com/Nayjest/Gito/issues
|
|
39
|
+
Project-URL: Documentation, https://github.com/Nayjest/Gito#readme
|
|
40
|
+
Project-URL: Homepage, https://github.com/Nayjest/Gito
|
|
41
|
+
Project-URL: Repository, https://github.com/Nayjest/Gito
|
|
42
|
+
Description-Content-Type: text/markdown
|
|
43
|
+
|
|
1
44
|
<h1 align="center"><a href="#"><img alt="Gito: AI Code Reviewer" src="https://raw.githubusercontent.com/Nayjest/Gito/main/press-kit/logo/gito-ai-code-reviewer_logo-180.png" align="center" width="180"></a></h1>
|
|
2
45
|
<p align="center">
|
|
3
46
|
<a href="https://pypi.org/project/gito.bot/" target="_blank"><img src="https://img.shields.io/pypi/v/gito.bot" alt="PYPI Release"></a>
|
|
4
47
|
<a href="https://github.com/Nayjest/Gito/actions/workflows/code-style.yml" target="_blank"><img src="https://github.com/Nayjest/Gito/actions/workflows/code-style.yml/badge.svg" alt="PyLint"></a>
|
|
5
48
|
<a href="https://github.com/Nayjest/Gito/actions/workflows/tests.yml" target="_blank"><img src="https://github.com/Nayjest/Gito/actions/workflows/tests.yml/badge.svg" alt="Tests"></a>
|
|
6
49
|
<img src="https://raw.githubusercontent.com/Nayjest/Gito/main/coverage.svg" alt="Code Coverage">
|
|
50
|
+
<a href="https://github.com/vshymanskyy/StandWithUkraine/blob/main/README.md" target="_blank"><img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/refs/heads/main/badges/StandWithUkraine.svg" alt="Stand With Ukraine"></a>
|
|
7
51
|
<a href="https://github.com/Nayjest/Gito/blob/main/LICENSE" target="_blank"><img src="https://img.shields.io/static/v1?label=license&message=MIT&color=d08aff" alt="License"></a>
|
|
8
52
|
</p>
|
|
9
53
|
|
|
@@ -15,6 +59,8 @@ Get consistent, thorough code reviews in seconds—no waiting for human availabi
|
|
|
15
59
|
## 📋 Table of Contents
|
|
16
60
|
- [Why Gito?](#-why-gito)
|
|
17
61
|
- [Perfect For](#-perfect-for)
|
|
62
|
+
- [Supported Platforms & Integrations](#-supported-platforms--integrations)
|
|
63
|
+
- [Security & Privacy](#-security--privacy)
|
|
18
64
|
- [Quickstart](#-quickstart)
|
|
19
65
|
- [1. Review Pull Requests via GitHub Actions](#1-review-pull-requests-via-github-actions)
|
|
20
66
|
- [2. Running Code Analysis Locally](#2-running-code-analysis-locally)
|
|
@@ -35,12 +81,13 @@ Get consistent, thorough code reviews in seconds—no waiting for human availabi
|
|
|
35
81
|
|
|
36
82
|
## ✨ Why Gito?<a id="-why-gito"></a>
|
|
37
83
|
|
|
38
|
-
- [⚡] **Lightning Fast:** Get detailed code reviews in seconds, not days
|
|
39
|
-
- [🔧] **Vendor Agnostic:** Works with any language model provider (OpenAI, Anthropic, Google, local models, etc.)
|
|
84
|
+
- [⚡] **Lightning Fast:** Get detailed code reviews in seconds, not days—powered by parallelized LLM processing
|
|
85
|
+
- [🔧] **Vendor Agnostic:** Works with any language model provider (OpenAI, Anthropic, Google, local models, etc.)
|
|
86
|
+
- [🔒] **Private & Secure:** Your code goes directly to your chosen LLM inference provider or local model—no intermediary servers
|
|
40
87
|
- [🌐] **Universal:** Supports all major programming languages and frameworks
|
|
41
88
|
- [🔍] **Comprehensive Analysis:** Detect issues across security, performance, maintainability, best practices, and much more
|
|
42
89
|
- [📈] **Consistent Quality:** Never tired, never biased—consistent review quality every time
|
|
43
|
-
- [🚀] **Easy Integration:** Automatically reviews pull requests via GitHub Actions
|
|
90
|
+
- [🚀] **Easy Integration:** Automatically reviews pull requests via CI/CD workflows (GitHub Actions, etc), posts results as PR comments, and reacts to maintainer comments
|
|
44
91
|
- [🎛️] **Infinitely Flexible:** Adapt to any project's standards—configure review rules, severity levels, and focus areas, build custom workflows
|
|
45
92
|
|
|
46
93
|
## 🎯 Perfect For<a id="-perfect-for"></a>
|
|
@@ -52,11 +99,54 @@ Get consistent, thorough code reviews in seconds—no waiting for human availabi
|
|
|
52
99
|
|
|
53
100
|
✨ See [code review in action](https://github.com/Nayjest/Gito/pull/99) ✨
|
|
54
101
|
|
|
102
|
+
## 🌐 Supported Platforms & Integrations<a id="-supported-platforms--integrations"></a>
|
|
103
|
+
|
|
104
|
+
### 🧩 Git Platforms
|
|
105
|
+
| Platform | Status |
|
|
106
|
+
|-----------|----------------------|
|
|
107
|
+
| GitHub | ✅ Supported |
|
|
108
|
+
| GitLab | 🧪 Supported (Beta) |
|
|
109
|
+
| Bitbucket | 🛠️ Planned |
|
|
110
|
+
|
|
111
|
+
> ℹ️ Gito ships ready-to-use CI/CD workflows for these platforms,
|
|
112
|
+
> with full support for triggering actions via PR comments, automatic review posting, and PR lifecycle integration.
|
|
113
|
+
>
|
|
114
|
+
> Not on this list? Gito works anywhere—via custom CI/CD pipelines or directly from the CLI.
|
|
115
|
+
### 🤖 LLM Providers / Runtimes
|
|
116
|
+
| Provider / Runtime | Status |
|
|
117
|
+
|-------------------------------------------------------------------------------------------------|---------------|
|
|
118
|
+
| OpenAI API | ✅ Supported |
|
|
119
|
+
| Anthropic API | ✅ Supported |
|
|
120
|
+
| Google API | ✅ Supported |
|
|
121
|
+
| Local LLM Services<br/>`Ollama, LM Studio, vLLM, etc.` | ✅ Supported |
|
|
122
|
+
| Embedded Inference<br/>`PyTorch / Transformers` | ✅ Supported |
|
|
123
|
+
| Any OpenAI-compatible API<br>`Mistral, xAI, Azure, Amazon Bedrock, OpenRouter, Fireworks, etc.` | ✅ Supported |
|
|
124
|
+
|
|
125
|
+
### 🗂️ Issue Trackers
|
|
126
|
+
| Tool | Status | Documentation |
|
|
127
|
+
|--------|---------------|---------------|
|
|
128
|
+
| Jira | ✅ Supported | [Atlassian Jira Integration](https://github.com/Nayjest/Gito/blob/main/documentation/jira_integration.md) ↗ |
|
|
129
|
+
| Linear | ✅ Supported | [Linear Integration](https://github.com/Nayjest/Gito/blob/main/documentation/linear_integration.md) ↗ |
|
|
130
|
+
|
|
131
|
+
> 🚀 More platforms and integrations are coming — Gito is built to grow with your stack.
|
|
132
|
+
|
|
133
|
+
## 🔒 Security & Privacy<a id="-security--privacy"></a>
|
|
134
|
+
|
|
135
|
+
Gito keeps your source code private by design:
|
|
136
|
+
it is designed as a **stateless, client-side tool** with a strict zero-retention policy.
|
|
137
|
+
|
|
138
|
+
- **No middleman:** Source code is transmitted directly from your environment (CI/CD runner or local machine)
|
|
139
|
+
to your explicitly configured LLM provider.
|
|
140
|
+
If you use a local model, your code never leaves your network.
|
|
141
|
+
We never see your code.
|
|
142
|
+
- **No data collection:** Your code isn't stored, logged, or retained by Gito.
|
|
143
|
+
- **Fully auditable:** 100% open source. Verify every line yourself.
|
|
144
|
+
|
|
55
145
|
## 🚀 Quickstart<a id="-quickstart"></a>
|
|
56
146
|
|
|
57
147
|
### 1. Review Pull Requests via GitHub Actions<a id="1-review-pull-requests-via-github-actions"></a>
|
|
58
148
|
|
|
59
|
-
Create a `.github/workflows/gito-code-review.yml` file:
|
|
149
|
+
Create a `.github/workflows/gito-code-review.yml` file with the following content:
|
|
60
150
|
```yaml
|
|
61
151
|
name: "Gito: AI Code Review"
|
|
62
152
|
on:
|
|
@@ -78,7 +168,7 @@ jobs:
|
|
|
78
168
|
uses: actions/setup-python@v6
|
|
79
169
|
with: { python-version: "3.13" }
|
|
80
170
|
- name: Install AI Code Review tool
|
|
81
|
-
run: pip install gito.bot~=
|
|
171
|
+
run: pip install gito.bot~=4.0
|
|
82
172
|
- name: Run AI code analysis
|
|
83
173
|
env:
|
|
84
174
|
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
|
|
@@ -121,6 +211,10 @@ pip install gito.bot
|
|
|
121
211
|
> **Troubleshooting:**
|
|
122
212
|
> pip may also be available via cli as `pip3` depending on your Python installation.
|
|
123
213
|
|
|
214
|
+
To install from repository source / specific branch:
|
|
215
|
+
```bash
|
|
216
|
+
pip install git+https://github.com/Nayjest/Gito.git@<branch-or-tag>
|
|
217
|
+
```
|
|
124
218
|
#### Option B: Windows Standalone Installer
|
|
125
219
|
|
|
126
220
|
Download the latest Windows installer from [Releases](https://github.com/Nayjest/Gito/releases).
|
|
@@ -310,3 +404,4 @@ See [CONTRIBUTING.md](https://github.com/Nayjest/Gito/blob/main/CONTRIBUTING.md)
|
|
|
310
404
|
Licensed under the [MIT License](https://github.com/Nayjest/Gito/blob/main/LICENSE).
|
|
311
405
|
|
|
312
406
|
© 2025–2026 [Vitalii Stepanenko](mailto:mail@vitaliy.in)
|
|
407
|
+
|
|
@@ -1,41 +1,10 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: github-code-review
|
|
3
|
-
Version: 3.6.0
|
|
4
|
-
Summary: AI code review tool that works with any language model provider. It detects issues in GitHub pull requests or local changes—instantly, reliably, and without vendor lock-in.
|
|
5
|
-
License: MIT
|
|
6
|
-
License-File: LICENSE
|
|
7
|
-
Keywords: static code analysis,code review,code quality,ai,coding,assistant,llm,github,automation,devops,developer tools,github actions,workflows,git
|
|
8
|
-
Author: Nayjest
|
|
9
|
-
Author-email: mail@vitaliy.in
|
|
10
|
-
Requires-Python: >=3.11,<4.0
|
|
11
|
-
Classifier: Environment :: Console
|
|
12
|
-
Classifier: Intended Audience :: Developers
|
|
13
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
-
Classifier: Programming Language :: Python :: 3
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
-
Classifier: Topic :: Software Development
|
|
20
|
-
Requires-Dist: GitPython (>=3.1.44,<4.0.0)
|
|
21
|
-
Requires-Dist: ai-microcore (>=4,<5)
|
|
22
|
-
Requires-Dist: anthropic (>=0.57.1,<1)
|
|
23
|
-
Requires-Dist: ghapi (>=1.0.6,<1.1.0)
|
|
24
|
-
Requires-Dist: google-generativeai (>=0.8.5,<0.9.0)
|
|
25
|
-
Requires-Dist: jira (>=3.8.0,<4.0.0)
|
|
26
|
-
Requires-Dist: pydantic (>=2.12.3,<3.0.0)
|
|
27
|
-
Requires-Dist: typer (>=0.16.0,<0.21)
|
|
28
|
-
Requires-Dist: unidiff (>=0.7.5,<0.8.0)
|
|
29
|
-
Project-URL: Homepage, https://github.com/Nayjest/Gito
|
|
30
|
-
Project-URL: Repository, https://github.com/Nayjest/Gito
|
|
31
|
-
Description-Content-Type: text/markdown
|
|
32
|
-
|
|
33
1
|
<h1 align="center"><a href="#"><img alt="Gito: AI Code Reviewer" src="https://raw.githubusercontent.com/Nayjest/Gito/main/press-kit/logo/gito-ai-code-reviewer_logo-180.png" align="center" width="180"></a></h1>
|
|
34
2
|
<p align="center">
|
|
35
3
|
<a href="https://pypi.org/project/gito.bot/" target="_blank"><img src="https://img.shields.io/pypi/v/gito.bot" alt="PYPI Release"></a>
|
|
36
4
|
<a href="https://github.com/Nayjest/Gito/actions/workflows/code-style.yml" target="_blank"><img src="https://github.com/Nayjest/Gito/actions/workflows/code-style.yml/badge.svg" alt="PyLint"></a>
|
|
37
5
|
<a href="https://github.com/Nayjest/Gito/actions/workflows/tests.yml" target="_blank"><img src="https://github.com/Nayjest/Gito/actions/workflows/tests.yml/badge.svg" alt="Tests"></a>
|
|
38
6
|
<img src="https://raw.githubusercontent.com/Nayjest/Gito/main/coverage.svg" alt="Code Coverage">
|
|
7
|
+
<a href="https://github.com/vshymanskyy/StandWithUkraine/blob/main/README.md" target="_blank"><img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/refs/heads/main/badges/StandWithUkraine.svg" alt="Stand With Ukraine"></a>
|
|
39
8
|
<a href="https://github.com/Nayjest/Gito/blob/main/LICENSE" target="_blank"><img src="https://img.shields.io/static/v1?label=license&message=MIT&color=d08aff" alt="License"></a>
|
|
40
9
|
</p>
|
|
41
10
|
|
|
@@ -47,6 +16,8 @@ Get consistent, thorough code reviews in seconds—no waiting for human availabi
|
|
|
47
16
|
## 📋 Table of Contents
|
|
48
17
|
- [Why Gito?](#-why-gito)
|
|
49
18
|
- [Perfect For](#-perfect-for)
|
|
19
|
+
- [Supported Platforms & Integrations](#-supported-platforms--integrations)
|
|
20
|
+
- [Security & Privacy](#-security--privacy)
|
|
50
21
|
- [Quickstart](#-quickstart)
|
|
51
22
|
- [1. Review Pull Requests via GitHub Actions](#1-review-pull-requests-via-github-actions)
|
|
52
23
|
- [2. Running Code Analysis Locally](#2-running-code-analysis-locally)
|
|
@@ -67,12 +38,13 @@ Get consistent, thorough code reviews in seconds—no waiting for human availabi
|
|
|
67
38
|
|
|
68
39
|
## ✨ Why Gito?<a id="-why-gito"></a>
|
|
69
40
|
|
|
70
|
-
- [⚡] **Lightning Fast:** Get detailed code reviews in seconds, not days
|
|
71
|
-
- [🔧] **Vendor Agnostic:** Works with any language model provider (OpenAI, Anthropic, Google, local models, etc.)
|
|
41
|
+
- [⚡] **Lightning Fast:** Get detailed code reviews in seconds, not days—powered by parallelized LLM processing
|
|
42
|
+
- [🔧] **Vendor Agnostic:** Works with any language model provider (OpenAI, Anthropic, Google, local models, etc.)
|
|
43
|
+
- [🔒] **Private & Secure:** Your code goes directly to your chosen LLM inference provider or local model—no intermediary servers
|
|
72
44
|
- [🌐] **Universal:** Supports all major programming languages and frameworks
|
|
73
45
|
- [🔍] **Comprehensive Analysis:** Detect issues across security, performance, maintainability, best practices, and much more
|
|
74
46
|
- [📈] **Consistent Quality:** Never tired, never biased—consistent review quality every time
|
|
75
|
-
- [🚀] **Easy Integration:** Automatically reviews pull requests via GitHub Actions
|
|
47
|
+
- [🚀] **Easy Integration:** Automatically reviews pull requests via CI/CD workflows (GitHub Actions, etc), posts results as PR comments, and reacts to maintainer comments
|
|
76
48
|
- [🎛️] **Infinitely Flexible:** Adapt to any project's standards—configure review rules, severity levels, and focus areas, build custom workflows
|
|
77
49
|
|
|
78
50
|
## 🎯 Perfect For<a id="-perfect-for"></a>
|
|
@@ -84,11 +56,54 @@ Get consistent, thorough code reviews in seconds—no waiting for human availabi
|
|
|
84
56
|
|
|
85
57
|
✨ See [code review in action](https://github.com/Nayjest/Gito/pull/99) ✨
|
|
86
58
|
|
|
59
|
+
## 🌐 Supported Platforms & Integrations<a id="-supported-platforms--integrations"></a>
|
|
60
|
+
|
|
61
|
+
### 🧩 Git Platforms
|
|
62
|
+
| Platform | Status |
|
|
63
|
+
|-----------|----------------------|
|
|
64
|
+
| GitHub | ✅ Supported |
|
|
65
|
+
| GitLab | 🧪 Supported (Beta) |
|
|
66
|
+
| Bitbucket | 🛠️ Planned |
|
|
67
|
+
|
|
68
|
+
> ℹ️ Gito ships ready-to-use CI/CD workflows for these platforms,
|
|
69
|
+
> with full support for triggering actions via PR comments, automatic review posting, and PR lifecycle integration.
|
|
70
|
+
>
|
|
71
|
+
> Not on this list? Gito works anywhere—via custom CI/CD pipelines or directly from the CLI.
|
|
72
|
+
### 🤖 LLM Providers / Runtimes
|
|
73
|
+
| Provider / Runtime | Status |
|
|
74
|
+
|-------------------------------------------------------------------------------------------------|---------------|
|
|
75
|
+
| OpenAI API | ✅ Supported |
|
|
76
|
+
| Anthropic API | ✅ Supported |
|
|
77
|
+
| Google API | ✅ Supported |
|
|
78
|
+
| Local LLM Services<br/>`Ollama, LM Studio, vLLM, etc.` | ✅ Supported |
|
|
79
|
+
| Embedded Inference<br/>`PyTorch / Transformers` | ✅ Supported |
|
|
80
|
+
| Any OpenAI-compatible API<br>`Mistral, xAI, Azure, Amazon Bedrock, OpenRouter, Fireworks, etc.` | ✅ Supported |
|
|
81
|
+
|
|
82
|
+
### 🗂️ Issue Trackers
|
|
83
|
+
| Tool | Status | Documentation |
|
|
84
|
+
|--------|---------------|---------------|
|
|
85
|
+
| Jira | ✅ Supported | [Atlassian Jira Integration](https://github.com/Nayjest/Gito/blob/main/documentation/jira_integration.md) ↗ |
|
|
86
|
+
| Linear | ✅ Supported | [Linear Integration](https://github.com/Nayjest/Gito/blob/main/documentation/linear_integration.md) ↗ |
|
|
87
|
+
|
|
88
|
+
> 🚀 More platforms and integrations are coming — Gito is built to grow with your stack.
|
|
89
|
+
|
|
90
|
+
## 🔒 Security & Privacy<a id="-security--privacy"></a>
|
|
91
|
+
|
|
92
|
+
Gito keeps your source code private by design:
|
|
93
|
+
it is designed as a **stateless, client-side tool** with a strict zero-retention policy.
|
|
94
|
+
|
|
95
|
+
- **No middleman:** Source code is transmitted directly from your environment (CI/CD runner or local machine)
|
|
96
|
+
to your explicitly configured LLM provider.
|
|
97
|
+
If you use a local model, your code never leaves your network.
|
|
98
|
+
We never see your code.
|
|
99
|
+
- **No data collection:** Your code isn't stored, logged, or retained by Gito.
|
|
100
|
+
- **Fully auditable:** 100% open source. Verify every line yourself.
|
|
101
|
+
|
|
87
102
|
## 🚀 Quickstart<a id="-quickstart"></a>
|
|
88
103
|
|
|
89
104
|
### 1. Review Pull Requests via GitHub Actions<a id="1-review-pull-requests-via-github-actions"></a>
|
|
90
105
|
|
|
91
|
-
Create a `.github/workflows/gito-code-review.yml` file:
|
|
106
|
+
Create a `.github/workflows/gito-code-review.yml` file with the following content:
|
|
92
107
|
```yaml
|
|
93
108
|
name: "Gito: AI Code Review"
|
|
94
109
|
on:
|
|
@@ -110,7 +125,7 @@ jobs:
|
|
|
110
125
|
uses: actions/setup-python@v6
|
|
111
126
|
with: { python-version: "3.13" }
|
|
112
127
|
- name: Install AI Code Review tool
|
|
113
|
-
run: pip install gito.bot~=
|
|
128
|
+
run: pip install gito.bot~=4.0
|
|
114
129
|
- name: Run AI code analysis
|
|
115
130
|
env:
|
|
116
131
|
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
|
|
@@ -153,6 +168,10 @@ pip install gito.bot
|
|
|
153
168
|
> **Troubleshooting:**
|
|
154
169
|
> pip may also be available via cli as `pip3` depending on your Python installation.
|
|
155
170
|
|
|
171
|
+
To install from repository source / specific branch:
|
|
172
|
+
```bash
|
|
173
|
+
pip install git+https://github.com/Nayjest/Gito.git@<branch-or-tag>
|
|
174
|
+
```
|
|
156
175
|
#### Option B: Windows Standalone Installer
|
|
157
176
|
|
|
158
177
|
Download the latest Windows installer from [Releases](https://github.com/Nayjest/Gito/releases).
|
|
@@ -342,4 +361,3 @@ See [CONTRIBUTING.md](https://github.com/Nayjest/Gito/blob/main/CONTRIBUTING.md)
|
|
|
342
361
|
Licensed under the [MIT License](https://github.com/Nayjest/Gito/blob/main/LICENSE).
|
|
343
362
|
|
|
344
363
|
© 2025–2026 [Vitalii Stepanenko](mailto:mail@vitaliy.in)
|
|
345
|
-
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"""Bootstrap module for initializing the Gito application environment."""
|
|
1
2
|
import os
|
|
2
3
|
import sys
|
|
3
4
|
import io
|
|
@@ -7,8 +8,9 @@ from pathlib import Path
|
|
|
7
8
|
|
|
8
9
|
import microcore as mc
|
|
9
10
|
|
|
10
|
-
from .utils import
|
|
11
|
-
from .
|
|
11
|
+
from .utils.git_platform.gitlab import is_running_in_gitlab_ci
|
|
12
|
+
from .utils.git_platform.github import is_running_in_github_action
|
|
13
|
+
from .constants import HOME_ENV_PATH, EXECUTABLE, PROJECT_GITO_FOLDER, DEFAULT_MAX_CONCURRENT_TASKS
|
|
12
14
|
from .env import Env
|
|
13
15
|
|
|
14
16
|
|
|
@@ -65,6 +67,8 @@ def bootstrap(verbosity: int = 1):
|
|
|
65
67
|
Path(__file__).parent / "tpl"
|
|
66
68
|
],
|
|
67
69
|
)
|
|
70
|
+
if mc.config().MAX_CONCURRENT_TASKS is None:
|
|
71
|
+
mc.config().MAX_CONCURRENT_TASKS = DEFAULT_MAX_CONCURRENT_TASKS
|
|
68
72
|
if verbosity > 1:
|
|
69
73
|
mc.logging.LoggingConfig.STRIP_REQUEST_LINES = None
|
|
70
74
|
else:
|
|
@@ -82,8 +86,16 @@ def bootstrap(verbosity: int = 1):
|
|
|
82
86
|
ref = ref.split(".github/workflows/")[-1]
|
|
83
87
|
ref = f" (.github/workflows/{ref})"
|
|
84
88
|
msg += (
|
|
85
|
-
f"\nPlease check your GitHub Action
|
|
86
|
-
f"and `env` configuration section of the corresponding workflow step{ref}
|
|
89
|
+
f"\nPlease check your GitHub Action secrets "
|
|
90
|
+
f"and `env` configuration section of the corresponding workflow step{ref}.\n"
|
|
91
|
+
f"See https://github.com/Nayjest/Gito/blob/main/documentation/github_setup.md "
|
|
92
|
+
f"for details."
|
|
93
|
+
)
|
|
94
|
+
elif is_running_in_gitlab_ci():
|
|
95
|
+
# @TODO add link to GitLab setup article
|
|
96
|
+
msg += (
|
|
97
|
+
"\nPlease check your GitLab CI/CD Variables "
|
|
98
|
+
"and `variables` configuration section of the corresponding job."
|
|
87
99
|
)
|
|
88
100
|
else:
|
|
89
101
|
msg += (
|
|
@@ -6,9 +6,15 @@ import textwrap
|
|
|
6
6
|
|
|
7
7
|
import microcore as mc
|
|
8
8
|
import typer
|
|
9
|
+
from gito.utils.git_platform.shared import get_repo_base_web_url
|
|
9
10
|
|
|
10
|
-
from .
|
|
11
|
-
|
|
11
|
+
from .core import (
|
|
12
|
+
review,
|
|
13
|
+
answer,
|
|
14
|
+
get_target_diff,
|
|
15
|
+
get_base_branch,
|
|
16
|
+
NoChangesInContextError,
|
|
17
|
+
)
|
|
12
18
|
from .cli_base import (
|
|
13
19
|
app,
|
|
14
20
|
args_to_target,
|
|
@@ -20,17 +26,20 @@ from .cli_base import (
|
|
|
20
26
|
arg_all,
|
|
21
27
|
get_repo_context,
|
|
22
28
|
)
|
|
23
|
-
from .report_struct import Report
|
|
24
|
-
from .constants import HOME_ENV_PATH, GITHUB_MD_REPORT_FILE_NAME
|
|
29
|
+
from .report_struct import Report, ReviewTarget
|
|
30
|
+
from .constants import HOME_ENV_PATH, GITHUB_MD_REPORT_FILE_NAME, REFS_VALUE_ALL
|
|
25
31
|
from .bootstrap import bootstrap
|
|
26
|
-
from .utils import no_subcommand,
|
|
27
|
-
from .
|
|
32
|
+
from .utils.cli import no_subcommand, logo
|
|
33
|
+
from .utils.html import remove_html_comments
|
|
34
|
+
from .utils.git_platform.shared import get_repo_domain_and_path
|
|
35
|
+
from .utils.git_platform.platform_types import PlatformType, identify_git_platform
|
|
28
36
|
from .project_config import ProjectConfig
|
|
29
37
|
|
|
30
|
-
# Import fix command to register it
|
|
31
|
-
from .commands import fix, gh_react_to_comment, repl, deploy, version # noqa
|
|
32
38
|
from .commands.gh_post_review_comment import post_github_cr_comment
|
|
39
|
+
from .commands.gitlab_post_review_comment import post_gitlab_cr_comment
|
|
33
40
|
from .commands.linear_comment import linear_comment
|
|
41
|
+
# Imported for registering commands
|
|
42
|
+
from .commands import fix, gh_react_to_comment, repl, deploy, version # noqa
|
|
34
43
|
|
|
35
44
|
app_no_subcommand = typer.Typer(pretty_exceptions_show_locals=False)
|
|
36
45
|
|
|
@@ -116,14 +125,17 @@ def cmd_review(
|
|
|
116
125
|
filters: str = arg_filters(),
|
|
117
126
|
merge_base: bool = typer.Option(default=True, help="Use merge base for comparison"),
|
|
118
127
|
url: str = typer.Option("", "--url", help="Git repository URL"),
|
|
119
|
-
path: str = typer.Option("", "--path", help="Git repository path"),
|
|
120
|
-
post_comment: bool = typer.Option(
|
|
128
|
+
path: str = typer.Option("", "--path", help="Git repository path"), # @todo: implement
|
|
129
|
+
post_comment: bool = typer.Option(
|
|
130
|
+
default=False,
|
|
131
|
+
help="Post review comment to git platform (GitHub, GitLab, etc.)"
|
|
132
|
+
),
|
|
121
133
|
pr: int = typer.Option(
|
|
122
134
|
default=None,
|
|
123
135
|
help=textwrap.dedent("""\n
|
|
124
|
-
GitHub Pull Request number to post the comment to
|
|
136
|
+
GitHub Pull Request number or GitLab Merge Request ID to post the comment to
|
|
125
137
|
(for local usage together with --post-comment,
|
|
126
|
-
in the
|
|
138
|
+
in the GitHub/GitLab actions PR/MR is resolved from the environment)
|
|
127
139
|
""")
|
|
128
140
|
),
|
|
129
141
|
out: str = arg_out(),
|
|
@@ -132,31 +144,54 @@ def cmd_review(
|
|
|
132
144
|
refs, merge_base = _consider_arg_all(all, refs, merge_base)
|
|
133
145
|
_what, _against = args_to_target(refs, what, against)
|
|
134
146
|
pr = pr or os.getenv("PR_NUMBER_FROM_WORKFLOW_DISPATCH")
|
|
135
|
-
with get_repo_context(url, _what) as (repo, out_folder):
|
|
136
|
-
|
|
137
|
-
|
|
147
|
+
with (get_repo_context(url, _what) as (repo, out_folder)):
|
|
148
|
+
commit_sha = repo.head.commit.hexsha
|
|
149
|
+
try:
|
|
150
|
+
active_branch = repo.active_branch.name
|
|
151
|
+
except TypeError:
|
|
152
|
+
active_branch = None
|
|
153
|
+
review_target = ReviewTarget(
|
|
154
|
+
git_platform_type=identify_git_platform(repo),
|
|
155
|
+
repo_url=get_repo_base_web_url(repo),
|
|
156
|
+
pull_request_id=str(pr) if pr else None,
|
|
138
157
|
what=_what,
|
|
139
158
|
against=_against,
|
|
140
159
|
filters=filters,
|
|
141
160
|
use_merge_base=merge_base,
|
|
161
|
+
commit_sha=commit_sha,
|
|
162
|
+
active_branch=active_branch,
|
|
163
|
+
)
|
|
164
|
+
asyncio.run(review(
|
|
165
|
+
repo=repo,
|
|
166
|
+
target=review_target,
|
|
142
167
|
out_folder=out or out_folder,
|
|
143
|
-
pr=pr,
|
|
144
168
|
))
|
|
145
169
|
if post_comment:
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
170
|
+
|
|
171
|
+
md_report_file = os.path.join(out or out_folder, GITHUB_MD_REPORT_FILE_NAME)
|
|
172
|
+
if review_target.git_platform_type == PlatformType.GITHUB:
|
|
173
|
+
try:
|
|
174
|
+
_, repo_path = get_repo_domain_and_path(repo)
|
|
175
|
+
except ValueError as e:
|
|
176
|
+
logging.error(
|
|
177
|
+
"Error posting comment:\n"
|
|
178
|
+
"Could not extract GitHub repository path "
|
|
179
|
+
"from the local repository."
|
|
180
|
+
)
|
|
181
|
+
raise typer.Exit(code=1) from e
|
|
182
|
+
post_github_cr_comment(
|
|
183
|
+
md_report_file=md_report_file,
|
|
184
|
+
pr=pr,
|
|
185
|
+
gh_repo=repo_path,
|
|
152
186
|
)
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
187
|
+
elif review_target.git_platform_type == PlatformType.GITLAB:
|
|
188
|
+
post_gitlab_cr_comment(md_report_file=md_report_file, merge_request_iid=pr)
|
|
189
|
+
else:
|
|
190
|
+
msg = "Posting comments is only supported for GitHub and GitLab repositories."
|
|
191
|
+
if not review_target.git_platform_type:
|
|
192
|
+
msg = f"Could not identify the Git provider for the current repository. {msg}"
|
|
193
|
+
logging.error(msg)
|
|
194
|
+
raise typer.Exit(code=1)
|
|
160
195
|
|
|
161
196
|
|
|
162
197
|
@app.command(name="ask", help="Answer questions about the target codebase changes.")
|
|
@@ -221,13 +256,17 @@ def cmd_answer(
|
|
|
221
256
|
|
|
222
257
|
@app.command(help="Configure LLM for local usage interactively.")
|
|
223
258
|
def setup():
|
|
259
|
+
print(logo())
|
|
224
260
|
mc.interactive_setup(HOME_ENV_PATH)
|
|
225
261
|
|
|
226
262
|
|
|
227
263
|
@app.command(name="report", help="Render and display code review report.")
|
|
228
264
|
@app.command(name="render", hidden=True)
|
|
229
265
|
def render(
|
|
230
|
-
format: str = typer.Argument(
|
|
266
|
+
format: str = typer.Argument(
|
|
267
|
+
default=Report.Format.CLI,
|
|
268
|
+
help="Report format: md (Markdown), cli (terminal)"
|
|
269
|
+
),
|
|
231
270
|
source: str = typer.Option(
|
|
232
271
|
"",
|
|
233
272
|
"--src",
|
|
@@ -249,21 +288,32 @@ def files(
|
|
|
249
288
|
against: str = arg_against(),
|
|
250
289
|
filters: str = arg_filters(),
|
|
251
290
|
merge_base: bool = typer.Option(default=True, help="Use merge base for comparison"),
|
|
252
|
-
diff: bool = typer.Option(default=False, help="Show diff content")
|
|
291
|
+
diff: bool = typer.Option(default=False, help="Show diff content"),
|
|
292
|
+
all: bool = arg_all(),
|
|
253
293
|
):
|
|
294
|
+
refs, merge_base = _consider_arg_all(all, refs, merge_base)
|
|
254
295
|
_what, _against = args_to_target(refs, what, against)
|
|
255
296
|
with get_repo_context(url=None, branch=_what) as (repo, out_folder):
|
|
256
|
-
patch_set = get_diff(repo=repo, what=_what, against=_against, use_merge_base=merge_base)
|
|
257
|
-
patch_set = filter_diff(patch_set, filters)
|
|
258
297
|
cfg = ProjectConfig.load_for_repo(repo)
|
|
259
|
-
|
|
260
|
-
patch_set =
|
|
298
|
+
try:
|
|
299
|
+
patch_set = get_target_diff(
|
|
300
|
+
repo=repo,
|
|
301
|
+
config=cfg,
|
|
302
|
+
what=_what,
|
|
303
|
+
against=_against,
|
|
304
|
+
filters=filters,
|
|
305
|
+
use_merge_base=merge_base,
|
|
306
|
+
pr=None,
|
|
307
|
+
)
|
|
308
|
+
except NoChangesInContextError:
|
|
309
|
+
patch_set = []
|
|
310
|
+
|
|
261
311
|
print(
|
|
262
312
|
f"Changed files: "
|
|
263
313
|
f"{mc.ui.green(_what or 'INDEX')} vs "
|
|
264
|
-
f"{mc.ui.yellow(_against or repo
|
|
314
|
+
f"{mc.ui.yellow(_against or get_base_branch(repo))}"
|
|
265
315
|
f"{' filtered by ' + mc.ui.cyan(filters) if filters else ''} --> "
|
|
266
|
-
f"{mc.ui.cyan(len(patch_set
|
|
316
|
+
f"{mc.ui.cyan(len(patch_set))} file(s)."
|
|
267
317
|
)
|
|
268
318
|
|
|
269
319
|
for patch in patch_set:
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""
|
|
2
|
+
Common CLI arguments and utilities for Gito commands.
|
|
3
|
+
"""
|
|
2
4
|
import contextlib
|
|
3
5
|
import logging
|
|
4
6
|
import tempfile
|
|
@@ -9,11 +11,15 @@ import typer
|
|
|
9
11
|
from git import Repo, InvalidGitRepositoryError
|
|
10
12
|
|
|
11
13
|
from .constants import REFS_VALUE_ALL
|
|
12
|
-
from .utils import parse_refs_pair
|
|
14
|
+
from .utils.string import parse_refs_pair
|
|
13
15
|
from .env import Env
|
|
14
16
|
|
|
15
17
|
|
|
18
|
+
app = typer.Typer(pretty_exceptions_show_locals=False)
|
|
19
|
+
|
|
20
|
+
|
|
16
21
|
def args_to_target(refs, what, against) -> tuple[str | None, str | None]:
|
|
22
|
+
"""Convert CLI arguments to target WHAT and AGAINST refs."""
|
|
17
23
|
if refs == REFS_VALUE_ALL:
|
|
18
24
|
return REFS_VALUE_ALL, None
|
|
19
25
|
_what, _against = parse_refs_pair(refs)
|
|
@@ -79,9 +85,6 @@ def arg_all() -> typer.Option:
|
|
|
79
85
|
return typer.Option(default=False, help="Review whole codebase")
|
|
80
86
|
|
|
81
87
|
|
|
82
|
-
app = typer.Typer(pretty_exceptions_show_locals=False)
|
|
83
|
-
|
|
84
|
-
|
|
85
88
|
@contextlib.contextmanager
|
|
86
89
|
def get_repo_context(
|
|
87
90
|
url: str | None,
|