fix(graph): vào màn GraphRAG tự điền đường dẫn quét từ project đang chọn

GraphRenderer.auto_scan_and_fit() thoát sớm khi ô đường dẫn rỗng, trong khi
chính nút Scan lại có đường lùi (path_edit.text() or Path.cwd()). Bất đối xứng
đó nghĩa là vào màn thì không làm gì, bấm Scan thì chạy.

Cố ý KHÔNG lấy cwd() làm đường lùi như nút Scan — quét thư mục làm việc của
tiến trình là quét một cây không liên quan gì tới project và có thể rất lớn.
Điền từ project đang hoạt động, không có project thì vẫn không quét.

LƯU Ý: chưa tái hiện được ca "lần đầu khởi động không tự nạp" mà người dùng báo.
Probe với project và thư mục thật cho thấy cả hai đường (gọi thẳng
auto_scan_and_fit và bấm GraphRAG trên thanh menu) đều khởi động lượt quét. Đây
là bất đối xứng duy nhất tìm được; cần biết ô đường dẫn và combo project đang
hiện gì lúc lỗi xảy ra để đi tiếp.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-10 01:34:37 +09:00
committed by thanhnv
co-authored by Claude Opus 5
parent 8423bfc9a8
commit fd53c1cb42
2 changed files with 87 additions and 0 deletions
@@ -105,6 +105,32 @@ class StructureGraphView(QWidget):
# sau — nên panel phải bật theo, không thì lượt quét đó lại im lặng.
self.renderer.project_changed.connect(self._on_project_scan_started)
def _ensure_scan_path(self) -> None:
"""Điền ô đường dẫn từ project đang hoạt động nếu nó đang rỗng.
``GraphRenderer.auto_scan_and_fit`` thoát sớm khi ô đường dẫn rỗng,
trong khi chính nút Scan lại có đường lùi (``path_edit.text() or
Path.cwd()``). Bất đối xứng đó nghĩa là: vào màn thì không làm gì, bấm
Scan thì chạy — đúng thứ người dùng phàn nàn.
Điền từ project đang chọn chứ KHÔNG lấy ``cwd()`` làm đường lùi như nút
Scan: quét thư mục làm việc của tiến trình là quét một cây không liên
quan gì tới project, và nó có thể rất lớn.
"""
if self.renderer.path_edit.text().strip():
return
ctx = getattr(self, "ctx", None)
pid = (getattr(ctx, "active_project_id", "") or "").strip()
if not pid or pid == "default":
return
try:
from ...core.projects import load_project
project = load_project(pid)
except Exception: # noqa: BLE001
return
if project is not None:
self.renderer.path_edit.setText(str(project.workspace_dir()))
def _on_project_scan_started(self) -> None:
"""Renderer vừa đổi project. Nó chỉ quét ngay khi màn này đang mở."""
if self.renderer.isVisible():
@@ -156,6 +182,7 @@ class StructureGraphView(QWidget):
``graph_rendered`` phát — bao trọn cả lượt quét chạy ở luồng nền phía
sau, chứ không tắt ngay khi hàm này trả về.
"""
self._ensure_scan_path()
da_dung_khung = self.renderer.web is not None
self._show_busy("structure.scanning" if da_dung_khung else "structure.loading_view")
try: