@modusensus/dsh-mneme 0.7.10 → 0.7.11

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 (154) hide show
  1. package/README.en.md +368 -0
  2. package/README.md +298 -169
  3. package/{dsh-mneme/cordis.patch.yml → cordis.patch.yml} +1 -0
  4. package/{dsh-mneme/lib → lib}/api.js +50 -295
  5. package/{dsh-mneme/lib → lib}/client.js +780 -936
  6. package/{dsh-mneme/src → lib}/config.js +6 -100
  7. package/{dsh-mneme/lib → lib}/dream/decisions.js +94 -143
  8. package/{dsh-mneme/lib → lib}/dream/sleep.js +12 -152
  9. package/{dsh-mneme/lib → lib}/dream.js +22 -168
  10. package/{dsh-mneme/src → lib}/hot-memory.js +0 -7
  11. package/{dsh-mneme/lib → lib}/index.js +6 -34
  12. package/{dsh-mneme/lib → lib}/inject.js +11 -53
  13. package/{dsh-mneme/src → lib}/mirror.js +1 -12
  14. package/{dsh-mneme/lib → lib}/quality-filter.js +1 -3
  15. package/{dsh-mneme/lib → lib}/reranker.js +1 -4
  16. package/{dsh-mneme/lib → lib}/service.js +20 -410
  17. package/{dsh-mneme/lib → lib}/settings.js +0 -70
  18. package/{dsh-mneme/lib → lib}/store.js +35 -450
  19. package/{dsh-mneme/lib → lib}/summarize.js +10 -10
  20. package/lib/tools.js +274 -0
  21. package/package.json +41 -19
  22. package/{dsh-mneme/scripts → scripts}/e2e-dsh.js +3 -4
  23. package/{dsh-mneme/scripts → scripts}/sync-lib.js +5 -10
  24. package/{dsh-mneme/src → src}/api.js +50 -295
  25. package/{dsh-mneme/lib → src}/config.js +6 -100
  26. package/{dsh-mneme/src → src}/dream/decisions.js +94 -143
  27. package/{dsh-mneme/src → src}/dream/sleep.js +12 -152
  28. package/{dsh-mneme/src → src}/dream.js +22 -168
  29. package/{dsh-mneme/lib → src}/hot-memory.js +0 -7
  30. package/{dsh-mneme/src → src}/index.js +6 -34
  31. package/{dsh-mneme/src → src}/inject.js +11 -53
  32. package/{dsh-mneme/lib → src}/mirror.js +1 -12
  33. package/{dsh-mneme/src → src}/quality-filter.js +1 -3
  34. package/{dsh-mneme/src → src}/reranker.js +1 -4
  35. package/{dsh-mneme/src → src}/service.js +20 -410
  36. package/{dsh-mneme/src → src}/settings.js +0 -70
  37. package/{dsh-mneme/src → src}/store.js +35 -450
  38. package/{dsh-mneme/src → src}/summarize.js +10 -10
  39. package/src/tools.js +274 -0
  40. package/{dsh-mneme/test → test}/api.test.js +1 -156
  41. package/{dsh-mneme/test → test}/client.test.js +10 -206
  42. package/{dsh-mneme/test → test}/config.test.js +0 -21
  43. package/{dsh-mneme/test → test}/dream.test.js +1 -160
  44. package/{dsh-mneme/test → test}/graph-api.test.js +0 -34
  45. package/{dsh-mneme/test → test}/hot-memory.test.js +0 -29
  46. package/test/inject.test.js +120 -0
  47. package/{dsh-mneme/test → test}/llm-audit.test.js +4 -4
  48. package/{dsh-mneme/test → test}/reasoning-effort.test.js +0 -27
  49. package/{dsh-mneme/test → test}/recall-layer.test.js +5 -26
  50. package/{dsh-mneme/test → test}/reranker.test.js +0 -43
  51. package/{dsh-mneme/test → test}/service-search.test.js +0 -25
  52. package/{dsh-mneme/test → test}/service.test.js +0 -106
  53. package/{dsh-mneme/test → test}/settings.test.js +0 -43
  54. package/{dsh-mneme/test → test}/sleep.test.js +4 -171
  55. package/{dsh-mneme/test → test}/store.test.js +0 -76
  56. package/{dsh-mneme/test → test}/summarize.test.js +16 -15
  57. package/test/tools.test.js +265 -0
  58. package/.github/workflows/publish.yml +0 -58
  59. package/.github/workflows/test.yml +0 -32
  60. package/CHANGELOG.md +0 -91
  61. package/CONTRIBUTING.md +0 -293
  62. package/SECURITY.md +0 -718
  63. package/docs/devlog/2026-08-14-dsh-mneme-dev-log.md +0 -247
  64. package/docs/devlog/2026-08-15-dsh-mneme-audit-stress-dev-log.md +0 -145
  65. package/docs/devlog/2026-08-15-dsh-mneme-pipeline-dev-log.md +0 -56
  66. package/docs/devlog/2026-08-15-dsh-mneme-reflection-dev-log.md +0 -77
  67. package/docs/devlog/2026-08-15-dsh-mneme-review-fixes-dev-log.md +0 -64
  68. package/docs/devlog/2026-08-15-dsh-mneme-semantic-dev-log.md +0 -90
  69. package/dsh-mneme/CHANGELOG.md +0 -419
  70. package/dsh-mneme/LICENSE +0 -21
  71. package/dsh-mneme/README.md +0 -501
  72. package/dsh-mneme/docs/AGENT_MEMORY_RESEARCH.md +0 -183
  73. package/dsh-mneme/docs/ENTITIES.md +0 -245
  74. package/dsh-mneme/docs/LOCAL_MODEL.md +0 -141
  75. package/dsh-mneme/docs/MIGRATION.md +0 -127
  76. package/dsh-mneme/docs/SEMANTIC.md +0 -256
  77. package/dsh-mneme/docs/SLEEP.md +0 -163
  78. package/dsh-mneme/lib/dream/tag-extractor.js +0 -156
  79. package/dsh-mneme/lib/heat.js +0 -136
  80. package/dsh-mneme/lib/parser/tag.js +0 -59
  81. package/dsh-mneme/lib/parser/wiki-link.js +0 -38
  82. package/dsh-mneme/lib/search/tag-boost.js +0 -61
  83. package/dsh-mneme/lib/tools.js +0 -458
  84. package/dsh-mneme/package-lock.json +0 -1936
  85. package/dsh-mneme/package.json +0 -83
  86. package/dsh-mneme/scripts/check-sync.js +0 -42
  87. package/dsh-mneme/src/client.js +0 -2242
  88. package/dsh-mneme/src/dream/tag-extractor.js +0 -156
  89. package/dsh-mneme/src/heat.js +0 -136
  90. package/dsh-mneme/src/parser/tag.js +0 -59
  91. package/dsh-mneme/src/parser/wiki-link.js +0 -38
  92. package/dsh-mneme/src/search/tag-boost.js +0 -61
  93. package/dsh-mneme/src/tools.js +0 -458
  94. package/dsh-mneme/test/boundary-v0625.test.js +0 -82
  95. package/dsh-mneme/test/directory.test.js +0 -134
  96. package/dsh-mneme/test/heat.test.js +0 -148
  97. package/dsh-mneme/test/inject.test.js +0 -206
  98. package/dsh-mneme/test/layered-types-stats.test.js +0 -144
  99. package/dsh-mneme/test/lib-smoke.test.js +0 -109
  100. package/dsh-mneme/test/normalize-decisions.test.js +0 -120
  101. package/dsh-mneme/test/provenance.test.js +0 -103
  102. package/dsh-mneme/test/recall-runs.test.js +0 -93
  103. package/dsh-mneme/test/sleep-heat.test.js +0 -112
  104. package/dsh-mneme/test/tag-boost.test.js +0 -125
  105. package/dsh-mneme/test/tag.test.js +0 -426
  106. package/dsh-mneme/test/tools.test.js +0 -674
  107. package/dsh-mneme/test/updated-at-semantics.test.js +0 -113
  108. package/dsh-mneme/test/wiki-link.test.js +0 -332
  109. package//346/250/252/345/271/205.png +0 -0
  110. /package/{dsh-mneme/lib → lib}/commands.js +0 -0
  111. /package/{dsh-mneme/lib → lib}/dream/clustering.js +0 -0
  112. /package/{dsh-mneme/lib → lib}/embedding.js +0 -0
  113. /package/{dsh-mneme/lib → lib}/entities/extractor.js +0 -0
  114. /package/{dsh-mneme/lib → lib}/local-embedder.js +0 -0
  115. /package/{dsh-mneme/lib → lib}/search/adaptive.js +0 -0
  116. /package/{dsh-mneme/lib → lib}/search/bm25.js +0 -0
  117. /package/{dsh-mneme/lib → lib}/vector-index.js +0 -0
  118. /package/{dsh-mneme/scripts → scripts}/benchmark-embed.js +0 -0
  119. /package/{dsh-mneme/scripts → scripts}/benchmark-recall.js +0 -0
  120. /package/{dsh-mneme/scripts → scripts}/benchmark-rerank.js +0 -0
  121. /package/{dsh-mneme/scripts → scripts}/stress-dsh.js +0 -0
  122. /package/{dsh-mneme/src → src}/commands.js +0 -0
  123. /package/{dsh-mneme/src → src}/dream/clustering.js +0 -0
  124. /package/{dsh-mneme/src → src}/embedding.js +0 -0
  125. /package/{dsh-mneme/src → src}/entities/extractor.js +0 -0
  126. /package/{dsh-mneme/src → src}/local-embedder.js +0 -0
  127. /package/{dsh-mneme/src → src}/search/adaptive.js +0 -0
  128. /package/{dsh-mneme/src → src}/search/bm25.js +0 -0
  129. /package/{dsh-mneme/src → src}/vector-index.js +0 -0
  130. /package/{dsh-mneme/test → test}/audit.test.js +0 -0
  131. /package/{dsh-mneme/test → test}/benchmark.test.js +0 -0
  132. /package/{dsh-mneme/test → test}/clustering.test.js +0 -0
  133. /package/{dsh-mneme/test → test}/commands.test.js +0 -0
  134. /package/{dsh-mneme/test → test}/conflict-freeze.test.js +0 -0
  135. /package/{dsh-mneme/test → test}/entities.test.js +0 -0
  136. /package/{dsh-mneme/test → test}/epistemic.test.js +0 -0
  137. /package/{dsh-mneme/test → test}/fnew-0112.test.js +0 -0
  138. /package/{dsh-mneme/test → test}/fnew-03.test.js +0 -0
  139. /package/{dsh-mneme/test → test}/helpers/dream-mock.js +0 -0
  140. /package/{dsh-mneme/test → test}/local-embedder.test.js +0 -0
  141. /package/{dsh-mneme/test → test}/mirror-dirty.test.js +0 -0
  142. /package/{dsh-mneme/test → test}/mirror-edit-digest.test.js +0 -0
  143. /package/{dsh-mneme/test → test}/mirror-generation.test.js +0 -0
  144. /package/{dsh-mneme/test → test}/mirror.test.js +0 -0
  145. /package/{dsh-mneme/test → test}/peer-blockers.test.js +0 -0
  146. /package/{dsh-mneme/test → test}/policy-epoch.test.js +0 -0
  147. /package/{dsh-mneme/test → test}/quality-filter.test.js +0 -0
  148. /package/{dsh-mneme/test → test}/recall-evals.test.js +0 -0
  149. /package/{dsh-mneme/test → test}/receipt-chain.test.js +0 -0
  150. /package/{dsh-mneme/test → test}/reflection.test.js +0 -0
  151. /package/{dsh-mneme/test → test}/search-fusion.test.js +0 -0
  152. /package/{dsh-mneme/test → test}/semantic.test.js +0 -0
  153. /package/{dsh-mneme/test → test}/stress.test.js +0 -0
  154. /package/{dsh-mneme/test → test}/vector-index.test.js +0 -0
