dsh-vibe-math 2.3.12 → 2.3.14

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.
Files changed (49) hide show
  1. package/README.md +17 -13
  2. package/cordis.patch.yml +1 -1
  3. package/{AUDIT-CHECKLIST.md → docs/AUDIT-CHECKLIST.md} +323 -304
  4. package/docs/COMPAT-AUDIT-ROUND2.md +325 -0
  5. package/docs/generate_framework_diagram_v2.py +114 -0
  6. package/docs/generate_framework_diagram_v3.py +127 -0
  7. package/{RELEASE-NOTES-2.1.0.md → docs/release-notes/RELEASE-NOTES-2.1.0.md} +143 -143
  8. package/{RELEASE-NOTES-2.2.0.md → docs/release-notes/RELEASE-NOTES-2.2.0.md} +266 -266
  9. package/{RELEASE-NOTES-2.2.1.md → docs/release-notes/RELEASE-NOTES-2.2.1.md} +43 -43
  10. package/{RELEASE-NOTES-2.2.2.md → docs/release-notes/RELEASE-NOTES-2.2.2.md} +88 -88
  11. package/{RELEASE-NOTES-2.3.0.md → docs/release-notes/RELEASE-NOTES-2.3.0.md} +207 -207
  12. package/{RELEASE-NOTES-2.3.1.md → docs/release-notes/RELEASE-NOTES-2.3.1.md} +134 -134
  13. package/{RELEASE-NOTES-2.3.10.md → docs/release-notes/RELEASE-NOTES-2.3.10.md} +105 -105
  14. package/{RELEASE-NOTES-2.3.11.md → docs/release-notes/RELEASE-NOTES-2.3.11.md} +57 -57
  15. package/{RELEASE-NOTES-2.3.12.md → docs/release-notes/RELEASE-NOTES-2.3.12.md} +80 -80
  16. package/docs/release-notes/RELEASE-NOTES-2.3.13.md +137 -0
  17. package/docs/release-notes/RELEASE-NOTES-2.3.14.md +83 -0
  18. package/{RELEASE-NOTES-2.3.2.md → docs/release-notes/RELEASE-NOTES-2.3.2.md} +145 -145
  19. package/{RELEASE-NOTES-2.3.3.md → docs/release-notes/RELEASE-NOTES-2.3.3.md} +115 -115
  20. package/{RELEASE-NOTES-2.3.4.md → docs/release-notes/RELEASE-NOTES-2.3.4.md} +69 -69
  21. package/{RELEASE-NOTES-2.3.5.md → docs/release-notes/RELEASE-NOTES-2.3.5.md} +63 -63
  22. package/{RELEASE-NOTES-2.3.6.md → docs/release-notes/RELEASE-NOTES-2.3.6.md} +66 -66
  23. package/{RELEASE-NOTES-2.3.7.md → docs/release-notes/RELEASE-NOTES-2.3.7.md} +59 -59
  24. package/{RELEASE-NOTES-2.3.8.md → docs/release-notes/RELEASE-NOTES-2.3.8.md} +45 -45
  25. package/{RELEASE-NOTES-2.3.9.md → docs/release-notes/RELEASE-NOTES-2.3.9.md} +70 -70
  26. package/docs/test-timing.md +19 -18
  27. package/installer.js +115 -41
  28. package/package.json +43 -37
  29. package/{audit-formal-sensitivity.mjs → tests/audit-formal-sensitivity.mjs} +342 -342
  30. package/{audit-installer-compat.test.mjs → tests/audit-installer-compat.test.mjs} +136 -136
  31. package/tests/audit-installer-policy.test.mjs +261 -0
  32. package/{audit-persona-sensitivity.mjs → tests/audit-persona-sensitivity.mjs} +249 -249
  33. package/{audit-persona-surface.test.mjs → tests/audit-persona-surface.test.mjs} +349 -349
  34. package/{audit-prompt-invariants.mjs → tests/audit-prompt-invariants.mjs} +508 -508
  35. package/{audit-spec-traceability.mjs → tests/audit-spec-traceability.mjs} +193 -193
  36. package/{audit-v5-integrity.mjs → tests/audit-v5-integrity.mjs} +448 -448
  37. package/{audit-v5-sensitivity.mjs → tests/audit-v5-sensitivity.mjs} +384 -384
  38. package/{e2e-v5-round2.test.mjs → tests/e2e-v5-round2.test.mjs} +521 -521
  39. package/{formal-verify-v2.test.mjs → tests/formal-verify-v2.test.mjs} +1315 -1315
  40. package/{formal-verify-v3.test.mjs → tests/formal-verify-v3.test.mjs} +1257 -1257
  41. package/{formal-verify-v4.test.mjs → tests/formal-verify-v4.test.mjs} +1082 -1082
  42. package/{formal-verify-v5.test.mjs → tests/formal-verify-v5.test.mjs} +708 -708
  43. package/{prompt-v5-integrity.test.mjs → tests/prompt-v5-integrity.test.mjs} +3 -3
  44. package/{run-tests.mjs → tests/run-tests.mjs} +121 -118
  45. package/{selfdrive-v5.mjs → tests/selfdrive-v5.mjs} +470 -470
  46. package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +1 -1
  47. package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +1 -1
  48. package/vibe-math-v5//346/236/266/346/236/204/345/233/276.md +1 -1
  49. /package/{RELEASE-NOTES-2.0.22.md → docs/release-notes/RELEASE-NOTES-2.0.22.md} +0 -0
