code-healer 1.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.
- code_healer-1.0.0/PKG-INFO +102 -0
- code_healer-1.0.0/README.md +90 -0
- code_healer-1.0.0/autofix/__init__.py +2 -0
- code_healer-1.0.0/autofix/engine.py +390 -0
- code_healer-1.0.0/code_healer.egg-info/PKG-INFO +102 -0
- code_healer-1.0.0/code_healer.egg-info/SOURCES.txt +10 -0
- code_healer-1.0.0/code_healer.egg-info/dependency_links.txt +1 -0
- code_healer-1.0.0/code_healer.egg-info/entry_points.txt +2 -0
- code_healer-1.0.0/code_healer.egg-info/requires.txt +4 -0
- code_healer-1.0.0/code_healer.egg-info/top_level.txt +1 -0
- code_healer-1.0.0/pyproject.toml +22 -0
- code_healer-1.0.0/setup.cfg +4 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: code-healer
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Yapay zeka destekli otonom kod tamir ve gelistirme kütüphanesi
|
|
5
|
+
Author: Abdullah Topak
|
|
6
|
+
Requires-Python: >=3.8
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: requests>=2.28.0
|
|
9
|
+
Requires-Dist: ollama>=0.1.0
|
|
10
|
+
Requires-Dist: flake8
|
|
11
|
+
Requires-Dist: pytest
|
|
12
|
+
|
|
13
|
+
# 🛡️ AutoFix: Yapay Zeka Destekli Otonom Kod Tamir ve Geliştirme Motoru
|
|
14
|
+
|
|
15
|
+
AutoFix, Python projelerindeki sözdizimi (Linter/Flake8) ve çalışma zamanı (Runtime/Pytest) hatalarını derinlemesine AST (Abstract Syntax Tree) analiziyle lokal veya bulut LLM'leri kullanarak otonom olarak iyileştiren ve koda yeni özellikler entegre edebilen bir Self-Healing & Feature Development kütüphanesidir.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## ✨ Özellikler
|
|
20
|
+
|
|
21
|
+
* **Derinlemesine Proje Sağlık Taraması:** Sadece hedef dosyayı değil, o dosyanın import ettiği tüm yerel bağımlılıkları (utils.py vb.) otomatik tarar.
|
|
22
|
+
* **AST Ameliyat Modu (Fonksiyon İzolasyonu):** Hatalı satırı tüm dosyayı bozmadan, AST ile sadece ilgili fonksiyon bloğunu cımbızla çekerek izole bir şekilde tamir eder.
|
|
23
|
+
* **Çift Modlu Çalışma Mimarisi:**
|
|
24
|
+
* **Tamir Modu:** Kodda hata varsa otonom olarak ardışık iyileştirme (Iterative Healing) döngüsünü başlatır.
|
|
25
|
+
* **Geliştirme Modu (Feature Mode):** Proje temizse, terminalden verilen --komut talimatına göre mevcut yapıyı bozmadan yeni özellikleri otonom olarak koda ekler.
|
|
26
|
+
* **Esnek Kimlik Doğrulama (.env Desteği):** Bulut motoru (Groq API) kullanırken isterseniz API anahtarınızı parametre olarak geçebilir, isterseniz de proje kökündeki bir .env dosyasından otomatik okunmasını sağlayabilirsiniz.
|
|
27
|
+
* **Hibrit Motor Desteği:** Groq API (Llama 3.3) ile bulut veya Ollama (Qwen 2.5 Coder) ile %100 yerel/offline çalışabilir.
|
|
28
|
+
* **Güvenli Yamalama (Safe Rollback):** Kodda ters giden bir şey olduğunda Git veya .bak yedeği üzerinden otonom olarak orijinal koda geri döner.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 🚀 Kurulum
|
|
33
|
+
|
|
34
|
+
Proje kök dizinindeyken terminalden geliştirici modunda kurun:
|
|
35
|
+
|
|
36
|
+
pip install -e .
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 🔑 Kimlik Doğrulama Seçenekleri (.env Kullanımı)
|
|
41
|
+
|
|
42
|
+
Bulut motorunu (Groq) kullanabilmek için API anahtarınızı sisteme iki farklı seçenekle tanıtabilirsiniz:
|
|
43
|
+
|
|
44
|
+
### Seçenek A: .env Dosyası İle (Önerilen)
|
|
45
|
+
Projenizin kök dizinine bir .env dosyası oluşturup API anahtarınızı eklemeniz yeterlidir. AutoFix bu dosyayı otomatik olarak algılar ve okur:
|
|
46
|
+
|
|
47
|
+
GROQ_API_KEY=gsk_your_secret_api_key_here
|
|
48
|
+
|
|
49
|
+
### Seçenek B: Ortam Değişkeni İle
|
|
50
|
+
Alternatif olarak, terminal oturumunuza veya işletim sisteminize ortam değişkeni olarak da ekleyebilirsiniz:
|
|
51
|
+
|
|
52
|
+
export GROQ_API_KEY="gsk_your_secret_api_key_here"
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 💻 Kullanım Şekilleri
|
|
57
|
+
|
|
58
|
+
### 1. Terminal CLI Modu (Doğrudan Çağrı)
|
|
59
|
+
|
|
60
|
+
Proje pyproject.toml standartlarına bağlandığı için terminalden doğrudan autofix kelimesiyle koşturulabilir:
|
|
61
|
+
|
|
62
|
+
#### Hata Tarama ve Otonom Tamir:
|
|
63
|
+
autofix --dosya main.py
|
|
64
|
+
|
|
65
|
+
#### Temiz Koda Yeni Özellik/Fonksiyon Ekleme veya Formatlama:
|
|
66
|
+
autofix --dosya main.py --komut "toplama fonksiyonu ekle ve tip ipuclarini (type hints) unutma"
|
|
67
|
+
|
|
68
|
+
### 2. Python Kod İçi Kütüphane Modu
|
|
69
|
+
|
|
70
|
+
Yazdığınız agentic workflow'lara veya multi-agent sistemlere bir alt motor olarak entegre edebilirsiniz:
|
|
71
|
+
|
|
72
|
+
import os
|
|
73
|
+
from autofix import tek_dosya_otonom_tamir
|
|
74
|
+
|
|
75
|
+
basari = tek_dosya_otonom_tamir(
|
|
76
|
+
dosya_yolu="uygulama.py",
|
|
77
|
+
ozel_komut="Yazilan kodlardaki tum aciklama satirlarini Turkce yap.",
|
|
78
|
+
api_key=os.environ.get("GROQ_API_KEY", ""), # .env dosyası varsa burayı boş da bırakabilirsiniz
|
|
79
|
+
tur_bilgisi="Agent-Core"
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if basari:
|
|
83
|
+
print("Kod otonom olarak güncellendi!")
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 🛠️ Klasör Mimarisi
|
|
88
|
+
|
|
89
|
+
PyCharmMiscProject/
|
|
90
|
+
│
|
|
91
|
+
├── autofix/ # Ana Kütüphane Klasörü
|
|
92
|
+
│ ├── __init__.py # Paket Arayüzü
|
|
93
|
+
│ └── engine.py # V12 Çift Modlu Ana Motor
|
|
94
|
+
│
|
|
95
|
+
├── .env # API Anahtarı Saklama Dosyası (Opsiyonel)
|
|
96
|
+
├── pyproject.toml # Modern Paket Yönetim Dosyası
|
|
97
|
+
└── README.md # Dokümantasyon
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 👤 Geliştirici
|
|
102
|
+
* **Abdullah Topak** - Software Engineering Student & AI Developer
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# 🛡️ AutoFix: Yapay Zeka Destekli Otonom Kod Tamir ve Geliştirme Motoru
|
|
2
|
+
|
|
3
|
+
AutoFix, Python projelerindeki sözdizimi (Linter/Flake8) ve çalışma zamanı (Runtime/Pytest) hatalarını derinlemesine AST (Abstract Syntax Tree) analiziyle lokal veya bulut LLM'leri kullanarak otonom olarak iyileştiren ve koda yeni özellikler entegre edebilen bir Self-Healing & Feature Development kütüphanesidir.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## ✨ Özellikler
|
|
8
|
+
|
|
9
|
+
* **Derinlemesine Proje Sağlık Taraması:** Sadece hedef dosyayı değil, o dosyanın import ettiği tüm yerel bağımlılıkları (utils.py vb.) otomatik tarar.
|
|
10
|
+
* **AST Ameliyat Modu (Fonksiyon İzolasyonu):** Hatalı satırı tüm dosyayı bozmadan, AST ile sadece ilgili fonksiyon bloğunu cımbızla çekerek izole bir şekilde tamir eder.
|
|
11
|
+
* **Çift Modlu Çalışma Mimarisi:**
|
|
12
|
+
* **Tamir Modu:** Kodda hata varsa otonom olarak ardışık iyileştirme (Iterative Healing) döngüsünü başlatır.
|
|
13
|
+
* **Geliştirme Modu (Feature Mode):** Proje temizse, terminalden verilen --komut talimatına göre mevcut yapıyı bozmadan yeni özellikleri otonom olarak koda ekler.
|
|
14
|
+
* **Esnek Kimlik Doğrulama (.env Desteği):** Bulut motoru (Groq API) kullanırken isterseniz API anahtarınızı parametre olarak geçebilir, isterseniz de proje kökündeki bir .env dosyasından otomatik okunmasını sağlayabilirsiniz.
|
|
15
|
+
* **Hibrit Motor Desteği:** Groq API (Llama 3.3) ile bulut veya Ollama (Qwen 2.5 Coder) ile %100 yerel/offline çalışabilir.
|
|
16
|
+
* **Güvenli Yamalama (Safe Rollback):** Kodda ters giden bir şey olduğunda Git veya .bak yedeği üzerinden otonom olarak orijinal koda geri döner.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 🚀 Kurulum
|
|
21
|
+
|
|
22
|
+
Proje kök dizinindeyken terminalden geliştirici modunda kurun:
|
|
23
|
+
|
|
24
|
+
pip install -e .
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 🔑 Kimlik Doğrulama Seçenekleri (.env Kullanımı)
|
|
29
|
+
|
|
30
|
+
Bulut motorunu (Groq) kullanabilmek için API anahtarınızı sisteme iki farklı seçenekle tanıtabilirsiniz:
|
|
31
|
+
|
|
32
|
+
### Seçenek A: .env Dosyası İle (Önerilen)
|
|
33
|
+
Projenizin kök dizinine bir .env dosyası oluşturup API anahtarınızı eklemeniz yeterlidir. AutoFix bu dosyayı otomatik olarak algılar ve okur:
|
|
34
|
+
|
|
35
|
+
GROQ_API_KEY=gsk_your_secret_api_key_here
|
|
36
|
+
|
|
37
|
+
### Seçenek B: Ortam Değişkeni İle
|
|
38
|
+
Alternatif olarak, terminal oturumunuza veya işletim sisteminize ortam değişkeni olarak da ekleyebilirsiniz:
|
|
39
|
+
|
|
40
|
+
export GROQ_API_KEY="gsk_your_secret_api_key_here"
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 💻 Kullanım Şekilleri
|
|
45
|
+
|
|
46
|
+
### 1. Terminal CLI Modu (Doğrudan Çağrı)
|
|
47
|
+
|
|
48
|
+
Proje pyproject.toml standartlarına bağlandığı için terminalden doğrudan autofix kelimesiyle koşturulabilir:
|
|
49
|
+
|
|
50
|
+
#### Hata Tarama ve Otonom Tamir:
|
|
51
|
+
autofix --dosya main.py
|
|
52
|
+
|
|
53
|
+
#### Temiz Koda Yeni Özellik/Fonksiyon Ekleme veya Formatlama:
|
|
54
|
+
autofix --dosya main.py --komut "toplama fonksiyonu ekle ve tip ipuclarini (type hints) unutma"
|
|
55
|
+
|
|
56
|
+
### 2. Python Kod İçi Kütüphane Modu
|
|
57
|
+
|
|
58
|
+
Yazdığınız agentic workflow'lara veya multi-agent sistemlere bir alt motor olarak entegre edebilirsiniz:
|
|
59
|
+
|
|
60
|
+
import os
|
|
61
|
+
from autofix import tek_dosya_otonom_tamir
|
|
62
|
+
|
|
63
|
+
basari = tek_dosya_otonom_tamir(
|
|
64
|
+
dosya_yolu="uygulama.py",
|
|
65
|
+
ozel_komut="Yazilan kodlardaki tum aciklama satirlarini Turkce yap.",
|
|
66
|
+
api_key=os.environ.get("GROQ_API_KEY", ""), # .env dosyası varsa burayı boş da bırakabilirsiniz
|
|
67
|
+
tur_bilgisi="Agent-Core"
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
if basari:
|
|
71
|
+
print("Kod otonom olarak güncellendi!")
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 🛠️ Klasör Mimarisi
|
|
76
|
+
|
|
77
|
+
PyCharmMiscProject/
|
|
78
|
+
│
|
|
79
|
+
├── autofix/ # Ana Kütüphane Klasörü
|
|
80
|
+
│ ├── __init__.py # Paket Arayüzü
|
|
81
|
+
│ └── engine.py # V12 Çift Modlu Ana Motor
|
|
82
|
+
│
|
|
83
|
+
├── .env # API Anahtarı Saklama Dosyası (Opsiyonel)
|
|
84
|
+
├── pyproject.toml # Modern Paket Yönetim Dosyası
|
|
85
|
+
└── README.md # Dokümantasyon
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 👤 Geliştirici
|
|
90
|
+
* **Abdullah Topak** - Software Engineering Student & AI Developer
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import re
|
|
3
|
+
import argparse
|
|
4
|
+
import subprocess
|
|
5
|
+
import requests
|
|
6
|
+
import ast
|
|
7
|
+
import ollama
|
|
8
|
+
|
|
9
|
+
MODEL_YEREL = "qwen2.5-coder:7b"
|
|
10
|
+
MODEL_BULUT = "llama-3.3-70b-versatile"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def dosyayi_oku(dosya_yolu):
|
|
14
|
+
with open(dosya_yolu, "r", encoding="utf-8") as f:
|
|
15
|
+
return f.read()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def dosyaya_yaz(dosya_yolu, yeni_kod):
|
|
19
|
+
with open(dosya_yolu, "w", encoding="utf-8") as f:
|
|
20
|
+
f.write(yeni_kod)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def dotenv_saf_anahtar_oku():
|
|
24
|
+
olasi_yollar = [".env", os.path.join(os.getcwd(), ".env")]
|
|
25
|
+
for yol in olasi_yollar:
|
|
26
|
+
if os.path.exists(yol):
|
|
27
|
+
try:
|
|
28
|
+
with open(yol, "r", encoding="utf-8", errors="ignore") as f:
|
|
29
|
+
icerik = f.read().strip()
|
|
30
|
+
satirlar = [s.strip() for s in icerik.split("\n") if s.strip()]
|
|
31
|
+
if not satirlar: continue
|
|
32
|
+
hedef_satir = satirlar[0]
|
|
33
|
+
if "=" in hedef_satir:
|
|
34
|
+
hedef_satir = hedef_satir.split("=", 1)[1].strip()
|
|
35
|
+
temiz_key = hedef_satir.strip('"').strip("'").strip()
|
|
36
|
+
if "gsk_" in temiz_key:
|
|
37
|
+
idx = temiz_key.find("gsk_")
|
|
38
|
+
return temiz_key[idx:]
|
|
39
|
+
if len(temiz_key) > 20: return temiz_key
|
|
40
|
+
except Exception:
|
|
41
|
+
pass
|
|
42
|
+
return ""
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def git_yedek_al(dosya_yolu):
|
|
46
|
+
try:
|
|
47
|
+
sonuc = subprocess.run(["git", "status"], capture_output=True, text=True)
|
|
48
|
+
if sonuc.returncode == 0:
|
|
49
|
+
return "git"
|
|
50
|
+
except Exception:
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
yedek_yolu = f"{dosya_yolu}.bak"
|
|
54
|
+
try:
|
|
55
|
+
dosyaya_yaz(yedek_yolu, dosyayi_oku(dosya_yolu))
|
|
56
|
+
return yedek_yolu
|
|
57
|
+
except Exception:
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def git_geri_yukle(dosya_yolu, yedek_turu):
|
|
62
|
+
if yedek_turu == "git":
|
|
63
|
+
print(f"🔄 [Git Rollback] Değişiklikler Git üzerinden otonom olarak geri alınıyor...")
|
|
64
|
+
subprocess.run(["git", "checkout", dosya_yolu])
|
|
65
|
+
elif yedek_turu and os.path.exists(yedek_turu):
|
|
66
|
+
print(f"🔄 [Lokal Rollback] Yedek dosyadan (.bak) orijinal kod geri yükleniyor...")
|
|
67
|
+
dosyaya_yaz(dosya_yolu, dosyayi_oku(yedek_turu))
|
|
68
|
+
os.remove(yedek_turu)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def yedek_temizle(yedek_turu):
|
|
72
|
+
if yedek_turu and yedek_turu != "git" and os.path.exists(yedek_turu):
|
|
73
|
+
os.remove(yedek_turu)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def pytest_calistir(dosya_yolu=""):
|
|
77
|
+
try:
|
|
78
|
+
if os.path.exists("test_main.py") or os.path.exists("tests/"):
|
|
79
|
+
sonuc = subprocess.run(["pytest"], capture_output=True, text=True, errors="ignore")
|
|
80
|
+
return sonuc.returncode == 0, sonuc.stdout + "\n" + sonuc.stderr
|
|
81
|
+
else:
|
|
82
|
+
if dosya_yolu and os.path.basename(dosya_yolu) != "main.py" and os.path.basename(
|
|
83
|
+
dosya_yolu) != "buyuk_proje.py":
|
|
84
|
+
sonuc = subprocess.run(["python", "-m", "py_compile", dosya_yolu], capture_output=True, text=True,
|
|
85
|
+
errors="ignore")
|
|
86
|
+
return sonuc.returncode == 0, sonuc.stdout + "\n" + sonuc.stderr
|
|
87
|
+
|
|
88
|
+
hedef_dosya = dosya_yolu if dosya_yolu else "main.py"
|
|
89
|
+
sonuc = subprocess.run(["python", hedef_dosya], capture_output=True, text=True, errors="ignore")
|
|
90
|
+
return sonuc.returncode == 0, sonuc.stdout + "\n" + sonuc.stderr
|
|
91
|
+
except Exception as e:
|
|
92
|
+
return False, f"Çalıştırma hatası: {e}"
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def kodda_hata_var_mi_bul(dosya_yolu):
|
|
96
|
+
sonuc = subprocess.run(
|
|
97
|
+
["flake8", dosya_yolu, "--select=E9,F821"],
|
|
98
|
+
capture_output=True,
|
|
99
|
+
text=True,
|
|
100
|
+
errors="ignore"
|
|
101
|
+
)
|
|
102
|
+
hata_satirlari = [s for s in sonuc.stdout.split("\n") if s.strip()]
|
|
103
|
+
return len(hata_satirlari) == 0, "\n".join(hata_satirlari), len(hata_satirlari)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def fonksiyona_ait_kesiti_bul(dosya_yolu, hata_satiri):
|
|
107
|
+
try:
|
|
108
|
+
with open(dosya_yolu, "r", encoding="utf-8") as f:
|
|
109
|
+
satirlar = f.readlines()
|
|
110
|
+
|
|
111
|
+
kod_icerik = "".join(satirlar)
|
|
112
|
+
agac = ast.parse(kod_icerik)
|
|
113
|
+
|
|
114
|
+
target_node = None
|
|
115
|
+
for node in ast.walk(agac):
|
|
116
|
+
if isinstance(node, ast.FunctionDef):
|
|
117
|
+
if node.lineno <= hata_satiri <= node.end_lineno:
|
|
118
|
+
target_node = node
|
|
119
|
+
break
|
|
120
|
+
|
|
121
|
+
if target_node:
|
|
122
|
+
baslangic = target_node.lineno - 1
|
|
123
|
+
bitis = target_node.end_lineno
|
|
124
|
+
fonksiyon_kodu = "".join(satirlar[baslangic:bitis])
|
|
125
|
+
print(
|
|
126
|
+
f"🎯 [AST Analizi] Hata '{target_node.name}' fonksiyonunda (Satır: {baslangic + 1}-{bitis}) izole edildi. Sadece bu blok tamir ediliyor.")
|
|
127
|
+
return fonksiyon_kodu, baslangic, bitis
|
|
128
|
+
|
|
129
|
+
except Exception:
|
|
130
|
+
pass
|
|
131
|
+
|
|
132
|
+
with open(dosya_yolu, "r", encoding="utf-8") as f:
|
|
133
|
+
satirlar = f.readlines()
|
|
134
|
+
sol_sinir = max(0, hata_satiri - 25)
|
|
135
|
+
sag_sinir = min(len(satirlar), hata_satiri + 25)
|
|
136
|
+
print(
|
|
137
|
+
f"🧱 [Pencere Modu] AST kısıtlandı. Hata çevresindeki 50 satırlık blok ameliyat ediliyor (Satır: {sol_sinir + 1}-{sag_sinir}).")
|
|
138
|
+
return "".join(satirlar[sol_sinir:sag_sinir]), sol_sinir, sag_sinir
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def bagli_yerel_dosyalari_bul(dosya_yolu):
|
|
142
|
+
bagli_dosyalar = []
|
|
143
|
+
if not os.path.exists(dosya_yolu): return bagli_dosyalar
|
|
144
|
+
try:
|
|
145
|
+
kod = dosyayi_oku(dosya_yolu)
|
|
146
|
+
proje_dizini = os.path.dirname(os.path.abspath(dosya_yolu))
|
|
147
|
+
|
|
148
|
+
for satir in kod.split("\n"):
|
|
149
|
+
satir = satir.strip()
|
|
150
|
+
if satir.startswith("import "):
|
|
151
|
+
for mod in satir.replace("import ", "").split(","):
|
|
152
|
+
olasi_dosya = os.path.join(proje_dizini, f"{mod.strip()}.py")
|
|
153
|
+
if os.path.exists(olasi_dosya): bagli_dosyalar.append(olasi_dosya)
|
|
154
|
+
elif satir.startswith("from "):
|
|
155
|
+
match = re.match(r"from\s+([\w\.]+)\s+import", satir)
|
|
156
|
+
if match:
|
|
157
|
+
olasi_dosya = os.path.join(proje_dizini, f"{match.group(1).strip()}.py")
|
|
158
|
+
if os.path.exists(olasi_dosya): bagli_dosyalar.append(olasi_dosya)
|
|
159
|
+
except Exception:
|
|
160
|
+
pass
|
|
161
|
+
return list(set(bagli_dosyalar))
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def yerel_modeli_kontrol_et_ve_indir():
|
|
165
|
+
try:
|
|
166
|
+
yuklu = ollama.list()
|
|
167
|
+
if not any(MODEL_YEREL in m['model'] for m in yuklu.get('models', [])):
|
|
168
|
+
print(f"⚠️ {MODEL_YEREL} bulunamadı. Yerel motor için otomatik indiriliyor (4.7 GB)...")
|
|
169
|
+
ollama.pull(MODEL_YEREL)
|
|
170
|
+
print(f"✨ {MODEL_YEREL} başarıyla kuruldu!")
|
|
171
|
+
return True
|
|
172
|
+
except Exception:
|
|
173
|
+
print("🚨 Hata: Arka planda Ollama uygulamasının açık olduğundan emin olun!")
|
|
174
|
+
return False
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def bulut_motoru_calistir(api_key, prompt, sistem_talimati):
|
|
178
|
+
url = "https://api.groq.com/openai/v1/chat/completions"
|
|
179
|
+
headers = {
|
|
180
|
+
"Authorization": f"Bearer {api_key}",
|
|
181
|
+
"Content-Type": "application/json",
|
|
182
|
+
"User-Agent": "Mozilla/5.0"
|
|
183
|
+
}
|
|
184
|
+
data = {
|
|
185
|
+
"model": MODEL_BULUT,
|
|
186
|
+
"messages": [
|
|
187
|
+
{"role": "system", "content": sistem_talimati},
|
|
188
|
+
{"role": "user", "content": prompt}
|
|
189
|
+
],
|
|
190
|
+
"temperature": 0.1
|
|
191
|
+
}
|
|
192
|
+
try:
|
|
193
|
+
response = requests.post(url, json=data, headers=headers, timeout=15)
|
|
194
|
+
response.raise_for_status()
|
|
195
|
+
return True, response.json()["choices"][0]["message"]["content"].strip()
|
|
196
|
+
except Exception as e:
|
|
197
|
+
return False, f"{e}"
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def tek_dosya_otonom_tamir(dosya_yolu, ozel_komut="", api_key="", tur_bilgisi=""):
|
|
201
|
+
dosya_adi = os.path.basename(dosya_yolu)
|
|
202
|
+
yedek_turu = git_yedek_al(dosya_yolu)
|
|
203
|
+
|
|
204
|
+
tur_str = f" [{tur_bilgisi}]" if tur_bilgisi else ""
|
|
205
|
+
print(f"\n🔍{tur_str} {dosya_adi} inceleniyor...")
|
|
206
|
+
|
|
207
|
+
maksimum_adim = 5
|
|
208
|
+
adim = 0
|
|
209
|
+
son_gecerli_hata_satiri = 1
|
|
210
|
+
|
|
211
|
+
while adim < maksimum_adim:
|
|
212
|
+
kod_temiz_mi, hata_logu, guncel_hata_sayisi = kodda_hata_var_mi_bul(dosya_yolu)
|
|
213
|
+
ek_talimat = f"\n⚠️ KULLANICI ÖZEL TALİMATI (Buna mutlaka uy): {ozel_komut}\n" if ozel_komut else ""
|
|
214
|
+
|
|
215
|
+
if kod_temiz_mi:
|
|
216
|
+
test_basarili, test_logu = pytest_calistir(dosya_yolu)
|
|
217
|
+
|
|
218
|
+
# --- 🚀 FEATURE DEVELOPMENT (GELİŞTİRME) MODU ---
|
|
219
|
+
if test_basarili and ozel_komut:
|
|
220
|
+
print(
|
|
221
|
+
f"💡 {dosya_adi} temiz ancak özel komut algılandı. Geliştirme modu başlatılıyor... (Adım: {adim + 1})")
|
|
222
|
+
kesit_kodu = dosyayi_oku(dosya_yolu)
|
|
223
|
+
baslangic_satiri = 0
|
|
224
|
+
bitis_satiri = len(kesit_kodu.split("\n"))
|
|
225
|
+
|
|
226
|
+
prompt_talimati = (
|
|
227
|
+
f"Aşağıda verilen mevcut Python koduna, kullanıcının istediği yeni özelliği entegre et.\n\n"
|
|
228
|
+
f"KULLANICI TALİMATI: {ozel_komut}\n\n"
|
|
229
|
+
f"MEVCUT KOD:\n"
|
|
230
|
+
f"{kesit_kodu}\n\n"
|
|
231
|
+
f"GÖREV: Mevcut kodun yapısını, importlarını ve çalışan fonksiyonlarını kesinlikle bozmadan, "
|
|
232
|
+
f"sadece istenen özelliği uygun bir yere ekle ve kodun TAMAMINI güncellenmiş olarak üret."
|
|
233
|
+
)
|
|
234
|
+
elif test_basarili and not ozel_komut:
|
|
235
|
+
print(f"🚀 ✅ {dosya_adi} tüm linter ve runtime testlerinden başarıyla geçti!")
|
|
236
|
+
yedek_temizle(yedek_turu)
|
|
237
|
+
return True
|
|
238
|
+
else:
|
|
239
|
+
hata_satirlari = [int(x) for x in re.findall(r"(?:line|satır|satir)\s+(\d+)", test_logu, re.IGNORECASE)]
|
|
240
|
+
if not hata_satirlari:
|
|
241
|
+
match = re.search(r", line (\d+)", test_logu)
|
|
242
|
+
hata_satirlari = [int(match.group(1))] if match else []
|
|
243
|
+
|
|
244
|
+
hata_satiri = hata_satirlari[0] if hata_satirlari else son_gecerli_hata_satiri
|
|
245
|
+
son_gecerli_hata_satiri = hata_satiri
|
|
246
|
+
|
|
247
|
+
print(f"🚨 Runtime Hatası algılandı! Satır: {hata_satiri}. Tamir adımı: {adim + 1}")
|
|
248
|
+
kesit_kodu, baslangic_satiri, bitis_satiri = fonksiyona_ait_kesiti_bul(dosya_yolu, hata_satiri)
|
|
249
|
+
|
|
250
|
+
prompt_talimati = (
|
|
251
|
+
f"Yazdığın kod şu çalışma zamanı hatasını verdi:\n{test_logu}\n"
|
|
252
|
+
f"{ek_talimat}\n"
|
|
253
|
+
f"Lütfen sadece bu fonksiyonun mantığını düzeltip saf fonksiyon kodunu üret:\n{kesit_kodu}"
|
|
254
|
+
)
|
|
255
|
+
else:
|
|
256
|
+
hata_satirlari = [int(x) for x in re.findall(r":(\d+):", hata_logu)]
|
|
257
|
+
hata_satiri = hata_satirlari[0] if hata_satirlari else son_gecerli_hata_satiri
|
|
258
|
+
son_gecerli_hata_satiri = hata_satiri
|
|
259
|
+
|
|
260
|
+
print(
|
|
261
|
+
f"🚨 Linter Hatası algılandı! Toplam hata: {guncel_hata_sayisi}. Şu an çözülen satır: {hata_satiri}. Tamir adımı: {adim + 1}")
|
|
262
|
+
kesit_kodu, baslangic_satiri, bitis_satiri = fonksiyona_ait_kesiti_bul(dosya_yolu, hata_satiri)
|
|
263
|
+
|
|
264
|
+
prompt_talimati = (
|
|
265
|
+
f"Koddaki şu linter hatasını mevcut fonksiyon yapısını bozmadan düzelt:\n{hata_logu}\n"
|
|
266
|
+
f"{ek_talimat}\n"
|
|
267
|
+
f"SADECE BU FONKSİYON BLOĞU ÜZERİNDE ÇALIŞ:\n{kesit_kodu}"
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
sistem_talimati = (
|
|
271
|
+
"Sen bir otonom yazılım robotusun. Görevin sadece geçerli ve saf Python kodu üretmektir.\n"
|
|
272
|
+
"KESİNLİKLE metinsel açıklama, selamlama, sitem, soru veya markdown (```python) işaretleri yazma.\n"
|
|
273
|
+
"Cevabın sadece doğrudan çalıştırılabilir Python kodundan oluşmalıdır."
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
yeni_kesit = ""
|
|
277
|
+
bulut_basarili = False
|
|
278
|
+
|
|
279
|
+
if api_key:
|
|
280
|
+
bulut_basarili, sonuc = bulut_motoru_calistir(api_key, prompt_talimati, sistem_talimati)
|
|
281
|
+
if bulut_basarili: yeni_kesit = sonuc
|
|
282
|
+
|
|
283
|
+
if not bulut_basarili:
|
|
284
|
+
if not yerel_modeli_kontrol_et_ve_indir():
|
|
285
|
+
git_geri_yukle(dosya_yolu, yedek_turu)
|
|
286
|
+
return False
|
|
287
|
+
try:
|
|
288
|
+
response = ollama.generate(model=MODEL_YEREL, prompt=prompt_talimati, system=sistem_talimati)
|
|
289
|
+
yeni_kesit = response['response'].strip()
|
|
290
|
+
except Exception:
|
|
291
|
+
git_geri_yukle(dosya_yolu, yedek_turu)
|
|
292
|
+
return False
|
|
293
|
+
|
|
294
|
+
yeni_kesit = yeni_kesit.replace("```python", "").replace("```", "").strip()
|
|
295
|
+
|
|
296
|
+
with open(dosya_yolu, "r", encoding="utf-8") as f:
|
|
297
|
+
orijinal_satirlar = f.readlines()
|
|
298
|
+
|
|
299
|
+
orijinal_satirlar[baslangic_satiri:bitis_satiri] = [yeni_kesit + "\n"]
|
|
300
|
+
dosyaya_yaz(dosya_yolu, "".join(orijinal_satirlar))
|
|
301
|
+
|
|
302
|
+
if kod_temiz_mi and test_basarili and ozel_komut:
|
|
303
|
+
print(f"🚀 ✅ {dosya_adi} dosyasına özel talimat başarıyla entegre edildi!")
|
|
304
|
+
yedek_temizle(yedek_turu)
|
|
305
|
+
return True
|
|
306
|
+
|
|
307
|
+
adim += 1
|
|
308
|
+
|
|
309
|
+
print(f"🚨 [Geçici Başarısız] {dosya_adi} çoklu hataları maksimum adımda eritemedi.")
|
|
310
|
+
git_geri_yukle(dosya_yolu, yedek_turu)
|
|
311
|
+
return False
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
def ana_motor():
|
|
315
|
+
parser = argparse.ArgumentParser(description="Nihai Proje Sağlık Taramalı Otonom CLI - V12")
|
|
316
|
+
parser.add_argument("--dosya", type=str, default="", help="Tek dosya modu")
|
|
317
|
+
parser.add_argument("--dosyalar", type=str, default="", help="Çoklu dosya listesi")
|
|
318
|
+
parser.add_argument("--komut", type=str, default="", help="Yapay zekaya özel talimat")
|
|
319
|
+
args = parser.parse_args()
|
|
320
|
+
|
|
321
|
+
api_key = dotenv_saf_anahtar_oku() or os.environ.get("GROQ_API_KEY", "")
|
|
322
|
+
|
|
323
|
+
hedef_dosyalar = []
|
|
324
|
+
|
|
325
|
+
if args.dosya:
|
|
326
|
+
ana_hedef = args.dosya.strip()
|
|
327
|
+
hedef_dosyalar.append(ana_hedef)
|
|
328
|
+
|
|
329
|
+
# 🎯 DERİNLEMESİNE SAĞLIK TARAMASI BURADA BAŞLIYOR:
|
|
330
|
+
# Önce tüm bağımlı alt dosyaları (import edilen utils.py vb.) listeliyoruz.
|
|
331
|
+
alt_dosyalar = bagli_yerel_dosyalari_bul(ana_hedef)
|
|
332
|
+
|
|
333
|
+
# Projenin genelinde (hem ana hedefte hem de tüm alt dosyalarda) hata arıyoruz.
|
|
334
|
+
proje_tamamen_temiz_mi = True
|
|
335
|
+
|
|
336
|
+
# 1. Aşama: Ana dosyanın ve bağlı dosyaların linter durumunu check et
|
|
337
|
+
for dosya in [ana_hedef] + alt_dosyalar:
|
|
338
|
+
if os.path.exists(dosya):
|
|
339
|
+
linter_temiz_mi, _, _ = kodda_hata_var_mi_bul(dosya)
|
|
340
|
+
if not linter_temiz_mi:
|
|
341
|
+
proje_tamamen_temiz_mi = False
|
|
342
|
+
break
|
|
343
|
+
|
|
344
|
+
# 2. Aşama: Linter temizse runtime (pytest/derleme) durumuna bak
|
|
345
|
+
if proje_tamamen_temiz_mi:
|
|
346
|
+
runtime_basarili, _ = pytest_calistir(ana_hedef)
|
|
347
|
+
if not runtime_basarili:
|
|
348
|
+
proje_tamamen_temiz_mi = False
|
|
349
|
+
|
|
350
|
+
# --- 🔀 KRİTİK KARAR MEKANIZMASI ---
|
|
351
|
+
if not proje_tamamen_temiz_mi:
|
|
352
|
+
# 🚨 SENARYO 1 (TAMİR MODU): Projenin herhangi bir yerinde hata bulundu!
|
|
353
|
+
# Bütün bağımlılıkları listeye ekle ki sistem gidip utils.py'daki hatayı da bulup düzeltsin.
|
|
354
|
+
print("⚠️ Projenin bütününde linter/runtime uyuşmazlığı saptandı. Tamir motoru genişletiliyor...")
|
|
355
|
+
hedef_dosyalar.extend(alt_dosyalar)
|
|
356
|
+
else:
|
|
357
|
+
# 🚀 SENARYO 2 (GELİŞTİRME MODU): Tüm proje jilet gibi temiz ve kullanıcının özel komutu var!
|
|
358
|
+
# utils.py dosyasını listeye ASLA ekleme, yapay zeka sadece kullanıcının istediği ana_hedef dosyaya yazsın.
|
|
359
|
+
pass
|
|
360
|
+
|
|
361
|
+
if args.dosyalar:
|
|
362
|
+
hedef_dosyalar.extend([d.strip() for d in args.dosyalar.split(",") if d.strip()])
|
|
363
|
+
|
|
364
|
+
hedef_dosyalar = list(set(hedef_dosyalar))
|
|
365
|
+
|
|
366
|
+
if not hedef_dosyalar:
|
|
367
|
+
print("🤖 Giriş dosyasını belirtin! Örn: --dosya main.py")
|
|
368
|
+
return
|
|
369
|
+
|
|
370
|
+
yarali_dosyalar = []
|
|
371
|
+
for dosya in hedef_dosyalar:
|
|
372
|
+
if os.path.exists(dosya):
|
|
373
|
+
basarili = tek_dosya_otonom_tamir(dosya, args.komut, api_key, tur_bilgisi="1. Tur")
|
|
374
|
+
if not basarili:
|
|
375
|
+
yarali_dosyalar.append(dosya)
|
|
376
|
+
|
|
377
|
+
if yarali_dosyalar:
|
|
378
|
+
print(f"\n🔄 --------------------------------------------------")
|
|
379
|
+
print(
|
|
380
|
+
f"🚀 [2. Tur Başlıyor] Diğer dosyalar iyileşti! Kilitlenen {len(yarali_dosyalar)} dosya yeniden işleniyor...")
|
|
381
|
+
print(f"-----------------------------------------------------")
|
|
382
|
+
|
|
383
|
+
for dosya in yarali_dosyalar:
|
|
384
|
+
if os.path.exists(dosya):
|
|
385
|
+
tek_dosya_otonom_tamir(dosya, args.komut, api_key, tur_bilgisi="2. Tur")
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
if __name__ == "__main__":
|
|
389
|
+
main_motor = ana_motor
|
|
390
|
+
ana_motor()
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: code-healer
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Yapay zeka destekli otonom kod tamir ve gelistirme kütüphanesi
|
|
5
|
+
Author: Abdullah Topak
|
|
6
|
+
Requires-Python: >=3.8
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: requests>=2.28.0
|
|
9
|
+
Requires-Dist: ollama>=0.1.0
|
|
10
|
+
Requires-Dist: flake8
|
|
11
|
+
Requires-Dist: pytest
|
|
12
|
+
|
|
13
|
+
# 🛡️ AutoFix: Yapay Zeka Destekli Otonom Kod Tamir ve Geliştirme Motoru
|
|
14
|
+
|
|
15
|
+
AutoFix, Python projelerindeki sözdizimi (Linter/Flake8) ve çalışma zamanı (Runtime/Pytest) hatalarını derinlemesine AST (Abstract Syntax Tree) analiziyle lokal veya bulut LLM'leri kullanarak otonom olarak iyileştiren ve koda yeni özellikler entegre edebilen bir Self-Healing & Feature Development kütüphanesidir.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## ✨ Özellikler
|
|
20
|
+
|
|
21
|
+
* **Derinlemesine Proje Sağlık Taraması:** Sadece hedef dosyayı değil, o dosyanın import ettiği tüm yerel bağımlılıkları (utils.py vb.) otomatik tarar.
|
|
22
|
+
* **AST Ameliyat Modu (Fonksiyon İzolasyonu):** Hatalı satırı tüm dosyayı bozmadan, AST ile sadece ilgili fonksiyon bloğunu cımbızla çekerek izole bir şekilde tamir eder.
|
|
23
|
+
* **Çift Modlu Çalışma Mimarisi:**
|
|
24
|
+
* **Tamir Modu:** Kodda hata varsa otonom olarak ardışık iyileştirme (Iterative Healing) döngüsünü başlatır.
|
|
25
|
+
* **Geliştirme Modu (Feature Mode):** Proje temizse, terminalden verilen --komut talimatına göre mevcut yapıyı bozmadan yeni özellikleri otonom olarak koda ekler.
|
|
26
|
+
* **Esnek Kimlik Doğrulama (.env Desteği):** Bulut motoru (Groq API) kullanırken isterseniz API anahtarınızı parametre olarak geçebilir, isterseniz de proje kökündeki bir .env dosyasından otomatik okunmasını sağlayabilirsiniz.
|
|
27
|
+
* **Hibrit Motor Desteği:** Groq API (Llama 3.3) ile bulut veya Ollama (Qwen 2.5 Coder) ile %100 yerel/offline çalışabilir.
|
|
28
|
+
* **Güvenli Yamalama (Safe Rollback):** Kodda ters giden bir şey olduğunda Git veya .bak yedeği üzerinden otonom olarak orijinal koda geri döner.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 🚀 Kurulum
|
|
33
|
+
|
|
34
|
+
Proje kök dizinindeyken terminalden geliştirici modunda kurun:
|
|
35
|
+
|
|
36
|
+
pip install -e .
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 🔑 Kimlik Doğrulama Seçenekleri (.env Kullanımı)
|
|
41
|
+
|
|
42
|
+
Bulut motorunu (Groq) kullanabilmek için API anahtarınızı sisteme iki farklı seçenekle tanıtabilirsiniz:
|
|
43
|
+
|
|
44
|
+
### Seçenek A: .env Dosyası İle (Önerilen)
|
|
45
|
+
Projenizin kök dizinine bir .env dosyası oluşturup API anahtarınızı eklemeniz yeterlidir. AutoFix bu dosyayı otomatik olarak algılar ve okur:
|
|
46
|
+
|
|
47
|
+
GROQ_API_KEY=gsk_your_secret_api_key_here
|
|
48
|
+
|
|
49
|
+
### Seçenek B: Ortam Değişkeni İle
|
|
50
|
+
Alternatif olarak, terminal oturumunuza veya işletim sisteminize ortam değişkeni olarak da ekleyebilirsiniz:
|
|
51
|
+
|
|
52
|
+
export GROQ_API_KEY="gsk_your_secret_api_key_here"
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 💻 Kullanım Şekilleri
|
|
57
|
+
|
|
58
|
+
### 1. Terminal CLI Modu (Doğrudan Çağrı)
|
|
59
|
+
|
|
60
|
+
Proje pyproject.toml standartlarına bağlandığı için terminalden doğrudan autofix kelimesiyle koşturulabilir:
|
|
61
|
+
|
|
62
|
+
#### Hata Tarama ve Otonom Tamir:
|
|
63
|
+
autofix --dosya main.py
|
|
64
|
+
|
|
65
|
+
#### Temiz Koda Yeni Özellik/Fonksiyon Ekleme veya Formatlama:
|
|
66
|
+
autofix --dosya main.py --komut "toplama fonksiyonu ekle ve tip ipuclarini (type hints) unutma"
|
|
67
|
+
|
|
68
|
+
### 2. Python Kod İçi Kütüphane Modu
|
|
69
|
+
|
|
70
|
+
Yazdığınız agentic workflow'lara veya multi-agent sistemlere bir alt motor olarak entegre edebilirsiniz:
|
|
71
|
+
|
|
72
|
+
import os
|
|
73
|
+
from autofix import tek_dosya_otonom_tamir
|
|
74
|
+
|
|
75
|
+
basari = tek_dosya_otonom_tamir(
|
|
76
|
+
dosya_yolu="uygulama.py",
|
|
77
|
+
ozel_komut="Yazilan kodlardaki tum aciklama satirlarini Turkce yap.",
|
|
78
|
+
api_key=os.environ.get("GROQ_API_KEY", ""), # .env dosyası varsa burayı boş da bırakabilirsiniz
|
|
79
|
+
tur_bilgisi="Agent-Core"
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if basari:
|
|
83
|
+
print("Kod otonom olarak güncellendi!")
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 🛠️ Klasör Mimarisi
|
|
88
|
+
|
|
89
|
+
PyCharmMiscProject/
|
|
90
|
+
│
|
|
91
|
+
├── autofix/ # Ana Kütüphane Klasörü
|
|
92
|
+
│ ├── __init__.py # Paket Arayüzü
|
|
93
|
+
│ └── engine.py # V12 Çift Modlu Ana Motor
|
|
94
|
+
│
|
|
95
|
+
├── .env # API Anahtarı Saklama Dosyası (Opsiyonel)
|
|
96
|
+
├── pyproject.toml # Modern Paket Yönetim Dosyası
|
|
97
|
+
└── README.md # Dokümantasyon
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 👤 Geliştirici
|
|
102
|
+
* **Abdullah Topak** - Software Engineering Student & AI Developer
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
autofix/__init__.py
|
|
4
|
+
autofix/engine.py
|
|
5
|
+
code_healer.egg-info/PKG-INFO
|
|
6
|
+
code_healer.egg-info/SOURCES.txt
|
|
7
|
+
code_healer.egg-info/dependency_links.txt
|
|
8
|
+
code_healer.egg-info/entry_points.txt
|
|
9
|
+
code_healer.egg-info/requires.txt
|
|
10
|
+
code_healer.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
autofix
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "code-healer" # 👈 Resmi paket adın bu oldu! (pip install code-healer)
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Yapay zeka destekli otonom kod tamir ve gelistirme kütüphanesi"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
authors = [
|
|
12
|
+
{ name="Abdullah Topak" }
|
|
13
|
+
]
|
|
14
|
+
dependencies = [
|
|
15
|
+
"requests>=2.28.0",
|
|
16
|
+
"ollama>=0.1.0",
|
|
17
|
+
"flake8",
|
|
18
|
+
"pytest"
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
[project.scripts]
|
|
22
|
+
codeheal = "autofix.engine:ana_motor" # 👈 Terminalde direkt 'codeheal' yazarak çalıştıracaksın!
|