From c5559b134dd85b0c2359f3b21afe2d295903665a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E7=B3=AF=20=28Xiaonuo=29?= Date: Thu, 23 Apr 2026 18:29:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(personality):=20switch=20=E6=97=B6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=9B=B4=E6=96=B0=20SOUL.md=EF=BC=8Cappend?= =?UTF-8?q?=20CONVENTIONS.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 切换人格时同时写 SOUL.md = personality prompt + ~/.hermes/CONVENTIONS.md。 清除人格时 SOUL.md 只保留 conventions 内容。 CONVENTIONS.md 由 skills repo sync.sh 维护,集中管理家族共识。 [小糯] --- src/commands/personality.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/commands/personality.ts b/src/commands/personality.ts index bd7999e..a64da35 100644 --- a/src/commands/personality.ts +++ b/src/commands/personality.ts @@ -3,7 +3,10 @@ import { homedir } from "os"; import { join } from "path"; import { parse, stringify } from "yaml"; -const CONFIG_PATH = join(homedir(), ".hermes", "config.yaml"); +const HERMES_HOME = process.env.HERMES_HOME || join(homedir(), ".hermes"); +const CONFIG_PATH = join(HERMES_HOME, "config.yaml"); +const SOUL_PATH = join(HERMES_HOME, "SOUL.md"); +const CONVENTIONS_PATH = join(HERMES_HOME, "CONVENTIONS.md"); interface Config { agent?: { @@ -51,6 +54,21 @@ function getPreview(value: string | PersonalityDict): string { return value.description || (value.system_prompt || "").slice(0, 60) + "..."; } +// --- SOUL.md management --- + +function loadConventions(): string { + if (!existsSync(CONVENTIONS_PATH)) return ""; + return readFileSync(CONVENTIONS_PATH, "utf-8").trim(); +} + +function writeSoulMd(personalityPrompt: string) { + const conventions = loadConventions(); + const parts = [personalityPrompt]; + if (conventions) parts.push(conventions); + const content = parts.filter(Boolean).join("\n\n"); + writeFileSync(SOUL_PATH, content + "\n", "utf-8"); +} + // --- Actions --- function list() { @@ -126,7 +144,9 @@ function switchLocal(name: string) { if (!config.agent) config.agent = {}; config.agent.system_prompt = ""; saveConfig(config); + writeSoulMd(""); console.log("Personality cleared."); + if (existsSync(CONVENTIONS_PATH)) console.log("SOUL.md updated (conventions only)."); return; } @@ -140,7 +160,9 @@ function switchLocal(name: string) { if (!config.agent) config.agent = {}; config.agent.system_prompt = prompt; saveConfig(config); + writeSoulMd(prompt); console.log(`Switched to: ${name}`); + console.log("SOUL.md updated."); } async function switchTelegram(name: string) {