gitpr-cli 0.0.18__tar.gz → 0.0.19__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 (27) hide show
  1. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/PKG-INFO +3 -1
  2. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/gitpr_cli.egg-info/PKG-INFO +3 -1
  3. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/gitpr_cli.egg-info/requires.txt +2 -0
  4. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/pyproject.toml +4 -2
  5. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/cache.py +14 -12
  6. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/core.py +33 -11
  7. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/updater.py +1 -1
  8. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/LICENSE +0 -0
  9. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/README.md +0 -0
  10. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/gitpr_cli.egg-info/SOURCES.txt +0 -0
  11. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/gitpr_cli.egg-info/dependency_links.txt +0 -0
  12. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/gitpr_cli.egg-info/entry_points.txt +0 -0
  13. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/gitpr_cli.egg-info/top_level.txt +0 -0
  14. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/setup.cfg +0 -0
  15. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/__init__.py +0 -0
  16. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/ai_providers.py +0 -0
  17. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/blame_engine.py +0 -0
  18. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/config.py +0 -0
  19. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/issue_engine.py +0 -0
  20. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/linter_engine.py +0 -0
  21. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/main.py +0 -0
  22. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/security.py +0 -0
  23. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/tui_issue.py +0 -0
  24. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/ui/__init__.py +0 -0
  25. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/ui/help_screen.py +0 -0
  26. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/src/ui/issue_app.py +0 -0
  27. {gitpr_cli-0.0.18 → gitpr_cli-0.0.19}/tests/test_core.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitpr-cli
3
- Version: 0.0.18
3
+ Version: 0.0.19
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
@@ -12,6 +12,8 @@ Requires-Dist: openai
12
12
  Requires-Dist: python-dotenv
13
13
  Requires-Dist: cryptography
14
14
  Requires-Dist: pyyaml
15
+ Requires-Dist: textual
16
+ Requires-Dist: requests
15
17
  Dynamic: license-file
16
18
 
17
19
  # **GitPR CLI 🚀**
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitpr-cli
3
- Version: 0.0.18
3
+ Version: 0.0.19
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
@@ -12,6 +12,8 @@ Requires-Dist: openai
12
12
  Requires-Dist: python-dotenv
13
13
  Requires-Dist: cryptography
14
14
  Requires-Dist: pyyaml
15
+ Requires-Dist: textual
16
+ Requires-Dist: requests
15
17
  Dynamic: license-file
16
18
 
17
19
  # **GitPR CLI 🚀**
@@ -4,3 +4,5 @@ openai
4
4
  python-dotenv
5
5
  cryptography
6
6
  pyyaml
7
+ textual
8
+ requests
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "gitpr-cli"
7
- version = "0.0.18"
7
+ version = "0.0.19"
8
8
  description = "Automação de PRs, Commits e Code Review com IA (Gemini e DeepSeek)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -17,7 +17,9 @@ dependencies = [
17
17
  "openai",
18
18
  "python-dotenv",
19
19
  "cryptography",
20
- "pyyaml"
20
+ "pyyaml",
21
+ "textual",
22
+ "requests"
21
23
  ]
22
24
 
23
25
  [project.scripts]
@@ -33,11 +33,13 @@ def save_cached_response(action_folder, action_type, prompt_text, response_dict)
33
33
  folder_path.mkdir(parents=True, exist_ok=True)
34
34
 
35
35
  cache_file = folder_path / f"{md5_hash}.json"
36
- from src.core import get_current_branch
36
+ from src.core import get_current_branch, get_repo_name
37
37
  current_branch = get_current_branch()
