dsh-structured 0.8.2 → 0.8.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.3 — 2026-10-22
4
+
5
+ - 提示词优先级加固:首段 markdown 标题卡即使后文使用 `dsh-ui` 也必须存在;`dsh-ui` 只能跟在标题卡与正文之后,不得用其 `title` 充当首卡,不得把结论/判断/风险/下一步做成 dsh-ui 组件;宿主默认要出 UI 时以插件规则为准。
6
+ - 尾部提醒同步强调「第一段必须是 markdown 标题卡,组件只能排在标题卡之后、不得充当首卡」。
7
+ - 背景:观察到报告型回复把 dsh-ui 当主卡、跳过标题卡;该会话的注入与视觉层均正常,属提示词优先级问题。
8
+
3
9
  ## 0.8.2 — 2026-10-22
4
10
 
5
11
  - 视觉层从“始终开启”改为 profile 级 `visual` 配置(`Config` + `.volatile()`,默认 true);通过 DSH 插件设置页(bundle 详情表单)切换,不再写共享的 `state.json`。
@@ -0,0 +1,5 @@
1
+ # dsh-structured 0.8.3 — 验收记录
2
+
3
+ [AC-001/002] `npm test` 36/36(含新增 GenUI 优先级断言);`node scripts/desktop-check.mjs` 全 PASS;`lib/index.js` 与 src 一致。
4
+ [AC-003] 0.8.3 已装 `structured-test`(`lib/index.js` sha256 `62f3a37d…` 与仓库一致);headless 两轮 `session-2aa045fb-…`、`session-c1253adf-…` 首段均为 `> **` 标题卡,system prompt 含新尾提醒「组件只能排在标题卡之后」;`npm pack` 39 文件 / unpacked 964444 B。
5
+ [AC-004] 用 keyvalue 组件的请求在 headless 不触发 GenUI(无 client half),desktop 的 dsh-ui 场景未验;未 push、未 publish、未改市场 PR。
package/lib/index.js CHANGED
@@ -86,12 +86,12 @@ export const BUILTIN_STYLE_TEXT = [
86
86
 
87
87
  /** GenUI 已安装时才追加的路由规则:交互/图表走 dsh-ui,普通卡片仍走 markdown。 */
88
88
  export const GENUI_ROUTING_TEXT = [
89
- '**GenUI 已安装**:图表、可排序表格、表单、超过 8 行的大表用 ` ```dsh-ui ` fence;结论/判断/风险/下一步仍用上面的 markdown 卡片,不要为每条回复生成 JSON,也不要重复渲染同一内容。',
89
+ '**GenUI 已安装**:只有图表、可排序表格、表单、超过 8 行的大表才用 ` ```dsh-ui ` fence;`dsh-ui` 只能出现在 markdown 标题卡与正文之后,**不得用它的 title 充当首卡,不得把结论/判断/风险/下一步做成 dsh-ui 组件**;宿主默认要出 UI 时以本节为准,不要为每条回复生成 JSON,也不要重复渲染同一内容。',
90
90
  ].join('\n')
91
91
 
92
92
  /** 尾部提醒:一句话重复契约中最容易衰减的四件事,长度控制在几十个 token。 */
93
93
  export const TAIL_REMINDER_TEXT = [
94
- '提醒:本轮最终回复第一段用无标签标题卡:加粗标题(≤60 字)/ 正文两行;表格前给 `**表格结论:**`;状态用 `✅ 完成` / `⚠️ 待做`;全文最多两个强调块;表格优先 ≤5 行;不设硬性篇幅上限;清晰优先;可复制内容用代码块。',
94
+ '提醒:本轮最终回复第一段必须是 markdown 无标签标题卡:加粗标题(≤60 字)/ 正文两行(即使后文要用组件也一样);组件只能排在标题卡之后,不得用组件充当首卡;表格前给 `**表格结论:**`;状态用 `✅ 完成` / `⚠️ 待做`;全文最多两个强调块;表格优先 ≤5 行;不设硬性篇幅上限;清晰优先;可复制内容用代码块。',
95
95
  ].join('\n')
96
96
 
97
97
  /** DSH home:优先 DSH_HOME,缺省 ~/.dsh。 */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-structured",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "description": "Structured output for DSH: no-label title card first, then tables/lists/steps; per-session switch and style.md override. 让 DSH 的每条实质回复默认结构化。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
package/src/index.js CHANGED
@@ -84,12 +84,12 @@ export const BUILTIN_STYLE_TEXT = [
84
84
 
85
85
  /** GenUI 已安装时才追加的路由规则:交互/图表走 dsh-ui,普通卡片仍走 markdown。 */
86
86
  export const GENUI_ROUTING_TEXT = [
87
- '**GenUI 已安装**:图表、可排序表格、表单、超过 8 行的大表用 ` ```dsh-ui ` fence;结论/判断/风险/下一步仍用上面的 markdown 卡片,不要为每条回复生成 JSON,也不要重复渲染同一内容。',
87
+ '**GenUI 已安装**:只有图表、可排序表格、表单、超过 8 行的大表才用 ` ```dsh-ui ` fence;`dsh-ui` 只能出现在 markdown 标题卡与正文之后,**不得用它的 title 充当首卡,不得把结论/判断/风险/下一步做成 dsh-ui 组件**;宿主默认要出 UI 时以本节为准,不要为每条回复生成 JSON,也不要重复渲染同一内容。',
88
88
  ].join('\n')
89
89
 
90
90
  /** 尾部提醒:一句话重复契约中最容易衰减的四件事,长度控制在几十个 token。 */
91
91
  export const TAIL_REMINDER_TEXT = [
92
- '提醒:本轮最终回复第一段用无标签标题卡:加粗标题(≤60 字)/ 正文两行;表格前给 `**表格结论:**`;状态用 `✅ 完成` / `⚠️ 待做`;全文最多两个强调块;表格优先 ≤5 行;不设硬性篇幅上限;清晰优先;可复制内容用代码块。',
92
+ '提醒:本轮最终回复第一段必须是 markdown 无标签标题卡:加粗标题(≤60 字)/ 正文两行(即使后文要用组件也一样);组件只能排在标题卡之后,不得用组件充当首卡;表格前给 `**表格结论:**`;状态用 `✅ 完成` / `⚠️ 待做`;全文最多两个强调块;表格优先 ≤5 行;不设硬性篇幅上限;清晰优先;可复制内容用代码块。',
93
93
  ].join('\n')
94
94
 
95
95
  /** DSH home:优先 DSH_HOME,缺省 ~/.dsh。 */
@@ -98,6 +98,10 @@ test('内置规则覆盖首句结论、组件、清晰度三件事', () => {
98
98
  assert.match(BUILTIN_STYLE_TEXT, /下一步/)
99
99
  assert.match(BUILTIN_STYLE_TEXT, /✅ 完成/)
100
100
  assert.match(GENUI_ROUTING_TEXT, /dsh-ui/)
101
+ assert.match(TAIL_REMINDER_TEXT, /即使后文要用组件也一样/)
102
+ assert.match(TAIL_REMINDER_TEXT, /不得用组件充当首卡/)
103
+ assert.match(GENUI_ROUTING_TEXT, /不得用它的 title 充当首卡/)
104
+ assert.match(GENUI_ROUTING_TEXT, /以本节为准/)
101
105
  })
102
106
 
103
107
  test('detectGenui:profile 清单不再作为 auto 依据,config 可强制', () => {