feat(reports): stabilize on-demand generation, live presence and 1C fallback
This commit is contained in:
@@ -2,81 +2,89 @@
|
||||
"""
|
||||
===============================================================================
|
||||
FILE: scripts/diagnostics/make_web_snapshot.py
|
||||
ROLE: Генерация актуального слепка Web API, фронтенда (HTML/JS) и LLM-движка.
|
||||
ROLE: Динамическая автоматическая генерация слепка Web API, фронтенда и LLM.
|
||||
Исключает временный кэш, авто-обнаруживает новые модули sidebar и роутеры.
|
||||
===============================================================================
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
|
||||
WEB_API_DIR = os.path.join(ROOT_DIR, "modules", "web_api")
|
||||
OUTPUT_FILE = os.path.join(ROOT_DIR, "web_api_code_snapshot.md")
|
||||
|
||||
WEB_TARGET_FILES = [
|
||||
# Главная точка входа и роутеры
|
||||
"modules/web_api/main.py",
|
||||
"modules/web_api/routers/chat.py",
|
||||
"modules/web_api/routers/remote_workers.py",
|
||||
"modules/web_api/routers/manual_absences.py",
|
||||
"modules/web_api/routers/exceptions.py",
|
||||
"modules/web_api/routers/snapshots.py",
|
||||
"modules/web_api/routers/tasks.py",
|
||||
"modules/web_api/routers/auth.py",
|
||||
"modules/web_api/routers/admin.py",
|
||||
"modules/web_api/routers/files.py",
|
||||
"modules/web_api/routers/context.py",
|
||||
ALLOWED_EXTENSIONS = {
|
||||
".py": "py",
|
||||
".js": "js",
|
||||
".html": "html",
|
||||
".css": "css",
|
||||
".json": "json"
|
||||
}
|
||||
|
||||
# LLM ядро
|
||||
"modules/web_api/llm/agent.py",
|
||||
"modules/web_api/llm/schemas.py",
|
||||
"modules/web_api/llm/db_tools.py",
|
||||
"modules/web_api/llm/core/fast_path.py",
|
||||
"modules/web_api/llm/core/context_manager.py",
|
||||
"modules/web_api/llm/core/ollama_client.py",
|
||||
"modules/web_api/llm/core/tool_injector.py",
|
||||
IGNORE_DIRS = {
|
||||
"__pycache__", ".git", "venv", ".venv", "uploads", "logs",
|
||||
"node_modules", ".idea", ".vscode"
|
||||
}
|
||||
|
||||
# Фронтенд (Разметка и клиентские скрипты)
|
||||
"modules/web_api/static/index.html",
|
||||
"modules/web_api/static/js/sidebar.js",
|
||||
"modules/web_api/static/js/tasks.js",
|
||||
"modules/web_api/static/js/manual_absences.js",
|
||||
"modules/web_api/static/js/chat/core.js",
|
||||
"modules/web_api/static/js/chat/task_widget.js",
|
||||
"modules/web_api/static/js/auth.js",
|
||||
"modules/web_api/static/js/app.js"
|
||||
]
|
||||
IGNORE_FILES = {
|
||||
"web_api_code_snapshot.md",
|
||||
"favicon.ico"
|
||||
}
|
||||
|
||||
|
||||
def collect_web_files():
|
||||
"""Рекурсивно собирает все исходники web_api без необходимости хардкода."""
|
||||
target_files = []
|
||||
|
||||
if not os.path.exists(WEB_API_DIR):
|
||||
print(f"[❌] Директория не найдена: {WEB_API_DIR}")
|
||||
return []
|
||||
|
||||
for root, dirs, files in os.walk(WEB_API_DIR):
|
||||
# Исключаем служебные папки
|
||||
dirs[:] = [d for d in dirs if d not in IGNORE_DIRS and not d.startswith(".")]
|
||||
|
||||
for file in sorted(files):
|
||||
if file in IGNORE_FILES or file.startswith("."):
|
||||
continue
|
||||
|
||||
_, ext = os.path.splitext(file)
|
||||
if ext.lower() in ALLOWED_EXTENSIONS:
|
||||
full_path = os.path.join(root, file)
|
||||
|
||||
# Пропускаем пустые __init__.py (0 байт)
|
||||
if file == "__init__.py" and os.path.getsize(full_path) == 0:
|
||||
continue
|
||||
|
||||
rel_path = os.path.relpath(full_path, ROOT_DIR)
|
||||
target_files.append(rel_path)
|
||||
|
||||
return sorted(target_files)
|
||||
|
||||
|
||||
def create_web_snapshot():
|
||||
content = ["# 🌐 WEB API & FRONTEND CODE SNAPSHOT\n"]
|
||||
files_to_pack = collect_web_files()
|
||||
content = ["# 🌐 WEB API & FRONTEND CODE SNAPSHOT (AUTO-DISCOVERY)\n"]
|
||||
included_count = 0
|
||||
|
||||
for rel_path in WEB_TARGET_FILES:
|
||||
for rel_path in files_to_pack:
|
||||
full_path = os.path.join(ROOT_DIR, rel_path)
|
||||
if os.path.exists(full_path):
|
||||
ext = os.path.splitext(rel_path)[1].replace(".", "")
|
||||
lang_map = {
|
||||
"js": "js",
|
||||
"py": "py",
|
||||
"html": "html",
|
||||
"css": "css",
|
||||
"json": "json"
|
||||
}
|
||||
lang = lang_map.get(ext, "text")
|
||||
try:
|
||||
with open(full_path, "r", encoding="utf-8") as f:
|
||||
file_text = f.read()
|
||||
content.append(f"## File: `./{rel_path}`\n```{lang}\n{file_text}\n```\n")
|
||||
included_count += 1
|
||||
except Exception as e:
|
||||
print(f"[⚠️] Ошибка чтения {rel_path}: {e}")
|
||||
else:
|
||||
print(f"[ℹ️] Пропущен отсутствующий файл: {rel_path}")
|
||||
ext = os.path.splitext(rel_path)[1].lower()
|
||||
lang = ALLOWED_EXTENSIONS.get(ext, "text")
|
||||
|
||||
try:
|
||||
with open(full_path, "r", encoding="utf-8") as f:
|
||||
file_text = f.read()
|
||||
content.append(f"## File: `./{rel_path}`\n```{lang}\n{file_text}\n```\n")
|
||||
included_count += 1
|
||||
except Exception as e:
|
||||
print(f"[⚠️] Ошибка чтения {rel_path}: {e}")
|
||||
|
||||
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
|
||||
f.write("\n".join(content))
|
||||
|
||||
size_kb = os.path.getsize(OUTPUT_FILE) / 1024
|
||||
print(f"\n[✓] Web API + Фронтенд слепок создан: {OUTPUT_FILE}")
|
||||
print(f"\n[✓] Web API + Фронтенд слепок успешно создан: {OUTPUT_FILE}")
|
||||
print(f" Включено файлов: {included_count} | Размер: {size_kb:.1f} KB\n")
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user