@neus117/dsh-anchor 0.6.0 → 0.6.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.
Files changed (3) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +48 -84
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # 变更记录
2
2
 
3
+ ## 0.6.1 — 2026-11-06
4
+
5
+ **文档**
6
+
7
+ - README 重写:按「能做什么 / 锚点长什么样 / 安装 / 写到哪 / 填的时候 / 边界」组织,去掉开发过程与内部实现细节。
8
+
3
9
  ## 0.6.0 — 2026-11-06
4
10
 
5
11
  锚点系统合并成一个包(前身:`dsh-anchor-inject` 0.4.0 + `dsh-anchor-form` 0.1.0)。
package/README.md CHANGED
@@ -1,113 +1,77 @@
1
1
  # dsh-anchor
2
2
 
3
- 锚点系统只有一个插件,两个半边共用同一个锚点文件:
3
+ 上下文被压缩后,把你自己写的「锚点」重新塞回模型的上下文;三行「下一步」还可以在会话里用表单让人填。
4
4
 
5
- | 半边 | 做什么 | 开关 |
6
- |---|---|---|
7
- | **注入** | 会话出现 `compaction/end` 后,把锚点原文追加回上下文(`user/message`,`source.kind=runtime-context`) | `inject.enabled` |
8
- | **表单** | 工具 `anchor_form`:让**人在会话里**填三行(做什么 / 为什么 / 还没验证 / 问我),写回同一份锚点 | `form.enabled` |
5
+ ## 它能做什么
9
6
 
10
- 2026-11-06 合并自 `dsh-anchor-inject` 0.4.0 + `dsh-anchor-form` 0.1.0。
11
-
12
- ## 为什么合并
13
-
14
- 两个包各有一份 `writeJudgment`,`$&` 那个写盘 bug 只长在其中一份里(另一份是安全的);两份 `anchorFile`
15
- 配置还可以指向不同文件,于是"人填的"喂不到"压缩后读取的"。合并后:写盘规则、锚点路径解析、三行文案、
16
- 配置都只有一份,**表单和注入在结构上就不可能写到不同文件**。
17
-
18
- ## 配置
19
-
20
- ```yaml
21
- - id: dsh-anchor
22
- name: dsh-anchor
23
- config:
24
- anchorFile: '' # 留空 = 按会话分文件
25
- anchorDir: 'D:\Coding\DeepSeek 开发经验\projects\anchors' # <cwd目录名>\<会话短id>-anchor.md
26
-
27
- createIfMissing: true
28
- maxChars: 6000
29
- protectedFiles: []
30
- traceFile: ''
31
- inject:
32
- enabled: true
33
- onceSession: ''
34
- onceOnLoad: false
35
- judge: { enabled: true, mode: model, minIntervalMs: 1800000 }
36
- form:
37
- enabled: true
38
- intro: ''
39
- ```
40
-
41
- | 字段 | 作用 |
7
+ | 注入 | 表单 |
42
8
  |---|---|
43
- | `anchorFile` | 显式锚点(存在就用它)。留空则**按会话分**:`<anchorDir>\<cwd目录名>\<会话短id>-anchor.md`——用户的会话 cwd 全是 `D:\Coding\workspace`,按 cwd 分不开项目,按会话分是确定性上界。**表单与注入走同一个解析函数**。 |
44
- | `anchorDir` / `createIfMissing` / `maxChars` | 锚点根目录、缺文件自动落骨架(表单首次使用也会落)、注入上限。 |
45
- | `protectedFiles` | 这些路径拒写(例如"测试不许碰正式锚点")。 |
46
- | `traceFile` | 填路径就记 apply / 注入 / 提问 / 写入状态;留空完全不写盘。**排查先看它**。 |
47
- | `inject.*` | 注入半边:`judge.mode=model` 让模型补三行;`ask` 在宿主侧不可用(见下);`onceOnLoad` 是测试通道。 |
48
- | `form.*` | 表单半边:`intro` 是第一栏开头的说明句,写 `''` 关掉。 |
9
+ | 每次上下文压缩后,自动把锚点文件原文追加回上下文,并声明「这不是用户指令」 | 智能体调 `anchor_form` 时,弹出四个空——**做什么 / 为什么 / 还没验证 / 问我** |
10
+ | 触发:`compaction/end` | 触发:智能体主动调用 |
11
+ | 开关:`inject.enabled` | 开关:`form.enabled` |
49
12
 
