From 2d8d23f4697165f470135ceb096c1044dbac10d3 Mon Sep 17 00:00:00 2001 From: Roo Date: Tue, 10 Mar 2026 08:27:38 +0000 Subject: [PATCH] =?UTF-8?q?gitea=5Fmanager=20friss=C3=ADt=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .roo/rules/05_Kanban_Workflow.md | 65 ++++- .roo/scripts/gitea_manager.py | 239 +++++++++++++----- .../2026.03.09}/move_card.py.old | 0 .../2026.03.09}/move_card2.py.old | 0 4 files changed, 225 insertions(+), 79 deletions(-) rename {.roo/scripts => archive/2026.03.09}/move_card.py.old (100%) rename {.roo/scripts => archive/2026.03.09}/move_card2.py.old (100%) diff --git a/.roo/rules/05_Kanban_Workflow.md b/.roo/rules/05_Kanban_Workflow.md index 4894889..a7a72b7 100755 --- a/.roo/rules/05_Kanban_Workflow.md +++ b/.roo/rules/05_Kanban_Workflow.md @@ -1,28 +1,71 @@ # 🤖 ÉLES MUNKAFOLYAMAT (KÖTELEZŐ) -A feladataidat szigorúan a `gitea_manager.py` script segítségével kell menedzselned a `roo-helper` konténerben. -Minden paramétert az alábbi parancsokkal hívj meg: +A feladataidat szigorúan a `gitea_manager.py` script segítségével kell menedzselned a `roo-helper` konténerben. +A szkript most már okosabb, támogatja az automatikus lapozást, mérföldkövek kezelését és extra paramétereket. -## 1. Feladat Felvétele (Get) +## 📋 ELÉRHETŐ PARANCSOK + +### 1. Listázás és Információ +- **Feladatok listázása:** `docker exec roo-helper python3 /scripts/gitea_manager.py list` +- **Lezárt feladatok:** `docker exec roo-helper python3 /scripts/gitea_manager.py list closed` +- **Mérföldkövek listázása:** `docker exec roo-helper python3 /scripts/gitea_manager.py ms list` +- **Feladat részletei:** `docker exec roo-helper python3 /scripts/gitea_manager.py get ` + +### 2. Mérföldkövek Kezelése +- **Új mérföldkő létrehozása:** `docker exec roo-helper python3 /scripts/gitea_manager.py ms create "Mérföldkő Neve" "Leírás" --due YYYY-MM-DD` +- **Mérföldkövek listázása:** `docker exec roo-helper python3 /scripts/gitea_manager.py ms list` + +### 3. Feladat Felvétele (Get) Amikor megkapod, hogy dolgozz pl. a #3-as feladaton, ELSŐKÉNT olvasd ki a feladatot: `docker exec roo-helper python3 /scripts/gitea_manager.py get 3` -Értelmezd a kapott címet és leírást. +Értelmezd a kapott címet, leírást és mérföldkövet. -## 2. Munka Megkezdése (Start) +### 4. Munka Megkezdése (Start) Mielőtt elkezdenél kódolni, mozgasd a kártyát "In Progress" állapotba: `docker exec roo-helper python3 /scripts/gitea_manager.py start 3` -## 3. Fejlesztés és Dokumentálás +### 5. Fejlesztés és Dokumentálás - Végezd el a kért kódolási feladatot. - **KÖTELEZŐ:** Készíts vagy frissíts egy Markdown leírást (pl. `readme.md` vagy doc fájl) a működő részről. -## 4. Befejezés és Lezárás (Finish) +### 6. Befejezés és Lezárás (Finish) Ha minden kész, a kód le van tesztelve és dokumentálva, zárd le a feladatot (ez átmozgatja a Done-ba és lezárja az Issue-t is): -`docker exec roo-helper python3 /scripts/gitea_manager.py finish 3` +`docker exec roo-helper python3 /scripts/gitea_manager.py finish 3 "Rövid technikai összefoglaló"` -## 5. Új Feladatok Létrehozása (Create) -Ha auditálást végzel, és hiányzó funkciókat találsz, önállóan hozz létre ToDo kártyákat az alábbi paranccsal: +### 7. Új Feladatok Létrehozása (Create) +Ha auditálást végzel, és hiányzó funkciókat találsz, önállóan hozz létre ToDo kártyákat: + +**Alap parancs:** `docker exec roo-helper python3 /scripts/gitea_manager.py create "Kártya Címe" "Részletes leírás Markdown formátumban"` +**Teljes szintaxis opciókkal:** +`docker exec roo-helper python3 /scripts/gitea_manager.py create "Cím" "Leírás" [Mérföldkő] [Címkék...] [--due YYYY-MM-DD] [--assign username]` -TILOS a folyamat lépéseit szimulálni. Ha egy API parancs hibát dob, állj meg, és jelezd a felhasználónak! \ No newline at end of file +**Példák:** +- `docker exec roo-helper python3 /scripts/gitea_manager.py create "API végpont hozzáadása" "Új POST /vehicles endpoint..." "DDD Refaktor" "Scope: Backend" "Type: Feature" --due 2026-03-15 --assign kincses` +- `docker exec roo-helper python3 /scripts/gitea_manager.py create "Hibajavítás" "Fix SQL injection..." "Scope: Database" "Type: Bug"` + +**Címke típusok:** +- **Státusz:** `Status: To Do`, `Status: In Progress`, `Status: Done`, `Status: Blocked` +- **Hatáskör:** `Scope: Backend`, `Scope: Frontend`, `Scope: API`, `Scope: Core`, `Scope: Robot`, `Scope: Database` +- **Típus:** `Type: Script`, `Type: Model`, `Type: Database`, `Type: Bug`, `Type: Feature`, `Type: Refactor` +- **Szerepkör:** `Role: Admin`, `Role: User` + +## 🎯 MUNKAFOLYAMAT ÖSSZEFOGLALÓ + +1. **Feladat kiválasztása:** `list` → válassz egy nyitott feladatot +2. **Részletek:** `get ` → értelmezd a feladatot +3. **Megkezdés:** `start ` → időmérés indítása +4. **Fejlesztés:** Kódolás és dokumentálás +5. **Befejezés:** `finish "Technikai összefoglaló"` → lezárás és időmérés leállítása +6. **Új feladat:** `create ...` → ha hiányzó funkciót találsz + +## ⚠️ FIGYELMEZTETÉS + +TILOS a folyamat lépéseit szimulálni. Ha egy API parancs hibát dob, állj meg, és jelezd a felhasználónak! + +A szkript automatikusan kezeli: +- **Automatikus lapozást** (bármilyen hosszú listát) +- **Mérföldkövek név alapján történő feloldását** +- **Címkék automatikus létrehozását és kezelését** +- **Hibrid hálózat felismerést** (belső/külső Gitea cím) \ No newline at end of file diff --git a/.roo/scripts/gitea_manager.py b/.roo/scripts/gitea_manager.py index 9d04a99..3d57321 100644 --- a/.roo/scripts/gitea_manager.py +++ b/.roo/scripts/gitea_manager.py @@ -2,9 +2,12 @@ import requests import sys import datetime +import socket # ================= KONFIGURÁCIÓ ================= -BASE_URL = "http://gitea:3000/api/v1" +INTERNAL_HOST = "gitea" +EXTERNAL_IP = "192.168.100.10" +PORT = "3000" OWNER = "kincses" REPO = "service-finder" TOKEN = "783f58519ee0ca060491dbc07f3dde1d8e48c5dd" @@ -14,27 +17,54 @@ HEADERS = { "Content-Type": "application/json" } -# A teljes profi címkerendszer +# Hibrid Hálózat-felismerés +def get_base_url(): + try: + socket.gethostbyname(INTERNAL_HOST) + return f"http://{INTERNAL_HOST}:{PORT}/api/v1" + except socket.gaierror: + return f"http://{EXTERNAL_IP}:{PORT}/api/v1" + +BASE_URL = get_base_url() + LABELS = { "Status: To Do": "#ef4444", "Status: In Progress": "#f59e0b", "Status: Done": "#10b981", "Status: Blocked": "#000000", - "Scope: Backend": "#0369a1", "Scope: Frontend": "#0284c7", "Scope: API": "#0ea5e9", "Scope: Core": "#38bdf8", "Scope: Robot": "#7dd3fc", - "Type: Script": "#8b5cf6", "Type: Model": "#3b82f6", "Type: Database": "#ec4899", "Type: Bug": "#dc2626", "Type: Feature": "#16a34a", + "Scope: Backend": "#0369a1", "Scope: Frontend": "#0284c7", "Scope: API": "#0ea5e9", "Scope: Core": "#38bdf8", "Scope: Robot": "#7dd3fc", "Scope: Database": "#ec4899", + "Type: Script": "#8b5cf6", "Type: Model": "#3b82f6", "Type: Database": "#ec4899", "Type: Bug": "#dc2626", "Type: Feature": "#16a34a", "Type: Refactor": "#16a34a", "Role: Admin": "#fb923c", "Role: User": "#fdba74" } # ================================================ +def fetch_all_pages(endpoint): + """Gitea API lapozás (Pagination) kezelése, hogy minden elemet visszakapjunk.""" + all_data = [] + page = 1 + limit = 50 + separator = "&" if "?" in endpoint else "?" + while True: + url = f"{BASE_URL}{endpoint}{separator}limit={limit}&page={page}" + res = requests.get(url, headers=HEADERS) + if res.status_code != 200: + break + data = res.json() + if not data: + break + all_data.extend(data) + if len(data) < limit: + break + page += 1 + return all_data + def init_labels(): - """Lekéri a meglévő címkéket, és létrehozza a hiányzókat.""" - url = f"{BASE_URL}/repos/{OWNER}/{REPO}/labels" - res = requests.get(url, headers=HEADERS) - existing = {l['name']: l['id'] for l in res.json()} if res.status_code == 200 else {} + existing_labels = fetch_all_pages(f"/repos/{OWNER}/{REPO}/labels") + existing = {l['name']: l['id'] for l in existing_labels} label_ids = {} for name, color in LABELS.items(): if name in existing: label_ids[name] = existing[name] else: - post_res = requests.post(url, headers=HEADERS, json={"name": name, "color": color}) + post_res = requests.post(f"{BASE_URL}/repos/{OWNER}/{REPO}/labels", headers=HEADERS, json={"name": name, "color": color}) if post_res.status_code == 201: label_ids[name] = post_res.json()['id'] return label_ids @@ -59,20 +89,64 @@ def set_issue_state(issue_num, new_state_label, category_labels=[]): def add_comment(issue_num, message): requests.post(f"{BASE_URL}/repos/{OWNER}/{REPO}/issues/{issue_num}/comments", headers=HEADERS, json={"body": message}) -def create_issue(title, body, categories, milestone_id=None): - url = f"{BASE_URL}/repos/{OWNER}/{REPO}/issues" +# --- MÉRFÖLDKŐ (MILESTONE) KEZELÉS --- + +def resolve_milestone_id(name_or_id): + if not name_or_id: return None + if str(name_or_id).isdigit(): return int(name_or_id) + + milestones = fetch_all_pages(f"/repos/{OWNER}/{REPO}/milestones") + for ms in milestones: + if ms['title'].lower() == str(name_or_id).lower(): + return ms['id'] + return None + +def create_milestone(title, description="", due_date=None): + existing_id = resolve_milestone_id(title) + if existing_id: + print(f"Mérföldkő már létezik: '{title}' (ID: {existing_id})") + return existing_id + + payload = {"title": title, "description": description} + if due_date: + payload["due_on"] = f"{due_date}T23:59:59Z" if len(due_date) == 10 else due_date + + res = requests.post(f"{BASE_URL}/repos/{OWNER}/{REPO}/milestones", headers=HEADERS, json=payload) + if res.status_code == 201: + ms_id = res.json()['id'] + print(f"✅ Mérföldkő sikeresen létrehozva: '{title}' (ID: {ms_id})") + return ms_id + print(f"❌ Hiba a mérföldkő létrehozásakor: {res.text}") + return None + +def list_milestones(): + milestones = fetch_all_pages(f"/repos/{OWNER}/{REPO}/milestones") + print(f"\n{'ID':<5} | {'Mérföldkő Címe':<40} | {'Haladás'}") + print("-" * 65) + for ms in milestones: + print(f"#{ms['id']:<4} | {ms['title'][:40]:<40} | {ms['completeness']}%") + +# --- KÁRTYA (ISSUE) KEZELÉS --- + +def create_issue(title, body, categories, milestone_ref=None, due_date=None, assignees=None): + ms_id = resolve_milestone_id(milestone_ref) + payload = {"title": title, "body": body} - if milestone_id is not None and milestone_id != "": - try: - payload["milestone"] = int(milestone_id) - except ValueError: - print(f"Figyelmeztetés: Érvénytelen milestone_id: {milestone_id}, figyelmen kívül hagyva.") - res = requests.post(url, headers=HEADERS, json=payload) + if ms_id: + payload["milestone"] = ms_id + if due_date: + payload["due_date"] = f"{due_date}T23:59:59Z" if len(due_date) == 10 else due_date + if assignees: + payload["assignees"] = assignees + + res = requests.post(f"{BASE_URL}/repos/{OWNER}/{REPO}/issues", headers=HEADERS, json=payload) if res.status_code == 201: issue_num = res.json()['number'] set_issue_state(issue_num, "Status: To Do", categories) - print(f"Siker: #{issue_num} feladat létrehozva.") + ms_text = f" (Milestone: {ms_id})" if ms_id else "" + print(f"✅ Siker: #{issue_num} feladat létrehozva{ms_text}.") return True + print(f"❌ Hiba a kártya létrehozásakor: {res.text}") return False def start_issue(issue_num): @@ -80,7 +154,7 @@ def start_issue(issue_num): set_issue_state(issue_num, "Status: In Progress") requests.post(f"{BASE_URL}/repos/{OWNER}/{REPO}/issues/{issue_num}/stopwatch/start", headers=HEADERS) add_comment(issue_num, f"▶️ **Munka megkezdve:** {now}") - print(f"Siker: A #{issue_num} időmérése elindult.") + print(f"✅ Siker: A #{issue_num} időmérése elindult.") def finish_issue(issue_num, custom_message=None): now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") @@ -88,70 +162,99 @@ def finish_issue(issue_num, custom_message=None): requests.post(f"{BASE_URL}/repos/{OWNER}/{REPO}/issues/{issue_num}/stopwatch/stop", headers=HEADERS) requests.patch(f"{BASE_URL}/repos/{OWNER}/{REPO}/issues/{issue_num}", headers=HEADERS, json={"state": "closed"}) - # Itt adjuk hozzá az egyedi AI összefoglalót, ha van - if custom_message: - comment_body = f"✅ **Munka befejezve:** {now}\n\n**Technikai Összefoglaló:**\n{custom_message}\n\n⏱️ *A ráfordított időt a Gitea rögzítette.*" - else: - comment_body = f"✅ **Munka befejezve:** {now}\n⏱️ *A ráfordított időt a Gitea rögzítette.*" - + comment_body = f"✅ **Munka befejezve:** {now}\n\n**Technikai Összefoglaló:**\n{custom_message}\n\n⏱️ *A ráfordított időt a Gitea rögzítette.*" if custom_message else f"✅ **Munka befejezve:** {now}\n⏱️ *A ráfordított időt a Gitea rögzítette.*" add_comment(issue_num, comment_body) - print(f"Siker: A #{issue_num} lezárva, időmérés megállítva. Komment mentve.") + print(f"✅ Siker: A #{issue_num} lezárva, időmérés megállítva.") def get_issue(issue_num): - url = f"{BASE_URL}/repos/{OWNER}/{REPO}/issues/{issue_num}" - res = requests.get(url, headers=HEADERS) - + res = requests.get(f"{BASE_URL}/repos/{OWNER}/{REPO}/issues/{issue_num}", headers=HEADERS) if res.status_code != 200: - print(f"Hiba: Nem sikerült lekérni a #{issue_num} feladatot. Státusz kód: {res.status_code}") + print(f"Hiba: Nem sikerült lekérni a #{issue_num} feladatot. Státusz: {res.status_code}") sys.exit(1) data = res.json() - title = data.get('title', 'Nincs cím') - body = data.get('body', 'Nincs leírás') - state = data.get('state', 'unknown') - created_at = data.get('created_at', '') - updated_at = data.get('updated_at', '') - + ms_title = data.get('milestone', {}).get('title', 'Nincs') if data.get('milestone') else 'Nincs' print("=" * 60) - print(f"Feladat #{issue_num} - {state.upper()}") + print(f"Feladat #{issue_num} - {data.get('state', 'unknown').upper()} (Mérföldkő: {ms_title})") print("=" * 60) - print(f"Cím: {title}") - print(f"Létrehozva: {created_at}") - print(f"Frissítve: {updated_at}") + print(f"Cím: {data.get('title', 'Nincs cím')}") print("-" * 60) - print("Leírás:") - print(body) + print(data.get('body', 'Nincs leírás')) print("=" * 60) +def list_issues(state="open"): + issues = fetch_all_pages(f"/repos/{OWNER}/{REPO}/issues?state={state}") + print(f"\n--- {state.upper()} FELADATOK ---") + print(f"{'ID':<4} | {'Cím':<40} | {'Mérföldkő'}") + print("-" * 70) + for i in issues: + ms = i.get('milestone', {}).get('title', '-') if i.get('milestone') else '-' + print(f"#{i['number']:<3} | {i['title'][:40]:<40} | {ms}") + +# ================= FŐPROGRAM ================= + if __name__ == "__main__": - if len(sys.argv) < 3: - print("Használat: python3 gitea_manager.py [start|finish|create|get] ...") - print(" start ") - print(" finish [\"Custom summary message\"]") - print(" get ") - print(" create \"\" \"<body>\" [milestone_id] [category1 category2 ...]") + raw_args = sys.argv[1:] + if not raw_args: + print("Használat: python3 gitea_manager.py [parancs] [argumentumok]") + print(" list - Nyitott kártyák listázása") + print(" list closed - Lezárt kártyák listázása") + print(" ms list - Mérföldkövek listázása") + print(" ms create \"Név\" - Új mérföldkő létrehozása") + print(" create \"Cím\" \"Leírás\" [Mérföldkő] [Címkék...] [--due YYYY-MM-DD] [--assign username]") + print(" start <id> - Munka megkezdése") + print(" finish <id> [msg] - Munka lezárása") + print(" get <id> - Kártya lekérése") sys.exit(1) - action = sys.argv[1].lower() + # Paraméterek kinyerése (--due, --assign) + args = [] + due_date = None + assignees = [] + + i = 0 + while i < len(raw_args): + if raw_args[i] == "--due" and i + 1 < len(raw_args): + due_date = raw_args[i+1] + i += 2 + elif raw_args[i] == "--assign" and i + 1 < len(raw_args): + assignees.append(raw_args[i+1]) + i += 2 + else: + args.append(raw_args[i]) + i += 1 - if action == "start": - start_issue(sys.argv[2]) - elif action == "finish": - # Ha van 3. paraméter (az üzenet), adjuk át - custom_msg = sys.argv[3] if len(sys.argv) > 3 else None - finish_issue(sys.argv[2], custom_msg) - elif action == "create": - title = sys.argv[2] - body = sys.argv[3] - milestone_id = None + action = args[0].lower() + + if action == "list": + list_issues(args[1] if len(args) > 1 else "open") + + elif action == "ms": + if len(args) > 1 and args[1].lower() == "create": + create_milestone(args[2], args[3] if len(args) > 3 else "", due_date) + else: + list_milestones() + + elif action == "start" and len(args) > 1: + start_issue(args[1]) + + elif action == "finish" and len(args) > 1: + finish_issue(args[1], args[2] if len(args) > 2 else None) + + elif action == "get" and len(args) > 1: + get_issue(args[1]) + + elif action == "create" and len(args) > 2: + title, body = args[1], args[2] + milestone_ref = None categories = [] - if len(sys.argv) > 4: - arg4 = sys.argv[4] - if arg4.isdigit(): - milestone_id = arg4 - categories = sys.argv[5:] if len(sys.argv) > 5 else [] + + if len(args) > 3: + arg3 = args[3] + if any(arg3.startswith(prefix) for prefix in ["Status:", "Scope:", "Type:", "Role:"]): + categories = args[3:] else: - categories = sys.argv[4:] - create_issue(title, body, categories, milestone_id) - elif action == "get": - get_issue(sys.argv[2]) \ No newline at end of file + milestone_ref = arg3 + categories = args[4:] + + create_issue(title, body, categories, milestone_ref, due_date, assignees) \ No newline at end of file diff --git a/.roo/scripts/move_card.py.old b/archive/2026.03.09/move_card.py.old similarity index 100% rename from .roo/scripts/move_card.py.old rename to archive/2026.03.09/move_card.py.old diff --git a/.roo/scripts/move_card2.py.old b/archive/2026.03.09/move_card2.py.old similarity index 100% rename from .roo/scripts/move_card2.py.old rename to archive/2026.03.09/move_card2.py.old