Repository navigation
Releases: duhuashan/dsh-annals
Release list
v0.5.2
0.5.2
变更
只有版本号变了,代码与 0.5.1 完全一致。
这一版的存在原因是 npm 侧的发布故障,不是功能迭代:
0.5.1 曾用 npm stage publish 提交过(在 2FA 尚未开通、直发被 403 拒绝时的一次尝试)。该 staged 记录占住了 0.5.1 这个版本号,而 registry 的申诉端点是坏的 —— npm stage approve 与 npm stage reject 都返回 404 staged version "..." not found,撤不掉。于是改用 0.5.2 重新发布。
三处字面量同步改了:package.json 的 version、README.md 横幅、README.md 的安装命令示例。
升级
无需任何操作。与 0.5.1 功能相同,从哪个装都一样。
安装
npm(推荐,免构建授权):
dsh plugin --profile web add dsh-annals或从本 Release 的 tgz:
dsh plugin --profile web add https://github.com/duhuashan/dsh-annals/releases/download/v0.5.2/dsh-annals-0.5.2.tgz校验
dsh-annals-0.5.2.tgz 120472 字节,SHA256 fad0f78256bea8220bfab0f18c11ae153e9393fe46b0ca75a62fb4431220f506。
v0.5.1
0.5.1
变更
@deepseek-ai/schemastery 从 dependencies 移到 peerDependencies(同时在 devDependencies 保留一份供本地测试)。
这个包由 DSH 宿主提供(本机宿主实际安装 3.18.5),插件自带一份会形成双份实例。lib/index.js 导出的 Config 是一个 z.object(...) schema,要交给宿主的 cordis loader 做配置校验,两份实例能否互认取决于内部实现细节,属于可能静默失效的一类问题。
升级
无需任何操作。旧版本功能不受影响,本版只是打包方式更干净。
dsh plugin --profile web add https://github.com/duhuashan/dsh-annals/releases/download/v0.5.1/dsh-annals-0.5.1.tgzv0.5.0 — 改名为 dsh-annals
改名
插件改名 \dsh-worklog\ -> \dsh-annals\。名字换成从「日志」往「记忆」走的方向,与同名的第三方插件区分开。
破坏性变更(老用户升级需知):
| 现在 | 改成 |
|---|---|
| 包名 \dsh-worklog\ | \dsh-annals\ |
| 工具 \worklog_init\ / \worklog_query\ / \worklog_links\ | \�nnals_init\ / \�nnals_query\ / \�nnals_links\ |
| 技能名 \worklog\ | \�nnals\ |
| 设置命名空间 \worklog\ | \�nnals\ |
| 探针文件 .dsh\worklog-probe.jsonl\ | .dsh\annals-probe.jsonl\ |
日志数据不受影响:\日志\\ 目录名、_日志索引.md\ 文件名都是中文常量,生成进工作区的 \�uild-index.mjs\ / \log-parse.mjs\ / .gitattributes\ 不含插件名 —— 已有日志一条不动。六个开关默认值全为 \ rue\,命名空间变更也不会让设置丢失。
升级步骤:
\
dsh plugin --profile web remove dsh-worklog
dsh plugin --profile web add <路径>\dsh-annals-0.5.0.tgz
\\
老版本 v0.4.1 的 \dsh-worklog-0.4.1.tgz\ 仍可从这个仓库的历史 Release 下载(点旧版本标签)。
dsh-worklog 0.4.1
0.4.1
这一版只改文档,代码一行没动。README 从 24 KB 砍到 13 KB,压下去的部分没有丢,而是拆成了两份能按需读的文件。
重写 README
原来的 README 面临的问题不是总量,而是结构:安装说明落在全文 70% 处,已知边界 独占 42.5% —— 一个新用户得读完一万七千字节才知道怎么装。
- 安装提到第 40 行(全文 18%)。装什么、怎么装、装完会被问什么,读完就能上手。
- 新增「为什么装它」 —— 先讲清楚问题是记忆不是日志,再说装了会得到什么,而不是一上来就列功能。
- 新增「我该说什么话」 —— 七条「你说这句会发生什么」的对照表。插件是给对话用的,但原来没有一处在教人怎么跟它说话。
- 删掉「命令行」整节。那两节教的
tools\worklog-*.mjs从来不在插件仓库里(tools\worklog-cli-base.mjs:13-15写着当初就是有意不放),package.json的files也不含它。留着等于让人去找一个不存在的文件。 - 检索与双链两章压成「能力一览」两行,机制叙述挪进 ARCHITECTURE。
新增 ARCHITECTURE.md
讲「它为什么这么工作」:目录结构、宿主契约(六个 inject 服务 + 五个宿主事件)、三态状态机、四条证据的提醒引擎、检索算法(四层加权与封顶、覆盖率分母的两次踩坑、两道阈值、两阶段检索的结构性缺陷)、双向链接的三条设计取舍、初始化、配置系统、测试策略。
关键常量都是从源码原样抄的(W_TITLE = 0.3、CAP_TITLE = 0.6、ABS_FLOOR = 0.1、REL_FLOOR = 0.25、TITLE_HIT_ENOUGH = 3 等),不是估计值。
新增 LIMITATIONS.md
原来 README 里的 26 条已知边界拆成两部分:
- 11 条「用户真会撞上」的留在 README(同秒漏报、同名技能覆盖、带空格路径被截断……)
- 15 条内部实现进 LIMITATIONS.md,原文搬迁不缩写,每条加了小标题。这些是「为什么不那么做」的完整推演:为什么靠快照而不猜命令行、为什么点名路径只投赞成票、为什么
SKIP_RE要做那两处负向断言。
顺带修掉一处问题:原内容里有对某个使用者本机私有路径的引用,别的用户点开是死链,已全部去除。
打包
package.json 的 files 白名单加了两个新文档 —— 不加的话打出来的 tgz 不带它们,GitHub 上从 README 点过去会 404。
测试
node --test test/offline.mjs 103 pass / 0 fail(另 2 skip)
node --test test/build-index.test.mjs 77 pass / 0 fail
node --test test/links.test.mjs 75 pass / 0 fail
node test/e2e-sandbox.mjs <空目录> 16 项检查全 PASS
dsh-worklog 0.4.0
0.4.0
新增
worklog_links双向链接工具 —— 按关系找:知道是哪一条,看它引了谁、谁引了它。worklog_query管「按内容找」,两者分工不重叠。- 入链(谁引用了它)只扫
日志\*.md;出链(它引用了谁)只认反引号里的路径,用扩展名白名单卡掉git status、wroteLog这类噪声。 target三种写法:整个文件 / 「第 N 条」/ 任意工作区文件全路径。
- 入链(谁引用了它)只扫
- 范围写法
第 38–56 条—— 指一整段流程时不必逐条列出,反查区间内任一条件都命中。–-~—至都认。 - 命令行工具 ——
tools\worklog-query.mjs与tools\worklog-links.mjs,不依赖 AI 也能查。逻辑仍是 import 插件里的纯函数,不复制第二份实现。 - 同文件内自引用也要写路径 —— 日志里指自己这一天的别的条目,光写「第 20 条」工具不知道是哪天,等于没写。这条规矩是撞出来的:一条日志这么写了自己,反查返回空,看着像没人引过。
修复
- 裸名不猜(真 bug) ——
matchesTarget曾对只写文件名的引用无条件放宽,查tools\说明.md会把全库四个同名说明.md的引用全算进来,数量从 20 条悄悄变成 33 条且不报错。现在指向不明的一律单独提示、不计入命中数。 - 裸名归一 —— 全库唯一的文件名(如
check-doc-map.mjs)自动补成全路径,同一条引用不再被算成两条。 - 并列条目号被去重吞掉 —— 同一行写「第 11 条与第 13 条」时第二个查不到。去重键加上条目号后两条都保留。
- 斜杠缩写
第 11/13 条会造出假引用 —— 解析成「未指定条目」,读起来像「这里本来就没写条目号」。现在渲染时明确提示「工具不认这种写法」。 - 注入段缺半句 —— 常驻规矩只写了「没说就是 B 档」,漏了「用户说了简单记就按 A 档」。用户的直接指令被当成「随便写写」,一条日志被记成 B 档(1392 字符,A 档上限 600)。
排序
- 出链里日志排在普通文件前面 —— 日志引用是「还能继续往下追」的活链接,文件引用到此为止。
- 入链里精确写了条目号的排前面,范围引用次之,只写文件名的最后。
已知边界
- 出链会截断带空格的 Windows 目录名(
D:\Program Files\x.exe→Files\x.exe)。全库 1292 处反引号引用里只有 2 处,为此引入引号配对解析会与「反引号内可以是命令」打架。 - 不校验引用是否还有效 —— 日志是历史快照,当时确实存在就够了。
- 裸名不猜逐条最多列 8 条,防真正的命中被 14 条历史裸引用淹掉。
dsh-worklog 0.3.0
0.3.0
新增
worklog_query检索工具 —— 让模型在动手前查「这事是不是做过」。返回条目标题 + 锚点 + 片段,不是匹配行。- 详略档位
[tier=A/B/C]—— 每条日志声明打算写多细,生成器核算,声明与实测不一致直接 FAIL。 normalizeUserText()—— 检索前剥掉「你好」「麻烦你」这类寒暄。实测把 3 个原本返回 0 条的查询救回来,分数普遍翻倍。- 对照埋点
probe-compare—— 同时记「模型编的查询查到什么」与「本轮用户原话查到什么」,攒够 20 条后对比agree分布,判定换输入源有没有收益。 - README 补
queryTool/probe两个配置项,新增「检索历史」整节。
修复
- 检索覆盖率分母改成查询字符数,折算改平方(
COVERAGE_FLOOR 0.05)。 - 插件自己的状态文件不再算工作区改动 —— 之前调一次检索就被催写日志。
- e2e 夹具仍按 0.2.0 前的旧格式写日志,导致 0.2.0 起该套件两处假失败。
已知局限
- 词法匹配看不见否定 —— 查「要重启吗」会输给「本机无需重启 dsh」。实测长度归一化与整换 BM25F 都无效,根因不是排序算法。
- 少于 4 个字的短查询容易被
ABS_FLOOR=0.1卡成 0 结果。 - 日志正文抄了查询原文会反噬检索(自指污染,会改写下一次每个 token 的 idf)。
dsh-worklog 0.1.5
误催根因定罪并修复,SKIP_RE 认得出「不记日志/别碰日志」
0.1.4 及以前确实修好了「工作区外写了不提醒」,但它顺手引入了一条副作用:collectShellPaths 把命令里出现过的任何绝对路径都收进点名集合,轮首轮尾各 stat 一次比对。其中 session.v4.jsonl.zstd 是宿主每一步都在追加写的文件 —— 某轮只要用 pwsh 读过它,轮首轮尾必然不同,byPaths 必投 true。不是概率事件,是确定性触发。
误报修复
在收集出口排除两类路径:
- 宿主自己持续写的四棵子树 ——
.dsh\sessions、.dsh\logs、.dsh\storages、.dsh\attachments,含目录本身(session-clean删会话时父目录 mtime 也会跳) - 宽得没意义的三个目标 —— 盘符根、家目录本身、
.dsh根
全量回放历史点名路径:4,299 次命中里只排除 190 次(4.4%),f1d99d1 那三个 e2e 用例全部保住。
SKIP_RE 扩词
这条正则从 0.1.1 首发起一个字都没改过,只认 5 个字面紧邻短语,不记 这个组合根本没写进去。现在 8 个分支,靠两处负向断言挡住「别动不动」「不记得」「不记录一下」:
/不[用要]记|不记(?!得|录)|不记录(?!一下)|不[用要]?[写记碰动]日志|别[记写碰动](?!不)|无需记录|不需要记录|跳过日志|免记/正样本 24 条零漏压、负样本 24 条零误压。
其它
- 新增 8 条离线用例(6 条正反 + 2 条
test.skip钉住已知缺陷),82/82 全过 - 做过变异测试:换回旧正则 → 4 条红;删掉
(?!不)→ 1 条红 - 删除临时插桩
worklog-probe
被放弃的路
53218a3 那个「加载过 worklog 技能即视为判断已执行」的豁免被回滚了(5c7d6c2):四次提醒全部早于当轮 skill 调用,判据接不上时序;而且「加载过」不等于「判断正确」,属自证清白式的仪式性检查。
已知边界
别记录这个错误,改用记忆里的方案 —— 局部否定被当成整轮否定,正则修不了,用 test.skip 钉住不修。取向是宁可漏压(多提醒一次),不可误压(该提醒时不提醒)。
升级提示
装完需重启 DSH 生效(判据:进程启动时间晚于 lib\index.js 的 mtime)。本次不改配置项、不改日志格式,老日志无需回改。
dsh-worklog 0.1.4
修漏催:工作区外的改动恢复提醒
0.1.3 及以前,「这一轮改没改文件」只看工作区快照。但快照只扫工作区,改动落在桌面这类位置时快照判 false,而官方 workspaceChanges 明明看见了,却因为「快照拿到就全信快照」永远轮不到 —— 该提醒的从不提醒,且不报错。
反过来只信官方也不行:非 git 工作区里 shell 写的工作区内文件,官方一律看不见,会漏。两条证据各有一段盲区,谁也盖不住谁。
判定改为取并集
- 任一条说改了就是改了
- 两条都说没改,才盖过命令行关键词的误报
- 两条都拿不到,才退回关键词判定
其它
- 新增 1 条回归用例:改动在工作区外 + 官方清单看得见 → 应提醒
- 已验证该用例在修复前失败、修复后通过,离线用例 63/63
- 「已知边界」第 6 条重写,原文「官方只在快照拿不到时兜底」已不成立
升级提示
装完需重启 DSH 生效。本次不改配置项、不改日志格式,老日志无需回改。
dsh-worklog 0.1.3
误报修复:不再靠猜命令判断「改没改文件」
0.1.2 及之前,插件靠正则匹配命令行关键字判断这一轮改没改文件(Set-Content、rm 、> 之类)。这套启发式在实际使用中连续误报,已换成客观信号。
改没改文件:工作区快照
- 轮首(
turn/start)扫一遍工作区,记下每个文件的mtimeMs:size;轮尾再扫一遍,两张不一样就是改过 - 一次同时覆盖 改动 / 新建 / 删除,与命令怎么写完全无关
.git目录跳过 ——git status/git add本身会重写.git\index,不跳会把自己扫成「改过」- 超过 20000 个文件放弃本次判定,退回旧逻辑
write/edit/str_replace_editor另加一层路径过滤:只算工作区内的写入
被这条改掉的误报源:
echo "==== form 枚举定义 ===="——form字面含rm2>&1—— 被当成重定向写文件->/=>/a > b之类比较符- here-string 正文里出现的指令词 ——
@'...'@里是数据,不是命令 - 只往系统临时目录写的命令
写没写日志:文件时间戳
- 不再判断命令里有没有出现
日志\YYYY-MM-DD.md字样 - 改成「今天的日志文件 mtime 变没变」
- 好处:
Set-Content、[System.IO.File]::WriteAllText、>>、Node 的appendFileSync一视同仁 - 能抓住「写了又还原」:内容一致但 mtime 变了
- 技能里推荐的写法恰好是旧关键词表里没有的
[System.IO.File]::WriteAllText,这次一并修掉
官方 workspaceChanges 服务降为兜底
- 它看得见
write/edit,但在非 git 工作区 看不见 shell 改动(上游 README 自述) - 现在只用来补「这轮改的文件列表里有没有今天的日志」,不再决定「改没改文件」
其它
- 临时目录豁免改用
os.tmpdir()运行时取值,不再依赖固定的环境变量写法 - here-string 剥离:正文里的关键词不再被当成命令
- 测试从 32 个增加到 62 个
- 「已知边界」新增 6 条,逐条写明代价与否定面
升级提示
装完需重启 DSH 生效。
dsh-worklog 0.1.2
生成器加固
- 代码围栏成为安全区:围栏内的示例不再被误收进索引
- 编号写法不规范(全角数字/顿号/缺空格)从静默丢失改为 FAIL 并提示正确写法
- 自动剥离 UTF-8 BOM
- 编号重复/倒序独立报错,不再出现「缺 -1 条」
- 同名目录、只读文件从不抛栈改为友好提示
- 新增 29 个端到端用例
取消字符数限制
- 删除单日 20000 字符的 WARN:长度不是质量判据