@@ -1,32 +0,0 @@
1
- name: Test
2
-
3
- on:
4
- push:
5
- branches: [master, main]
6
- pull_request:
7
- branches: [master, main]
8
- workflow_dispatch:
9
-
10
- jobs:
11
- test:
12
- runs-on: ubuntu-latest
13
- strategy:
14
- matrix:
15
- node-version: [24]
16
- steps:
17
- - uses: actions/checkout@v4
18
- - uses: actions/setup-node@v4
19
- with:
20
- node-version: ${{ matrix.node-version }}
21
- - name: Install dependencies
22
- working-directory: dsh-mneme
23
- run: npm ci
24
- - name: Run tests
25
- working-directory: dsh-mneme
26
- run: npm run test:coverage
27
- - name: Upload coverage to Codecov
28
- uses: codecov/codecov-action@v4
29
- with:
30
- token: ${{ secrets.CODECOV_TOKEN }}
31
- files: dsh-mneme/coverage/lcov.info
32
- fail_ci_if_error: false
package/CHANGELOG.md DELETED
@@ -1,91 +0,0 @@
1
- # Changelog
2
-
3
- > **完整版本历史见 [dsh-mneme/CHANGELOG.md](dsh-mneme/CHANGELOG.md)**(正式版本正源,0.3.8 → 0.7.9)。以下为仓库早期开发记录(0.1.0–0.2.x,2026-08-13~14,已归档)。
4
-
5
- All notable changes to dsh-mneme are documented here.
6
-
7
- ## [Unreleased]
8
-
9
- - **诚实审计修复(v0.2.7,F-03)**
10
- - autoDream 决策无变更且 summary 为空时,不再误报 ok:true——新增 `noop` 状态(ok:false,baseline 不刷新),避免空跑循环
11
- - 有变更但 summary 缺失 → `degraded`(ok:true 但如实标记 summary 缺失)
12
- - parseReceipt 支持 ok/noop/degraded/reconcile/failed
13
- - 测试 259 → **263**
14
-
15
- - **社区贡献 · 嵌入式面板 UI 改进(PR #2,@Liuxin4950)**
16
- - 记忆面板与设置面板的嵌入模式(settings.section 插槽)不再复用弹窗面板样式(去掉 boxShadow / background / borderRadius / padding),改为全宽平铺渲染,消除 DSH 设置页内多余的悬浮卡片与阴影
17
- - 弹窗(portal)模式保持原有面板样式不变;新增回归测试锁定 embedded 分支不携带 modal chrome
18
-
19
- - **安全审计修复(v0.2.5)**
20
- - 并发安全:CAS 冲突守卫——过期快照不再覆盖并发写入(防丢更新)
21
- - 事务化决策应用:merge/archive 原子提交,receipt 反映已提交子步骤,部分提交 = reconcile(绝不虚报 ok)
22
- - 压测硬断言:lost-update 与多步原子性失败即非零退出(`npm run stress`)
23
- - 运行时人工编辑三方合并(three-way),不再静默覆盖
24
- - 新增 `memory_archive` 工具(第 7 个模型工具)+ `memory_list include_archived`,归档可恢复
25
- - reranker 改为 opt-in:`rerankEnabled=false`、`rerankProvider=none` 默认(裸装不加载 onnxruntime)
26
- - npm `files` 纳入 scripts/test,tarball 内可直接跑压测
27
- - 测试 236 → **258**(+22)
28
-
29
- - **安全加固(v0.2.4)**:API 鉴权 `apiToken`(写操作与密钥端点要求 Bearer 校验)+ `apiKey` 掩码回传 + timing-safe token 比对
30
-
31
- - **审查修复补丁(v0.2.3)**
32
- - failure 记录增加 `before` JSON 快照(title/content/importance 变更可追溯,不只 content)
33
- - vector-index `rebuildIndex` guard 改为检查 `embedSingle`(修复 embed/embedSingle 不一致导致的静默跳过)
34
-
35
- - **流水线补全(v0.2.2)**
36
- - reflection 修复:failure 记录检查 title/importance 变化(不只 content);支持 query 上下文(memory_update 加 `reason` 参数);update 校验失败不污染 claimed;`failure_memories` 清理(`deleteOldFailures` + 启动自动清理 90 天前)
37
- - 专项测试补全:`vector-index.test.js`(modelHash 漂移/重建/增量)+ `service-search.test.js`(hybrid/auto/rerank 端到端)
38
- - api.js `/search` 的 mode 参数文档化
39
- - 测试 212 → **233**
40
-
41
- - **反思更新(v0.2.1)**:`update` 决策 + 失败追踪
42
- - autoDream 新增 `update` 决策类型:修正单条记忆的过时/错误内容(单 id、必须实际变化、非 summary、24h 保护、每次 ≤2)
43
- - 审计记录 update 的 `_before` 快照;update 后向量索引同步
44
- - `failure_memories` 表:记录用户纠正(user_correction)+ 查询/统计接口
45
- - 配置:`reflectionUpdateEnabled` / `reflectionFailureTracking` / `reflectionUpdateMaxPerRun` / `reflectionUpdateMinAgeHours`
46
-
47
- - **Semantic 升级(v0.2.0-semantic)**:完全离线语义记忆引擎
48
- - 本地 Embedding:`embedProvider: local`(ONNX bge-small-zh-v1.5,transformers.js/onnxruntime)或 `ollama`;原 `openai` 外部 API 保留为默认,向后兼容
49
- - 向量索引层:`vector_meta` 模型指纹追踪 + 索引统计(`/api/dsh-mneme/semantic`)
50
- - Rerank 精排:`rerankEnabled`(bge-reranker-base cross-encoder),召回后精排 Top-K,失败自动跳过
51
- - 混合搜索:`memory_search` 新增 `mode: hybrid`(向量优先 + 关键词补位);`auto` 保持关键词优先 + 向量补位
52
- - autoDream 语义增强:K-Means 聚类预分组(k-means++)、`[潜在冲突]` 向量相似度标记、整理后向量索引重建
53
- - 模型下载:断点续传 + 缓存(transformers.js 内置);`.npmrc` 跳过 onnxruntime CUDA 下载避免安装失败
54
- - 文档:`docs/SEMANTIC.md` / `docs/LOCAL_MODEL.md` / `docs/MIGRATION.md` + 基准脚本 `benchmark-embed` / `benchmark-rerank`
55
- - autoDream 裁决审计:每次运行写入 `dream_runs`(输入快照 sha256 digest + 完整输入快照 + LLM 决策清单 + 逐 id 去向 + receipt `dsh-mneme:run:<id>:<status>:<hash>:<count>:<applied>`),可离线回放、定位静默错误
56
- - 幂等决策应用:merge / conflict 重复应用无累积副作用(来源注释不重复追加),防并发/重放下的重复合并
57
- - 三轴线压测 `npm run stress`:长会话检索(Recall@k、陈旧残留率)/ 冲突裁决(可重放仲裁集)/ 多 Agent 并发(丢更新、重复合并、事务/崩溃恢复)
58
-
59
- ## [0.1.6] - 2026-08-14
60
-
61
- - Vector (semantic) search via OpenAI-compatible embeddings endpoint, with automatic fallback to LIKE keyword search on failure
62
- - Web GUI memory panel: browse by type, full-text + semantic search
63
-
64
- ## [0.1.5] - 2026-08-14
65
-
66
- - autoDream consolidation refinements: conflict resolution with source tracking, fail-safe decision validation
67
-
68
- ## [0.1.4] - 2026-08-14
69
-
70
- - User settings: profile + behavior rules injected every turn
71
- - Custom slash commands (register, route to agent)
72
-
73
- ## [0.1.3] - 2026-08-14
74
-
75
- - autoDream background consolidation: dedup / merge / archive / conflict resolution
76
-
77
- ## [0.1.2] - 2026-08-14
78
-
79
- - Session summarization: auto-distill preferences / decisions / lessons at session end
80
- - Web panel improvements
81
-
82
- ## [0.1.1] - 2026-08-13
83
-
84
- - Memory tools: memory_save / memory_search / memory_list / memory_update / memory_delete / memory_forget
85
- - Markdown mirror sync (human-editable, manual edits take priority)
86
-
87
- ## [0.1.0] - 2026-08-13
88
-
89
- - Initial release: cross-session memory for DeepSeek Harness
90
- - SQLite store (node:sqlite, zero native deps) + human-editable Markdown mirror
91
- - Auto-injection of relevant memories at session start
package/CONTRIBUTING.md DELETED
@@ -1,293 +0,0 @@
1
- # Contributing
2
-
3
- > **English** | [中文](#贡献指南)
4
-
5
- ---
6
-
7
- ## Prerequisites
8
-
9
- - **Node.js 24+** (CI runs on Node 24)
10
- - **npm** (the repo uses npm; CI installs with `npm ci`)
11
- - **git** (on Windows, watch LF/CRLF: the repo is LF-normalized and git converts automatically)
12
-
13
- ---
14
-
15
- ## Repository Layout
16
-
17
- The repository root is the publishing manifest; the actual plugin code lives in the `dsh-mneme/` subdirectory:
18
-
19
- ```
20
- dsh-mneme-1/
21
- ├── package.json # npm publishing manifest (main → dsh-mneme/lib/index.js)
22
- ├── README.md / CHANGELOG.md / SECURITY.md
23
- └── dsh-mneme/ # the plugin itself
24
- ├── src/ # source (ESM) — all feature work happens here
25
- ├── lib/ # build output; DSH actually loads lib/index.js
26
- ├── scripts/ # sync-lib.js, check-sync.js, e2e-dsh.js, stress-dsh.js, benchmark-*
27
- ├── test/ # node:test test suite
28
- ├── docs/ # SEMANTIC / SLEEP / ENTITIES / MIGRATION deep-dives
29
- ├── package.json # plugin metadata and scripts
30
- └── cordis.patch.yml # DSH injection patch
31
- ```
32
-
33
- **Key convention: `src/` is the single source of truth; `lib/` is build output.**
34
-
35
- - Write code only in `src/`, then run `npm run sync` to mirror changes into `lib/`.
36
- - **Never edit `lib/` by hand** — the next sync overwrites it.
37
- - Publish from the **repo root**: root `prepack` runs `scripts/check-sync.js`, which asserts `src/` ↔ `lib/` match file-for-file and fails the publish on any drift (issue #65). So run `npm run sync` (in `dsh-mneme/`) and commit the `lib/` changes **before** publishing.
38
-
39
- ---
40
-
41
- ## Local Development
42
-
43
- ```bash
44
- # 1. Install dependencies (inside dsh-mneme/)
45
- cd dsh-mneme
46
- npm ci
47
-
48
- # 2. After editing files under src/, mirror to lib/
49
- npm run sync
50
-
51
- # 3. Run the tests
52
- npm test # node --test test/*.test.js
53
- npm run test:coverage # c8 coverage
54
- ```
55
-
56
- Common scripts (all run under `dsh-mneme/`):
57
-
58
- | Command | Description |
59
- |---------|-------------|
60
- | `npm test` | Full unit/integration suite |
61
- | `npm run test:coverage` | Tests + c8 coverage (used by CI) |
62
- | `npm run e2e` | End-to-end smoke test (scripts/e2e-dsh.js) |
63
- | `npm run stress` | Three-axis stress test (scripts/stress-dsh.js) |
64
- | `npm run sync` | src/ → lib/ mirror |
65
-
66
- ---
67
-
68
- ## Testing Conventions
69
-
70
- - Tests use Node's built-in **`node:test` + `node:assert/strict`**; no third-party test framework.
71
- - New features require corresponding tests; **changing core logic (e.g. model routing, decision validation) must update the affected test assertions** so the suite stays green before committing.
72
- - Test files live in `test/`, named `*.test.js`; shared mocks go in `test/helpers/` (e.g. `dream-mock.js`).
73
- - Known environment dependency: a few cases in `reranker.test.js` need `@huggingface/transformers` (locally this one case fails without the package; it is unrelated to repo logic and CI installs it and passes).
74
- - The published artifact is covered too: `test/lib-smoke.test.js` imports from `lib/` and asserts `src/` ↔ `lib/` are file-for-file identical (issue #65 regression guard).
75
-
76
- ---
77
-
78
- ## Code Style & Engineering Conventions
79
-
80
- - **ESM**: the repo is `"type": "module"`; everything uses `import`/`export`.
81
- - **Comments in Chinese**, biased toward "why" — core logic, config options, and fail-safe branches must explain their intent.
82
- - **Fail-safe is a hard rule**: local failures in any background LLM path (autoDream / sleep / autoTag / summarization) must skip or degrade, **never** block the main flow (write, recall, injection).
83
- - **Config is defined centrally with schemastery in `src/config.js`** (`z.object` + `.default(...)`); new options must keep docs and default-value semantics in sync.
84
- - **Audit honesty**: a run's status (ok / noop / degraded / reconcile / failed) must reflect what actually committed — never a fake ok.
85
-
86
- ---
87
-
88
- ## Commits & Branches
89
-
90
- - Commit messages follow **Conventional Commits**:
91
-
92
- ```
93
- fix(dream): reject cross-type merge as a whole batch (Issue #26)
94
- feat(tag): add tag-weighted recall
95
- docs: expand the SEMANTIC doc
96
- release: v0.6.9 ...
97
- ```
98
-
99
- - Run `npm test` before committing and confirm green (note any environment-only known exceptions in the commit message).
100
- - **Small fixes**: can push straight to `main` (this is the project's workflow).
101
- - **Larger features / breaking changes**: open an Issue first to state the motivation and design, then submit a PR — the PR triggers CI (Node 24 + full suite + Codecov).
102
- - Release operations (version bumps, tags, Releases, npm publish) are performed by maintainers — see the next section.
103
-
104
- ---
105
-
106
- ## Scope: Platform Adaptation & Wrapper PRs
107
-
108
- DSH upstream is still in developer preview — APIs and service interfaces change frequently. Until DSH reaches a stable release (RC or GA), **PRs that adapt dsh-mneme to secondary platforms or wrap it into other hosts are not a priority** and are reviewed with extra caution:
109
-
110
- - Desktop shells (e.g. a Tauri/Electron wrapper around `dsh web`)
111
- - Standalone CLI packaging
112
- - Ports/wrappers of dsh-mneme into other plugin ecosystems
113
-
114
- These tend to bind against unstable upstream APIs: a single upstream change can break them, and the maintenance burden falls back on this project. The currently supported platform is the **Web Profile** (`dsh web`).
115
-
116
- Exceptions: if a contributor is willing to **own long-term maintenance** (track upstream changes and fix breakage), open a Discussion first to scope the work — maintainers will evaluate and review the PR.
117
-
118
- Bug-fix PRs for existing desktop compatibility issues are still welcome.
119
-
120
- ---
121
-
122
- ## Release Process (Maintainers)
123
-
124
- Versioning follows semantic versioning (`MAJOR.MINOR.PATCH`). Full flow:
125
-
126
- 1. **Update CHANGELOG**: add a version entry (`## [X.Y.Z] - date`, split into 「修复 / 新增 / 测试」) at the top of `dsh-mneme/CHANGELOG.md`; update the root `CHANGELOG.md` if it tracks the same.
127
- 2. **Bump version**: change `version` in `dsh-mneme/package.json` and `package-lock.json`; the root `package.json` is synced automatically by the `prepublishOnly` hook — no manual edit.
128
- 3. **Full test pass**: `npm test` must be green.
129
- 4. **Commit and push**: commit → `git push origin main` → `git tag vX.Y.Z` → `git push origin vX.Y.Z`.
130
- 5. **Create a GitHub Release**: title `vX.Y.Z`, body referencing the matching CHANGELOG entry (review before publishing).
131
- 6. **Publish to npm**: run `npm publish` from the **repository root** (`prepublishOnly` copies the version from `dsh-mneme/package.json` into the root `package.json`; `prepack` runs `scripts/check-sync.js` and fails if `src/` ↔ `lib/` drifted — ensure `npm run sync` + commit ran first).
132
-
133
- ---
134
-
135
- ## Contact
136
-
137
- - **General questions & contributions**: [GitHub Discussions](https://github.com/modusensus/dsh-mneme/discussions) or `work@modusensus.space`
138
- - **Security vulnerabilities**: report privately via [SECURITY.md](SECURITY.md) — never open a public issue for vulnerabilities
139
-
140
- ---
141
-
142
- ## Miscellaneous
143
-
144
- - Security issues go through [SECURITY.md](SECURITY.md) or a GitHub Security Advisory — never paste sensitive info into a public Issue.
145
- - Be respectful and constructive; PRs touching data integrity, security, or behavior must include reproduction steps and regression evidence.
146
-
147
- ---
148
-
149
- # 贡献指南
150
-
151
- > **中文** | [English](#contributing)
152
-
153
- ---
154
-
155
- ## 环境要求
156
-
157
- - **Node.js 24+**(CI 在 node 24 上运行)
158
- - **npm**(仓库使用 npm,CI 用 `npm ci`)
159
- - **git**(Windows 下注意 LF/CRLF:仓库以 LF 为准,git 会自动转换)
160
-
161
- ---
162
-
163
- ## 代码库布局
164
-
165
- 仓库根目录是发布清单,实际插件代码在 `dsh-mneme/` 子目录:
166
-
167
- ```
168
- dsh-mneme-1/
169
- ├── package.json # npm 包发布清单(main 指向 dsh-mneme/lib/index.js)
170
- ├── README.md / CHANGELOG.md / SECURITY.md
171
- └── dsh-mneme/ # 插件本体
172
- ├── src/ # 源码(ESM),所有功能都在这里开发
173
- ├── lib/ # 构建产物,DSH 实际加载的是 lib/index.js
174
- ├── scripts/ # sync-lib.js、check-sync.js、e2e-dsh.js、stress-dsh.js、benchmark-*
175
- ├── test/ # node:test 测试
176
- ├── docs/ # SEMANTIC / SLEEP / ENTITIES / MIGRATION 等专题文档
177
- ├── package.json # 插件包元数据与 scripts
178
- └── cordis.patch.yml # DSH 注入补丁
179
- ```
180
-
181
- **关键约定:`src/` 是唯一的事实来源,`lib/` 是构建产物。**
182
-
183
- - 所有代码改动只写 `src/`,改完必须运行 `npm run sync` 同步到 `lib/`。
184
- - **不要手工编辑 `lib/`**——下次 sync 会覆盖你的改动。
185
- - 发布在**仓库根**执行:root `prepack` 会跑 `scripts/check-sync.js`,逐文件断言 `src/` ↔ `lib/` 一致,有漂移直接发布失败(issue #65 教训)。所以发布前务必先在 `dsh-mneme/` 里跑 `npm run sync` 并把 `lib/` 改动一起提交。
186
-
187
- ---
188
-
189
- ## 本地开发
190
-
191
- ```bash
192
- # 1. 安装依赖(在 dsh-mneme/ 目录内)
193
- cd dsh-mneme
194
- npm ci
195
-
196
- # 2. 修改 src/ 下的文件后,同步到 lib/
197
- npm run sync
198
-
199
- # 3. 跑测试
200
- npm test # node --test test/*.test.js
201
- npm run test:coverage # c8 覆盖率
202
- ```
203
-
204
- 常用脚本(均在 `dsh-mneme/` 下):
205
-
206
- | 命令 | 说明 |
207
- |------|------|
208
- | `npm test` | 全量单元/集成测试 |
209
- | `npm run test:coverage` | 测试 + c8 覆盖率(CI 使用) |
210
- | `npm run e2e` | 端到端冒烟(scripts/e2e-dsh.js) |
211
- | `npm run stress` | 三轴线压测(scripts/stress-dsh.js) |
212
- | `npm run sync` | src/ → lib/ 同步 |
213
-
214
- ---
215
-
216
- ## 测试约定
217
-
218
- - 测试框架为 Node 内置 **`node:test` + `node:assert/strict`**,不引入第三方测试库。
219
- - 新增功能必须有对应测试;**修改核心逻辑(如模型路由、决策校验)时必须同步更新受影响用例的断言**,保证全量测试通过后提交。
220
- - 测试文件放在 `test/`,命名 `*.test.js`;共享 mock 放 `test/helpers/`(如 `dream-mock.js`)。
221
- - 已知环境依赖:`reranker.test.js` 的个别用例需要 `@huggingface/transformers`(本地未安装该包时这 1 例会失败,与本仓库逻辑无关,CI 会正常安装并通过)。
222
- - 发布产物也被覆盖:`test/lib-smoke.test.js` 从 `lib/` 直接导入复跑关键用例,并断言 src↔lib 逐文件一致(issue #65 防再犯)。
223
-
224
- ---
225
-
226
- ## 代码风格与工程约定
227
-
228
- - **ESM**:仓库 `"type": "module"`,全部使用 `import`/`export`。
229
- - **注释用中文**,且偏向"解释为什么"——核心逻辑、配置项、fail-safe 分支都要求写清意图。
230
- - **fail-safe 是硬性约定**:所有后台 LLM 链路(autoDream / sleep / autoTag / 摘要)中的局部失败只能跳过或降级,**绝不能**阻断主流程(写入、检索、注入)。
231
- - **配置项统一用 schemastery 定义在 `src/config.js`**(`z.object` + `.default(...)`),新增配置记得同步文档与默认值语义。
232
- - **审计诚实性**:任何 run 的状态(ok / noop / degraded / reconcile / failed)必须反映真实提交结果,绝不虚报。
233
-
234
- ---
235
-
236
- ## 提交与分支
237
-
238
- - 提交信息遵循 **Conventional Commits**:
239
-
240
- ```
241
- fix(dream): 修复跨类型 merge 整单拒绝(Issue #26)
242
- feat(tag): 新增标签加权召回
243
- docs: 补充 SEMANTIC 文档
244
- release: v0.6.9 ...
245
- ```
246
-
247
- - 提交前跑一遍 `npm test` 确认全绿(环境相关的已知例外需在提交说明里注明)。
248
- - **小改动 / 修复**:可直推 `main`(本项目采用此工作流)。
249
- - **较大功能 / 破坏性改动**:建议先开 Issue 说明动机与方案,再通过 PR 提交,PR 会触发 CI 校验(node 24 + 全量测试 + Codecov)。
250
- - 发布相关操作(改版本号、打 tag、发 Release、npm publish)由维护者执行,详见下节。
251
-
252
- ---
253
-
254
- ## 范围:平台适配与封装 PR
255
-
256
- DSH 上游仍处于 developer preview 阶段,API 与服务接口变动频繁。在 DSH 稳定(RC 或正式版)之前,以下方向的 PR **不作为优先项**,且会以额外谨慎的态度审查:
257
-
258
- - 桌面端适配(例如基于 `dsh web` 的 Tauri/Electron 桌面壳)
259
- - 独立 CLI 封装
260
- - 把 dsh-mneme 移植/封装到其他插件体系
261
-
262
- 这类 PR 往往绑定不稳定的上游接口——上游一次变动就可能使其失效,而维护责任会落到本项目头上。当前唯一受支持的平台是 **Web Profile**(`dsh web`)。
263
-
264
- 例外:如果贡献者愿意**承担长期维护**(跟进上游变更并修复 break),请先开 Discussion 沟通范围,维护者会评估并 review 该 PR。
265
-
266
- 针对现有 desktop 兼容问题的 **bug 修复 PR 依然欢迎**。
267
-
268
- ---
269
-
270
- ## 发布流程(维护者)
271
-
272
- 版本号遵循语义化版本(`MAJOR.MINOR.PATCH`)。完整流程:
273
-
274
- 1. **更新 CHANGELOG**:在 `dsh-mneme/CHANGELOG.md` 顶部新增版本条目(`## [X.Y.Z] - 日期`,分「修复 / 新增 / 测试」小节),根目录 `CHANGELOG.md` 如涉及同步更新。
275
- 2. **更新版本号**:改 `dsh-mneme/package.json` 的 `version` 与 `package-lock.json`;根目录 `package.json` 由 `prepublishOnly` 钩子自动同步,无需手改。
276
- 3. **全量测试**:`npm test` 确认通过。
277
- 4. **提交并推送**:commit → `git push origin main` → `git tag vX.Y.Z` → `git push origin vX.Y.Z`。
278
- 5. **创建 GitHub Release**:标题为 `vX.Y.Z`,正文引用 CHANGELOG 对应条目(发布前需人工过目)。
279
- 6. **发布 npm**:在**仓库根目录**执行 `npm publish`(`prepublishOnly` 会自动把 `dsh-mneme/package.json` 的版本号写入根 `package.json`,`prepack` 会跑 `scripts/check-sync.js` 校验 src↔lib 一致性,漂移则发布失败——发布前须先 `npm run sync` 并提交 `lib/` 改动)。
280
-
281
- ---
282
-
283
- ## 联系方式
284
-
285
- - **一般问题与贡献咨询**:[GitHub Discussions](https://github.com/modusensus/dsh-mneme/discussions) 或 `work@modusensus.space`
286
- - **安全漏洞**:请通过 [SECURITY.md](SECURITY.md) 私有提交,不要在公开 Issue 中提交漏洞
287
-
288
- ---
289
-
290
- ## 其他
291
-
292
- - 安全问题请走 [SECURITY.md](SECURITY.md) 或 GitHub Security Advisory,不要在公开 Issue 贴敏感信息。
293
- - 保持礼貌与建设性;涉及数据损坏 / 安全 / 破坏性改动的 PR 需附复现步骤与回归证据。