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-07 19:55:43 +09:00
co-authored by Claude Opus 5
parent 45cb5cbb6c
commit 4eb0ae660e
2 changed files with 87 additions and 0 deletions
+60
View File
@@ -55,6 +55,7 @@ def _dung(qapp, ViewCls, web=None, path="C:/tmp"):
v.renderer = _Renderer(qapp, web=web, path=path)
v.renderer._view = v
v._workspace_project = None
v.ctx = type("C", (), {"active_project_id": "default"})()
v.resize(800, 600)
v._build_busy_panel()
return v
@@ -199,3 +200,62 @@ def test_doi_project_khi_man_dang_an_thi_khong_bat_panel(qapp, view):
assert v._busy.isHidden() is True
finally:
v.deleteLater()
# ---- đường dẫn quét rỗng thì lấy từ project đang hoạt động ---------------
def test_o_duong_dan_rong_thi_dien_tu_project_dang_chon(qapp, view, monkeypatch, tmp_path):
"""GraphRenderer.auto_scan_and_fit thoát sớm khi ô đường dẫn rỗng, trong khi
nút Scan lại có đường lùi — vào màn không làm gì, bấm Scan thì chạy."""
import cowork_local.core.projects as projects
ws = tmp_path / "ws"
ws.mkdir()
class _P:
project_id = "p1"
def workspace_dir(self, base=None):
return ws
monkeypatch.setattr(projects, "load_project", lambda pid: _P() if pid == "p1" else None)
v = _dung(qapp, view, path="")
v.ctx = type("C", (), {"active_project_id": "p1"})()
v.renderer.path_edit = type("E", (), {
"_t": "",
"text": lambda s: s._t,
"setText": lambda s, t: setattr(s, "_t", t)})()
try:
v._ensure_scan_path()
assert v.renderer.path_edit.text() == str(ws)
finally:
v.deleteLater()
def test_da_co_duong_dan_thi_khong_ghi_de(qapp, view):
v = _dung(qapp, view, path="C:/da-chon")
v.ctx = type("C", (), {"active_project_id": "p1"})()
try:
v._ensure_scan_path()
assert v.renderer.path_edit.text() == "C:/da-chon"
finally:
v.deleteLater()
def test_chua_chon_project_thi_khong_bia_duong_dan(qapp, view):
"""Không lấy cwd() làm đường lùi: 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 = _dung(qapp, view, path="")
v.ctx = type("C", (), {"active_project_id": "default"})()
v.renderer.path_edit = type("E", (), {
"_t": "",
"text": lambda s: s._t,
"setText": lambda s, t: setattr(s, "_t", t)})()
try:
v._ensure_scan_path()
assert v.renderer.path_edit.text() == ""
finally:
v.deleteLater()