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.
@@ -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,2 @@
1
+ from .engine import tek_dosya_otonom_tamir, ana_motor
2
+ __all__ = ["tek_dosya_otonom_tamir", "ana_motor"]
@@ -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,2 @@
1
+ [console_scripts]
2
+ codeheal = autofix.engine:ana_motor
@@ -0,0 +1,4 @@
1
+ requests>=2.28.0
2
+ ollama>=0.1.0
3
+ flake8
4
+ pytest
@@ -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!
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+