50
- ## 表单怎么引导人填对
13
+ 压缩能保住事实,保不住判断。判断得由人写——表单就是把「让人写」搬进会话里;写回的文件和压缩后注入的是**同一个**。
51
14
 
52
- 1. **每个空都写清怎么填 + 合格/不合格例子**;
53
- 2. **可点候选**:取本会话最近两条真实原话、最近两条失败调用做成选项。label 只负责指路
54
- (`刚才说的第 1 条` / `上一轮报错 1`),原文在说明里,**选中后写进锚点的是完整原文**;
55
- 3. **打回重填**:`做什么` 只写「继续推进」这类通用动词、或 `为什么` 不带判据 → 打回一次,
56
- 卡片上写明打回理由;仍不合格才放行(`why` 追加 `[判据缺失]`);
57
- 4. **初见说明**:第一栏开头说明「压缩后我只看得见这个文件」,`form.intro` 可覆盖。
15
+ ## 锚点长什么样
58
16
 
59
- ## 写入规则(只有一个实现)
17
+ 一份普通 Markdown,关键是这三行:
60
18
 
61
- 只改 `## 下一步` 段:`[待填]` 空位 → 原位替换;已有 `- 做什么:` 行 → 原位更新;手写锚点 → 插在标题之后。
62
- 替换值一律走函数形式(否则 `$&` 会被当成模板吃掉)。这个形状 `anchor-gen.ps1 -Refresh` 认得、会保留。
19
+ ```markdown
20
+ ## 下一步(做什么 + 为什么)
21
+ - 做什么:把 anchor_form 挂进预设并调一次验收
22
+ - 为什么:跑 test\run.mjs 得到 34 passed
23
+ - 还没验证:真实压缩后的注入还没触发过
24
+ ```
63
25
 
64
- ## 压缩注入长什么样
26
+ 只改 `## 下一步` 段:有 `[待填]` 空位就原位替换,已有这三行就原位更新,手写锚点则插在标题之后——其它段一个字节不动。
65
27
 
66
- `<system-reminder>` + 说明「这不是用户指令」+ 来源与写入时间 + 锚点原文 + 「与当前窗口冲突时以窗口为准」。
67
- 判断段还是空位时,额外指路:**调 `anchor_form` 让用户填,不要自己编**,并点出本文件路径让它核对配置。
28
+ ## 安装
68
29
 
69
- ## 为什么 `judge.mode = ask` 不可用
30
+ ```powershell
31
+ npm i @neus117/dsh-anchor
32
+ ```
70
33
 
71
- 宿主根插件调 `ctx.userQuestions.ask` 拿不到合法的 agent 载体(活 agent 对象 / 不传 / `{id}` 占位,三种实测全失败)。
72
- 工具执行上下文里的 `exec.agent` 才是唯一入口——所以问人这件事只存在于 `anchor_form` 里。
34
+ 挂载一行即可(两个半边可以分别关):
73
35
 
74
- ## 客户端半边
36
+ ```yaml
37
+ - id: dsh-anchor
38
+ name: '@neus117/dsh-anchor'
39
+ config:
40
+ anchorFile: '' # 留空 = 按会话分文件
41
+ anchorDir: 'D:\Coding\DeepSeek 开发经验\projects\anchors'
42
+ inject: { enabled: true }
43
+ form: { enabled: true }
44
+ ```
75
45
 
76
- 只做一件事:**题的说明文字**改成次级色。内置卡片里选项说明有 `tertiary`,题的说明(`.wnLwla_detail`)没有 `color`。
46
+ ## 锚点写到哪
77
47
 
