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.
Files changed (65) hide show
  1. github_code_review-3.6.0/README.md → github_code_review-4.0.0/PKG-INFO +100 -5
  2. github_code_review-3.6.0/PKG-INFO → github_code_review-4.0.0/README.md +56 -38
  3. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/bootstrap.py +16 -4
  4. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/cli.py +87 -37
  5. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/cli_base.py +8 -5
  6. github_code_review-4.0.0/gito/commands/deploy.py +486 -0
  7. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/fix.py +2 -1
  8. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/gh_post_review_comment.py +30 -9
  9. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/gh_react_to_comment.py +10 -10
  10. github_code_review-4.0.0/gito/commands/gitlab_post_review_comment.py +246 -0
  11. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/linear_comment.py +15 -7
  12. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/repl.py +15 -1
  13. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/version.py +1 -0
  14. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/config.toml +4 -3
  15. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/constants.py +4 -0
  16. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/context.py +2 -2
  17. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/core.py +78 -24
  18. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/gh_api.py +4 -4
  19. github_code_review-4.0.0/gito/gitlab.py +79 -0
  20. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/issue_trackers.py +23 -8
  21. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/pipeline.py +23 -6
  22. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/pipeline_steps/jira.py +16 -1
  23. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/project_config.py +8 -3
  24. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/report_struct.py +77 -21
  25. {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
  26. {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
  27. github_code_review-4.0.0/gito/tpl/workflows/gitlab/.gitlab-ci.yml.j2 +4 -0
  28. github_code_review-4.0.0/gito/tpl/workflows/gitlab/gito-code-review.yml.j2 +29 -0
  29. github_code_review-4.0.0/gito/utils/__init__.py +3 -0
  30. github_code_review-4.0.0/gito/utils/cli.py +140 -0
  31. github_code_review-4.0.0/gito/utils/git.py +27 -0
  32. github_code_review-4.0.0/gito/utils/git_platform/__init__.py +21 -0
  33. github_code_review-4.0.0/gito/utils/git_platform/adapters/__init__.py +47 -0
  34. github_code_review-4.0.0/gito/utils/git_platform/adapters/base.py +82 -0
  35. github_code_review-4.0.0/gito/utils/git_platform/adapters/github.py +42 -0
  36. github_code_review-4.0.0/gito/utils/git_platform/adapters/gitlab.py +42 -0
  37. github_code_review-4.0.0/gito/utils/git_platform/github.py +131 -0
  38. github_code_review-4.0.0/gito/utils/git_platform/gitlab.py +111 -0
  39. github_code_review-4.0.0/gito/utils/git_platform/platform_types.py +108 -0
  40. github_code_review-4.0.0/gito/utils/git_platform/shared.py +80 -0
  41. github_code_review-4.0.0/gito/utils/html.py +11 -0
  42. github_code_review-4.0.0/gito/utils/markdown.py +90 -0
  43. github_code_review-4.0.0/gito/utils/package_metadata.py +9 -0
  44. github_code_review-4.0.0/gito/utils/python.py +31 -0
  45. github_code_review-4.0.0/gito/utils/string.py +56 -0
  46. github_code_review-4.0.0/pyproject.toml +99 -0
  47. github_code_review-3.6.0/gito/commands/deploy.py +0 -138
  48. github_code_review-3.6.0/gito/utils.py +0 -270
  49. github_code_review-3.6.0/pyproject.toml +0 -61
  50. {github_code_review-3.6.0 → github_code_review-4.0.0}/LICENSE +0 -0
  51. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/__init__.py +0 -0
  52. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/__main__.py +0 -0
  53. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/commands/__init__.py +0 -0
  54. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/entrypoint.py +0 -0
  55. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/env.py +0 -0
  56. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/git_installation_check.py +0 -0
  57. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/pipeline_steps/__init__.py +0 -0
  58. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/pipeline_steps/linear.py +0 -0
  59. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/tpl/answer.j2 +0 -0
  60. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/tpl/partial/aux_files.j2 +0 -0
  61. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/tpl/questions/changes_summary.j2 +0 -0
  62. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/tpl/questions/release_notes.j2 +0 -0
  63. {github_code_review-3.6.0 → github_code_review-4.0.0}/gito/tpl/questions/test_cases.j2 +0 -0
  64. {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
  65. {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 powered by parallelized LLM processing
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 and posts results as PR comments
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~=3.6
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 powered by parallelized LLM processing
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 and posts results as PR comments
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~=3.6
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 is_running_in_github_action
11
- from .constants import HOME_ENV_PATH, EXECUTABLE, PROJECT_GITO_FOLDER
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 Secrets "
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 .constants import REFS_VALUE_ALL
11
- from .core import review, get_diff, filter_diff, answer
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, extract_gh_owner_repo, remove_html_comments
27
- from .gh_api import resolve_gh_token
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(default=False, help="Post review comment to GitHub"),
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 github actions PR is resolved from the environment)
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
- asyncio.run(review(
137
- repo=repo,
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
- try:
147
- owner, repo_name = extract_gh_owner_repo(repo)
148
- except ValueError as e:
149
- logging.error(
150
- "Error posting comment:\n"
151
- "Could not extract GitHub owner and repository name from the local repository."
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
- raise typer.Exit(code=1) from e
154
- post_github_cr_comment(
155
- md_report_file=os.path.join(out or out_folder, GITHUB_MD_REPORT_FILE_NAME),
156
- pr=pr,
157
- gh_repo=f"{owner}/{repo_name}",
158
- token=resolve_gh_token()
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(default=Report.Format.CLI),
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
- if cfg.exclude_files:
260
- patch_set = filter_diff(patch_set, cfg.exclude_files, exclude=True)
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.remotes.origin.refs.HEAD.reference.name)}"
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 or []))} file(s)."
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
- """Common CLI arguments and utilities for Gito commands."""
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,