dsh-memory-palace 1.8.1 → 1.8.3-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -121,6 +121,11 @@ dsh plugin --profile web remove dsh-memory-palace
121
121
 
122
122
  ## 版本历史
123
123
 
124
+ - **1.8.3**
125
+ - **1.8.3-alpha.1**
126
+ - 💪调整内置system prompt
127
+ - **1.8.2**
128
+ - 💪内置prompt剪枝优化
124
129
  - **1.8.1**
125
130
  - 更改插件兼容性定义为 engines.dsh
126
131
  - npm publish v1.8.1
@@ -40,7 +40,7 @@ export function REORG_COMMAND_PROMPT({ budget, memFile, logDirs } = {}) {
40
40
  "【约束】\n" +
41
41
  "1. 保持 `## 章节` + `- 条目` 格式;**绝不丢失仍然有效的关键信息**(硬约束、明确禁止项、前提、决策及其理由、可复用入口、已验证的坑)。\n" +
42
42
  "2. 预算 " + budgetText + " 是**健康参考线**,尽量贴近即可——**严禁为达标删除仍有效的信息**。\n" +
43
- "3. **只依据**现有 MEMORY.md 与工作日志:**不得新增**原记忆中没有的章节或结论;日志只用于核对与补全遗漏的必要事实,**不得把已被推翻 / 已过时的历史结论重新引入**。\n" +
43
+ "3. **只依据**现有 MEMORY.md 与工作日志:**不得新增**原记忆中没有的章节或结论,**归并时默认并入已有章节,新建章节须先证明语义最近的 2 个章节装不下**;同一主题散落多章时**先并为一章再补写**;日志只用于核对与补全遗漏的必要事实,**不得把已被推翻 / 已过时的历史结论重新引入**。\n" +
44
44
  "4. 条目形状:一条一事、结论先行、简明(需要展开就拆 `- 父项` + 缩进子项);禁源码坐标(`文件:行号`)、禁一次性过程(报错全文 / 命令输出 / 临时 URL)。\n" +
45
45
  "5. 只操作**项目级** MEMORY.md;用户级 MEMORY.md 禁止改动。\n" +
46
46
  "\n" +
@@ -1,4 +1,4 @@
1
- // memory-palace hybrid 模式提示词:注入段二(HYBRID_PROACTIVE)+ 记忆子 agent
1
+ // memory-palace hybrid 模式提示词:注入 [写入分工] 块(HYBRID_PROACTIVE)+ 记忆子 agent
2
2
  // system prompt(SUBAGENT_SYSTEM)。纯常量,无状态。
3
3
  //
4
4
  // 定案锚点:
@@ -7,13 +7,24 @@
7
7
  // - 项目级全量重整双门禁(超预算 + 冷却 ≥7 天,机器校验),用户级禁止重整;
8
8
  // - 操作规范写在工具 description(定案 #11),本文件只做方向性引导,不堆格式细节。
9
9
 
10
- // hybrid 模式注入 system prompt 的段二(替换 plugin 的记忆公民指令 / smart 的"无需主动"说明)。
10
+ // hybrid 模式注入 system prompt 的【写入分工】段(与 index.mjs 的 [记忆文件] / [读取] / [边界] 并列,
11
+ // 由 index.mjs 按序以空行拼接——故本常量不以空行开头)。
11
12
  export const HYBRID_PROACTIVE =
12
- "\n\n[记忆说明] 分工如下:\n" +
13
- "① 每轮结束由记忆子代理自动提炼摘要写入今日工作日志(含去重:重复/过时条目会以删除线标记),你无需调用工具记录过程性信息,也无需复述日志内容。\n" +
14
- "② 长期记忆 MEMORY.md(项目级与用户级)由你主动维护,但**只在「下一个会话不做这条就会做错 / 返工 / 重踩坑」时才写**——记关键决策、踩坑修复、用户偏好等 durable 结论,不记过程流水。写前自检:这条是不是在解释「代码怎么实现」?去掉行号 / 报错全文 / 临时链接后还立得住吗?写前先查重(同一事实只留一处),**优先用 memory_update_section 合并 / 改写已有条目,其次才用 memory_write 追加**(章节不存在会自动新建);一次只记一个事实;过时内容整章节精确替换或标删,绝不手写覆盖记忆文件。\n" +
15
- "③ 项目级 MEMORY.md 仅在「超出注入预算 且 距上次重整 ≥ 重整冷却期」两条件同时满足时,才可调用 memory_reorganize 全量重整;重整**只允许落盘一次**,重整前必须用**文件读取工具直接读**项目 MEMORY.md 与 `memory/` 目录下的历史日志(`YYYY-MM-DD.md`,含更早日期)对照——重整流程中 memory_read 被禁用,它只覆盖近三天、读不到更早的日志;切勿丢失关键信息。门禁不满足时**不要反复尝试重整**:未超预算 → 用 memory_update_section 做日常章节维护;冷却期内(本项目刚重整过)→ **停止并如实报告**,不得改用其它工具继续删改凑数。\n" +
16
- "④ 用户级 MEMORY.md 禁止全量重整,只允许增量写入与整章节精确替换。";
13
+ "[写入分工]\n" +
14
+ "- 日志不归你:每轮结束由记忆子代理自动提炼摘要写入今日工作日志(含去重:重复 / 过时条目会以删除线标记);你无需调用工具记录过程性信息,也无需复述日志内容。\n" +
15
+ "- 归属:长期记忆 MEMORY.md(项目级与用户级)由你主动维护。\n" +
16
+ "- 写 MEMORY.md 的时机:\n" +
17
+ " - 必写:用户明确要求「记住」某事——按归属选层级(跨项目 → 用户级;本项目 → 项目级)。\n" +
18
+ " - 才写:其余情况**只在「下一个会话不做这条就会做错 / 返工 / 重踩坑」时才写**,典型是**用户当场声明的项目约定 / 偏好**、关键决策、踩坑修复等 durable 结论。\n" +
19
+ " - 不写:过程流水**或一次性临时状态**。\n" +
20
+ "- 写前自检:这条是不是在解释「代码怎么实现」?去掉行号 / 报错全文 / 临时链接后还立得住吗?\n" +
21
+ "- 已有记忆归类:**强化(只是佐证已有条目)→ 不写或并入原句;修正 / 推翻(已有条目失效)→ 整章节精确替换或标删——仅叙述旧→新转变过程、而 MEMORY.md 已含新结论的,算强化;补充(已有体系内的新维度)→ 追加;三类都不属 → 不写就是正确的沉淀,不要为留痕而写。**\n" +
22
+ "- 怎么写:**优先用 memory_update_section 合并 / 改写已有条目,其次才用 memory_write 追加**(章节不存在会自动新建);一次只记一个事实;绝不手写覆盖记忆文件。\n" +
23
+ "- 全量重整:项目级 MEMORY.md 仅在「超出注入预算 且 距上次重整 ≥ 重整冷却期」两条件同时满足时,才可调用 memory_reorganize 全量重整;重整**只允许落盘一次**。\n" +
24
+ "- 重整取材:重整前必须用**文件读取工具直接读**项目 MEMORY.md 与 `memory/` 目录下的历史日志(`YYYY-MM-DD.md`,含更早日期)对照——重整流程中 memory_read 被禁用,它只覆盖近三天、读不到更早的日志;切勿丢失关键信息。\n" +
25
+ "- 门禁不过:**不要反复尝试重整**——未超预算 → 用 memory_update_section 做日常章节维护;冷却期内(本项目刚重整过)→ **停止并如实报告**,不得改用其它工具继续删改凑数。\n" +
26
+ "- 用户级:MEMORY.md 禁止全量重整,只允许增量写入与整章节精确替换。\n" +
27
+ "- 密级:不写密钥、token、密码、个人身份信息;除非用户明确要求,否则不记录任何凭据。确需记录时只写「在哪个配置项 / 文件读取」。"
17
28
 
18
29
  // 记忆子 agent system prompt(turn/end 触发,判定 + 产出一体)。
19
30
  // {date} 注入今日日期;回喂正文见 subagent.mjs 的首轮 user 消息。
@@ -25,7 +36,7 @@ export function SUBAGENT_SYSTEM() {
25
36
  "你是记忆子代理,负责把本轮对话沉淀进【今日工作日志】(Markdown 文件,按 `## 章节` + `- 条目` 组织)。\n" +
26
37
  "\n" +
27
38
  "【判定(第一优先)】先判断本轮对话是否包含值得写入日志的实质内容:完成了任务、修了 bug、做了决策、得出结论、用户表达了偏好或约束。\n" +
28
- "- 无重点(闲聊、寒暄、一句话问答、无任何可沉淀信息):直接输出一行纯文本说明,不调用任何工具,立即结束。\n" +
39
+ "- 无重点(闲聊、寒暄、一句话问答),或本轮结论已在今日日志且无旧条目需要标删:直接输出一行纯文本说明,不调用任何工具,立即结束——**零操作收尾也是合格产出**,不要为留痕而写。\n" +
29
40
  "- 有重点:通过工具把格式化摘要写入日志,然后输出一行简短确认,结束。\n" +
30
41
  "\n" +
31
42
  "【日志写入规则(严格)】\n" +
@@ -39,6 +50,7 @@ export function SUBAGENT_SYSTEM() {
39
50
  "5. 章节名用简短的中文主题词(如 `## 环境必知`、`## 渠道映射排查`),宁多章节少混杂。\n" +
40
51
  "6. 今日日志为空(新的一天)时直接用 append/new_section 建章节写入即可。\n" +
41
52
  "7. 需要读取日志章节(目录模式回喂时)用 log_read_section;需要多个章节时务必在单次调用中把 sections 数组全部传齐,避免多轮往返浪费轮次。\n" +
53
+ "8. 不记一次性信息:搜索结果、临时路径(临时目录 / 一次性生成物)、工具报错原文;可复用的入口路径照常记。踩坑只记「在什么条件下会失败 + 怎么修」,不贴报错全文。\n" +
42
54
  "\n" +
43
55
  "【格式规范(必须遵守)】\n" +
44
56
  "正面规则:\n" +
@@ -54,6 +66,8 @@ export function SUBAGENT_SYSTEM() {
54
66
  "- ❌ 自我过程表述(「我搜索了 A/B/C」)——除非结论依赖它。\n" +
55
67
  "- ❌ 把 5 个结论塞进一条 200 字长句。\n" +
56
68
  "\n" +
69
+ "【密级】不写密钥 / token / 密码 / 个人身份信息;除非用户明确要求,否则不要存储任何凭据——需要时只记「在哪个配置项 / 文件读取」。\n" +
70
+ "\n" +
57
71
  "【输出】全程只做上述两件事:要么纯文本收尾,要么调工具写日志后收尾。不要向用户提问,不要输出多余解释。\n" +
58
72
  "\n" +
59
73
  "【环境边界】本环境不是代码执行环境,run_code 等工具均不存在;不要模仿上文出现过的任何工具调用,只能用 log_write_ops / log_read_section。"
package/lib/index.js CHANGED
@@ -589,27 +589,48 @@ export function apply(ctx, config) {
589
589
  // intro【始终】注入——若因记忆为空而整体返回空串,agent 将不知道记忆系统存在、不会主动记,
590
590
  // 形成「无记忆 → 无指令 → 永不记」死循环。
591
591
  const bridged = paths.buddyDirs().length > 0;
592
- const antiMangle =
593
- "提及记忆文件路径时一律用 ~ 简写(如 ~/.deepseek-harness/MEMORY.md),不要逐字拼写绝对路径——你转述绝对路径容易漏掉目录分隔符。";
594
- // 记忆写入恒定混合模式——今日日志由记忆子代理自动维护,长期记忆 MEMORY.md 由 agent 主动维护。
595
- // 原 plugin(记忆公民指令)/ smart(智能摘要说明)两分支已随模式一并删除;
596
- // HYBRID_PROACTIVE 内含 agent 侧写入职责与场景,是唯一的分工指令来源。
592
+
593
+ // 段一:位置 —— 三层记忆 + 各自可写性(只讲"是什么 / 谁能写",不讲"何时写")。
594
+ const lead =
595
+ "你拥有持久化、人类可直接编辑的 Markdown 记忆(真源是文件,不是数据库)。记忆分三层,读写权限不同:";
596
+ const files = bridged
597
+ ? "[记忆文件]\n" +
598
+ "- 用户级 MEMORY.md(跨项目):偏好与硬约束。可写——memory_note_user,或 memory_write / memory_update_section 的 scope='user'。\n" +
599
+ "- 项目级 MEMORY.md(本项目):约定、决策、踩坑。可写——memory_note,或 memory_write / memory_update_section 的 scope='project'。\n" +
600
+ "- 每日日志 memory/YYYY-MM-DD.md:记忆子代理每轮自动维护。你只读——不写、不改文件头、不重排。\n" +
601
+ "当前项目已存在 WorkBuddy/CodeBuddy 记忆目录,本插件直接读写这些目录(不再单独创建 .deepseek-harness/memory/)。"
602
+ : "[记忆文件]\n" +
603
+ "- 用户级 ~/.deepseek-harness/MEMORY.md(跨项目):偏好与硬约束。可写——memory_note_user,或 memory_write / memory_update_section 的 scope='user'。\n" +
604
+ "- 项目级 .deepseek-harness/MEMORY.md(项目根下):约定、决策、踩坑。可写——memory_note,或 memory_write / memory_update_section 的 scope='project'。\n" +
605
+ "- 每日日志 .deepseek-harness/memory/YYYY-MM-DD.md(项目根下):记忆子代理每轮自动维护。你只读——不写、不改文件头、不重排。";
606
+
607
+ // 段二:读取 —— 与 [记忆文件] 同一套「标签:内容」行语法(每行都能竖着扫)。
608
+ // ⚠ 重构只改排版,不动语义:工具名、条件、分支、举例必须逐字保留。
609
+ const read =
610
+ "[读取]\n" +
611
+ "- 快照:上下文里的记忆是**会话起始快照**,不随记忆文件之后的更新刷新。\n" +
612
+ "- 必须重读:需要**当前**磁盘状态时**必须** memory_read 重读(改记忆前、据记忆作答前、用户问「现在 / 最新」时)。\n" +
613
+ "- 不必重读:上下文里已有、且不涉时效的,不必再读——不要为「确认一下」重复调用。\n" +
614
+ "- 取日志:scope 默认 'memory' = 用户级 + 项目级 MEMORY.md;要日志才显式传 'today' / 'daily' / 'all'。\n" +
615
+ "- 禁止:手动 glob/read 记忆文件;看不到的内容不要编造。";
616
+
617
+ // 段三:写入分工(HYBRID_PROACTIVE,恒定混合模式——日志归子代理、MEMORY.md 归 agent)。
618
+ // 原 plugin(记忆公民指令)/ smart(智能摘要说明)两分支已随模式一并删除。
597
619
  const proactive = HYBRID_PROACTIVE;
598
- const intro = bridged
599
- ? "你拥有持久化、人类可直接编辑的 Markdown 记忆文件。当前项目已存在 WorkBuddy/CodeBuddy 项目记忆目录,本插件直接读写这些目录(不再单独创建 .deepseek-harness/memory/)。" +
600
- "写入记忆:项目级约定用 memory_note 工具,跨项目个人偏好用 memory_note_user 工具;读取记忆用 memory_read 工具,scope 默认 'memory'(用户级 + 项目级 MEMORY.md),需要今日/历史日志时显式传 scope:'daily' 或 'all'(不要手动 glob/read 记忆文件)。用它保持跨 session 一致性;看不到的内容不要编造。" +
601
- "注意:上下文中的记忆是**会话起始快照**,不随记忆文件之后的更新自动刷新;需要以当前状态为依据时(改记忆前、或据记忆作答前)用 memory_read 重读。" +
602
- antiMangle + proactive
603
- : "你拥有持久化、人类可直接编辑的 Markdown 记忆文件(位于 ~/.deepseek-harness/MEMORY.md,以及各项目的 .deepseek-harness/MEMORY.md(长期记忆)与 .deepseek-harness/memory/(每日日志))。" +
604
- "写入记忆:项目级约定用 memory_note 工具,跨项目个人偏好用 memory_note_user 工具;读取记忆用 memory_read 工具,scope 默认 'memory'(用户级 + 项目级 MEMORY.md),需要今日/历史日志时显式传 scope:'daily' 或 'all'(不要手动 glob/read 记忆文件)。用它保持跨 session 一致性;看不到的内容不要编造。" +
605
- "注意:上下文中的记忆是**会话起始快照**,不随记忆文件之后的更新自动刷新;需要以当前状态为依据时(改记忆前、或据记忆作答前)用 memory_read 重读。" +
606
- antiMangle + proactive;
620
+
621
+ // 段四:边界 —— 记忆不替代交付;路径一律 ~ 简写(antiMangle,防转述时漏分隔符)。
622
+ // 同样用「- 」起行,与前三块视觉一致。
623
+ const tail =
624
+ "[边界]\n" +
625
+ "- 记忆是补充,不替代回答与交付:不要把记忆原文直接当答案,也不要用读记忆代替动手核实。\n" +
626
+ "- 提及记忆文件路径时一律用 ~ 简写(如 ~/.deepseek-harness/MEMORY.md),不要逐字拼写绝对路径——你转述绝对路径容易漏掉目录分隔符。";
607
627
  // 计划模式禁写提示(硬编码默认行为,无开关):让 agent 自觉不写(网关物理兜底仍生效)。
608
628
  // 按**会话**判定:plan 模式是会话级状态,别的会话进 plan 不该往本会话 prompt 里塞这条提示。
609
629
  const planNote = planModeOf(state, context?.agent?.session)
610
630
  ? "\n\n[plan 模式] 当前处于 plan 模式,不要调用 memory_note / memory_note_user 写入记忆,也不要请求删除记忆(读取记忆用 memory_read,仍可用)。"
611
631
  : "";
612
- const introFull = intro + planNote;
632
+ // 拼接顺序即 system prompt 实际排布:位置 → 读取 → 写入 → 边界。
633
+ const introFull = [lead, files, read, proactive, tail].join("\n\n") + planNote;
613
634
  // 自定义指令追加在「记忆插件 prompt + 记忆分工 prompt」之后 ——
614
635
  // 拼接顺序即 system prompt 里的实际排布(同一 section 内完成,order 不变)。
615
636
  // 它由用户在设置页配置,内容恒定 → 放 system 零缓存成本,不违反本节的分流原则。
package/lib/tools.mjs CHANGED
@@ -74,7 +74,8 @@ export function registerTools({ ctx, getConfig, paths, state }) {
74
74
  "Save ONE durable PROJECT-LEVEL memory entry to the active workspace's MEMORY.md " +
75
75
  "(the project's .workbuddy/memory, .codebuddy/memory, or .deepseek-harness/MEMORY.md). " +
76
76
  "Write ONLY when the NEXT session would go wrong without it — a lasting preference, convention, " +
77
- "key decision, or root-cause fix. Do NOT log step-by-step work or one-off process (that belongs in the daily log). " +
77
+ "key decision, or root-cause fix — or when the user explicitly asks you to remember it. " +
78
+ "Do NOT log step-by-step work or one-off process (that belongs in the daily log). " +
78
79
  "Format: ONE concise line, conclusion first, objective third-person. " +
79
80
  "CONTENT RULES: no source coordinates (`file.go:123`), no one-off material (error dumps, command output, " +
80
81
  "throwaway URLs); paths = reusable entry points only; URLs = must-reuse base addresses only. " +
@@ -128,7 +129,8 @@ export function registerTools({ ctx, getConfig, paths, state }) {
128
129
  "Save ONE durable USER-LEVEL (cross-project) preference or fact to the user-level MEMORY.md " +
129
130
  `(default ${toHomeShort(expandHome(cfg().userMemoryPath))}). ` +
130
131
  "Write ONLY when the fact applies across ALL projects and the next session would need it — " +
131
- "a personal preference / constraint, or a reusable fact / decision. Not for one-off process. " +
132
+ "a personal preference / constraint, or a reusable fact / decision — or when the user explicitly " +
133
+ "asks you to remember something that is not tied to this project. Not for one-off process. " +
132
134
  "Format: ONE concise line, conclusion first. " +
133
135
  "CONTENT RULES: no source coordinates (`file.go:123`), no one-off material (error dumps, command output, " +
134
136
  "throwaway URLs); paths = reusable entry points only; URLs = must-reuse base addresses only. " +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-memory-palace",
3
- "version": "1.8.1",
3
+ "version": "1.8.3-alpha.1",
4
4
  "description": "把 WorkBuddy 的文件式记忆系统移植进 DeepSeek Harness:用户级 + 工作区的人类可读 Markdown 记忆(~/.deepseek-harness/MEMORY.md 与 <cwd>/.deepseek-harness/memory/)。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",