feat(infra): R02 vào thật — app chạy bằng JsonConfigRepository, khoá rời khỏi config.json
Từ 21/08 tôi đã viết xong 7 file R02 với 46 test xanh, và báo là "xong R02". Báo sai: code mới nằm song song, KHÔNG một dòng nào ngoài infrastructure/ và tests/ gọi tới nó. App vẫn chạy nguyên trên config.py, 29 file dùng nó, và khoá API của người dùng vẫn nằm plaintext trong config.json suốt 4 ngày. Commit này mới là phần refactor thật. Bù 21 thành viên còn thiếu (85 dòng) ------------------------------------ JsonConfigRepository có 18/34 thành viên công khai của AppConfig nên không tráo được. Chép nguyên ngữ nghĩa 21 cái còn lại: load, ms365_*, ext_connectors, connect_external, routing_mode_for, seeded_*, mcp_servers, teams, history, structure, monitoring_visibility, model_label, ca_bundle... Giờ 40/34, không thiếu gì. Không phải thiết kế mới — chừng nào 29 file còn gọi qua ctx.config thì repository phải trả lời được đúng các câu hỏi cũ. ROUTING_MODES lấy theo bản Delta (4 chế độ, có "fallback" từ R03-T03) chứ không theo bản main cũ 3 chế độ. Chép bản cũ là routing "fallback" âm thầm rơi về "off" sau khi Delta merge, không lỗi nào báo. Composition Root (R08-T10, phần đầu) ------------------------------------- presentation/shell/bootstrap.py: một chỗ duy nhất quyết định app dựng bằng mảnh nào. app.py::run giờ gọi build_context() thay cho AppConfig.load(). Đây cũng là chỗ ráp kho bí mật vào; máy không có keyring thì secrets=None và mọi thứ chạy như cũ. Kiểm trên dữ liệu thật ---------------------- Chạy lên máy tôi, migration tự chạy đúng như thiết kế: openai_compat 39 ký tự config.json -> Windows Credential Manager ollama giá trị bù nhìn, để nguyên trong file, không đẩy vào kho schema_version 1 -> 2 sao lưu config.json.v20260825-193206.bak Sau khi bật lại app và để nó ghi cấu hình, config.json vẫn sạch: api_key rỗng, không còn chuỗi nào có hình dạng khoá. scripts/audit_security.py sạch. Tiêu chí nghiệm thu A của plan (dòng 244) — "0 lưu trữ plaintext API Key trong JSON" — tới commit này mới thật sự đạt. 632 test xanh. check_dialogs, check_nav, check_design_parity đều qua. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
e4ce9b2f5f
commit
2246d55286
@@ -19,6 +19,7 @@ from PySide6.QtWidgets import (
|
||||
from . import APP_NAME, DISPLAY_NAME, __version__
|
||||
from .config import PROVIDER_LABELS, AppConfig
|
||||
from .i18n import LANGUAGE_SHORT, LANGUAGES, get_language, on_language_changed, set_language, tr
|
||||
from .presentation.shell.bootstrap import build_context
|
||||
from .state import AppContext
|
||||
from .ui.widgets import tidy_popup
|
||||
from .theme import current_palette, set_active_theme, stylesheet
|
||||
@@ -1293,7 +1294,10 @@ def run(argv: List[str] | None = None) -> int:
|
||||
app = QApplication.instance() or QApplication(argv)
|
||||
app.setApplicationName(APP_NAME)
|
||||
app.setWindowIcon(app_icon())
|
||||
ctx = AppContext(AppConfig.load())
|
||||
# Composition Root: presentation/shell/bootstrap.py quyết định app chạy
|
||||
# bằng mảnh nào. Từ R02, đó là JsonConfigRepository + kho bí mật của hệ
|
||||
# điều hành, không còn config.py::AppConfig.
|
||||
ctx = build_context()
|
||||
set_language(ctx.config.language)
|
||||
# Built-in default skills (if any are bundled) are always-on and loaded
|
||||
# straight from the package; tidy away any copy seeded by older versions so they
|
||||
|
||||
Reference in New Issue
Block a user