78
- ```css
79
- .wnLwla_card .wnLwla_detail, .wnLwla_detail,
80
- .wnLwla_card .wnLwla_detail *, .wnLwla_detail * { /* 文字在更深的自带颜色的元素里 */
81
- color: var(--dsw-alias-label-tertiary) !important; /* 强制:内置样式会压过普通声明 */
82
- }
83
- .wnLwla_card .wnLwla_detail, .wnLwla_detail {
84
- margin-top: 8px !important; /* 与标题之间再拉开一点;左右沿用内置 24px */
85
- }
86
- ```
48
+ - `anchorFile` 留空时按会话分:`<anchorDir>\<工作目录名>\<会话短id>-anchor.md`,**任何会话都不会读到别的项目的锚点**。
49
+ - 文件不存在时自动落一份模板骨架(表单第一次用也会落)。
50
+ - 想固定一份共享锚点:把 `anchorFile` 写成那个路径。
87
51
 
88
- 三条踩过的坑:
52
+ ## 填的时候
89
53
 
90
- - **注入必须在 factory 执行时做,不能放在 `apply(ctx)` 的 `ctx.effect` 里**:客户端 API 一有差异就静默失败,
91
- 页面上看不出任何异常(2026-11-06 连试三次都"改了没反应")。
92
- - **验证只能看页面,用二元探针**:`outline: 2px solid red !important` → 问"有没有红框"。
93
- 有红框=模块加载+选择器命中;没红框=模块没进页面。别用"CSS 文件里写了什么"当证据。
94
- - 类名带构建期 hash(`wnLwla_`),升级后选择器失效会退回原样;`test/compat.mjs` 每次升级后跑一次。
95
- - **factory id 必须等于包名 `dsh-anchor`**(2026-11-06 曾因写成别的名字触发 web boot 致命失败)。
54
+ - **可点候选**:本会话最近两条原话、最近两条失败调用做成选项,选中就写入完整原文。
55
+ - **打回重填**:「做什么」只写「继续推进」这类通用动词、或「为什么」不带判据 → 打回一次,卡片上写明理由。
56
+ - **第四栏「问我」**:写的话不写进锚点,原样回到会话,智能体按问题范围翻历史回答。
57
+ - 判断段还空着时,压缩注入里会指路「调 `anchor_form` 让用户填,别自己编」。
96
58
 
97
59
  ## 边界
98
60
 
61
+ - 问人只在**工具执行上下文**里成立;宿主侧拿不到可用的 agent 载体,所以没有"自动弹表单"。
99
62
  - `ask` 没有超时:没人回答就一直等,直到会话结束。
100
- - 一次调用最多 5 张卡(4 栏 + 2 次打回)。
101
- - 候选来自会话末尾 2 条原话 / 2 条失败调用,不是"总结"。
102
- - 注入只在 `compaction/end` 后发生一次;压缩失败也会发这个事件(验收时别把"失败也注入"当成"压缩成功")。
63
+ - 一次调用最多 5 张卡(4 栏 + 最多 2 次打回)。
64
+ - 压缩失败也会发 `compaction/end`——注入发生了不等于压缩成功了。
103
65
 
104
66
  ## 开发
105
67
 
106
68
  ```powershell
107
69
  $env:ELECTRON_RUN_AS_NODE=1
108
70
  $exe = "D:\Coding\DeepSeek Harness\DeepSeek Harness.exe"
109
- & $exe "D:\Coding\dsh-plugins\dsh-anchor\test\run.mjs" # 表单/写盘 30
110
- & $exe "D:\Coding\dsh-plugins\dsh-anchor\test\inject.mjs" # 注入/判断层/指路 35
111
- & $exe "D:\Coding\dsh-plugins\dsh-anchor\test\client.mjs" # 客户端半边 5
112
- & $exe "D:\Coding\dsh-plugins\dsh-anchor\test\compat.mjs" # 升级自检 5(钉死宿主内部标识)
71
+ & $exe "…\dsh-anchor\test\run.mjs" # 表单 / 写盘 / 健壮性
72
+ & $exe "…\dsh-anchor\test\inject.mjs" # 注入 / 判断层 / 指路
73
+ & $exe "…\dsh-anchor\test\client.mjs" # 客户端半边
74
+ & $exe "…\dsh-anchor\test\compat.mjs" # 升级自检:钉死宿主内部标识
113
75
  ```
76
+
77
+ 变更记录见 [CHANGELOG.md](./CHANGELOG.md)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neus117/dsh-anchor",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Anchor system in one plugin: re-inject your anchor after a context compaction, and let the user fill its three next-step lines from inside the session.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",