From 7ba0de7dc75ec9b09bb662d59068b1ed6dbdc0a7 Mon Sep 17 00:00:00 2001
From: ai_xiaopei <xiaopei@aisim.cn>
Date: Fri, 21 Aug 2026 20:11:20 +0800
Subject: [PATCH] fix(llm): getDefaultConfig 默认路径经 expandPath 展开(修复无配置文件时在 cwd 下创建字面 ~ 目录)

---
 internal/llm/client_test.go |   43 +++++++++++++++++++++++++++++++++++++++++++
 internal/llm/client.go      |    5 +++--
 2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/internal/llm/client.go b/internal/llm/client.go
index 883cc63..d48961f 100644
--- a/internal/llm/client.go
+++ b/internal/llm/client.go
@@ -124,8 +124,9 @@
 	config.LLM.Primary.Temperature = 0.3
 	config.LLM.Primary.MaxTokens = 2000
 	config.LLM.Primary.DisableThinking = true
-	config.KnowledgeBase.VaultPath = "~/aisim/note/001/笔记001"
-	config.KnowledgeBase.DBPath = "~/.cache/kb-cli/kb.db"
+	// 默认路径同样经过 expandPath 展开,与成功加载分支保持一致
+	config.KnowledgeBase.VaultPath = expandPath("~/aisim/note/001/笔记001")
+	config.KnowledgeBase.DBPath = expandPath("~/.cache/kb-cli/kb.db")
 	config.Draft.ReviewDir = "待审阅"
 	config.Draft.DefaultType = "售后"
 	return config
diff --git a/internal/llm/client_test.go b/internal/llm/client_test.go
new file mode 100644
index 0000000..8c8d684
--- /dev/null
+++ b/internal/llm/client_test.go
@@ -0,0 +1,43 @@
+package llm
+
+import (
+	"os"
+	"path/filepath"
+	"strings"
+	"testing"
+)
+
+// TestLoadConfigDefaultExpandsTilde 验证无配置文件时(走 getDefaultConfig 分支)
+// 返回的路径已经过 expandPath 展开,不含未展开的 ~
+func TestLoadConfigDefaultExpandsTilde(t *testing.T) {
+	home := t.TempDir()
+	t.Setenv("HOME", home)
+
+	// 确保该 HOME 下没有 .kb-cli/config.yaml
+	if _, err := os.Stat(filepath.Join(home, ".kb-cli", "config.yaml")); !os.IsNotExist(err) {
+		t.Fatalf("测试前置条件不满足: %s 下不应存在 config.yaml", home)
+	}
+
+	cfg := LoadConfig()
+
+	homedir, _ := os.UserHomeDir()
+	for name, p := range map[string]string{
+		"VaultPath": cfg.KnowledgeBase.VaultPath,
+		"DBPath":    cfg.KnowledgeBase.DBPath,
+	} {
+		if strings.HasPrefix(p, "~/") {
+			t.Errorf("%s 含未展开的 ~: %q", name, p)
+		}
+		if !filepath.IsAbs(p) {
+			t.Errorf("%s 不是绝对路径: %q", name, p)
+		}
+	}
+	// APIBase 是 URL,仅要求不含未展开的 ~
+	if strings.Contains(cfg.LLM.Primary.APIBase, "~/") {
+		t.Errorf("APIBase 含未展开的 ~: %q", cfg.LLM.Primary.APIBase)
+	}
+
+	if want := filepath.Join(homedir, ".cache", "kb-cli", "kb.db"); cfg.KnowledgeBase.DBPath != want {
+		t.Errorf("DBPath = %q, want %q", cfg.KnowledgeBase.DBPath, want)
+	}
+}

--
Gitblit v1.10.0