dsh-structured 0.9.6 → 0.9.9
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 +19 -0
- package/README.md +274 -273
- package/docs/0.9-FINAL-RELEASE.md +22 -0
- package/docs/1.0-BASELINE.md +38 -0
- package/docs/1.0-GATE.md +39 -0
- package/docs/1.0-PERSONA-SPEC.md +59 -0
- package/lib/client.js +4 -4
- package/lib/index.js +518 -517
- package/package.json +102 -99
- package/scripts/theme-contrast.mjs +2 -2
- package/scripts/theme-hue-distance.mjs +55 -0
- package/src/client.js +2 -2
- package/src/index.js +516 -515
- package/test/client-cards.test.mjs +145 -140
- package/test/fixtures/persona-gate/no-persona.md +8 -0
- package/test/fixtures/persona-gate/persona-append.md +9 -0
- package/test/fixtures/persona-gate/style-override.md +8 -0
- package/test/structured.test.mjs +8 -0
- package/test/theme.test.mjs +8 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# 1.0 基线(0.9.8 冻结版)
|
|
2
|
+
|
|
3
|
+
## 固定 10 条 prompt
|
|
4
|
+
|
|
5
|
+
1. P01:给一个 5 人团队做本周发布计划。
|
|
6
|
+
2. P02:解释一个 Redis 连接池泄露的排查顺序。
|
|
7
|
+
3. P03:比较 Postgres 与 SQLite 的适用边界。
|
|
8
|
+
4. P04:把一份长会议记录压缩成决策、风险和下一步。
|
|
9
|
+
5. P05:给一个前端页面做无障碍检查清单。
|
|
10
|
+
6. P06:写一个可回滚的数据库迁移方案。
|
|
11
|
+
7. P07:分析一段 Python 异步代码的死锁风险。
|
|
12
|
+
8. P08:给一个 API 设计写三组验收用例。
|
|
13
|
+
9. P09:用表格比较三种缓存策略。
|
|
14
|
+
10. P10:对一个失败发布做 5-Why 复盘。
|
|
15
|
+
|
|
16
|
+
## 注入口径(0.9.8)
|
|
17
|
+
|
|
18
|
+
当前 `BUILTIN_STYLE_TEXT` 940 字符;GenUI 路由 186 字符;尾部提醒 206 字符。合计 1332 字符,约 333 token(按 4 字符/token 估算;不是宿主 tokenizer 实测)。10 条 prompt 共用同一注入段,per-turn 注入增量以宿主实际 tokenizer 为准。
|
|
19
|
+
|
|
20
|
+
## 输出与结构化率
|
|
21
|
+
|
|
22
|
+
- 首屏结构化率、散文率:沿用 `docs/METRICS.md` 的 12 个新会话样本(注入 12/12,散文 0/12);这是 0.9.x 既有样本,不是本轮 10 条固定 prompt 的新跑结果。
|
|
23
|
+
- 输出 token 增量:**未测**;本轮没有调用模型执行 10 条固定 prompt,不能用旧样本冒充。
|
|
24
|
+
- 3×2 桌面实机截图:**未验**;0.9.6 的视觉截图是 web profile 裁图,0.9.8 没有安装到 desktop。
|
|
25
|
+
|
|
26
|
+
## `style.md` 1.0 迁移语义(冻结)
|
|
27
|
+
|
|
28
|
+
- `style.md`:非空即整份覆盖内置 `BUILTIN_STYLE_TEXT`;不做片段合并。
|
|
29
|
+
- 需要保留结构规则时,把 `BUILTIN_STYLE_TEXT` 全文复制到 `style.md`,再追加自己的文本。
|
|
30
|
+
- 1.0 的 `persona.md` 只作为**追加层**设计,不改变 `style.md` 的整份覆盖语义;结构规则始终注入,见 `docs/1.0-PERSONA-SPEC.md`。
|
|
31
|
+
- 读取失败、文件为空、权限错误均 fail-open:回退内置规则,不阻断回复。
|
|
32
|
+
- 迁移路径:现有 `style.md` 用户不需要改文件;若 1.0 要同时使用结构规则和人格,按 1.0 spec 使用 `persona.md` 追加,而不是把人格塞进 `style.md`。
|
|
33
|
+
|
|
34
|
+
## 待验
|
|
35
|
+
|
|
36
|
+
- 10 条固定 prompt 的实际注入/输出 token。
|
|
37
|
+
- 10 条固定 prompt 的首屏结构化率与散文率。
|
|
38
|
+
- 3×2 桌面实机截图与 800px 实机窄窗。
|
package/docs/1.0-GATE.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# 1.0 人格 gate(0.9.9,PM 主导)
|
|
2
|
+
|
|
3
|
+
## 目的
|
|
4
|
+
|
|
5
|
+
决定 1.0 是否开放 persona 追加层;不评价人格文案好坏,只评价结构保留、token 增量、偏好和 P0。
|
|
6
|
+
|
|
7
|
+
## 受试与分组
|
|
8
|
+
|
|
9
|
+
- 5–10 名真实用户;PM 招募/主持,开发只提供夹具与测量。
|
|
10
|
+
- 每组同一批任务,三组顺序随机:
|
|
11
|
+
1. **无 persona**:仅结构规则。
|
|
12
|
+
2. **style.md 覆盖**:用户自己的整份 style.md(保留现有语义)。
|
|
13
|
+
3. **persona.md 追加**:结构规则 + persona 追加层。
|
|
14
|
+
|
|
15
|
+
## 固定任务
|
|
16
|
+
|
|
17
|
+
使用 `docs/1.0-BASELINE.md` 的 P01–P10;每人至少完成 5 条,覆盖报告、代码/ diff、比较、风险/下一步。
|
|
18
|
+
|
|
19
|
+
## 测量
|
|
20
|
+
|
|
21
|
+
- 结构保留:首屏标题卡/表格/列表/结论等结构不下降;用现有 `scripts/measure-prose.mjs` + 人工抽查。
|
|
22
|
+
- token 增量:同一任务三组的注入 token 与实际输出 token;必须给出数字,不用“差不多”。
|
|
23
|
+
- 偏好:受试者在三组中选最愿意继续用的一组;目标 **≥60% 偏好 persona 追加层**。
|
|
24
|
+
- P0:任何阻断回复、覆盖结构规则、泄露个人信息、改变工具权限/GenUI/代码隔离的案例即 P0。
|
|
25
|
+
|
|
26
|
+
## 通过条件
|
|
27
|
+
|
|
28
|
+
1. 结构保留不下降;
|
|
29
|
+
2. token 增量有数字且可接受(PM 定阈值);
|
|
30
|
+
3. ≥60% 偏好追加层;
|
|
31
|
+
4. 无 P0。
|
|
32
|
+
|
|
33
|
+
任何一项不满足:1.0 不开人格功能,回到 spec/文档方案。0.9.x 不开放用户入口。
|
|
34
|
+
|
|
35
|
+
## 当前状态
|
|
36
|
+
|
|
37
|
+
- 夹具:`test/fixtures/persona-gate/` 三组。
|
|
38
|
+
- 用户 gate:**未执行**(0 名用户);0.9.9 只能交付“待 gate”,不能伪造 go。
|
|
39
|
+
- 结论:**NO-GO / pending**,直到 PM 提供 5–10 名用户结果。
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# 1.0 人格化 spec / schema(0.9.9 草案,不实现)
|
|
2
|
+
|
|
3
|
+
## 定位
|
|
4
|
+
|
|
5
|
+
1.0 的人格是 **profile 级追加层**,不是替换层:
|
|
6
|
+
|
|
7
|
+
1. 结构规则:始终由 base 注入。base 默认是 `BUILTIN_STYLE_TEXT`;`style.md` 非空时按现有契约整份覆盖 base(显式例外,用户自己承担丢失结构规则)。
|
|
8
|
+
2. `persona.md`:只追加在 base 之后,不能删除、替换结构规则,不能修改 host 提示词或消息内容。
|
|
9
|
+
3. 不碰 `AGENTS.md`、`soul`、工具权限、GenUI 路由和代码/diff 隔离。
|
|
10
|
+
|
|
11
|
+
## 路径与读取顺序
|
|
12
|
+
|
|
13
|
+
- profile 级路径:`$DSH_PROFILE_DIR/dsh-structured/persona.md`;缺省 profile 目录时按宿主 profile 解析,不读其他 profile。
|
|
14
|
+
- 读取顺序:base(内置或 `style.md` 整份覆盖)→ `persona.md` 追加层。
|
|
15
|
+
- 两个文件都存在时,`style.md` 仍只控制 base;`persona.md` 不参与 base 覆盖。
|
|
16
|
+
- 读取失败、权限错误、文件缺失、schema 不合法:忽略 persona,继续 base,fail-open,不阻断回复。
|
|
17
|
+
|
|
18
|
+
## Schema
|
|
19
|
+
|
|
20
|
+
`persona.md` 是 UTF-8 Markdown,可选 frontmatter:
|
|
21
|
+
|
|
22
|
+
```yaml
|
|
23
|
+
---
|
|
24
|
+
schema: dsh-structured/persona@1
|
|
25
|
+
scope: profile
|
|
26
|
+
append: true
|
|
27
|
+
recommended_max_chars: 4000
|
|
28
|
+
---
|
|
29
|
+
# 称呼与语气
|
|
30
|
+
...
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
- `schema` 必须精确匹配 `dsh-structured/persona@1`;不匹配时忽略并记录一次非阻断警告。
|
|
34
|
+
- `append` 只能为 `true`;`false` 不提供“替换结构”的入口。
|
|
35
|
+
- `recommended_max_chars` 只是建议;**不硬截断**。超过建议值时在设置页显示提示,不改变实际内容。
|
|
36
|
+
- 正文只作为文本 section 追加;不插值 `{{...}}`,不执行命令,不解析 Markdown 到 DOM。
|
|
37
|
+
|
|
38
|
+
## 优先级与迁移
|
|
39
|
+
|
|
40
|
+
1. 结构规则:`BUILTIN_STYLE_TEXT`(默认)或 `style.md`(整份覆盖)。
|
|
41
|
+
2. `persona.md`:追加层,不能覆盖 1。
|
|
42
|
+
3. 其他 profile/全局文件:不参与。
|
|
43
|
+
|
|
44
|
+
迁移:
|
|
45
|
+
|
|
46
|
+
- 现有 `style.md` 用户不需要改文件;0.9.x 不读 `persona.md`,行为不变。
|
|
47
|
+
- 1.0 想保留结构规则并加人格:保留/复制 `BUILTIN_STYLE_TEXT` 到 `style.md`,把人格写进 `persona.md`;或保持 `style.md` 为空,使用内置结构 + persona 追加。
|
|
48
|
+
- 不建议把人格塞进 `style.md`,否则会整份覆盖结构规则。
|
|
49
|
+
|
|
50
|
+
## 隐私与安全
|
|
51
|
+
|
|
52
|
+
- persona 可能包含个人信息;只保存在本机 profile,不进入 npm 包、不写日志、不上传、不进市场。
|
|
53
|
+
- 文档和设置页必须提示“persona 可能含个人信息,分享 profile 前先清理”。
|
|
54
|
+
- persona 不能包含工具调用、系统指令覆盖、凭据或外部 URL 执行语义;仅作为文本追加。
|
|
55
|
+
|
|
56
|
+
## 0.9.9 不实现
|
|
57
|
+
|
|
58
|
+
- 不加设置页入口、不新增命令、不做人格市场/编辑器/预设包、不读 `persona.md` 运行时。
|
|
59
|
+
- 只提供本 spec、三组 gate 夹具和测量口径;1.0 是否上线由 gate 决定。
|
package/lib/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// Generated from src/client.js by scripts/build.mjs — edit src/, then run `npm run build`.
|
|
2
|
-
// dsh-structured client module: renders "结论:" blockquotes as cards.
|
|
1
|
+
// Generated from src/client.js by scripts/build.mjs — edit src/, then run `npm run build`.
|
|
2
|
+
// dsh-structured client module: renders "结论:" blockquotes as cards.
|
|
3
3
|
/**
|
|
4
4
|
* dsh-structured client
|
|
5
5
|
*
|
|
@@ -131,12 +131,12 @@ body[data-ds-dark-theme][data-dsh-structured-theme="codex"] [class*="_markdown_"
|
|
|
131
131
|
}
|
|
132
132
|
body[data-dsh-structured-theme="anthropic"] [class*="_markdown_"]{
|
|
133
133
|
--ds-surface:#FAF9F5;--ds-surface-2:#F5F1E8;--ds-text:#141413;--ds-muted:#6B6359;
|
|
134
|
-
--ds-border:#E5E0D5;--ds-accent:#CC785C;--ds-accent-text:#A14A2E;--ds-success:#266B4D;--ds-warn:#
|
|
134
|
+
--ds-border:#E5E0D5;--ds-accent:#CC785C;--ds-accent-text:#A14A2E;--ds-success:#266B4D;--ds-warn:#806000;--ds-error:#8C1D18;
|
|
135
135
|
--ds-code-bg:#F5F1E8;--ds-code-text:#141413;
|
|
136
136
|
}
|
|
137
137
|
body[data-ds-dark-theme][data-dsh-structured-theme="anthropic"] [class*="_markdown_"]{
|
|
138
138
|
--ds-surface:#1F1E1D;--ds-surface-2:#2A2825;--ds-text:#F5F1E8;--ds-muted:#A8A29A;
|
|
139
|
-
--ds-border:#3A3733;--ds-accent:#E8A087;--ds-accent-text:#E8A087;--ds-success:#6FBF9A;--ds-warn:#
|
|
139
|
+
--ds-border:#3A3733;--ds-accent:#E8A087;--ds-accent-text:#E8A087;--ds-success:#6FBF9A;--ds-warn:#EAB308;--ds-error:#F28B82;
|
|
140
140
|
--ds-code-bg:#171614;--ds-code-text:#F5F1E8;
|
|
141
141
|
}
|
|
142
142
|
[class*="_markdown_"] p{margin:.72em 0}
|