Skip to content

Releases: duhuashan/dsh-annals

v0.5.2

Choose a tag to compare

@duhuashan duhuashan released this 26 Oct 13:28

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

Choose a tag to compare

@duhuashan duhuashan released this 26 Oct 11:15

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.tgz

v0.5.0 — 改名为 dsh-annals

Choose a tag to compare

@duhuashan duhuashan released this 26 Oct 08:12

改名

插件改名 \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

Choose a tag to compare

@duhuashan duhuashan released this 26 Oct 07:12

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

Choose a tag to compare

@duhuashan duhuashan released this 26 Oct 05:12

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

Choose a tag to compare

@duhuashan duhuashan released this 25 Oct 17:46

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

Choose a tag to compare

@duhuashan duhuashan released this 23 Oct 20:54

误催根因定罪并修复,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

Choose a tag to compare

@duhuashan duhuashan released this 23 Oct 12:36

修漏催:工作区外的改动恢复提醒

0.1.3 及以前,「这一轮改没改文件」只看工作区快照。但快照只扫工作区,改动落在桌面这类位置时快照判 false,而官方 workspaceChanges 明明看见了,却因为「快照拿到就全信快照」永远轮不到 —— 该提醒的从不提醒,且不报错。

反过来只信官方也不行:非 git 工作区里 shell 写的工作区内文件,官方一律看不见,会漏。两条证据各有一段盲区,谁也盖不住谁。

判定改为取并集

  • 任一条说改了就是改了
  • 两条都说没改,才盖过命令行关键词的误报
  • 两条都拿不到,才退回关键词判定

其它

  • 新增 1 条回归用例:改动在工作区外 + 官方清单看得见 → 应提醒
  • 已验证该用例在修复前失败、修复后通过,离线用例 63/63
  • 「已知边界」第 6 条重写,原文「官方只在快照拿不到时兜底」已不成立

升级提示

装完需重启 DSH 生效。本次不改配置项、不改日志格式,老日志无需回改。

dsh-worklog 0.1.3

Choose a tag to compare

@duhuashan duhuashan released this 22 Oct 15:04

误报修复:不再靠猜命令判断「改没改文件」

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 字面含 rm
  • 2>&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

Choose a tag to compare

@duhuashan duhuashan released this 21 Oct 18:32

生成器加固

  • 代码围栏成为安全区:围栏内的示例不再被误收进索引
  • 编号写法不规范(全角数字/顿号/缺空格)从静默丢失改为 FAIL 并提示正确写法
  • 自动剥离 UTF-8 BOM
  • 编号重复/倒序独立报错,不再出现「缺 -1 条」
  • 同名目录、只读文件从不抛栈改为友好提示
  • 新增 29 个端到端用例

取消字符数限制

  • 删除单日 20000 字符的 WARN:长度不是质量判据