gitpr-cli 0.0.16__py3-none-any.whl → 0.0.17__py3-none-any.whl
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.
- {gitpr_cli-0.0.16.dist-info → gitpr_cli-0.0.17.dist-info}/METADATA +17 -6
- {gitpr_cli-0.0.16.dist-info → gitpr_cli-0.0.17.dist-info}/RECORD +9 -9
- src/cache.py +1 -2
- src/main.py +220 -19
- src/updater.py +1 -1
- {gitpr_cli-0.0.16.dist-info → gitpr_cli-0.0.17.dist-info}/WHEEL +0 -0
- {gitpr_cli-0.0.16.dist-info → gitpr_cli-0.0.17.dist-info}/entry_points.txt +0 -0
- {gitpr_cli-0.0.16.dist-info → gitpr_cli-0.0.17.dist-info}/licenses/LICENSE +0 -0
- {gitpr_cli-0.0.16.dist-info → gitpr_cli-0.0.17.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gitpr-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.17
|
|
4
4
|
Summary: Automação de PRs, Commits e Code Review com IA (Gemini e DeepSeek)
|
|
5
5
|
Author-email: Natan Fiuza <contato@natanfiuza.dev.br>
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -125,11 +125,12 @@ Você pode passar as seguintes *flags* para ações específicas:
|
|
|
125
125
|
* `--provider <gemini|deepseek>`: Força a utilização de uma IA específica apenas para esta execução, ignorando o seu padrão guardado no `.env`.
|
|
126
126
|
* `-l` ou `--linter`: Roda **apenas o linter estático local** (sem chamadas de IA). Ideal para usar em pipelines de CI/CD para bloquear código fora do padrão.
|
|
127
127
|
* `-ih` ou `--installhooks`: Instala automaticamente os **Git Hooks locais** (`pre-commit` e `prepare-commit-msg`) no seu repositório.
|
|
128
|
-
* `-s` ou `--skill`: Cria os arquivos de template de contexto da IA (`.gitpr.commit.md`, `.gitpr.pr.md`, `.gitpr.review.md`, `.gitpr.filereview.md`) e do Linter (`.gitpr.linter.yml`) na raiz do projeto.
|
|
128
|
+
* `-s` ou `--skill`: Cria os arquivos de template de contexto da IA (`.gitpr.commit.md`, `.gitpr.pr.md`, `.gitpr.review.md`, `.gitpr.filereview.md`, `.gitpr.issue.md`, `.gitpr.blame.md`) e do Linter (`.gitpr.linter.yml`) na raiz do projeto.
|
|
129
129
|
* `-is` ou `--issue`: Gera automaticamente o rascunho de uma **Issue padronizada** e abre uma interface interativa (TUI) para edição ou envio direto via API REST. Esta funcionalidade possui **3 motores de contexto** dependendo da combinação de comandos:
|
|
130
130
|
* **Issue de Código Novo (`gitpr -is`):** Lê o `git diff` atual. **Por que usar:** Ideal para documentar rapidamente a tarefa que você acabou de programar, antes de commitar.
|
|
131
131
|
* **Issue de Épico/Release (`gitpr -is -ht`):** Lê o histórico completo da branch atual (Git Log + Cache de PRs). **Por que usar:** Ideal para gerar uma documentação consolidada de uma release inteira ou de uma *feature* grande que levou vários dias/commits para ser concluída.
|
|
132
132
|
* **Issue Arqueológica/Dívida Técnica (`gitpr -is -b arquivo:linhas`):** Lê a linha do tempo de uma regra específica. **Por que usar:** Ideal para documentar dívidas técnicas, explicando como um bloco de código legado evoluiu e por que precisa ser refatorado.
|
|
133
|
+
* `-h` ou `--help`: Mostra a ajuda geral com todas as opções. Use em conjunto com outra flag para **ajuda contextual** (ex: `gitpr -h --issue`, `gitpr -h --linter`) com link direto para a documentação detalhada de cada funcionalidade.
|
|
133
134
|
* `-u` ou `--update`: Verifica e instala a versão mais recente do GitPR (Auto-Updater).
|
|
134
135
|
* `-h` ou `--help`: Exibe o menu de ajuda.
|
|
135
136
|
|
|
@@ -172,6 +173,8 @@ Em vez de esconder as instruções da IA no código fonte, o GitPR utiliza arqui
|
|
|
172
173
|
* `.gitpr.pr.md`: Estrutura de tópicos exigida para a descrição do Pull Request.
|
|
173
174
|
* `.gitpr.review.md`: Define o foco de arquitetura (ex: SOLID, Clean Code) para a análise de diffs.
|
|
174
175
|
* `.gitpr.filereview.md`: Define regras rígidas de coesão e acoplamento para auditoria de um ficheiro completo (usado com `--input`).
|
|
176
|
+
* `.gitpr.issue.md`: Define a estrutura e o nível de detalhe exigido para a geração de Issues padronizadas (usado com `--issue`).
|
|
177
|
+
* `.gitpr.blame.md`: Define o foco da análise arqueológica para o rastreamento de código legado (usado com `--blame`).
|
|
175
178
|
|
|
176
179
|
## 📚 Documentação Técnica e Guias Avançados
|
|
177
180
|
|
|
@@ -179,10 +182,18 @@ Para manter este README conciso, detalhamos as implementações mais avançadas
|
|
|
179
182
|
|
|
180
183
|
Se você deseja implementar o GitPR como uma barreira de qualidade automatizada na sua equipe, consulte os guias abaixo:
|
|
181
184
|
|
|
182
|
-
* [**
|
|
183
|
-
* [**
|
|
184
|
-
* [**Geração de Issues e Interface TUI**](docs/issue-tui-help.md): Como utilizar a interface gráfica de terminal (TUI)
|
|
185
|
-
* [**
|
|
185
|
+
* [**Git Hooks Locais (Shift-Left)**](docs/git-hooks-locais.md): Como usar o `gitpr --installhooks` para criar travas na máquina do desenvolvedor e usar a IA para escrever mensagens de commit automaticamente.
|
|
186
|
+
* [**Linter Estático Customizável**](docs/linter-regras-customizadas.md): Como criar regras de validação no `.gitpr.linter.yml` para CI/CD e hooks de pre-commit.
|
|
187
|
+
* [**Geração de Issues e Interface TUI**](docs/issue-tui-help.md): Como utilizar a interface gráfica de terminal (TUI) e os 3 motores de contexto para gerir Issues estruturadas.
|
|
188
|
+
* [**Code Review com IA**](docs/code-review-ia.md): Guia dos modos de revisão (`--review`, `--fullreview`) e auditoria de arquivo (`--input`).
|
|
189
|
+
* [**Mensagens de Commit com IA**](docs/commit-message-ia.md): Como gerar mensagens no padrão Conventional Commits e integrar com Git Hooks.
|
|
190
|
+
* [**Arqueólogo de Código (Git Blame)**](docs/blame-arqueologo.md): Como rastrear a origem de regras de negócio com `git blame` e IA.
|
|
191
|
+
* [**Sistema de Skills e Templates**](docs/skill-template.md): Como customizar o comportamento da IA com arquivos `.gitpr.*.md`.
|
|
192
|
+
* [**Auto-Updater**](docs/auto-update.md): Como funciona a atualização automática (hot-swap) do GitPR.
|
|
193
|
+
* [**Provedores de IA**](docs/providers-ia.md): Configuração e seleção entre Google Gemini e DeepSeek.
|
|
194
|
+
* [**Pull Request (Modo Padrão)**](docs/pr-descricao-padrao.md): Fluxo completo de geração de descrição de PR sem flags.
|
|
195
|
+
* [**Integração com CI/CD (GitHub Actions)**](docs/github-ci-linter.md): Como rodar o GitPR no pipeline para travar o "Merge" de PRs com violações.
|
|
196
|
+
* [**Integração e Segurança do Token GitHub (PAT)**](docs/github-pat-integration.md): Entenda como o GitPR gera issues diretamente no repositório de forma autenticada.
|
|
186
197
|
|
|
187
198
|
## ⚡ Sistema de Cache Local (Economia de Quota)
|
|
188
199
|
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
gitpr_cli-0.0.
|
|
1
|
+
gitpr_cli-0.0.17.dist-info/licenses/LICENSE,sha256=UQzLC6mwqb-ZNDkBBAqOxC-SMQcEID0gaM6oFcu6u48,27030
|
|
2
2
|
src/__init__.py,sha256=U6ksarernNcryHO20aj4rNG7w0thT7xdMs5KzBJyPvE,28
|
|
3
3
|
src/ai_providers.py,sha256=P6675oqJePikR_jwaxWboBr6nj9l3ri5HqVUZ7nNpw8,2680
|
|
4
4
|
src/blame_engine.py,sha256=lLPuuOZSPdJOhKrj00Wko0-i7wzKwngkpPkiSL0nMho,10321
|
|
5
|
-
src/cache.py,sha256=
|
|
5
|
+
src/cache.py,sha256=oIu4iVlqVCHmUdSjvuznbkzpxwcBrUG3Hm2uQ2GxIZs,3072
|
|
6
6
|
src/config.py,sha256=BXgHArYWuuaB2GL7NynOuKtEq4kOuTUwApOcy-ApsqM,6775
|
|
7
7
|
src/core.py,sha256=OqiWX63Ss4UNa_82wJYfUB88aTqX5wgh2E3io2ZbyCc,15531
|
|
8
8
|
src/issue_engine.py,sha256=-cDkW7Dxo48kN_aWwGKSymVE-6nJ2bCHZW7GpM3wC00,3637
|
|
9
9
|
src/linter_engine.py,sha256=ppyMje4qQCf9fMRhWOTxsfKvUBcjNoniu7v20kZ0034,4494
|
|
10
|
-
src/main.py,sha256=
|
|
10
|
+
src/main.py,sha256=7bTMdu27EIgq6WUBsC5H26dlejFqSjAz9cQJN7ngjfE,28718
|
|
11
11
|
src/security.py,sha256=_OKBz_R-3xM8-5XNl_dOUyPCQi6jWDeLoOykZvN1Cys,1355
|
|
12
12
|
src/tui_issue.py,sha256=Aiy82hUdz8cs9lnKsxm_bT-GQ-8WDm0VtPdxOoKeOWk,1638
|
|
13
|
-
src/updater.py,sha256=
|
|
14
|
-
gitpr_cli-0.0.
|
|
15
|
-
gitpr_cli-0.0.
|
|
16
|
-
gitpr_cli-0.0.
|
|
17
|
-
gitpr_cli-0.0.
|
|
18
|
-
gitpr_cli-0.0.
|
|
13
|
+
src/updater.py,sha256=O5hq-8c57FEelDvf87T50AFu_TgwQZFpfSvCuHzUtbU,7024
|
|
14
|
+
gitpr_cli-0.0.17.dist-info/METADATA,sha256=c-2tdkPnmH2xo88E1udiUmOL71VqeKhqT3sRLirgG74,15640
|
|
15
|
+
gitpr_cli-0.0.17.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
16
|
+
gitpr_cli-0.0.17.dist-info/entry_points.txt,sha256=mh_4F_idM4cj0XhfRGBDQb5Nnku93YJ-dyKh5SufwlE,39
|
|
17
|
+
gitpr_cli-0.0.17.dist-info/top_level.txt,sha256=74rtVfumQlgAPzR5_2CgYN24MB0XARCg0t-gzk6gTrM,4
|
|
18
|
+
gitpr_cli-0.0.17.dist-info/RECORD,,
|
src/cache.py
CHANGED
|
@@ -3,8 +3,6 @@ import json
|
|
|
3
3
|
import hashlib
|
|
4
4
|
from datetime import datetime
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from src.core import get_current_branch
|
|
7
|
-
|
|
8
6
|
def get_cache_base_dir():
|
|
9
7
|
"""Retorna o caminho ~/.gitpr/cache/prompts/"""
|
|
10
8
|
path = Path.home() / ".gitpr" / "cache" / "prompts"
|
|
@@ -35,6 +33,7 @@ def save_cached_response(action_folder, action_type, prompt_text, response_dict)
|
|
|
35
33
|
folder_path.mkdir(parents=True, exist_ok=True)
|
|
36
34
|
|
|
37
35
|
cache_file = folder_path / f"{md5_hash}.json"
|
|
36
|
+
from src.core import get_current_branch
|
|
38
37
|
current_branch = get_current_branch()
|
|
39
38
|
|
|
40
39
|
cache_data = {
|
src/main.py
CHANGED
|
@@ -20,22 +20,158 @@ from src.linter_engine import parse_diff_and_lint
|
|
|
20
20
|
|
|
21
21
|
def print_banner():
|
|
22
22
|
"""Exibe a assinatura ASCII Art do projeto"""
|
|
23
|
-
banner = """
|
|
24
|
-
,----. ,--. ,--. ,------. ,------.
|
|
25
|
-
' .-./ `--',-' '-.| .--. '| .--. '
|
|
26
|
-
| | .---.,--.'-. .-'| '--' || '--'.'
|
|
27
|
-
' '--' || | | | | | --' | |\ \
|
|
28
|
-
`------' `--' `--' `--' `--' '--'
|
|
29
|
-
|
|
23
|
+
banner = r"""
|
|
24
|
+
,----. ,--. ,--. ,------. ,------.
|
|
25
|
+
' .-./ `--',-' '-.| .--. '| .--. '
|
|
26
|
+
| | .---.,--.'-. .-'| '--' || '--'.'
|
|
27
|
+
' '--' || | | | | | --' | |\ \
|
|
28
|
+
`------' `--' `--' `--' `--' '--'
|
|
29
|
+
|
|
30
30
|
"""
|
|
31
31
|
click.secho(banner, fg="cyan", bold=True)
|
|
32
32
|
click.secho(f" 🚀 Automação Inteligente de PRs com IA (v{__version__})", fg="yellow", bold=True)
|
|
33
|
-
click.secho(" Opções: -c,--commit | -r,--review | -f,--fullreview | -l,--linter | -s,--skill | -u,--update | -ih,--installhooks | -is,--issue | -h
|
|
33
|
+
click.secho(" Opções: -c,--commit | -r,--review | -f,--fullreview | -l,--linter | -s,--skill | -u,--update | -ih,--installhooks | -is,--issue | -h,--help (use -h --flag para ajuda contextual)\n", fg="white", dim=True)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# ============================================================
|
|
37
|
+
# Mapeamento de ajuda contextual (flag -> doc URL e descricao)
|
|
38
|
+
# ============================================================
|
|
39
|
+
HELP_MAP: dict[str, dict[str, str]] = {
|
|
40
|
+
'commit': {
|
|
41
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/commit-message-ia.md',
|
|
42
|
+
'title': 'Geracao de Mensagens de Commit com IA',
|
|
43
|
+
'description': (
|
|
44
|
+
'Gera automaticamente mensagens de commit no formato Conventional '
|
|
45
|
+
'Commits usando inteligencia artificial. Suporta integracao com Git '
|
|
46
|
+
'Hooks (prepare-commit-msg) para injecao direta no editor.'
|
|
47
|
+
),
|
|
48
|
+
},
|
|
49
|
+
'review': {
|
|
50
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/code-review-ia.md',
|
|
51
|
+
'title': 'Code Review com IA (Alteracoes Locais)',
|
|
52
|
+
'description': (
|
|
53
|
+
'Realiza uma revisao de codigo inteligente das alteracoes locais '
|
|
54
|
+
'nao commitadas (git diff HEAD). Integra automaticamente o Linter '
|
|
55
|
+
'Estatico (.gitpr.linter.yml) no topo do relatorio.'
|
|
56
|
+
),
|
|
57
|
+
},
|
|
58
|
+
'fullreview': {
|
|
59
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/code-review-ia.md',
|
|
60
|
+
'title': 'Code Review Completo com IA (Full Diff)',
|
|
61
|
+
'description': (
|
|
62
|
+
'Realiza uma revisao profunda comparando toda a branch atual com '
|
|
63
|
+
'a branch principal remota (origin/main). Faz git fetch antes da '
|
|
64
|
+
'analise. Ideal para revisar antes de abrir um Pull Request.'
|
|
65
|
+
),
|
|
66
|
+
},
|
|
67
|
+
'input': {
|
|
68
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/code-review-ia.md',
|
|
69
|
+
'title': 'Analise de Arquivo Especifico (--input)',
|
|
70
|
+
'description': (
|
|
71
|
+
'Analisa um arquivo inteiro do sistema local, ignorando o diff do '
|
|
72
|
+
'Git. REQUER --review (-r) ou --fullreview (-f) para funcionar. '
|
|
73
|
+
'Excelente para auditoria de codigo legado e refatoracoes.'
|
|
74
|
+
),
|
|
75
|
+
},
|
|
76
|
+
'linter': {
|
|
77
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/linter-regras-customizadas.md',
|
|
78
|
+
'title': 'Linter Estatico Customizavel',
|
|
79
|
+
'description': (
|
|
80
|
+
'Motor de analise estatica local que verifica regras definidas no '
|
|
81
|
+
'arquivo .gitpr.linter.yml. Nao consome cotas de IA nem requer '
|
|
82
|
+
'internet. Ideal para CI/CD e hooks de pre-commit.'
|
|
83
|
+
),
|
|
84
|
+
},
|
|
85
|
+
'skill': {
|
|
86
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/skill-template.md',
|
|
87
|
+
'title': 'Sistema de Skills e Templates (--skill)',
|
|
88
|
+
'description': (
|
|
89
|
+
'Faz download dos arquivos de template (.gitpr.*.md e .gitpr.linter.yml) '
|
|
90
|
+
'do repositorio oficial para a raiz do projeto. Estes arquivos permitem '
|
|
91
|
+
'customizar o comportamento da IA conforme as regras da sua equipa.'
|
|
92
|
+
'NUNCA sobrescreve arquivos locais existentes.'
|
|
93
|
+
),
|
|
94
|
+
},
|
|
95
|
+
'update': {
|
|
96
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/auto-update.md',
|
|
97
|
+
'title': 'Auto-Update do GitPR',
|
|
98
|
+
'description': (
|
|
99
|
+
'Verifica e instala automaticamente a versao mais recente do GitPR. '
|
|
100
|
+
'Suporta atualizacao via pip (PyPI) e binario standalone (GitHub Releases) '
|
|
101
|
+
'com hot-swap e rollback automatico em caso de falha.'
|
|
102
|
+
),
|
|
103
|
+
},
|
|
104
|
+
'installhooks': {
|
|
105
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/git-hooks-locais.md',
|
|
106
|
+
'title': 'Instalacao de Git Hooks Locais',
|
|
107
|
+
'description': (
|
|
108
|
+
'Instala hooks de pre-commit (linter estatico automatico) e '
|
|
109
|
+
'prepare-commit-msg (geracao de mensagens com IA) no repositorio '
|
|
110
|
+
'local. Adota a pratica de Shift Left para validacao antes do push.'
|
|
111
|
+
),
|
|
112
|
+
},
|
|
113
|
+
'blame': {
|
|
114
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/blame-arqueologo.md',
|
|
115
|
+
'title': 'Arqueologo de Codigo (Git Blame com IA)',
|
|
116
|
+
'description': (
|
|
117
|
+
'Rastreia a origem e evolucao de regras de negocio no codigo usando '
|
|
118
|
+
'git blame com classificacao por IA (ORIGEM vs REFATORACAO). Suporta '
|
|
119
|
+
'modo direto (arquivo:10-20) e modo interativo. Pode alimentar o '
|
|
120
|
+
'contexto de Issues de divida tecnica com --issue.'
|
|
121
|
+
),
|
|
122
|
+
},
|
|
123
|
+
'issue': {
|
|
124
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/issue-tui-help.md',
|
|
125
|
+
'title': 'Geracao de Issues com TUI Interativa',
|
|
126
|
+
'description': (
|
|
127
|
+
'Gera issues padronizadas (O Que / Por Que / Onde / Como) usando IA '
|
|
128
|
+
'e abre uma interface interativa no terminal (Textual) para revisao. '
|
|
129
|
+
'Possui 3 motores de contexto: diff atual, historico da branch (--history) '
|
|
130
|
+
'e arqueologia de codigo (--blame). Permite salvar .md local ou publicar '
|
|
131
|
+
'diretamente no GitHub via API.'
|
|
132
|
+
),
|
|
133
|
+
},
|
|
134
|
+
'history': {
|
|
135
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/issue-tui-help.md',
|
|
136
|
+
'title': 'Contexto de Historico para Issues (--history)',
|
|
137
|
+
'description': (
|
|
138
|
+
'Modificador do --issue (-is): usa todo o historico da branch atual '
|
|
139
|
+
'(git log + cache de PRs anteriores) como contexto para gerar a issue. '
|
|
140
|
+
'Ideal para documentar epicos, releases e features grandes com '
|
|
141
|
+
'varios commits ao longo de dias.'
|
|
142
|
+
),
|
|
143
|
+
},
|
|
144
|
+
'provider': {
|
|
145
|
+
'url': 'https://github.com/natanfiuza/gitpr/blob/main/docs/providers-ia.md',
|
|
146
|
+
'title': 'Selecao de Provedor de IA (--provider)',
|
|
147
|
+
'description': (
|
|
148
|
+
'Forca o uso de um provedor de IA especifico para esta execucao: '
|
|
149
|
+
'gemini (Google Gemini) ou deepseek (DeepSeek). Sobrescreve '
|
|
150
|
+
'temporariamente o provider padrao definido no ficheiro .env.'
|
|
151
|
+
),
|
|
152
|
+
},
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
# Prioridade para help contextual quando multiplas flags sao usadas com -h
|
|
156
|
+
# Menor valor = maior prioridade
|
|
157
|
+
HELP_PRIORITY: dict[str, int] = {
|
|
158
|
+
'linter': 1,
|
|
159
|
+
'skill': 2,
|
|
160
|
+
'update': 3,
|
|
161
|
+
'installhooks': 4,
|
|
162
|
+
'issue': 5,
|
|
163
|
+
'blame': 6,
|
|
164
|
+
'commit': 7,
|
|
165
|
+
'fullreview': 8,
|
|
166
|
+
'review': 9,
|
|
167
|
+
'input': 10,
|
|
168
|
+
'history': 11,
|
|
169
|
+
'provider': 12,
|
|
170
|
+
}
|
|
34
171
|
|
|
35
172
|
|
|
36
173
|
# Configuração nativa do Click para aceitar -h além de --help
|
|
37
174
|
@click.command()
|
|
38
|
-
@click.help_option('-h', '--help', help='Mostra esta mensagem e sai.')
|
|
39
175
|
@click.option('-c', '--commit', is_flag=True, help="Gera apenas a mensagem de commit e exibe no console.")
|
|
40
176
|
@click.option('-r', '--review', is_flag=True, help="Faz um code review das alterações locais (git diff).")
|
|
41
177
|
@click.option('-f', '--fullreview', is_flag=True, help="Faz um code review de todas as alterações desde a branch principal (origin/main).")
|
|
@@ -45,18 +181,75 @@ def print_banner():
|
|
|
45
181
|
@click.option('-ih', '--installhooks', is_flag=True, help="Instala automaticamente os Git Hooks de validação no projeto.")
|
|
46
182
|
@click.option('--hook', type=click.Path(), hidden=True, help="Caminho do arquivo de commit (uso interno dos hooks).")
|
|
47
183
|
@click.option('-q', '--quiet', is_flag=True, hidden=True, help="Oculta o banner e logs não essenciais (uso interno).")
|
|
48
|
-
@click.option('-i', '--input', type=click.Path(
|
|
184
|
+
@click.option('-i', '--input', type=click.Path(), help="Caminho de um arquivo específico para análise completa.")
|
|
49
185
|
@click.option('-b', '--blame', type=str, help="Analisa a origem de uma regra de negócio (ex: arquivo.py:10-20 ou apenas arquivo.py).")
|
|
50
186
|
@click.option('-ht', '--history', is_flag=True, help="Usa todo o histórico da branch (Git Log + Cache de PR) como contexto para gerar a issue.")
|
|
51
187
|
@click.option('-is', '--issue', is_flag=True, help="Gera uma Issue padronizada das alterações atuais e abre a interface interativa.")
|
|
52
188
|
@click.option('-p', '--provider', type=click.Choice(['gemini', 'deepseek']), help="Força a utilização de um provedor de IA específico nesta execução.")
|
|
53
|
-
|
|
189
|
+
@click.option('-h', '--help', 'help_flag', is_flag=True, help="Mostra esta mensagem e sai. Use com outra flag para ajuda contextual (ex: -h --issue).")
|
|
190
|
+
def cli(commit, review, fullreview, linter, skill, update, installhooks, hook, quiet, provider, input, blame, history, issue, help_flag):
|
|
54
191
|
"""
|
|
55
192
|
GitPR CLI - Automação de PRs e Code Review com IA.
|
|
56
193
|
|
|
57
194
|
COMPORTAMENTO PADRÃO (Sem opções):
|
|
58
195
|
Faz o fetch, compara com a branch principal remota e gera um arquivo Markdown (.md) com a descrição completa para o Pull Request.
|
|
59
196
|
"""
|
|
197
|
+
|
|
198
|
+
# ============================================================
|
|
199
|
+
# MANIPULADOR DE AJUDA CONTEXTUAL
|
|
200
|
+
# ============================================================
|
|
201
|
+
if help_flag:
|
|
202
|
+
# Identifica quais outras flags estao ativas (excluindo hidden: hook, quiet)
|
|
203
|
+
active_flags: list[str] = []
|
|
204
|
+
for param_name, help_info in HELP_MAP.items():
|
|
205
|
+
value = locals().get(param_name)
|
|
206
|
+
# Trata tanto flags booleanas (True) quanto parametros string (blame, input, provider)
|
|
207
|
+
if value:
|
|
208
|
+
active_flags.append(param_name)
|
|
209
|
+
|
|
210
|
+
if not active_flags:
|
|
211
|
+
# gitpr -h puro (sem outras flags): mostra help padrao do Click
|
|
212
|
+
ctx = click.get_current_context()
|
|
213
|
+
click.echo(ctx.get_help())
|
|
214
|
+
ctx.exit()
|
|
215
|
+
|
|
216
|
+
# Ordena por prioridade e seleciona a flag mais especifica
|
|
217
|
+
active_flags.sort(key=lambda f: HELP_PRIORITY.get(f, 99))
|
|
218
|
+
primary_flag = active_flags[0]
|
|
219
|
+
help_info = HELP_MAP.get(primary_flag)
|
|
220
|
+
|
|
221
|
+
if help_info:
|
|
222
|
+
click.secho(f"\n{'=' * 60}", bold=True)
|
|
223
|
+
click.secho(f" {help_info['title']}", fg="cyan", bold=True)
|
|
224
|
+
click.secho(f"{'=' * 60}\n", bold=True)
|
|
225
|
+
click.echo(help_info['description'])
|
|
226
|
+
click.echo("")
|
|
227
|
+
click.secho(">> Documentacao completa:", fg="green")
|
|
228
|
+
click.secho(f" {help_info['url']}", fg="blue", underline=True)
|
|
229
|
+
click.echo("")
|
|
230
|
+
|
|
231
|
+
if len(active_flags) > 1:
|
|
232
|
+
click.secho(
|
|
233
|
+
">> Dica: Para ajuda sobre uma unica opcao, "
|
|
234
|
+
"use -h apenas com ela.",
|
|
235
|
+
fg="yellow", dim=True,
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
# Exibe a URL da documentacao principal do GitPR como rodape
|
|
239
|
+
click.secho(
|
|
240
|
+
">> Repositorio: https://github.com/natanfiuza/gitpr",
|
|
241
|
+
fg="bright_black",
|
|
242
|
+
)
|
|
243
|
+
click.echo("")
|
|
244
|
+
else:
|
|
245
|
+
# Fallback: mostra help padrao (nao deveria acontecer)
|
|
246
|
+
ctx = click.get_current_context()
|
|
247
|
+
click.echo(ctx.get_help())
|
|
248
|
+
|
|
249
|
+
# Garante saida limpa apos exibir ajuda contextual
|
|
250
|
+
ctx = click.get_current_context()
|
|
251
|
+
ctx.exit()
|
|
252
|
+
|
|
60
253
|
# Silencia o banner se estiver no modo quiet ou via hook
|
|
61
254
|
if not quiet and not hook:
|
|
62
255
|
print_banner()
|
|
@@ -129,7 +322,7 @@ def cli(commit, review, fullreview, linter, skill, update, installhooks, hook, q
|
|
|
129
322
|
click.echo("O Linter será agora executado automaticamente antes de cada commit.")
|
|
130
323
|
|
|
131
324
|
click.echo("\n---")
|
|
132
|
-
click.echo("
|
|
325
|
+
click.echo(">> Guias de Utilização:")
|
|
133
326
|
|
|
134
327
|
# Link da documentação geral de Hooks
|
|
135
328
|
click.echo("• Como utilizar Git Hooks:")
|
|
@@ -162,7 +355,7 @@ def cli(commit, review, fullreview, linter, skill, update, installhooks, hook, q
|
|
|
162
355
|
click.secho(f"❌ O arquivo '{file_path}' não foi encontrado.", fg="red")
|
|
163
356
|
return
|
|
164
357
|
|
|
165
|
-
click.secho(f"
|
|
358
|
+
click.secho(f">> Arquivo selecionado: {file_path}", fg="cyan", bold=True)
|
|
166
359
|
lines_input = click.prompt("Quais linhas você deseja investigar? (Ex: 10-20 ou apenas 45)")
|
|
167
360
|
|
|
168
361
|
if "-" in lines_input:
|
|
@@ -213,7 +406,7 @@ def cli(commit, review, fullreview, linter, skill, update, installhooks, hook, q
|
|
|
213
406
|
if not os.path.exists(file_path):
|
|
214
407
|
click.secho(f"❌ O arquivo '{file_path}' não foi encontrado.", fg="red")
|
|
215
408
|
return
|
|
216
|
-
click.secho(f"
|
|
409
|
+
click.secho(f">> Arquivo selecionado: {file_path}", fg="cyan", bold=True)
|
|
217
410
|
lines_input = click.prompt("Quais linhas você deseja investigar? (Ex: 10-20)")
|
|
218
411
|
start_line, end_line = lines_input.split("-") if "-" in lines_input else (lines_input, lines_input)
|
|
219
412
|
|
|
@@ -274,10 +467,18 @@ def cli(commit, review, fullreview, linter, skill, update, installhooks, hook, q
|
|
|
274
467
|
|
|
275
468
|
return
|
|
276
469
|
|
|
277
|
-
# Validação do Modo Input
|
|
278
|
-
if input and not
|
|
279
|
-
|
|
280
|
-
|
|
470
|
+
# Validação do Modo Input (com guard para nao atrapalhar o -h contextual)
|
|
471
|
+
if input and not help_flag:
|
|
472
|
+
if not os.path.exists(input):
|
|
473
|
+
click.secho(
|
|
474
|
+
f"\n❌ Erro: O arquivo '{input}' nao foi encontrado.",
|
|
475
|
+
fg="red", bold=True,
|
|
476
|
+
)
|
|
477
|
+
return
|
|
478
|
+
|
|
479
|
+
if not (review or fullreview):
|
|
480
|
+
click.secho("\n❌ Erro: A opção --input (-i) só pode ser utilizada em conjunto com --review (-r) ou --fullreview (-f).", fg="red", bold=True)
|
|
481
|
+
return
|
|
281
482
|
|
|
282
483
|
# Garante que o ambiente e as chaves estão configurados
|
|
283
484
|
setup_environment()
|
|
@@ -349,7 +550,7 @@ def cli(commit, review, fullreview, linter, skill, update, installhooks, hook, q
|
|
|
349
550
|
click.secho(f"❌ Erro ao injetar no hook: {e}", fg="red")
|
|
350
551
|
else:
|
|
351
552
|
# MODO CONSOLE: O comportamento original que já existia
|
|
352
|
-
click.secho("\n
|
|
553
|
+
click.secho("\n>> Dica: Use sem --commit para gerar o PR completo.\n", fg="yellow")
|
|
353
554
|
click.secho("\n📝 Sugestão de Commit:\n", fg="green", bold=True)
|
|
354
555
|
click.echo(msg)
|
|
355
556
|
click.echo("\n")
|
src/updater.py
CHANGED
|
@@ -7,7 +7,7 @@ import click
|
|
|
7
7
|
from datetime import datetime
|
|
8
8
|
|
|
9
9
|
# Versão atual do seu executável local (Atualize isso a cada novo build!)
|
|
10
|
-
__version__ = "0.0.
|
|
10
|
+
__version__ = "0.0.17"
|
|
11
11
|
GITHUB_API_URL = "https://api.github.com/repos/natanfiuza/gitpr/releases/latest"
|
|
12
12
|
PYPI_API_URL = "https://pypi.org/pypi/gitpr-cli/json"
|
|
13
13
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|