import sqlite3 import json from pathlib import Path DB_PATH = Path("/home/ai-projects/services/study.qpid.pro/data/notes.db") TARGET_MD = Path("/home/ai-projects/services/study.qpid.pro/data/USER_REPORTS.md") MEMORY_MD = Path("/home/ai-projects/memory/USER_REPORTS.md") def sync(): if not DB_PATH.exists(): print("Database not found") return conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row rows = conn.execute(""" SELECT f.id, f.category, f.message, f.context_url, f.context_data_json, f.status, f.created_at, f.updated_at, u.username FROM feedback_reports f JOIN users u ON f.user_id = u.id ORDER BY f.id DESC """).fetchall() lines = [ "# 📋 Пользовательские репорты & Запросы на доработку (study.qpid.pro)", "", "> 🔄 Данный файл автоматически синхронизируется с виджетом обратной связи на сайте.", "> AI-ассистент (Antigravity) считывает этот файл для анализа найденных багов и планирования задач.", "", f"**Всего репортов:** {len(rows)} | **Последняя синхронизация:** сейчас", "", "## 🔴 Активные репорты (Требуют внимания / В работе)", "", ] active_rows = [r for r in rows if r["status"] in ("new", "in_progress")] resolved_rows = [r for r in rows if r["status"] in ("resolved", "closed")] if not active_rows: lines.append("🎉 *Активных багов или задач нет! Все известные репорты закрыты.*") lines.append("") else: for r in active_rows: cat_emoji = "🐛 БАГ" if r["category"] == "bug" else ("💡 ФИЧА" if r["category"] == "feature" else "📝 ЗАМЕТКА") status_icon = "🆕 Новый" if r["status"] == "new" else "⏳ В работе" ctx_extra = "" if r["context_data_json"]: try: c_dict = json.loads(r["context_data_json"]) parts = [] if "screen" in c_dict: parts.append(f"Экран: {c_dict['screen']}") if "device" in c_dict: parts.append(f"Устройство: {c_dict['device']}") if parts: ctx_extra = f" ({', '.join(parts)})" except Exception: pass lines.append(f"### #{r['id']} [{cat_emoji}] — {status_icon} (`{r['created_at']}`)") lines.append(f"- **Пользователь**: `{r['username']}`") if r["context_url"]: lines.append(f"- **Раздел/Страница**: `{r['context_url']}`{ctx_extra}") lines.append(f"- **Текст**:\n> {r['message'].strip()}") lines.append("") lines.extend([ "---", "", "## ✅ Решенные / Закрытые задачи", "", ]) if not resolved_rows: lines.append("*Пока нет закрытых репортов.*") lines.append("") else: for r in resolved_rows: cat_emoji = "🐛" if r["category"] == "bug" else ("💡" if r["category"] == "feature" else "📝") lines.append(f"- [x] **#{r['id']} {cat_emoji} ({r['created_at']})**: {r['message'].strip()} *(Страница: {r['context_url'] or 'общая'})*") lines.append("") content = "\n".join(lines) TARGET_MD.write_text(content, encoding="utf-8") MEMORY_MD.write_text(content, encoding="utf-8") print(f"Synced {len(rows)} reports successfully!") if __name__ == "__main__": sync()