Repository navigation
Releases: sugarmaster666/dsh-persona-forge
Release list
v0.8.4 — 审查面板显示不全的完整修复
面板显示不全的完整修复
Fixed
-
面板跑到屏幕底部、盖住了输入框。 上一版为了腾出高度,把面板改成
position:fixed并锚在视口底部(bottom:124px)。这是个错误的锚点:
固定定位是相对视口摆放的,不是相对输入框。新会话开头输入框在屏幕
中部,面板却贴到了窗口底部——于是它离输入框很远,还压住了输入框本身。改回留在文档流里:
flex:0 0 auto让面板拿到它想要的高度、不被压缩栈
挤扁;max-height:calc(100dvh - var(--pf-panel-reserve))让它不会超过
头部和输入框之外剩下的空间。在流里,它天然就紧贴输入框上方——不管输入框
在哪。在 1559×770(输入框居中)和 1176×359(矮窗口)两种情况下都验证过:面板
紧贴输入框、按钮可见、输入框不被遮挡。 -
新会话开头,面板整个被顶出屏幕——这次找到了真正的原因。
前两次修复都盯在面板内部(限高、滚动、按钮位置),但症状只在新会话开头出现,
而那是 hero 模式:对话区为空、输入区垂直居中,宿主的composerSeat是
position:absolute; bottom:0。面板脱离了文档流,所以它变高时没有任何东西
会把它压回去,只能向上溢出视口,连自己的标题栏一起被裁掉。实测:359px 高的窗口里,头部 76px + 输入框 96px + 间距,面板只剩约 169px;
而面板内部光标题栏、页脚、提示行就超过这个数——文本区在算术上就是负数。
这就是"永远只能滚动"的根源:不是布局没调好,是可用空间根本不够。改法是让面板浮起来:
position:fixed,锚在输入框上方,按视口而不是
按输入框剩余空间来计算高度。359px 窗口下文本区从约 10px 变成约 100px,正文
完整可读;280px 的极矮窗口也仍然完整可见,只是文本区变矮。 -
面板里的辅助信息挪到页脚,正文只留改写结果。 提示行、模型/耗时、标签原本
是正文里三块竖排内容,各占一行高度——在只有 169px 的预算里,它们把文本区挤成
了负值。现在它们是页脚里一行横向排布的小字。
Changed
-
删掉了正文里的"改写后"标签和失去引用的
.pf-col-title。 面板只有一个
结果栏,标签不再有区分作用;无障碍标签仍在textarea的aria-label上。 -
面板不再重复显示你的草稿。 它原本是左右两栏,左边"你写的"、右边"改写后"
——可草稿就在面板正下方的输入框里,左栏只是把同一段话再说一遍,却占掉一半
宽度、并把按钮往下推。现在只显示改写结果,文本区因此宽了一倍。顺带删掉了失去引用的
panel.original文案键(中英各一条)。 -
"本地检查通过"从三行说明收成一行,边界改成悬停提示。 那段话每次改写都
常驻显示,占掉面板约三分之一的高度,而面板高度正是按钮被挤出去的原因。
它现在是一行结论,鼠标悬停才展开"这个检查看不出什么"。0.5.0 就定过这条规则(说明改成 tooltip,不堆常驻文字),面板这里没有遵守。
Added
-
检查套件新增"审查面板布局"一节(11 项),钉住这一串失败:
- 动作行必须在页脚里、且在滚动区之外(放回去,3 项变红)
- 面板不得重复显示草稿(把左栏加回来,2 项变红)
- 常驻文案按显示宽度限长(一个中文字约等于两个西文字符,按字符数算会
放过一条 74 字符、实际渲染三行的中文说明——这个 bug 是写检查时才发现的) - 面板必须由输入框定位、而不是由视口定位:不得用
position:fixed
(固定定位是相对窗口摆放的,新会话里会把面板甩到屏幕底部、压住输入框)
Added
-
发布变成一条命令。
npm run release依次做:改版本号、把[Unreleased]
提成带日期的版本节、重写底部链接、把版本号和 CHANGELOG 放进同一个 commit、
打 annotated tag、发布、推送,最后核对 npm 记录的gitHead等于HEAD。它会拒绝八种不该发布的状态:工作区不干净、不在
main上、origin 不是本包
仓库(副本会继承真实 origin,在副本里发布会直接推到线上)、自检不过、只有
文档改动、[Unreleased]是空的、tag 或 npm 版本号已存在、package.json
和最近的 tag 对不上。发布中途失败(比如打好了 tag 但 publish 失败)会被认出来,重跑只补做剩下的步骤。
-
AGENTS.md和RELEASING.md。 前者是给下一个接手的人(或 AI)的入口:
三条硬约束、改完必须跑什么、提交信息怎么前缀;后者是发版规则:什么时候该发、
版本号怎么定、七步流程,以及历史欠账清单。
Fixed
- 发布指向正确的 registry。 本机
.npmrc为了速度指向 npmmirror 镜像,
而镜像不接受发布。发布目标现在是项目属性而不是机器属性:npm publish和
每一次版本探测都显式带上--registry https://registry.npmjs.org。
Note
同一症状此前修过两次,都只动了面板内部:先限高+滚动(按钮落在滚动区里),
再把按钮移进页脚(但面板用 flex:none 拒绝缩小,被外层裁掉)。两次都没问
"面板到底有多少可用空间"——在 359px 的窗口里答案是 169px,扣掉标题栏和页脚后
文本区为负。换布局之前先算清可用空间,这是这一轮真正的教训。
安装 / 升级
dsh plugin --profile web add dsh-persona-forge@0.8.4桌面版:插件页 → 添加插件 → 填 dsh-persona-forge。
v0.3.1 — 改写等待显示实时秒数 · 移除三处冗余控件
对应 npm 上的 dsh-persona-forge@0.3.1。
修复
等待慢模型时的改写不再像是卡死了。
此前面板只显示「改写中」,没有任何时间感 —— 一次耗时的改写和真正卡住无法区分,只能报告为"卡住"。宿主其实一直有 120 秒超时(所以面板并非真的永远卡住),但两分钟无反馈的转圈,看起来和冻结一模一样。
现在面板会:
- 实时显示已等待的秒数 —— 免费的进度感,让"在跑"和"挂了"一眼可分
- 超过 45 秒时明说「已经 N 秒了,模型可能较慢」以及放弃的办法
移除
- 设置页的「开启模型校验」复选框。 它和插件行配置里的
factCheck重复 —— 同一个设置有两个地方,还放在一个讲卡片的页面上。宿主配置是唯一开关,且默认已关闭。复选框、它的字典键、背后的客户端偏好一并删除。 - 常驻的「检查是否有改动」说明行。 按钮的悬浮提示已经写了同一句话。现在页面只保留检查结果(真实反馈),而不是把同一段文案放两遍。
- 三个没有任何路由或组件引用的字典键:
settings.ai.briefLabel、settings.changed、error.busy。
说明
本次全部为客户端改动(lib/client.js)—— 客户端半边会热重载,刷新页面即可,无需重启 DSH。
验证:195 项单元自检 + 90 项宿主集成自检,中英字典保持 117/117 完全一致。
v0.3.0 — AI 代填 · 免费本地校验 · 模型如实告知
对应 npm 上的 dsh-persona-forge@0.3.0。
新增
- AI 代填。 用一句话描述角色思路,模型会填好整张卡:风格描述、名称、图标、简介,以及四档强度各自的转换范例。它就在「新建角色卡」打开的表单顶部,设置页有一行提示告诉你它存在,不用靠点按钮去发现。生成结果只填表单、绝不自动保存,并且走和手动保存完全相同的校验,所以不可能产出存不下去的卡。
- 免费的本地技术事实检查。 在插件进程里比对草稿与改写结果的技术记号 —— 标识符、路径、版本号、数字、
--flag、API这类缩写 —— 丢了哪个就点名告诉你。不调用模型,所以不花 token、不加延迟,也关不掉。 - 输入框菜单新增三个按会话记住的开关:改写方式(跟随卡片 / 模型改写 / 模板套用)、保真度、模型校验。
- 卡片表单现在可以编辑分强度范例。它们本来就是卡的一部分,但界面里看不见 —— 这正是下面那个 bug 的成因。
变更
- 模型校验默认关闭,并可在菜单里开关。 它是唯一能看出「需求被悄悄改弱」或「用散文追加了约束」的东西,但会让每一次发送都多一次模型调用(延迟与 token 翻倍);而最常见、最伤人的失败(丢掉文件名 / 数字 / 版本号)已经被免费的本地检查证明了。为它每次都付一次调用是浪费。配置里的
factCheck现在只设默认值,且只有显式true才开启。 - 中文 README 成为主
README.md,英文版为README.en.md。
修复
- 改写方式与保真度的按会话覆盖。 保真度只能收窄、不能放宽:让
strategy卡临时只改语气,只是拿走它追加约束的权力,永远更安全;而让style卡开始追加约束,会超出卡片作者的授权 —— 那该去改卡,不该由「发送前顺手一点」授权。服务端强制同一条规则。 - 收窄后的保真度根本没进提示词。 路由算出了收窄值、也写进了响应,但
buildSystemPrompt直接读card.fidelity—— 设置看起来生效、实际什么都没做。现在把生效值传进提示词构造函数,并且测试改为断言提示词本身,而不只是响应。 - 改卡会静默丢掉四档范例。 表单没带
examplesByIntensity,所以任何一次保存都会把它重建丢;光改个名字就能丢掉全部四档。现已可见并可往返保存。 - 每张内置卡都被标成「自定义」。 内置卡会被播种进用户目录,标签却按「这个 id 有没有用户文件」来判 —— 对从没人碰过的卡也是真。现在按内容判定,与「检查是否有改动」用同一套语义比较,因此两者从构造上不再互相矛盾;并新增「已修改」状态。
- 「删除」出现在它根本无效的地方。 内容等于内置版的卡没有属于你的文件,删掉之后下次启动会被写回。现在只在该出现的地方出现。
- 内置
肌肉集团 · 硬邦邦卡有 3 条范例把输入里的「bug」丢了 —— 正是这个插件最想防的「用氛围替换需求」。测试现在也校验分强度范例,这才逮到它们。 - 修好 CHANGELOG 里 4 个 404 的版本链接:补建
v0.1.0/v0.1.1/v0.1.2/v0.2.0tag。
说明
settings.section 这个插槽从 shell 只收到 { close },拿不到会话 id,所以设置页的 AI 代填用的是 harness 默认模型,无法跟随当前会话 —— 之前的 README 说错了。现在目录接口会返回解析到的模型,设置页在生成前后都把它显示出来,两份 README 也用表格说清这个区别。改写本身仍然跟随当前会话。
验证:185 项单元自检 + 90 项宿主集成自检。
v0.2.1 — 发送即改写 · 四档强度 · 角色卡差异检查
对应 npm 上的 dsh-persona-forge@0.2.1。
新增
- 输入框的原生发送按钮、以及 Enter,就是改写触发器。 审查模式弹出对比面板;直接发出模式改写后立即发送。菜单里那个单独的改写按钮已删除 —— 发送动作取代了它。
- Enter 有独立的监听。 Enter 不经过按钮(编辑器 keymap 直接提交),所以需要单独拦截。Shift+Enter(换行)、输入法组字中、以及 shell 忽略的修饰键组合都不受影响。
- 强度增加第四档「重」。 原来是 轻 → 中 → 狂热,中间缺一档,无法要求「语气充分但还没到通篇仪式化」。现在是 轻 / 中 / 重 / 狂热,两张内置卡都为四档补齐了范例。
- 「检查是否有改动」 —— 一次比完所有角色卡,只有真正偏离内置版本的卡才出现「还原为内置」。
修复
- 播种的角色卡会把内置卡冻结在首次发布的版本。 副本会遮蔽内置卡,导致后续版本改进的内置卡永远传不到老用户手里。现在会记录播种时写入内容的哈希:没动过的副本随升级刷新,编辑过的副本永不覆盖。
- 种子账本被当成角色卡加载,每次读目录都报一条假的诊断。已改为跳过点文件。
- 角色卡行的描述文字与按钮重叠。 描述是
<span>(行内元素),而overflow:hidden/text-overflow对行内元素无效,长描述直接撑出卡片。改为 flex column + 两行截断。 - \check.mjs\ 会读开发者的真实角色卡目录,导致测试结果取决于本地状态。已隔离 \DSH_HOME\。
说明
发送拦截没有官方钩子(宿主按钮直接调用 shell 提交方法),所以靠无障碍名称与 \data-composer-card\ 识别。所有判断都朝「放行原生发送」失败:任何一环对不上就什么都不做,消息照常发出;关闭插件则彻底移除拦截。
验证:125 项单元自检 + 60 项宿主集成自检。