@xia-sc/dsh-cc-studio 0.11.0 → 0.11.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.
package/README.md CHANGED
@@ -14,7 +14,7 @@ DSH(DeepSeek Harness)插件:输入框上方的胶囊 → 全屏融合工
14
14
 
15
15
  | 项目 | 值 |
16
16
  | --- | --- |
17
- | 包名 / 版本 | `@xia-sc/dsh-cc-studio` `0.11.0` |
17
+ | 包名 / 版本 | `@xia-sc/dsh-cc-studio` `0.11.1` |
18
18
  | 兼容 | DSH `>=0.4.5-rc.4`(含**桌面版**)、Node `>=22`、**零运行依赖**;逐版本实测见 [兼容与权限](#兼容与权限) |
19
19
  | 落盘位置 | `<DSH_HOME>/cc-library/`(角色卡)、`<DSH_HOME>/cc-drafts/`(会话草稿;LLM 创作锁 `.lock.json` 与覆盖前备份 `backups/` 也在这里);`DSH_HOME` 默认 `~/.dsh`,旧位置仍读得到 |
20
20
  | 文档 | 用户文档=本文件;改代码前必读 [AGENTS.md](./AGENTS.md);完整历史 [CHANGELOG.md](./CHANGELOG.md) |
@@ -42,7 +42,7 @@ DSH(DeepSeek Harness)插件:输入框上方的胶囊 → 全屏融合工
42
42
  dsh --profile <profile> --dump-config
43
43
  期望在 `# == @xia-sc/dsh-cc-studio` 那一层下看到两行:`id: dsh-cc-studio`(宿主行)与 `id: preset-cc`(CC 预设行)。
44
44
  4. 告诉用户重启:宿主行只在启动时组合 —— CLI 重启 `dsh web`,桌面版退出并重新打开应用。
45
- 5. 重启后可选自检:在「CC 模式」会话里调任意一个 cc_* 工具,返回里带 "build": "0.11.0" 即说明新代码已加载
45
+ 5. 重启后可选自检:在「CC 模式」会话里调任意一个 cc_* 工具,返回里带 "build": "0.11.1" 即说明新代码已加载
46
46
  (这也是判断「改了但没重启」的唯一可靠依据)。
47
47
  6. 不要做的事:
48
48
  - 不要手工把 presets/ 拷进 ~/.dsh/.agent-presets/(dsh >= 0.4.7-alpha.4 已不读该目录,拷了也不生效);
@@ -58,9 +58,9 @@ DSH(DeepSeek Harness)插件:输入框上方的胶囊 → 全屏融合工
58
58
  ```bash
59
59
  # 从 npm 安装(推荐)
60
60
  dsh plugin --profile web add @xia-sc/dsh-cc-studio
61
- dsh plugin --profile web add @xia-sc/dsh-cc-studio@0.11.0 # 锁定版本
61
+ dsh plugin --profile web add @xia-sc/dsh-cc-studio@0.11.1 # 锁定版本
62
62
 
63
- # 从 GitHub 源安装(可加 #v0.11.0 / #master 指定 tag / 分支)
63
+ # 从 GitHub 源安装(可加 #v0.11.1 / #master 指定 tag / 分支)
64
64
  dsh plugin --profile web add github:xia-sc/dsh-cc-studio
65
65
 
66
66
  # 从本地仓库安装(开发 / 调试):装出来是 link:,改 lib/*.js 重启即生效
@@ -180,8 +180,8 @@ dsh plugin --profile web remove @xia-sc/dsh-cc-studio # 卸载(同时移
180
180
  ## 开发与测试
181
181
 
182
182
  ```bash
183
- npm test # 24 个文件、959 项断言,全绿才算过
184
- node tests/tools-contract.test.mjs # 只跑 CC 工具链契约(113 项)
183
+ npm test # 24 个文件、987 项断言,全绿才算过
184
+ node tests/tools-contract.test.mjs # 只跑 CC 工具链契约(125 项)
185
185
  node tests/group-layer-guard.test.mjs # 只跑卡组层的耦合守卫(16 项)
186
186
  ```
187
187
 
@@ -192,6 +192,8 @@ node tests/group-layer-guard.test.mjs # 只跑卡组层的耦合守卫(1
192
192
 
193
193
  完整历史见 [CHANGELOG.md](./CHANGELOG.md)。最近几版大多是「另一个 LLM 以工具使用者身份跑回归」挖出来的问题:
194
194
 
195
+ - `0.11.1` **CC 预设对齐 dsh `0.2.1-rc.2` 内置 `standard`**:修掉 `tool-ralph` 漏抄 `disabled`(CC 模式一直多挂一个实验性长循环工具)、`skill-filesystem` / `tool-skill` 被误关(模型没有技能目录与加载器)、以及 `backgroundMode` 等已下线的配置键;补 `time-context`、`tool-web` 的 `fetch` 改回 `true`。`dshReleases` 补 `0.2.1-rc.2`(npm `dsh web` 隔离环境实测)。测试补 CHARX 导入全链路与「按 id 改世界书条目」的回归 → **987 项**。**重启 dsh(桌面端重启应用)生效**。
196
+
195
197
  - `0.11.0` **新增 LLM 草稿锁(读写分离)**:LLM 创作期间工坊只读、载入/导入只进只读预览,不再覆盖未保存草稿;`cc_release_draft` 交还编辑权,锁 30 分钟无写入自动失效,设置页可关闭。**修复**:角色卡完成后主动交还锁(persona / `cc_validate` / 首次上锁三处引导)、客户端草稿来源 id 恢复失效;覆盖型载入/导入前自动备份到 `cc-drafts/backups/`。测试 864 → **959 项**。详细见 [CHANGELOG](./CHANGELOG.md)。
196
198
 
197
199
  - `0.10.3` **多行文本被写成字面 `\n`**:用户实机报告(六步全链路 `valid: true`)发现经 `cc_patch_character` / `cc_patch_greetings` / `cc_patch_world` 写入的字符串,换行全部落盘成字面 `\` + `n`,导进 SillyTavern 显示成「说完这句话。\n\n下一段」。取证推翻了「工具多转义」的猜测:工具层往返测试证明真换行原样保留;会话日志里模型 18 次调用有 6 次在 JSON 里把换行写成 `\\n`(多转义一层),而 `alternate_greetings` / lorebook 却写对了 —— 是**模型输出不一致**。修法:写类工具统一 `textArg()` 解码字面 `\n` / `\r` / `\t`(多层转义最多 4 轮收敛),覆盖角色 / 问候语 / 世界书条目 / 书级元信息 / 共享书;工坊保存与导入路径不动。顺带修报告 P2(卡内 `token_budget` 默认 1200 → **2400**)与 P4(autoLorebook 的「力量体系」条目裸 `@@activate` → `@@activate 100`)。测试 858 → **864 项**。**重启 dsh 生效**;已存卡里已写坏的字段需重写。
package/lib/agent.js CHANGED
@@ -23,7 +23,7 @@ const name = "dsh-cc-studio-agent";
23
23
  // 由来:第五轮实测里测试者第一遍跑出「四项全无变化」,其实只是**没重启 dsh** —— LLM 侧完全无法
24
24
  // 分辨「代码没改」和「改了但没加载」。有了这个字段,任何一次调用都能先确认自己测的是哪一版。
25
25
  // 发版时与 package.json 的 version 同步。
26
- const BUILD = "0.11.0";
26
+ const BUILD = "0.11.1";
27
27
  const inject = ["tools", "agents"];
28
28
 
29
29
  function nowSec(){ return Math.floor(Date.now()/1000); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xia-sc/dsh-cc-studio",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
4
4
  "description": "CCv3 角色卡工坊:融合工坊 + CC 模式 + JSON/PNG/CHARX + 中英双语(跟随全局)",
5
5
  "keywords": [
6
6
  "dsh",
@@ -65,7 +65,8 @@
65
65
  "0.1.6-alpha.2": "compatible",
66
66
  "0.1.7-alpha.1": "compatible",
67
67
  "0.1.7-rc.1": "compatible",
68
- "0.2.0-rc.2": "compatible"
68
+ "0.2.0-rc.2": "compatible",
69
+ "0.2.1-rc.2": "compatible"
69
70
  }
70
71
  }
71
72
  },
@@ -54,6 +54,12 @@
54
54
  config:
55
55
  maxBytes: 65536
56
56
 
57
+ # 0.2.1 对齐:time-context 从 host 层挪进预设行(dsh 0.2.1-rc.2 的内置 standard 有这一行)。
58
+ # 包 @deepseek-ai/dsh-time-context 在 dsh 0.1.6-alpha.2 的依赖里也存在,
59
+ # 且那一代 host 层没有挂它,所以旧版目录形态上补这一行不会重复注册、不会 broken。
60
+ - id: time-context
61
+ name: '@deepseek-ai/dsh-time-context'
62
+
57
63
  # ── shell ───────────────────────────────────────────────────────────────────
58
64
 
59
65
  # `shell-env` stays in the HOST composition: `apps/cli/src/web.ts` injects it to
@@ -104,11 +110,9 @@
104
110
  # carries whatever the deployment registered globally (repository plugins).
105
111
  - id: skill-filesystem
106
112
  name: '@deepseek-ai/dsh-skill-filesystem'
107
- disabled: true
108
113
 
109
114
  - id: tool-skill
110
115
  name: '@deepseek-ai/dsh-tool-skill'
111
- disabled: true
112
116
 
113
117
  # 0.3.7 补回:内置 `standard` 自 0.1.6-alpha.2 起就带这一行,本预设初次拷贝时整行漏掉了
114
118
  # (与 0.3.4 补回的 `present` 同类:不报错、不判 broken,只是少了能力)。
@@ -143,7 +147,7 @@
143
147
  name: '@deepseek-ai/dsh-plan-mode'
144
148
  config:
145
149
  section: |
146
- You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
150
+ You are in plan mode. Stay in plan mode until the user approves your plan through exit_plan_mode or switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
147
151
 
148
152
  Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
149
153
 
@@ -225,36 +229,12 @@
225
229
  provider: spawn
226
230
  toolName: subagent
227
231
  modelSelectionSettings: true
228
- backgroundMode: continuable
229
232
 
230
233
  - id: tool-subagent-fork
231
234
  name: '@deepseek-ai/dsh-tool-subagent'
232
235
  config:
233
236
  provider: fork
234
237
  toolName: subagent_fork
235
- backgroundMode: continuable
236
-
237
- # Production dsh does not install these optional providers. Install the
238
- # matching Bundle in this Profile and restart the Host, then copy this
239
- # preset and remove `disabled` from the matching tool row. Host availability
240
- # alone grants no tool.
241
- - id: tool-subagent-codex
242
- name: '@deepseek-ai/dsh-tool-subagent'
243
- disabled: true
244
- config:
245
- provider: codex
246
- toolName: subagent_codex
247
- backgroundMode: one-shot
248
- maxDepth: provider-managed
249
-
250
- - id: tool-subagent-claude-code
251
- name: '@deepseek-ai/dsh-tool-subagent'
252
- disabled: true
253
- config:
254
- provider: claude-code
255
- toolName: subagent_claude_code
256
- backgroundMode: one-shot
257
- maxDepth: provider-managed
258
238
 
259
239
  # dsh 0.1.6-alpha.1: `dsh-workflow-worker-thread` is gone from the release;
260
240
  # the workflow engine is now `dsh-workflow-ptc` (sandboxed Node PTC runtime,
@@ -270,12 +250,6 @@
270
250
  - id: tool-workflow
271
251
  name: '@deepseek-ai/dsh-tool-workflow'
272
252
 
273
- - id: tool-ralph
274
- name: '@deepseek-ai/dsh-tool-ralph'
275
- config:
276
- subagentProvider: spawn
277
- maxRounds: 64
278
-
279
253
  # ── remaining model-facing rows ─────────────────────────────────────────────
280
254
 
281
255
  - id: tool-ask-user
@@ -291,7 +265,7 @@
291
265
  - id: tool-web
292
266
  name: '@deepseek-ai/dsh-tool-web'
293
267
  config:
294
- fetch: false
268
+ fetch: true
295
269
  searchTimeoutMs: 60000
296
270
 
297
271
  # 0.3.4 补回:`present` 是 standard 一直有的行,本预设此前整行漏抄。
@@ -309,6 +283,16 @@
309
283
  name: '@deepseek-ai/dsh-plugin-manager/tools'
310
284
  disabled: true
311
285
 
286
+ # ── 与 dsh 0.2.1-rc.2 内置 standard 的**有意差异**(下次升级 diff 别当成漏抄)──
287
+ # · `tool-schedule`:0.2.1 standard 有,但 `@deepseek-ai/dsh-tool-schedule` 在
288
+ # dsh ≤ 0.1.6-alpha.2 的依赖里不存在,而这份清单同时喂给目录形态(旧版);
289
+ # 非 disabled 行解析不到包会让**整个预设 broken**(unresolvableRows),
290
+ # 所以为兼容旧版不带这一行。CC 模式也不需要定时任务工具。
291
+ # · `tool-plugin-market`:0.2.1 standard 里是 disabled,但 0.1.6 没有
292
+ # `@deepseek-ai/dsh-plugin-market` 这个包;按家规「不拿 disabled 遮掩
293
+ # 一个已经不存在的包」,同样不带。
294
+ # 其余行与 standard 逐行对齐;本预设只保留 persona 定制与末尾的 cc-agent 行。
295
+
312
296
  # ── CC 角色卡工坊(CC 模式专用) ───────────────────────────────────
313
297
  - id: cc-agent
314
298
  name: '@xia-sc/dsh-cc-studio/agent'
@@ -89,6 +89,12 @@
89
89
  config:
90
90
  maxBytes: 65536
91
91
 
92
+ # 0.2.1 对齐:time-context 从 host 层挪进预设行(dsh 0.2.1-rc.2 的内置 standard 有这一行)。
93
+ # 包 @deepseek-ai/dsh-time-context 在 dsh 0.1.6-alpha.2 的依赖里也存在,
94
+ # 且那一代 host 层没有挂它,所以旧版目录形态上补这一行不会重复注册、不会 broken。
95
+ - id: time-context
96
+ name: '@deepseek-ai/dsh-time-context'
97
+
92
98
  # ── shell ───────────────────────────────────────────────────────────────────
93
99
 
94
100
  # `shell-env` stays in the HOST composition: `apps/cli/src/web.ts` injects it to
@@ -139,11 +145,9 @@
139
145
  # carries whatever the deployment registered globally (repository plugins).
140
146
  - id: skill-filesystem
141
147
  name: '@deepseek-ai/dsh-skill-filesystem'
142
- disabled: true
143
148
 
144
149
  - id: tool-skill
145
150
  name: '@deepseek-ai/dsh-tool-skill'
146
- disabled: true
147
151
 
148
152
  # 0.3.7 补回:内置 `standard` 自 0.1.6-alpha.2 起就带这一行,本预设初次拷贝时整行漏掉了
149
153
  # (与 0.3.4 补回的 `present` 同类:不报错、不判 broken,只是少了能力)。
@@ -178,7 +182,7 @@
178
182
  name: '@deepseek-ai/dsh-plan-mode'
179
183
  config:
180
184
  section: |
181
- You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
185
+ You are in plan mode. Stay in plan mode until the user approves your plan through exit_plan_mode or switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
182
186
 
183
187
  Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
184
188
 
@@ -260,36 +264,12 @@
260
264
  provider: spawn
261
265
  toolName: subagent
262
266
  modelSelectionSettings: true
263
- backgroundMode: continuable
264
267
 
265
268
  - id: tool-subagent-fork
266
269
  name: '@deepseek-ai/dsh-tool-subagent'
267
270
  config:
268
271
  provider: fork
269
272
  toolName: subagent_fork
270
- backgroundMode: continuable
271
-
272
- # Production dsh does not install these optional providers. Install the
273
- # matching Bundle in this Profile and restart the Host, then copy this
274
- # preset and remove `disabled` from the matching tool row. Host availability
275
- # alone grants no tool.
276
- - id: tool-subagent-codex
277
- name: '@deepseek-ai/dsh-tool-subagent'
278
- disabled: true
279
- config:
280
- provider: codex
281
- toolName: subagent_codex
282
- backgroundMode: one-shot
283
- maxDepth: provider-managed
284
-
285
- - id: tool-subagent-claude-code
286
- name: '@deepseek-ai/dsh-tool-subagent'
287
- disabled: true
288
- config:
289
- provider: claude-code
290
- toolName: subagent_claude_code
291
- backgroundMode: one-shot
292
- maxDepth: provider-managed
293
273
 
294
274
  # dsh 0.1.6-alpha.1: `dsh-workflow-worker-thread` is gone from the release;
295
275
  # the workflow engine is now `dsh-workflow-ptc` (sandboxed Node PTC runtime,
@@ -305,12 +285,6 @@
305
285
  - id: tool-workflow
306
286
  name: '@deepseek-ai/dsh-tool-workflow'
307
287
 
308
- - id: tool-ralph
309
- name: '@deepseek-ai/dsh-tool-ralph'
310
- config:
311
- subagentProvider: spawn
312
- maxRounds: 64
313
-
314
288
  # ── remaining model-facing rows ─────────────────────────────────────────────
315
289
 
316
290
  - id: tool-ask-user
@@ -326,7 +300,7 @@
326
300
  - id: tool-web
327
301
  name: '@deepseek-ai/dsh-tool-web'
328
302
  config:
329
- fetch: false
303
+ fetch: true
330
304
  searchTimeoutMs: 60000
331
305
 
332
306
  # 0.3.4 补回:`present` 是 standard 一直有的行,本预设此前整行漏抄。
@@ -344,6 +318,16 @@
344
318
  name: '@deepseek-ai/dsh-plugin-manager/tools'
345
319
  disabled: true
346
320
 
321
+ # ── 与 dsh 0.2.1-rc.2 内置 standard 的**有意差异**(下次升级 diff 别当成漏抄)──
322
+ # · `tool-schedule`:0.2.1 standard 有,但 `@deepseek-ai/dsh-tool-schedule` 在
323
+ # dsh ≤ 0.1.6-alpha.2 的依赖里不存在,而这份清单同时喂给目录形态(旧版);
324
+ # 非 disabled 行解析不到包会让**整个预设 broken**(unresolvableRows),
325
+ # 所以为兼容旧版不带这一行。CC 模式也不需要定时任务工具。
326
+ # · `tool-plugin-market`:0.2.1 standard 里是 disabled,但 0.1.6 没有
327
+ # `@deepseek-ai/dsh-plugin-market` 这个包;按家规「不拿 disabled 遮掩
328
+ # 一个已经不存在的包」,同样不带。
329
+ # 其余行与 standard 逐行对齐;本预设只保留 persona 定制与末尾的 cc-agent 行。
330
+
347
331
  # ── CC 角色卡工坊(CC 模式专用) ───────────────────────────────────
348
332
  - id: cc-agent
349
333
  name: '@xia-sc/dsh-cc-studio/agent'