@@ -1,80 +1,80 @@
1
- # dsh-vibe-math 2.3.12 — 安装器按 `engines.dsh` 判定宿主 + npm 页不再有裂图 + README 清理
2
-
3
- > 上一版:2.3.11。三件收尾:① 安装器自检与市场读**同一个**声明;② npm 上 README 的图不再裂;
4
- > ③ 目录条目文案按实际内容更新(第三方 PR)。另按你的要求删掉了上一版塞进 README 的"插件市场展示"一节。
5
- > 无预设行为变更,四套预设字节未变。
6
-
7
- ---
8
-
9
- ## 1. 安装器自检改为读 `engines.dsh`(单一事实源)
10
-
11
- 原来安装器按 `dsh.compatibility.dshReleases` 这张**本包自用的表**判断宿主版本,而市场卡片按
12
- `engines.dsh` 判定——**两个来源可以互相矛盾**(卡片说兼容、日志却告警,或反之)。现在:
13
-
14
- - `installer.js` 导出两个纯函数:`satisfiesDshRange(version, range, {includePrerelease})` 与
15
- `dshVersionVerdict(version, manifest)`;
16
- - 判定顺序:**`engines.dsh`**(顶层优先)→ **`dsh.engines.dsh`** → 都没有才回退到 `dshReleases` 表;
17
- 无法解析的范围返回 `unknown`(只提示、绝不判成 incompatible);
18
- - 匹配器支持生态里真实出现的写法:`*`/`x`、精确、`^`、`~`、`>=`/`>`/`<=`/`<`、空格分隔的组合、`||` 分支,
19
- 并实现 npm 的**集合级预发布规则**(一个 `||` 分支为一个集合:只有集合里存在与宿主同
20
- `major.minor.patch` 且自带预发布标签的比较符时,才放行预发布版本);
21
- - **实测对齐**:用 npm 自带的 **semver 7.8.5** 逐项比对 **320** 组(范围 × 版本 × 两种预发布语义),
22
- **0 处不一致**;`not-a-range`、`>=1.2`、`1.2.x` 等不支持写法一律返回 `null`(unknown,绝不误判)。
23
- - 顺手修掉安装器头部注释的陈旧描述("copies ALL THREE agent presets … ships v2/v3/v4 only" →
24
- 四套,v5 自 2.1.0 起就在)。
25
-
26
- 新增随包套件 [`audit-installer-compat.test.mjs`](audit-installer-compat.test.mjs)(**54 条断言**,进并行回归):
27
- 匹配器的期望值表(由 semver 7.8.5 生成)、不支持写法必须为 unknown、`dshVersionVerdict` 的优先级与回退、
28
- 以及**两个来源不许矛盾**——`dsh.compatibility` 里每个标 `compatible` 的版本都不得被 `engines.dsh` 判成 incompatible。
29
-
30
- ## 2. npm 页的 README 图不再裂
31
-
32
- README 展示 5 张本地图,此前只有 v4/v5 的 SVG 随包发布,v2/v3 的 PNG 与实际使用示例长截图**不在 `files` 里**,
33
- 所以 npm 页一直是裂图。现在把 README 引用的**每一张**本地图都纳入 `files`:
34
-
35
- | 新增随包 | 大小 |
36
- |---|---|
37
- | `示例图/框架图-v2.png` | ≈403 KB |
38
- | `示例图/框架图-v3.png` | ≈559 KB |
39
- | `示例图/实际使用示例-长截图.png` | ≈2.7 MB |
40
-
41
- 守卫也加了这条不变式:**README 里出现的每个本地图片路径都必须列在 `package.json` `files` 里**
42
- (历史遗留条目"指向已删除的 v1 图"就是同一类腐烂),以后谁再引用未随包的图会直接判红。
43
- (实测包体积 1.0 MB → **4.36 MB**(解包 8.89 MB,79 个文件)——若你不想背这张 2.7 MB 的长截图,
44
- 删掉 README 里那一行即可,守卫会要求同步从 `files` 移除。)
45
-
46
- ## 3. README 清理
47
-
48
- 按你的要求,删除了上一版新增的「🏪 插件市场(dsh-market / awesome-dsh-plugin)里的展示」整节
49
- (那是维护者视角、与用户了解项目无关)。README 里现在没有任何市场/元数据相关内容;
50
- 这些声明仍由 `audit-market-metadata.test.mjs`(仓库级守卫,19 条断言)与发布说明守着。
51
-
52
- ## 4. 目录条目文案(第三方 PR)
53
-
54
- 条目 `data/plugins/ChongCyrus__Vibe-Mathematics.yml` 的描述仍是 v2 时代措辞(只描述一条流水线,
55
- 且把 preset 说成"附带品")。已按实际内容更新并发起 PR:
56
-
57
- - **PR #5673**:https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/pull/5673
58
- - 只改我们这一条(1 file, +2/−2),en/zh 同步,无营销词;
59
- - 分支基于**上游当前 `main`**(你的 fork 停在 2026-08-18、与上游有分叉且无法 fast-forward,
60
- 所以没有动 fork 的 main,只推了一个新分支)。
61
-
62
- ## 5. 验收
63
-
64
- | 项 | 结果 |
65
- |---|---|
66
- | `audit-installer-compat.test.mjs` | **54/0** |
67
- | `audit-market-metadata.test.mjs` | **19/0**(含"README 图片必须随包") |
68
- | 匹配器 vs semver 7.8.5 | 320 组,**0 处不一致** |
69
- | 其余静态守卫 | invariants 157/0(self-probe 5/5)、traceability 94/0、v5-integrity clean、persona-surface 197/0 |
70
- | 全量并行回归 | **25/25** |
71
- | closing verification | 18/18 |
72
- | 发布产物自证 | registry tarball sha1 与本地一致 + 包内跑全部随包套件 |
73
-
74
- ## 6. 升级
75
-
76
- ```
77
- npm i dsh-vibe-math@latest
78
- ```
79
-
80
- 无迁移;`off` 档行为与四套预设字节均未变。
1
+ # dsh-vibe-math 2.3.12 — 安装器按 `engines.dsh` 判定宿主 + npm 页不再有裂图 + README 清理
2
+
3
+ > 上一版:2.3.11。三件收尾:① 安装器自检与市场读**同一个**声明;② npm 上 README 的图不再裂;
4
+ > ③ 目录条目文案按实际内容更新(第三方 PR)。另按你的要求删掉了上一版塞进 README 的"插件市场展示"一节。
5
+ > 无预设行为变更,四套预设字节未变。
6
+
7
+ ---
8
+
9
+ ## 1. 安装器自检改为读 `engines.dsh`(单一事实源)
10
+
11
+ 原来安装器按 `dsh.compatibility.dshReleases` 这张**本包自用的表**判断宿主版本,而市场卡片按
12
+ `engines.dsh` 判定——**两个来源可以互相矛盾**(卡片说兼容、日志却告警,或反之)。现在:
13
+
14
+ - `installer.js` 导出两个纯函数:`satisfiesDshRange(version, range, {includePrerelease})` 与
15
+ `dshVersionVerdict(version, manifest)`;
16
+ - 判定顺序:**`engines.dsh`**(顶层优先)→ **`dsh.engines.dsh`** → 都没有才回退到 `dshReleases` 表;
17
+ 无法解析的范围返回 `unknown`(只提示、绝不判成 incompatible);
18
+ - 匹配器支持生态里真实出现的写法:`*`/`x`、精确、`^`、`~`、`>=`/`>`/`<=`/`<`、空格分隔的组合、`||` 分支,
19
+ 并实现 npm 的**集合级预发布规则**(一个 `||` 分支为一个集合:只有集合里存在与宿主同
20
+ `major.minor.patch` 且自带预发布标签的比较符时,才放行预发布版本);
21
+ - **实测对齐**:用 npm 自带的 **semver 7.8.5** 逐项比对 **320** 组(范围 × 版本 × 两种预发布语义),
22
+ **0 处不一致**;`not-a-range`、`>=1.2`、`1.2.x` 等不支持写法一律返回 `null`(unknown,绝不误判)。
23
+ - 顺手修掉安装器头部注释的陈旧描述("copies ALL THREE agent presets … ships v2/v3/v4 only" →
24
+ 四套,v5 自 2.1.0 起就在)。
25
+
26
+ 新增随包套件 [`audit-installer-compat.test.mjs`](../../tests/audit-installer-compat.test.mjs)(**54 条断言**,进并行回归):
27
+ 匹配器的期望值表(由 semver 7.8.5 生成)、不支持写法必须为 unknown、`dshVersionVerdict` 的优先级与回退、
28
+ 以及**两个来源不许矛盾**——`dsh.compatibility` 里每个标 `compatible` 的版本都不得被 `engines.dsh` 判成 incompatible。
29
+
30
+ ## 2. npm 页的 README 图不再裂
31
+
32
+ README 展示 5 张本地图,此前只有 v4/v5 的 SVG 随包发布,v2/v3 的 PNG 与实际使用示例长截图**不在 `files` 里**,
33
+ 所以 npm 页一直是裂图。现在把 README 引用的**每一张**本地图都纳入 `files`:
34
+
35
+ | 新增随包 | 大小 |
36
+ |---|---|
37
+ | `示例图/框架图-v2.png` | ≈403 KB |
38
+ | `示例图/框架图-v3.png` | ≈559 KB |
39
+ | `示例图/实际使用示例-长截图.png` | ≈2.7 MB |
40
+
41
+ 守卫也加了这条不变式:**README 里出现的每个本地图片路径都必须列在 `package.json` `files` 里**
42
+ (历史遗留条目"指向已删除的 v1 图"就是同一类腐烂),以后谁再引用未随包的图会直接判红。
43
+ (实测包体积 1.0 MB → **4.36 MB**(解包 8.89 MB,79 个文件)——若你不想背这张 2.7 MB 的长截图,
44
+ 删掉 README 里那一行即可,守卫会要求同步从 `files` 移除。)
45
+
46
+ ## 3. README 清理
47
+
48
+ 按你的要求,删除了上一版新增的「🏪 插件市场(dsh-market / awesome-dsh-plugin)里的展示」整节
49
+ (那是维护者视角、与用户了解项目无关)。README 里现在没有任何市场/元数据相关内容;
50
+ 这些声明仍由 `audit-market-metadata.test.mjs`(仓库级守卫,19 条断言)与发布说明守着。
51
+
52
+ ## 4. 目录条目文案(第三方 PR)
53
+
54
+ 条目 `data/plugins/ChongCyrus__Vibe-Mathematics.yml` 的描述仍是 v2 时代措辞(只描述一条流水线,
55
+ 且把 preset 说成"附带品")。已按实际内容更新并发起 PR:
56
+
57
+ - **PR #5673**:https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/pull/5673
58
+ - 只改我们这一条(1 file, +2/−2),en/zh 同步,无营销词;
59
+ - 分支基于**上游当前 `main`**(你的 fork 停在 2026-08-18、与上游有分叉且无法 fast-forward,
60
+ 所以没有动 fork 的 main,只推了一个新分支)。
61
+
62
+ ## 5. 验收
63
+
64
+ | 项 | 结果 |
65
+ |---|---|
66
+ | `audit-installer-compat.test.mjs` | **54/0** |
67
+ | `audit-market-metadata.test.mjs` | **19/0**(含"README 图片必须随包") |
68
+ | 匹配器 vs semver 7.8.5 | 320 组,**0 处不一致** |
69
+ | 其余静态守卫 | invariants 157/0(self-probe 5/5)、traceability 94/0、v5-integrity clean、persona-surface 197/0 |
70
+ | 全量并行回归 | **25/25** |
71
+ | closing verification | 18/18 |
72
+ | 发布产物自证 | registry tarball sha1 与本地一致 + 包内跑全部随包套件 |
73
+
74
+ ## 6. 升级
75
+
76
+ ```
77
+ npm i dsh-vibe-math@latest
78
+ ```
79
+
80
+ 无迁移;`off` 档行为与四套预设字节均未变。
@@ -0,0 +1,137 @@
1
+ # dsh-vibe-math 2.3.13 — 仓库归档 + 安装器改为「版本一变就整体替换」(手改原文先备份)
2
+
3
+ > 上一版:2.3.12。本版**不改四套预设的任何代码/提示词字节**(预设行为与上一版逐字相同),
4
+ > 改的是仓库布局、安装器的更新策略、以及两处守卫。
5
+
6
+ ---
7
+
8
+ ## 1. 仓库根目录归档:跟踪条目 77 → 19(其中文件 66 → 7)
9
+
10
+ 只留下"包必须暴露在顶层"的东西:
11
+
12
+ | 留在根目录 | 为什么不能动 |
13
+ |---|---|
14
+ | `package.json` / `README.md` / `LICENSE` | npm 与 GitHub 的固定位置 |
15
+ | `cordis.patch.yml` | `package.json` 的 `dsh.bundle.patch` 指向它;DSH 靠它把安装器挂进 profile |
16
+ | `screenshots.json` | 插件市场规定它必须与 `package.json` 同级 |
17
+ | `installer.js` | bundle 的唯一插件行(`dsh-vibe-math/installer`),也是 `main` / `exports` |
18
+ | `.gitignore` | — |
19
+
20
+ 其余 **59 个文件**按角色归档:
21
+
22
+ ```
23
+ tests/ 26 个 *.test.mjs + 7 个审计守卫 + 3 个人工探针 + 3 个自驱动记录器 + run-tests.mjs
24
+ docs/ AUDIT-CHECKLIST.md、COMPAT-AUDIT-ROUND2.md、架构图.md、formal-verification.md、
25
+ test-timing.md、4 个架构图生成器
26
+ docs/release-notes/ 18 份历史发布说明(本版 +1)
27
+ ```
28
+
29
+ 搬动过程中顺带修掉的问题(都是"搬完才看得见"或一直没人看的那一类):
30
+
31
+ 1. **5 个硬编码绝对路径**(`D:/wd/vibemath开发/...`、`C:/Users/admin/...`):
32
+ `audit-corrupt-file-guard`、`audit-f1-compact-fix`、`audit-f2-filter-fix`、`audit-fuzz-helpers`、
33
+ `e2e-f1-agent-detach`。其中 **`audit-fuzz-helpers.mjs` 是随包发布的**——写死了作者机器的路径,
34
+ 等于对任何用户都跑不了;`e2e-f1-agent-detach` 现在按 `npm root -g` 定位真实宿主包(并在找不到时
35
+ 报出所有试过的路径)。
36
+ 2. **5 条发布说明里的链接失效**:搬进 `docs/release-notes/` 后,原来按仓库根写的相对链接要上一层。
37
+ 3. `README` 里 `` `../COMPAT-AUDIT-ROUND2.md` `` 指的是仓库**外面**——这个引用从来就没对过。
38
+ 4. README 链接的 v2/v3 架构图生成器(`.py`)**从未随包发布** → npm 页上点开是 404;现已纳入 `files`。
39
+ 5. `docs/test-timing.md`、`docs/AUDIT-CHECKLIST.md` 与各脚本头部的 `Run:` 命令行按新路径更新
40
+ (否则照抄命令就是"找不到文件")。
41
+
42
+ **"纯搬动"有测量为证**:每个套件在**改动前的检出**(临时 git worktree)与**改动后的检出**里各跑一遍,
43
+ 把检出路径、`tests/` 这一段、临时目录、缓存串、随机 id 与耗时归一化之后**逐行比对**
44
+ (`_oneoff/layout-invariance.mjs`):**24/26 输出逐字节相同**,另外 2 个是本轮改过内容的文件
45
+ (新增两条链接断言的市场守卫、被改写路径的 v5 套件),**没有一个套件的输出与"套件住在哪里"有关**。
46
+ 断言条数与归档前逐项一致;README 的 29 条本地链接与全仓 52 条相对链接 0 失效。
47
+ (顺带发现审计工具自身的盲区:`git ls-files` 默认会把中文路径 C 风格转义,于是 6 个中文名文档——
48
+ 含四份 `实现方案.md` 与 `docs/架构图.md`——从来没被链接扫描看过;现已加 `-c core.quotepath=false`,
49
+ 扫描面从 28 个 md 扩到 35 个、45 条链接扩到 52 条,仍为 0 失效。)
50
+
51
+ ## 2. 安装器:版本一变就整体替换(含手改文件),并先备份原文
52
+
53
+ **旧策略**:版本升级时只替换"哈希与上次安装一致"的文件,你改过的文件被**永久保留**。
54
+
55
+ **新策略**:
56
+
57
+ - 记录里的版本与包版本**不一致**(或根本没有记录的老安装)→ **受管文件全部替换成随包字节,
58
+ 不看它是否被改过**;
59
+ - **被替换的手改原文不会丢**:若磁盘上的字节不是"本安装器上次写入的字节",会先备份到
60
+ `<presetRoot>/.vibe-math-backup/<旧版本>/<preset>/<文件>`,并在日志里逐个列出;
61
+ - **同一个版本内不重写任何文件**(重启 DSH 不会改写 preset、也不会扰动它按 mtime 记的生成代际);
62
+ - **缺失文件随时补回**(任何版本);
63
+ - 本包不再发布的 preset 目录照旧清理(记录为"用户持有"的文件保留)。
64
+
65
+ **为什么改**:旧策略最危险之处是"静默的版本混合"。你改一个文件、包升级一次,得到的是
66
+ **一半旧版、一半新版**的 preset——它可能挂不上(`agent.cordis.yml` 与 `vibe-math-vN.js` 不同代),
67
+ 也可能挂上了但行为与文档不符,而**从外面完全看不出来**,只能靠人去 diff 一个 5000 行的文件。
68
+ 而且一旦被标记为"用户持有",那个文件就**永远不会**再更新,连你后来把它改回原样都不会恢复。
69
+
70
+ **如何正确自定义**:不要改受管文件。复制一份——预设选择器里的复制动作(DSH 的 `agentPresets/copy`),
71
+ 或自行把目录复制成新的 id——那份副本属于你,随包更新不会碰它。
72
+
73
+ **发布前的复核又补了两处**(都是新代码自己审出来的):
74
+
75
+ 1. **读不到版本时什么都不替换**:manifest 缺失/没有 `version` 字段时不再猜——本次只补回缺失文件、
76
+ 并**保留上一次记录的版本号**(这样下次能读到时,日志里的"从哪个版本升级"仍然是对的、备份也落在
77
+ 正确的版本目录下)。此前这种情况会被当成"同版本"而静默不动,现在会明确告警说明原因。
78
+ 2. **备份报告不再误报失败**:同一版本目录下已存在备份时(例如升级被重跑),保留**最早那份**原文,
79
+ 并且不再把它报成"备份失败(原文未保留)"——报错必须只说真话。
80
+
81
+ ## 3. 新增与加固的守卫
82
+
83
+ | 守卫 | 变化 |
84
+ |---|---|
85
+ | `tests/audit-installer-policy.test.mjs` | **新增**(52 条断言,随包发布):在临时 DSH_HOME 里驱动真实 `apply()`,用"两个版本的临时包副本"证明基线安装 / 同版本不重写 / 版本一变即替换(且备份原文) / 缺失补回 / 旧 preset 清理 / 读不到版本时不动任何文件,并证明受管清单覆盖四套预设运行时需要的每个文件、备份目录名不会被 DSH 当成 preset |
86
+ | `tests/audit-market-metadata.test.mjs` | 19 → **21** 条:README 的**每一条本地链接**(不再只是图片)都必须真实存在**且**列在 `files` 里 |
87
+ | `final-verify.mjs` 打包阶段 | 把**每一个随包发布的守卫在解包出来的包里各跑一遍**(安装器策略套件还会在包内重新复制四个 preset,因此"`files` 漏了某个 preset 文件"会在打包阶段就红,而不是等到用户装上挂载失败) |
88
+
89
+ 两个新增断言的灵敏度都实测过:`_oneoff/probe-installer-policy.mjs`(对着 2.3.12 的安装器 → **10 条**断言变红,
90
+ 其中就有"版本一变,被改过的文件必须被替换")、`_oneoff/probe-market-link-guard.mjs`(README 里塞一条
91
+ 死链接 / 塞一条"存在但不随包"的链接 → 分别命中对应断言,改回后逐字节还原)。
92
+
93
+ > **发布前复核还做了一次"引用闭合"审计**(`_oneoff/check-reference-closure.mjs`):`package.json` 的
94
+ > `main`/`exports`/`dsh.bundle.patch`/`files` 全部存在;35 个 markdown 的 52 条相对链接全部可解析;
95
+ > 文档与脚本头部的每一条 `node <路径>` 命令行都指向真实文件;代码里"确实写成路径"的字符串字面量
96
+ > (排除运行时工作区路径)无一悬空。反向检查顺带把 `docs/COMPAT-AUDIT-ROUND2.md` 纳入了 `files`
97
+ > ——README 正文点名让它"详见",不随包的话 npm 读者就打不开。
98
+
99
+ ## 4. 附:为什么不用 DSH 自带的预设根目录(`agent-presets.roots`)
100
+
101
+ 勘察结论(DSH 0.1.5-rc.2):**DSH 没有任何"插件包自带 preset 并自动安装"的机制**。
102
+
103
+ - `dsh plugin add` 只做两件事:在 profile 目录里跑 pnpm、把带 `dsh.bundle` 的依赖并进
104
+ `dsh.profile.bundles`(即 `cordis.patch.yml` 成为一个 patch 层)。它不读、也不安装 preset。
105
+ - `dsh.configTrees`(`@deepseek-ai/dsh-package-manifest` 里唯一像"包自带配置树"的字段)明确写着
106
+ "服务于实验性的镜像打包器……**声明它不会注册任何外部插件行为**"。
107
+ - 原生机制只有**根目录发现**:随包 `system` 根 + 部署配置的 `roots[]` + `$DSH_HOME/.agent-presets`(`user` 根,
108
+ 也是唯一可写的)。也就是说,**第三方包面向用户的唯一手段就是写进那个可写根**——正是本安装器在做的事。
109
+
110
+ 理论上可以用 patch 层给 `agent-presets` 行塞一个 `roots` 项指向包内目录,但代价与风险都不划算:
111
+ ① 按 id 命中的 patch **整体替换**该行的 `config`,于是必须重述 `default` 等字段,等于覆盖部署的默认预设选择;
112
+ ② `roots[].path` 在 `scanRoot` 里是 `resolve(expandHomePath(path))`,即**相对 cwd**,只能靠 `!!js` 表达式算出
113
+ 绝对路径,脆弱;③ 本包声明的兼容范围是 0.1.2 → 0.1.5,早期版本的 schema 是否接受 `roots` 无从验证,
114
+ 而一旦宿主拒绝这个 config,结果是**一个 preset 都装不上**。相比之下,`installer.js` 是一段自包含的复制逻辑,
115
+ 只依赖 node 内置模块,任何声明兼容的宿主上都能工作。
116
+
117
+ ## 5. 验收
118
+
119
+ | 项 | 2.3.12 | 2.3.13 |
120
+ |---|---|---|
121
+ | 仓库根目录的跟踪条目 | **77**(66 文件 + 11 目录) | **19**(7 文件 + 12 目录) |
122
+ | 全套件并行回归 | 25/25 | **26/26**(24/25 个原有套件断言条数逐项一致;市场守卫有意 +2) |
123
+ | 布局不变性(改前 vs 改后逐行比对) | — | **24/26 输出逐字节相同**(另 2 个是本轮改过内容的文件;无一个与布局有关) |
124
+ | 安装器策略套件 | — | **52/0**(+ 对旧策略 10 条变红的灵敏度探针) |
125
+ | 市场元数据守卫 | 19/0 | **21/0**(+ 2 条链接探针) |
126
+ | README 本地链接 | 29(npm 页上 2 条 404:两个 `.py` 生成器没随包) | 29(全部存在且随包) |
127
+ | 发布产物自证 | 通过 | 通过(并在包内跑 6 个随包守卫) |
128
+
129
+ ## 6. 升级
130
+
131
+ ```
132
+ npm i dsh-vibe-math@latest
133
+ ```
134
+
135
+ 升级后**重启 DSH**:安装器会把四个 preset 目录的受管文件整体换成 2.3.13 的字节——**包括你手改过的**,
136
+ 被替换的手改原文在 `~/.dsh/.agent-presets/.vibe-math-backup/2.3.12/<preset>/`。
137
+ 无迁移;参数、工具、提示词与预设行为均未变。
@@ -0,0 +1,83 @@
1
+ # dsh-vibe-math 2.3.14 — 升级命令修正 · 安装器对「降级」发声 · 计数口径纠正
2
+
3
+ > 上一版:2.3.13。本版**不改四套预设的任何字节**(预设代码、提示词、语料逐字未变),改动集中在三件事:
4
+ > 一条照抄会**失败**的升级命令、一次**静默的降级**、以及两处数字口径。另外删掉仓库里一张没有任何引用的图。
5
+
6
+ ---
7
+
8
+ ## 1. README 的升级命令原本会直接失败
9
+
10
+ `dsh plugin` 的 `--profile` 是**必填项**(`dsh/lib/bin.js`:`plugin.requiredOption('--profile <name>', …)`),
11
+ 而 README 写的是:
12
+
13
+ ```sh
14
+ dsh plugin update dsh-vibe-math # ✗ error: required option '--profile <name>' not specified
15
+ ```
16
+
17
+ 即使补上 `--profile`,`pnpm update` 也**跨不过被精确钉住的版本**——而 profile 里常见
18
+ `"dsh-vibe-math": "2.1.0"` 这种写法。现改为:
19
+
20
+ ```sh
21
+ dsh plugin --profile <你的 profile> add dsh-vibe-math@latest # ✓ 用 add:它会把依赖写到你指定的版本
22
+ ```
23
+
24
+ 同一处错误写法还出现在 `installer.js` 与 `cordis.patch.yml` 的说明注释里,一并改正。
25
+
26
+ ## 2. 安装器:降级不再静默
27
+
28
+ "版本一变就整体替换"这条策略**没有区分方向**。当记录里的版本比正在运行的包**新**时
29
+ (典型成因:profile 里的依赖还钉在旧版,而 preset 目录已经被更新的包同步过),下一次启动会把
30
+ preset 换回**旧**字节——而日志只会说一句 `preset auto-update: version 2.3.12 → 2.1.0`。
31
+
32
+ 现在补一条明确的告警(复用安装器里已有的 `parseSemver` / `compareSemver`,任一侧解析不出就跳过):
33
+
34
+ > `[dsh-vibe-math] 记录里的版本(2.3.13)比本包版本(2.1.0)新,本次会把 preset 换回旧字节。`
35
+ > `若这不是你想要的,请先升级 profile 里的依赖:dsh plugin --profile <name> add dsh-vibe-math@latest,再重启 DSH。`
36
+
37
+ **替换本身仍然执行**——"preset 目录等于已安装的那个包"就是这条策略的全部意义;变的只是它不再偷偷发生。
38
+ (这不是假想:发布 2.3.13 前的复核在本机实测到这个形态——`~/.dsh/profiles/web` 里钉着 `2.1.0`,
39
+ 而 preset 目录的状态记录是 `2.3.12`,用**已安装的那个安装器**跑一遍就会重写 12 个预设文件。
40
+ 本机已把 profile 依赖升到最新并同步,之后一致性探针输出 `consistent`。)
41
+
42
+ ## 3. 计数口径纠正(两处)
43
+
44
+ | 位置 | 原来 | 现在 |
45
+ |---|---|---|
46
+ | 2.3.13 发布说明 + `compatNote` | 根目录"68 个条目 → 18 个(7 个文件 + 11 个目录)" | **跟踪条目 77 → 19(文件 66 → 7,目录 11 → 12)** |
47
+ | `docs/test-timing.md` | 其余 16 个套件 / 其中 8 个 < 1 s | **其余 19 个 / 其中 12 个 < 1 s** |
48
+
49
+ 第一处原来把"仓库跟踪的**文件数**"与"目录里可见的**条目数**"混着比——两边都不是同一个口径。
50
+ 发布说明的验收表也一并改准(全套件 **26/26**、布局不变性 **24/26 逐字节相同**)。
51
+
52
+ ## 4. 仓库:删除一张没有任何引用的图
53
+
54
+ `示例图/框架图.png`(397 KB)在**仓库源码、`screenshots.json`、以及插件市场目录条目里都没有任何引用**
55
+ (目录 YAML 只有 `url` / `name` / `category` / `description` 四个字段;市场的轮播图与卡片图都来自
56
+ `screenshots.json` 里的 v5 / v4 / v3 / v2 四张)。已删除,`git log` 可查。
57
+
58
+ ## 5. 验收
59
+
60
+ | 项 | 2.3.13 | 2.3.14 |
61
+ |---|---|---|
62
+ | closing verification(发布门禁) | 19/19 | **19/19** |
63
+ | 全套件并行回归 | 26/26 | **26/26** |
64
+ | 安装器策略套件 | 52/0 | **57/0**(新增 5 条:降级必须告警、替换照旧、原文仍备份、状态记录实际版本) |
65
+ | 市场元数据守卫 | 21/0 | **21/0** |
66
+ | 静态守卫 | 157 / 94 / clean | **157 / 94 / clean** |
67
+ | 引用闭合审计(`main`/`exports`/`files`/链接/命令行/路径字面量) | 0 悬空 | **0 悬空** |
68
+ | 仓库相对链接 | 52 条 / 0 失效 | **52 条 / 0 失效** |
69
+
70
+ 发布前的复核还做了一次"牵连对象"审计:把 `_oneoff` 里**所有**引用被搬运文件的工具找出来并修正
71
+ (10 个按裸文件名、3 个按绝对路径),其中两个探针原本会**原地改写仓库里的预设源码/守卫脚本**、
72
+ 只在 `finally` 里恢复——被超时杀掉就会留下损坏的文件。它们现在改为**在临时副本上变异**
73
+ (v2/v3 探针走 `V2_PLUGIN` / `V3_PLUGIN` + 临时语料目录),另外两个加了"启动先自愈、退出必校验"。
74
+
75
+ ## 6. 升级
76
+
77
+ ```
78
+ npm i dsh-vibe-math@latest
79
+ ```
80
+
81
+ 无迁移;`off` 档行为、四个 preset 的字节与提示词均未变。
82
+ 若你把本包钉在 profile 里,记得同步那个依赖版本(见 §1),否则下一次启动会把 preset 换回钉住的那一版
83
+ (届时日志会明确告警,不会像以前那样悄悄发生)。