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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitpr-cli
3
- Version: 0.0.16
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
- * [**Guia de Git Hooks Locais (Shift-Left)**](docs/local-git-hooks.md): Como usar o `gitpr --installhooks` para criar travas na máquina do desenvolvedor (bloqueio de *console.log*, *localhost*, etc.) e usar a IA para escrever mensagens de commit automaticamente no editor.
183
- * [**Integração com CI/CD (GitHub Actions)**](docs/github-ci-linter.md): Como rodar o GitPR no seu pipeline na nuvem para realizar a validação estática e travar o botão de "Merge" de Pull Requests que violem as regras do projeto.
184
- * [**Geração de Issues e Interface TUI**](docs/issue-tui-help.md): Como utilizar a interface gráfica de terminal (TUI) para revisar e gerenciar Issues estruturadas antes do envio.
185
- * [**Integração e Segurança do Token GitHub (PAT)**](docs/github-pat-integration.md): Entenda como o GitPR gera issues diretamente no seu repositório de forma autenticada, mantendo suas credenciais criptografadas localmente.
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.16.dist-info/licenses/LICENSE,sha256=UQzLC6mwqb-ZNDkBBAqOxC-SMQcEID0gaM6oFcu6u48,27030
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=tHhQ0AqqjEzyVz44JDCu0zaKOBVZRrZa1er27ZbB4w4,3070
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=TGvNHxJ5PTI8rwztUsMNbQgGOQByXXq2GJ3nt0Rldec,19743
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=C_m9-1UlmOhEI6Wr-F_uF8pL-5Ujpw8E8eVZpVrrS_A,7024
14
- gitpr_cli-0.0.16.dist-info/METADATA,sha256=ln1aGxxMa3nb-RhZ5Zzir11zsbwLU49ycBkECfEj08A,14247
15
- gitpr_cli-0.0.16.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
16
- gitpr_cli-0.0.16.dist-info/entry_points.txt,sha256=mh_4F_idM4cj0XhfRGBDQb5Nnku93YJ-dyKh5SufwlE,39
17
- gitpr_cli-0.0.16.dist-info/top_level.txt,sha256=74rtVfumQlgAPzR5_2CgYN24MB0XARCg0t-gzk6gTrM,4
18
- gitpr_cli-0.0.16.dist-info/RECORD,,
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 ou --help\n", fg="white", dim=True)
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(exists=True), help="Caminho de um arquivo específico para análise completa.")
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
- def cli(commit, review, fullreview, linter, skill, update, installhooks, hook, quiet, provider, input, blame,history, issue):
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("📚 Guias de Utilização:")
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"📂 Arquivo selecionado: {file_path}", fg="cyan", bold=True)
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"📂 Arquivo selecionado: {file_path}", fg="cyan", bold=True)
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 (review or fullreview):
279
- 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)
280
- return
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💡 Dica: Use sem --commit para gerar o PR completo.\n", fg="yellow")
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.16"
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