38
-
38
+ repo_name = get_repo_name()
39
+
39
40
  cache_data = {
40
41
  "md5": md5_hash,
42
+ "repo": repo_name,
41
43
  "branch": current_branch,
42
44
  "datetime": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
43
45
  "action_type": action_type,
@@ -51,21 +53,21 @@ def save_cached_response(action_folder, action_type, prompt_text, response_dict)
51
53
  except IOError:
52
54
  pass # Falha silenciosa no cache para não travar a ferramenta
53
55
 
54
- def get_cached_pr_descriptions(branch_name):
55
- """Busca no cache todos os PRs gerados historicamente para esta branch."""
56
+ def get_cached_pr_descriptions(repo_name, branch_name):
57
+ """Busca no cache todos os PRs gerados historicamente para este repositorio e branch."""
56
58
  pr_cache_folder = get_cache_base_dir() / "pr_desc"
57
59
  history_texts = []
58
-
60
+
59
61
  if not pr_cache_folder.exists():
60
62
  return ""
61
-
63
+
62
64
  for cache_file in pr_cache_folder.glob("*.json"):
63
65
  try:
64
66
  with open(cache_file, "r", encoding="utf-8") as f:
65
67
  data = json.load(f)
66
-
67
- # Verifica se o cache pertence à branch solicitada
68
- if data.get("branch") == branch_name:
68
+
69
+ # Filtra por repositorio E branch (evita misturar projetos diferentes)
70
+ if data.get("repo") == repo_name and data.get("branch") == branch_name:
69
71
  response_dict = data.get("response", {})
70
72
  pr_desc = response_dict.get("pr_description")
71
73
  if pr_desc:
@@ -73,10 +75,10 @@ def get_cached_pr_descriptions(branch_name):
73
75
  history_texts.append(f"[{date_str}]\n{pr_desc}\n")
74
76
  except (json.JSONDecodeError, IOError):
75
77
  continue
76
-
78
+
77
79
  if history_texts:
78
- # Ordena cronologicamente (usando a data extraída no colchete)
80
+ # Ordena cronologicamente (usando a data extraida no colchete)
79
81
  history_texts.sort()
80
82
  return "=== HISTÓRICO DE PRs DA IA ===\n" + "\n".join(history_texts)
81
-
83
+
82
84
  return ""
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import re
2
3
  import json
3
4
  import stat
4
5
  import click
@@ -56,9 +57,9 @@ def get_current_branch():
56
57
  """Retorna o nome da branch atual."""
57
58
  try:
58
59
  result = subprocess.run(
59
- ["git", "rev-parse", "--abbrev-ref", "HEAD"],
60
- capture_output=True,
61
- text=True,
60
+ ["git", "rev-parse", "--abbrev-ref", "HEAD"],
61
+ capture_output=True,
62
+ text=True,
62
63
  encoding="utf-8",
63
64
  check=True
64
65
  )
@@ -67,6 +68,26 @@ def get_current_branch():
67
68
  return "main" # Fallback
68
69
 
69
70
 
71
+ def get_repo_name():
72
+ """Extrai o nome owner/repo do git remote origin."""
73
+ try:
74
+ result = subprocess.run(
75
+ ["git", "remote", "-v"],
76
+ capture_output=True,
77
+ text=True,
78
+ encoding="utf-8",
79
+ check=True
80
+ )
81
+ match = re.search(r'github\.com[:/](.+?)/(.+?)(\.git)?\s+\(push\)', result.stdout)
82
+ if match:
83
+ owner = match.group(1)
84
+ repo = match.group(2).replace('.git', '')
85
+ return f"{owner}/{repo}"
86
+ return "unknown/repo"
87
+ except subprocess.CalledProcessError:
88
+ return "unknown/repo"
89
+
90
+
70
91
  def get_skill_context(action_type="pr"):
71
92
  """Lê o arquivo de contexto correto baseado na ação (PR/Commit ou Review)."""
72
93
 
@@ -316,14 +337,15 @@ def install_git_hooks():
316
337
  return success_count == len(hooks_to_install)
317
338
 
318
339
  def get_branch_history_text():
319
- """Compila o Git Log e o Cache de PRs da branch atual para gerar o contexto épico."""
340
+ """Compila o Git Log e o Cache de PRs da branch atual para gerar o contexto epico."""
320
341
  branch = get_current_branch()
321
342
  base_branch = get_base_branch()
322
-
323
- click.secho(f"🔄 Compilando histórico da branch '{branch}' contra '{base_branch}'...", fg="cyan")
324
-
325
- hybrid_context = f"Resumo Histórico da Branch: {branch}\n\n"
326
-
343
+ repo_name = get_repo_name()
344
+
345
+ click.secho(f"🔄 Compilando historico do repositorio '{repo_name}', branch '{branch}' contra '{base_branch}'...", fg="cyan")
346
+
347
+ hybrid_context = f"Repositorio: {repo_name}\nResumo Historico da Branch: {branch}\n\n"
348
+
327
349
  # Pega os Commits reais do Git
328
350
  try:
329
351
  # Pega a linha do tempo desde o merge base
@@ -349,8 +371,8 @@ def get_branch_history_text():
349
371
  except subprocess.CalledProcessError as e:
350
372
  click.secho(f"⚠️ Aviso: Não foi possível obter o Git Log: {e.stderr}", fg="yellow")
351
373
 
352
- # Pega a memória histórica da IA (Cache de PRs antigos dessa branch)
353
- cached_prs = get_cached_pr_descriptions(branch)
374
+ # Pega a memoria historica da IA (Cache de PRs antigos desse repo + branch)
375
+ cached_prs = get_cached_pr_descriptions(repo_name, branch)
354
376
  if cached_prs:
355
377
  hybrid_context += f"{cached_prs}\n"
356
378
  else:
@@ -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.18"
10
+ __version__ = "0.0.19"
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
File without changes
File without changes
File without changes
File without changes