Skip to content

feat: 集成 HyperAI TUI 与原生 Profile - #1

Draft
lizhenhhh wants to merge 20 commits into
masterfrom
feat/hyperai-tui-profile
Draft

lizhenhhh wants to merge 20 commits into
masterfrom
feat/hyperai-tui-profile

Conversation

@lizhenhhh

@lizhenhhh lizhenhhh commented Nov 2, 2026 •

Copy link
Copy Markdown

一、概述

本 PR 为 HyperAI Harness 集成品牌化 TUI 与原生 DSH Profile,并完善安装、Skills 管理、更新回滚及故障恢复能力。

本次主要变更包括:

  • 将上游 dsh-tui 定制为 HyperAI Harness,统一品牌色 #FF6096。
  • 保留纯终端字符界面,不依赖图片协议。
  • 基于原生 DSH Profile 机制提供 dsh --profile hyperai 入口。
  • 提供 Profile 安装、状态检查、诊断、修复和两阶段卸载功能。
  • 集成私有 HyperAI Skills 的安装、更新、回滚与数据保护机制。
  • 完善版本兼容性检查、LICENSE 分发和第三方许可声明。
  • 增加自动化测试、故障注入测试及独立 QA 验收报告。

本 PR 已完成三轮开发修复与最终双 Agent 定向验收。

二、代码版本

当前验收提交:

90ac001f8173ed891e2da62dc1097d97819bc465

关键修复提交:

  • 60dc943dc1a351f3ebbfb7aeb994a1c68ec1bc86 — Round 3 代码修复与回归测试。
  • 90ac001f8173ed891e2da62dc1097d97819bc465 — Round 3 统一报告。

原 Round 3 QA 基线:

f4d6d0c731f830ece866b6bfd5cdc1a10e176edb

本次沿用原 feat/hyperai-tui-profile 分支,未重新创建 PR,未修改 master,未重写已有 Git 提交历史。

三、主要修复内容

3.1 Skills 数据完整性与故障恢复

修复 Legacy Skills 安装器在两次目录重命名之间发生 SIGKILL 时,可能静默丢失用户附加文件的问题(BUG-R3B-01,原 P1)。

修复包括:

  • 根据目标目录、旧目录、staging、journal 和 manifest 的实际状态决定恢复动作。
  • 在目标目录缺失但旧目录完整时,优先恢复旧 Skill。
  • 保留用户自行添加的文件及其内容。
  • 无法确定安全恢复方式时,返回明确错误并保留恢复证据。
  • 完善 journal 状态记录与清理顺序。
  • 增加真实子进程 SIGKILL 回归测试。

3.2 安装及自动化接口

  • 修复 install.mjs --json 被 pnpm 进度输出污染的问题。
  • 修复 skills-update check --json 在部分失败路径输出非结构化文本的问题。
  • 完善错误码、退出码和凭据脱敏。
  • 优化失败依赖树在成功 repair 后的清理策略。
  • 补充卸载归档的恢复说明。

3.3 TUI 品牌与兼容性

  • 统一 HyperAI Harness 品牌名称和终端标题。
  • 保留 #FF6096 品牌色。
  • 调整 Splash font 和 Companion skin 的展示说明。
  • 保留 56 列窄终端紧凑版本信息。
  • 明确交互式 TUI 需要真实 TTY/PTY。
  • 保持上游 dsh-tui 版本锁定与 DSH Core 兼容性检查。

四、最终独立 QA 验收

最终验收日期:2026-11-03

最终验收 SHA:

90ac001f8173ed891e2da62dc1097d97819bc465

QA Agent 最终结论
Agent A READY WITH LIMITATIONS
Agent B READY WITH LIMITATIONS

两位 QA Agent 均在独立环境下进行定向验收,未修改被测源码或 PR。

4.1 P1 数据丢失修复验证

测试项目 Agent A Agent B
MID-SWAP 真实 SIGKILL 3/3 PASS 5/5 PASS
六类故障恢复验证 6/6 状态矩阵 PASS 6/6 真实 SIGKILL PASS
用户附加文件 24/24 哈希一致 24/24 哈希一致
Manifest 与文件一致性 PASS PASS
后续 v3 更新 PASS PASS
OpenBayes Linux 定向验证 PASS PASS

原 P1 数据丢失问题已由两位 QA 独立确认修复。

4.2 安装与生命周期

  • 真实授权 macOS 默认安装成功。
  • 默认 verified-only Skills 策略正常。
  • LICENSE 正确安装。
  • status、doctor、repair 正常。
  • 两阶段卸载正常。
  • 失败依赖树保留与恢复后的清理正常。
  • 用户 YAML 配置保留正常。

4.3 JSON 接口

  • install.mjs --json:成功及失败路径通过。
  • skills-update check --json:成功及失败路径通过。
  • stdout 输出合法单一 JSON 文档。
  • 进度及诊断信息不污染 stdout。
  • 未发现测试凭据泄露。

skills-update check --json 的退出码约定:

  • 0:无更新。
  • 2:有更新。
  • 1:执行失败。

4.4 测试结论

截至本次最终定向验收:

未发现尚未解决的 P0、P1 或 P2 缺陷。

本轮工程 QA 结论为:

READY WITH LIMITATIONS

该结论适用于已验证的工程范围,不代表所有操作系统、运行时和上游模型服务均已完成兼容性认证。

五、已知非阻断问题

最终 QA 仍记录以下 P3 问题,计划作为后续维护事项处理:

  1. Legacy Skills 在存在用户附加文件时,重复执行相同版本更新可能仍报告 updated,并刷新 installedAt。
  2. skills-update update --json 可能连续输出两个 JSON 文档,尚未统一为单文档输出契约。
  3. Git 不可用时返回通用 SKILLS_UPDATE_FAILED,尚无专用 GIT_UNAVAILABLE 错误码。
  4. 部分测试 fixture 使用 git init -b,在 Git 2.25 环境下存在兼容性问题。
  5. 卸载归档 README 的 cp -R 示例在目标目录已存在时可能产生嵌套,需要进一步明确复制目标。

以上问题均未被本轮 QA 评定为 P0/P1/P2 发布阻断缺陷。

六、已接受限制与未验证范围

  • hyperai/hyperai-skills 继续保持私有,不改变仓库可见性、URL、lock ref、鉴权及分发方案。
  • 私有 Skills 仓库的 LICENSE 与部分技能来源归属问题,留待公司在公开发行前确认。
  • dsh-tui 补丁目前绑定上游 0.16.1。
  • DSH Core 仅承诺已验证版本的兼容性。
  • 非 TTY 环境不支持交互式 TUI。
  • 56 列终端采用紧凑的 HyperAI 产品版本显示。
  • 上游 tool-ralph 告警及 Provider API Key 回显问题暂不在本 PR 中修改。
  • Windows、并发安装、网络文件系统、部分模型路由与异常场景尚未完成完整验证。
  • SIGKILL 后可能残留临时 Git clone 目录,作为已记录的低风险限制。

七、验收报告

仓库中已有 Round 3 开发修复报告:

  • ROUND3-UNIFIED-QA.md
  • ROUND3-FIX-REPORT.md
  • ROUND3-REGRESSION-RESULTS.md
  • ROUND3-SKILLS-CRASH-RECOVERY.md
  • ROUND3-QA-HANDOFF.md

最终独立 QA 另提供:

  • FINAL-TARGETED-QA-A.md
  • BUGS-TARGETED-QA-A.md
  • CRASH-RECOVERY-TARGETED-A.md
  • JSON-INTERFACE-TARGETED-A.md
  • INSTALL-LIFECYCLE-TARGETED-A.md
  • FINAL-TARGETED-QA-B.md
  • BUGS-TARGETED-QA-B.md
  • MID-SWAP-VERIFICATION-B.md
  • SKILLS-DATA-INTEGRITY-B.md
  • JSON-INTERFACE-TARGETED-B.md
  • LINUX-TARGETED-B.md
  • TERMINAL-TARGETED-B.md

上述最终 QA 文件为独立审核交付材料;不表示它们均已提交到本仓库。

八、PR 当前状态

本 PR 继续保持 Draft / Open / Unmerged。

代码与当前已验证范围内的工程 QA 已完成,等待公司进一步代码审查及后续合并决策。

本 PR 不涉及将私有 Skills 仓库公开,也不代表批准公开发行。


历史审核与原始 PR 描述(原文保留,不覆盖)

下列内容为 PR 历史记录原文。历史上出现的 PENDING、INSUFFICIENT EVIDENCE、NOT READY 等状态均代表当时阶段的结论;最终结论以本页上方的“最终独立 QA 验收”为准。

Summary / 变更概述

在 DeepSeek Harness 中新增 HyperAI Harness TUI 品牌适配和 原生 HyperAI Profile,并接入 HyperAI Skills 的检查、更新、目录和回滚能力;TUI 只负责提示与用户确认,实际扫描/安装/备份逻辑由 Profile 侧独立 CLI 承担。

本次 Draft PR 基于提交 85b5cde46,用于代码审查、把开发成果保存到公司仓库、以及继续完成跨平台和公开安装验收。不请求合并。

Upstream & License / 上游与许可证

上游来源

  • HyperAI TUI 基于上游 dsh-TUI,不是从零开发的 TUI:
    • 仓库:https://github.com/ccch1mneyyy/dsh-TUI
    • 使用版本:@deepseek-harness-tui/dsh-tui@0.16.1
    • Git tag:v0.16.1
    • Tag commit:73ff99fbed56563bf154d719effd09f9f9725349
    • npm license:MIT
    • 上游版权:Copyright (c) 2026, chimney (ccch1mneyyy)
    • 上游许可证:MIT(完整文本已随仓库保存)
  • 集成方式:pnpm patch 修改必要的品牌/展示逻辑;没有重新实现 TUI 渲染器,也没有迁移 OpenTUI。

许可证审查结论

  • dsh-TUI 0.16.1:MIT。GitHub tag、raw LICENSE、npm license 字段与 npm tarball 内 package/LICENSE 已相互核对;版权人为 chimney (ccch1mneyyy)。
  • 上游 THIRD_PARTY_LICENSES 还包含:
    • dsh-ui-whale:BSD-3-Clause(Copyright (c) 2026 lhh010);
    • dsh-anchored-standard:MIT(Copyright (c) 2026 xiaobright / Portions Copyright (c) 2026 DeepSeek)。
  • 上游 tui-profile/LICENSE:MIT,Copyright (c) 2026 dsh ecosystem community contributors。
  • 上游 npm tarball 捆绑的 MathJax / mhchem 为 Apache-2.0;TUI 包内保留其 LICENSE、NOTICE 和 LEGAL.txt。
  • DeepSeek Harness 本身:MIT,Copyright (c) 2026 DeepSeek。
  • 当前 patch 修改的是上游 MIT 代码;MIT 要求的 copyright + permission notice 已随仓库保留在:
    • apps/tui/LICENSE
    • apps/tui/docs/licenses/dsh-tui-0.16.1-LICENSE.txt
    • apps/tui/docs/licenses/dsh-tui-0.16.1-THIRD_PARTY_LICENSES.txt
    • apps/tui/docs/licenses/dsh-tui-0.16.1-tui-profile-LICENSE.txt
    • apps/tui/docs/licenses/mathjax-tex-svg-LICENSE.txt / mathjax-tex-svg-NOTICE.txt
    • 完整审查记录:apps/tui/docs/third-party-notices.md
  • HyperAI 新增代码(TUI bridge、品牌配置、patch 构建、测试和文档)沿用仓库 MIT 条款;没有删除或替换上游版权声明。
  • 直接 runtime 依赖的许可证族已核查:MIT、ISC、BSD-3-Clause、Apache-2.0、MIT OR CC0-1.0;未发现 GPL/AGPL/SSPL 等不兼容许可证。

重要说明与保留意见

  • 以上是工程侧的源码许可证审查,不是正式法律意见;公开发布前仍应完成公司法务/合规复核。
  • 上游 0.16.1 npm tarball 包含 package/LICENSE 和依赖/vendor 的许可证,但未包含仓库级 THIRD_PARTY_LICENSES(BSD 的 dsh-ui-whale 和 MIT 的 dsh-anchored-standard 通知)。本仓库已在应用级 notice 中独立保留这些文本。
  • 历史开发提交中存在已废弃 Logo 原型相关文件(当前树已删除,原型资产来自内部用户提供的品牌素材);这些历史原型资产的公开再分发权利需公司在发布前确认。本 PR 为 Draft,不代表已经完成公开发布授权。

Architecture / 架构

apps/tui/                 HyperAI 品牌、上游 patch、构建/验证/文档
apps/profiles/hyperai/    原生 DSH Profile、安装器、Skills CLI、回滚与测试
  • apps/tui/ 是自包含包,根 pnpm-workspace.yaml 通过 !apps/tui 排除,不进入 DSH 根 workspace 构建图。
  • apps/profiles/hyperai/ 使用原生 DSH dsh.profile.bundles:
    • @deepseek-ai/dsh-base
    • @deepseek-harness-tui/dsh-tui@0.16.1
  • Profile 通过 cordis.patch.yml 只声明 profile-scoped skill root;不预设 Provider、LiteLLM、默认模型或 API Key。
  • TUI 与 Profile 的职责边界:
    • TUI:品牌渲染、patch 构建与验证、Skills 提示/确认 UI;
    • Profile:Skills 远程检查、SHA pin、下载、安装、备份、回滚、manifest;
    • TUI 不实现第二套 scanner,也不直接安装 Skill。

Implementation / 技术实现

  • 品牌:产品名 HyperAI Harness,像素标题 HYPERAI / HARNESS,主色 #FF6096,无 Logo/鲸鱼/PNG 图像协议。
  • 字体:固定使用上游 solid bold 字形;避免上游每日轮换到 stencil 等空心字体;窄终端保留上游纯文字回退。
  • Profile:原生 DSH profile + pnpm hoisted workspace + patched dependency;安装器复制 patch 并验证安装结果。
  • Skills CLI:apps/profiles/hyperai/scripts/skills-update.mjs 提供 check / update / catalog / rollback;用户确认、验证、备份、保留本地修改、回滚。
  • TUI Skills 交互:启动后异步检查、约 24 小时一次、非阻塞提示、/skills-update 手动检查、持久结果对话框、安装前确认。
  • 未修改 DSH Agent Core、Provider 实现、原版 dsh-tui Profile,也未发布 npm 包。

Development History / 开发历程

  1. TUI 接入:研究 dsh-TUI 与 DSH Profile,选择现有 npm 包 + pnpm patchedDependencies。
  2. 品牌化探索:早期尝试 Logo 图像协议和鲸鱼绘制,最终删除 Logo/图像路径,改为纯像素字标和 #FF6096。
  3. 目录分离:拆分 apps/tui/ 与 apps/profiles/hyperai/,避免 TUI 渲染与 Profile 配置混在一起。
  4. 恢复原生模型配置:移除强制 Provider/模型/API Key 配置,恢复 /provider、/model 原生交互。
  5. Skills 管理:从固定名单升级为独立更新器,支持检查、安装、目录、回滚;随后加入 TUI 异步提示与确认流程。
  6. 交互修复:修复手动 /skills-update 检查结果只显示为短暂 toast 的问题,改为持久 managed dialog。
  7. 字体回归修复:上游按日轮换字体在 2026-11-02 命中 stencil 导致空心;固定 HyperAI 使用 solid bold,保留上游字体数据,不重画字体。
  8. 废弃的 Logo 原型只作为历史探索存在,不是当前产品功能。

Testing / 测试结果

自动化

node apps/tui/scripts/verify.mjs              -> 12/12 PASS
node --test apps/tui/tests/                   -> 13/13 PASS
node apps/profiles/hyperai/scripts/verify.mjs -> 9/9 PASS
node --test apps/profiles/hyperai/tests/      -> 32/32 PASS
  • build-patch.mjs 确定性构建通过;生成 patch SHA256:13eb0c4c916e1a3177d739bab75c5f5db02ac669706a61ca1d4a9ff179173e21。
  • Patch 包含 14 个上游文件,许可证检查、品牌色、无 Logo、字体固定、Skills bridge 边界均有断言。
  • 新增许可证文件存在性和上游 copyright 文本检查。

真实终端 / 环境

  • macOS Orca:实际启动通过;真实窗口截图覆盖修复前空心字体、修复后实心字体、对话开屏、较窄窗口和 900×600 回退布局;截图裁剪了本机窗口 chrome 和 workspace 路径。
  • macOS Terminal.app:此前开发阶段已验证深色/浅色/小窗口;本 PR 保留对应截图。
  • 品牌色实际截图中存在精确 #FF6096 像素;修复后标题为 solid bold。
  • /skills 可列出 Profile 中已安装 Skills;/skills-update 可进入检查流程,并显示持久反馈。
  • 原生 Provider 配置可保留:真实 Profile 显示用户已配置的 deepseek-flash;仓库 Profile 没有强制 Provider/模型/API Key。
  • 原版 ~/.dsh/profiles/dsh-tui 未被修改。

尚未测试(NOT TESTED)

  • Windows、Linux 的完整启动和安装验证。
  • 全新公开用户的端到端安装(npm 全球安装、profile 初始化、Skills 首次安装)。
  • 上游 0.17/0.18 升级兼容性。
  • 本轮未重新执行完整模型对话;此前开发阶段已验证,但不应把单元测试当作跨平台/模型验收。
  • 公开发布、法务正式审查和 Skills Internal 仓库的外部用户访问流程。

Known Limitations / 已知限制

  • 绑定 @deepseek-harness-tui/dsh-tui@0.16.1;任何上游小版本升级都可能使 exact-match patch 失败,需要重新适配并重跑全部验证。
  • HyperAI Skills 仓库当前是 Internal,外部用户无法直接访问完整更新源。
  • GitHub 网络在当前环境可能间歇超时;实际 Push 通过 SSH 完成,GitHub HTTPS git 通道曾出现连接失败。
  • Windows/Linux 尚未完整验收。
  • 公开用户安装和分发流程尚未完整测试。
  • TUI Skills 更新交互仍需要更多用户体验测试。
  • 历史原型提交包含本机路径字符串和已废弃 Logo 素材;当前树已移除/裁剪,但历史提交未做强制重写。若公开发布前需要清除,需单独评估历史重写并取得确认。
  • 许可证审查是工程侧结论,不是正式法律意见;上游 npm tarball 缺省不包含仓库级 THIRD_PARTY_LICENSES,本仓库已自行保留。
  • 窄窗口(约 900px)采用上游纯文字回退,不是大号像素字标;这是上游布局行为,不是回归。

Next Steps / 下一步

  • 在 macOS 上完成独立安装流程和全新用户端到端验收。
  • 增加 Windows/Linux 自动化与手动机器验收。
  • 继续完善 Skills 更新交互和错误/超时体验。
  • 评估上游 0.17/0.18 升级并更新 patch。
  • 设计正式发布机制,完成许可证/历史原型资产的最终法务复核。
  • 确认公开安装的 Provider/模型用户流程,不引入强制凭据。

Review Status / 审核状态

本 PR 为 Draft,仅用于保存开发成果、代码审查和后续测试。目前不请求合并,未经明确批准不得转为 Ready for review 或进行任何合并。

PR Checklist / 检查清单

  • TUI 品牌接入
  • 原生 HyperAI Profile
  • Skills 更新器
  • TUI 更新提示
  • macOS 已验证部分功能
  • 当前分支/上游源码许可证核查(MIT / BSD-3-Clause / Apache-2.0;记录见 apps/tui/docs/third-party-notices.md)
  • Windows/Linux 完整验证
  • 新用户端到端安装测试
  • 上游升级兼容验证
  • 历史 Logo 原型资产与公开发布法务确认
  • 最终合并批准

Round 1 — 独立 QA

  • QA 基线: 85b5cde463cb9e178f7cc57849b02e86927e2541
  • 两位独立 QA Agent 分别完成测试,覆盖 macOS 与 OpenBayes Linux。
  • 测试结果统一去重整理为 24 个 QA 项目(QA-001 … QA-024)。
  • 当时总体结论:NOT READY。原始 QA 报告与证据仍由两位 QA 分别保存;本 PR 仅记录统一索引后的修复状态,不替代原报告。

Round 1 — 开发修复

  • 实现提交: 89b416406
  • 报告提交: 1114f30ae、0d98839a5
  • 当前 PR head: 0d98839a532dc5f2b6be47acaa210540296dbb6c
  • 修复报告: FIX-REPORT.md(已在当前 PR 分支中)
  • 修复分支原为 fix/hyperai-unified-qa;已通过 fast-forward 追加到 feat/hyperai-tui-profile,未 rebase、未 squash、未 force push,原开发提交与修复提交均保留。

本轮修复覆盖:

  • 默认安装 TypeError(Skills 路径参数未规范化);
  • DSH Core / Node / pnpm 安装前版本预检,未验证的 Core(如 0.2.1-rc.5)明确拒绝且无绕过开关;
  • legacy Skills 更新的用户附加文件保护、manifest 指纹、rollback manifest 恢复与旧快照迁移;
  • git clone/checkout 超时;
  • 安装阶段状态、status/doctor/repair/uninstall 生命周期;
  • /update 上游更新入口禁用并指向 HyperAI 安装/发布流程;
  • Settings/终端标题/版本铭牌中的上游品牌残留;
  • Profile 许可证文件与字段;
  • 默认只安装 verified Skills,未验证 inbox 技能需显式 --include-unverified;
  • HOME/DSH_HOME 隔离、lockfile 策略和安装文档。

开发自测结果(仅代表开发自测,不代表独立 QA 最终验收通过):

node apps/tui/scripts/verify.mjs              -> 12/12 PASS
node --test apps/tui/tests/                   -> 13/13 PASS
node apps/profiles/hyperai/scripts/verify.mjs -> 12/12 PASS
node --test apps/profiles/hyperai/tests/      -> 49/49 PASS

patch 确定性构建 SHA256:ea68d6b2ed3a3cfb01ef2f55f80439b769ffc6e682c55798718203712a08ba99。

FIX-REPORT.md 逐项记录 24 个 QA-ID 的状态、根因、修改文件、测试结果、风险与剩余项。该文件是本轮唯一逐项状态来源,本 PR 描述不把未复测项写成已验收。

Round 2 — 独立复测

状态:PENDING / NOT STARTED

后续由原来的两位 QA Agent 对修复后的同一精确 SHA(当前为 0d98839a532dc5f2b6be47acaa210540296dbb6c)重新检出,分别完成 macOS 与 OpenBayes Linux 的冷安装、默认 Skills、Skills 更新/回滚、版本拒绝、生命周期、真实 Terminal.app/Orca 与终端矩阵复测。Round 2 的结论应在下一轮追加到本 PR,不覆盖 Round 1 的 NOT READY 结论。

已知限制与接受项

以下项目本轮没有被标记为已修复,也不全部视为当前内部使用的发布阻断:

  • QA-002(DEFERRED / ACCEPTED LIMITATION): hyperai/hyperai-skills 保持私有;不修改仓库可见性、URL、lock ref、鉴权机制或分发方式。当前内部使用要求是:已登录且具备权限的用户 Mac 可以完成默认安装、检查更新、升级和回滚。
  • QA-014(NEEDS COMPANY / LEGAL): TUI/Profile 的许可证声明已补充;但 Skills 私有仓库仍没有 LICENSE 文件,公开发布前必须由公司确认许可证与归属。
  • QA-017(NEEDS QA): 56/80/120 列完整真实终端矩阵尚未完成独立复测;版本铭牌已修复,但窄窗口布局仍需 QA 验证。
  • QA-020(NOT FIXED / UPSTREAM): 上游 tool-ralph entry 告警暂不修改,记录为上游边界/已知限制。
  • QA-024(ACCEPTED LIMITATION / UPSTREAM): 上游 Provider API Key 输入框明文回显暂不修改,记录为上游行为,不在品牌 patch 中分叉。

本轮 PR 更新记录

  • 原开发历史和原始 PR 描述保留不变;
  • 仅将 3 个修复/报告提交 fast-forward 追加到原 feat/hyperai-tui-profile;
  • Draft 状态保持不变,未转为 Ready for review;
  • 未创建新 PR、未推送独立修复分支、未合并到 master、未修改 Skills 仓库。

Round 2 — 独立 QA

  • Round 2 QA 基线(保留): 0d98839a532dc5f2b6be47acaa210540296dbb6c
  • 原两位独立 QA Agent 分别完成 Round 2 测试,覆盖 macOS 与 OpenBayes Linux。
  • 统一整理为 R2-01 … R2-17;当时总体结论:NOT READY。
  • 关键 P1 是默认 Skills 网络 clone 后 execFileSync(...).trim() 遇 stdout=null 抛 TypeError;另有安装中断状态、legacy SIGKILL 数据一致性、两阶段 uninstall、大 JSON 截断、错配 patch 半安装等 P2/P3。
  • 原始 QA 报告与证据保留在 QA Agent 处;本 PR 只追加开发修复记录,不改写 QA 原始结论。

Round 2 — 开发修复

  • Round 2 修复提交: 528010eaf
  • Round 2 报告提交: f4d6d0c73
  • 当前 PR head: f4d6d0c731f830ece866b6bfd5cdc1a10e176edb
  • 报告文件: FIX-REPORT-ROUND2.md(已加入当前 PR 分支)
  • 修复以追加提交方式进入原 feat/hyperai-tui-profile;未 rebase、未 squash、未 force push,Round 1 历史完整保留。

本轮主要修复:

  • R2-01:处理 execFileSync 在 stdout ignored 时返回 null;真实认证网络默认安装和本地 file:// bare remote 默认安装均通过;
  • R2-02:120/110/80/56 列 PTY 下堆叠 workspace/version,产品版本保持可读;
  • R2-03:install.mjs --dry-run 无论是否 --json 均 exit 0 且不写入;
  • R2-04:SIGINT/中断安装状态被 doctor 检测为 interrupted,提示 repair;
  • R2-05:doctor 使用显式 --dsh-bin,并对比上次安装记录;
  • R2-06:修正 plugin 注释中的环境变量 Provider 描述;
  • R2-07:两阶段 uninstall --yes → uninstall --yes --purge;
  • R2-08:legacy 技能 swap 增加 journal/recovery,SIGKILL 窗口可收敛 manifest 并保留用户文件;
  • R2-09:check --json 去掉完整 plan,TUI 对超大 stdout 明确报错而非静默截断;
  • R2-10:Profile LICENSE 纳入安装清单和 verify;
  • R2-11:依赖安装失败时恢复上一份 node_modules,隔离错误树;
  • R2-12:聊天头部版本改为产品版本,移除 whale Tip,Settings 标记上游兼容项;
  • R2-13:updater git 超时/权限错误给出可操作建议;
  • R2-14:保留用户 YAML 注释并做往返幂等测试;
  • R2-15:冷安装 --frozen-lockfile 缺 lock 时清晰失败,不静默退化;
  • R2-16/R2-17:文档化 pnpm HOME 副作用和非 TTY/JSON 支持边界。

开发自测(不代表独立 QA 通过)

node apps/tui/scripts/verify.mjs              -> 13/13 PASS
node --test apps/tui/tests/                   -> 13/13 PASS
node apps/profiles/hyperai/scripts/verify.mjs -> 12/12 PASS
node --test apps/profiles/hyperai/tests/      -> 59/59 PASS

补充开发证据:

  • 在隔离 DSH_HOME 中,使用真实已登录用户 HOME 的 GitHub 凭据完成 默认 node scripts/install.mjs:
    • exit 0;
    • Profile 状态 completed/done;
    • LICENSE、verified Skill、manifest 均落盘;
    • 私有 Skills check --json 返回 273-byte 紧凑结果,无完整 plan。
  • 真实私库默认安装使用 --source 之外的网络 clone 路径,满足 R2-01 的默认安装要求。
  • apps/tui/docs/screenshots/real/terminal-width-{56,80,110,120}.txt 记录 PTY 宽度证据。
  • 本机 TUI patch 已刷新并通过真实 Orca 验证:/update 禁用提示、Settings 品牌标签、产品版本、实心字标。

以上均为开发自测,不是独立 QA 验收。

Round 3 — 独立复测

状态:PENDING / NOT STARTED

由原 QA Agent A/B 分别检出同一精确 SHA(当前 f4d6d0c731f830ece866b6bfd5cdc1a10e176edb),重新执行 Round 2 清单及未修改功能的完整独立测试,覆盖 macOS 与 OpenBayes Linux;两份报告分别给出 GO/NO-GO。开发 Agent 不自行宣称最终通过。

Round 2 遗留与接受限制

  • QA-002: Skills 仓库保持私有,不修改可见性、URL、lock ref、鉴权或分发方式;已授权 Mac 的默认安装/更新是要求,匿名 Linux 失败为接受限制。
  • QA-014: Skills 私库自身 LICENSE 仍由公司未来决定;R2-10 的 Profile LICENSE 已修复,两者不混淆。
  • R2-16: pnpm Corepack 可能向 HOME 写入 shim,已文档化为宿主工具链副作用,不承诺零 HOME 写入。
  • R2-17: install.mjs --json 已清理依赖进度;非 TTY TUI 启动仍属上游 dsh-tui 边界。
  • QA-020 / QA-024: 上游 tool-ralph 警告、Provider API Key 明文回显仍未修改。
  • Round 2 部分证据(真实 SIGKILL、网络超时、错误 patch、非 TTY TUI)需在 Round 3 独立复测确认。

PR 更新状态

  • Draft 状态保持不变;
  • 未转为 Ready for review;
  • 未创建新 PR、未合并、未改 master、未修改 Skills 仓库;
  • Round 3 结论将在下一轮追加,不覆盖 Round 1/2 历史。

Round 3 开发过程历史记录(原文保留)

本节保留 Round 3 修复过程与当时开发自测记录;其中 “Final Targeted QA PENDING” 已在最终双 Agent 验收后关闭,最终结论见页首。


Round 3 — QA 历史结论

以下三份结论均保留,互不覆盖:

  • QA Agent A:READY WITH LIMITATIONS;报告 4 个 P3,未发现 P0/P1/P2。
  • QA Agent B 初版:INSUFFICIENT EVIDENCE;环境/版本/故障注入覆盖不足。
  • QA Agent B 深度验收:NOT READY / BUG-R3B-01;该报告在真实 SIGKILL 注入中确认 Legacy Skills 两次 rename 之间中断后,恢复路径会静默丢失用户附加文件。

Agent A 的 canonical kill 点 PASS 与 Agent B 的 MID-SWAP FAIL 并不矛盾:A 覆盖了常规时点,B 增加了两次 rename 之间的微窗口。按新证据,Round 3 的 R2-08 整体判为 FAIL,直到本轮修复。

Agent A 的详细原始报告在当前工作区未找到,未伪造其内容;本轮统一分析只使用任务提供的 A 结论,并完整读取 Agent B 初版与深度报告。原始 QA 报告均未修改或覆盖。

Round 3 — 开发修复

  • Round 3 被测 SHA: f4d6d0c731f830ece866b6bfd5cdc1a10e176edb
  • 代码修复 commit: 60dc943dc1a351f3ebbfb7aeb994a1c68ec1bc86
  • 报告 commit: 90ac001f8173ed891e2da62dc1097d97819bc465
  • 当前 PR head: 90ac001f8173ed891e2da62dc1097d97819bc465
  • 修复报告: ROUND3-UNIFIED-QA.md、ROUND3-FIX-REPORT.md、ROUND3-REGRESSION-RESULTS.md、ROUND3-SKILLS-CRASH-RECOVERY.md、ROUND3-QA-HANDOFF.md

P1 — BUG-R3B-01 修复

  • recoverSkillJournals() 现在按实际文件系统状态恢复,不再对缺失 target 直接 digestSkill 后吞掉 ENOENT。
  • 新增目标目录缺失但 oldPath 完整时的回滚:将旧树恢复到 target,恢复旧 manifest,保留用户文件,再清理 staging/journal。
  • journal 增加 prepared / old-moved / new-moved 阶段;恢复不单靠阶段字段。
  • 不可判定状态抛 SKILL_RECOVERY_FAILED,保留 journal/oldPath/staging/backup 并以非零退出;不再静默 exit 0。
  • 用户 extras 在 skill 根和 references/ 内均按哈希保留;冲突会保留 .hyperai-recovered-* 副本并安全失败。
  • 清理 journal 临时文件,修复测试中的偶发残留。
  • 真实 12 skill + 用户 extras MID-SWAP SIGKILL 回归:通过;重复 10/10。

其他修复

  • install.mjs --json:pnpm/dsh 子进程 stdout 捕获后转 stderr;stdout 仅一个合法 JSON;成功和失败均有稳定机器接口。
  • skills-update check --json:错误输出稳定 JSON envelope(GIT_TIMEOUT / GIT_AUTH / ROLLBACK_FAILED / SKILLS_STATE_INVALID),保留非零退出并脱敏 URL 凭据。
  • 两阶段 uninstall:归档 README 增加安全恢复步骤、目标检查、marker 清理、重装和 doctor 指引。
  • 失败依赖树:只在验证成功后清理 .hyperai-failed-node_modules;doctor 给出明确诊断。
  • updater D3:先 recover 再规划,避免恢复回滚的 skill 滞后一轮。
  • TUI:Splash font 可见值固定为 HyperAI fixed solid,Companion skin 标注 HyperAI 不使用,标题改为 HyperAI Harness · <session>;56 列保持紧凑产品版本并文档化。
  • 文档:明确 TUI 需要真实 TTY/PTY;非 TTY 属上游边界,CLI --json 才是自动化接口。

Round 3 — 开发自测

TUI verify              13/13 PASS
TUI tests               13/13 PASS
Profile verify          12/12 PASS
Profile tests           67/67 PASS
MID-SWAP crash test     PASS,重复 10/10
Linux x86_64 Node 24    TUI 13/13;Profile 64 pass/0 fail/2 skipped
真实授权默认安装        exit 0;completed/done;LICENSE;1 verified skill

真实非 dry-run --json:stdout 约 1.5 KB 合法 JSON,无 Progress: 污染;失败路径也有 JSON envelope。真实私有 Skills 默认安装使用隔离 HOME/DSH_HOME/npm prefix,未触碰真实用户 Profile。

以上为开发自测,不是 Agent A/B 的最终验收结论。

Final Targeted QA

状态:PENDING

请 Agent A 与 Agent B 对最终完整 SHA
90ac001f8173ed891e2da62dc1097d97819bc465
进行定向复测,重点:

  1. BUG-R3B-01 MID-SWAP 真实 SIGKILL(非 journal 模拟)及六 canonical kill points;
  2. 用户 extras 哈希、manifest/磁盘一致性、回滚和 v2/v3 收敛;
  3. install.mjs --json 与 skills-update check --json 成功/失败契约;
  4. 两阶段卸载恢复说明、失败依赖树清理、TUI Splash/标题/56 列;
  5. OpenBayes Linux x86_64、真实 Node/DSH 版本矩阵、模型 Provider(如凭证可用);
  6. 全部既有 R2/QA 回归。

本轮保留的限制

  • QA-002:私有 Skills 仓库保持私有;可见性、URL、lock、认证和分发不变。
  • QA-014:Skills 仓库 LICENSE/归属仍待公司公开发行前确认。
  • QA-020 / QA-024:上游 tool-ralph 告警和 API Key 回显未 fork。
  • 56 列:显示 hyperai v0.2.0 紧凑产品版本,不强行挤压完整上游版本;80+ 列为完整版本牌。
  • R2-16:pnpm/Corepack 可能写 HOME,使用 disposable HOME/预装 pnpm。
  • R2-17 / 非 TTY:TUI 需要 PTY;非 TTY 属上游行为,文档已明确。
  • B2/D2:SIGKILL 可能遗留临时 clone 目录;低风险,未自动清理。
  • 未独立复测:OpenBayes 主机、Windows、Node 18/20/22/23 全矩阵、DSH rc.3/rc.5/alpha.2、Anthropic/Bash/API 错误全矩阵;这些仍为 QA/环境待办,不宣称通过。

PR 状态

  • Draft:保持
  • Open:保持
  • Merged:否
  • 未改 master,未创建新 PR,未 force push/rebase/squash
  • 未修改私有 Skills 仓库

Additive distribution layer, no harness source changes:

- hyperai-tui: reproducible pnpm patch that rebrands upstream
  @deepseek-harness-tui/dsh-tui 0.16.1 (splash words HYPERAI/HARNESS,
  official HyperAI mark in the splash art slot, hyperai-tui wordmark,
  profile-scoped TUI state, updater disabled)
- brand art generated from the official HyperAI org avatar (lossless
  decode -> box downsample -> true-color half-block; dark/light variants)
- hyperai profile template: dsh-base + pinned TUI, env-driven
  OpenAI-compatible llm-pi-ai route, profile-scoped skills root
- idempotent installers (profile + skills) with backups, no overwrite of
  user-modified skills, pinned skills commit and manifest
- docs: distribution, branding, skills, OpenTUI comparison, verification
  procedure and captured screens

Verified locally: patch self-applies, 9/9 build checks, 14/14 tests,
branded TUI launches and talks to a live model, skills discovered and one
skill script executed, existing dsh-tui profile and ~/.dsh-tui state
unchanged. Not pushed.
Brand-visual corrections only; profile, skills, model routing and the
patch-based architecture are unchanged.

- logo: brand source is now the local canonical asset
  /Users/zhenhaoli/Downloads/51961168.png (60x60 RGBA), copied byte-for-byte
  to brand/hyperai-logo.png; no remote avatar URL is fetched. Generated
  terminal art rebuilt from it (generator minimum source lowered to 48px).
  Provenance and docs updated.
- title: new HYPERAI_PALETTE in branding.js feeds LogoV2's existing title
  ladder: dark theme HYPERAI #FF6096 -> #FFA6C4, HARNESS #FFA6C4 -> #FFF7FA
  (pink -> near white); light theme deep pink -> light pink for contrast.
  Wordmark/tagline reuse the same pink family. No title component rewritten.
- verify: 11/11 checks (adds pink-palette + local-logo-source checks);
  tests 14/14. Profile re-installed (patch replaced, manifest/profile files
  unchanged) and re-verified with live PTY captures: pink title, zero
  blue-ish title cells, live model reply PINK_BRAND_OK + bash BRAND_TOOL_OK.
- existing dsh-tui profile files and ~/.dsh-tui state hashes unchanged.
The splash mark no longer comes from a bespoke PNG -> ANSI encoder. It now
uses the same mechanism as the upstream DeepSeek whale, so the two art slots
render identically.

- data: the official local asset (/Users/zhenhaoli/Downloads/51961168.png,
  60x60 RGBA) is downsampled to a 26x26 mark, quantized to the source's own
  white/pink colors and emitted as a whale-format letter grid (one palette
  letter per sprite pixel, '.' transparent) in
  brand/generated/hyperai-logo.js.
- renderer: overlay/components/hyperaiLogo.js calls the upstream whale's own
  renderSpriteRows (imported from components/Whale.js) once at module load and
  feeds the rows to Text, mirroring WhaleArt. No image protocol, no
  theme-specific recolor: the white plate stays white and the pink pattern
  keeps its official color; transparent pixels use the terminal background
  (\x1b[49m for the empty half of a half-covered cell).
- the old light-theme ink variant (white plate -> #1A1A20) is removed; it was
  the source of the black disc on light terminals.
- resolution: 13 rows x 2 px = 26 px tall, so a square mark is capped at 26x26
  (26 of the 40 slot columns); documented as the distortion-free limit.
- patch: rebuilt (12 files); hyperaiLogoRows.js now carries the letter grid and
  palette; build-patch self-check asserts the whale renderer import.
- verify: 11/11 (adds whale-grid/palette and whale-renderer-reuse checks);
  tests 14/14. Profile re-installed (patch replaced, manifest/rows unchanged).
- verified in the real macOS terminal (Terminal.app) as well as PTY: dark and
  light window captures plus an upstream-whale reference rendered by the same
  renderSpriteRows; no black plate/ring, transparent pixels show the terminal
  background. PTY screenshots are now rendered with exact half-block
  rectangles so tooling artifacts are not mistaken for product defects.

The HYPERAI HARNESS pink title gradient is unchanged.
…26x26 fallback

The canonical logo source is now the official SVG provided by the user
(/Users/zhenhaoli/Downloads/logo-icon-border-1.svg, copied to
brand/hyperai-logo.svg). The retired 51961168.png is no longer referenced.

Generation chain (scripts/generate-logo-art.mjs, Node built-ins only):
1. parse the SVG: 120x120 viewBox, white circle 'Oval' path (center 60,60
   r=55), 90x89 icon rect, objectBoundingBox pattern matrix, and the embedded
   271x267 RGBA PNG data URI (decoded with the local PNG decoder);
2. composite analytically at 512x512 with 4x4 supersampling: white circle ->
   icon stretched into its rect exactly as the pattern maps it; cross-checked
   against rsvg-convert at 1024x1024 (alpha IoU 0.9996, mean abs diff 1.18/255);
3. alpha-crop + downsampling to two letter-grid sprites in the whale frame
   format: wide 40x40 (20 display rows) and compact 26x26 (13 rows), quantized
   along the SVG's own white #FFFFFF -> rose #E11D48 blend line (5 palette
   letters, '.' transparent). Nothing is recolored or darkened.

Rendering still reuses the upstream whale's renderSpriteRows (no new renderer,
no image protocol). components/hyperaiLogo.js renders the wide sprite when
terminal content rows >= HYPERAI_LOGO_WIDE_MIN_ROWS (44) and degrades to the
compact sprite on smaller windows; splashArtRows.js/Launchpad.js use the same
threshold for the layout budget so the hero and the logo always agree.

Real Terminal.app verification (OSC 11 backgrounds, ScreenCaptureKit PNG):
169x55 dark and 168x54 light windows show the 40x40 mark; the 139x40 window
shows the automatic 26x26 fallback. Clarity experiment (docs/screenshots/
logo-clarity-svg.png) compares 26/40/48 grids on the same background and box:
40x40 is adopted as the main mark; 48x48 is sharper but needs a 24-row slot and
is deliberately not used.

Also: branding/provenance/verification docs rewritten for the SVG chain,
generator tests replaced with SVG-parse/composite/sprite checks, verify.mjs
extended for both sprites + the dynamic art height, screenshots refreshed.
verify: 11/11; tests: 16/16. Profile re-installed (patch replaced only);
the dsh-tui profile and ~/.dsh-tui state stay byte-identical.
…te fallback

The splash mark now shows the canonical SVG as a 512x512 transparent PNG when
the renderer reports terminal graphics support (Kitty Graphics / Sixel), and
keeps the existing 40x40 / 26x26 whale-format sprite rows everywhere else.

Build:
- scripts/generate-logo-art.mjs also encodes the 512x512 RGBA composite as a
  PNG (pure Node + zlib) and embeds it (base64 + sha256) in
  brand/generated/hyperai-logo.js; the SVG stays the only committed source.
- no quantized colors on the HD path: full white->rose anti-aliased raster with
  transparent background.

Runtime (components/hyperaiLogo.js):
- reuse of the upstream image pipeline, no custom protocol code: the component
  asks the renderer's own capability probe (useTerminalImages; Kitty query +
  DA1 + cell metrics, disabled under tmux/screen, non-TTY, non-fullscreen and
  DSH_TUI_DISABLE_TERMINAL_IMAGES), lazily decodes the embedded PNG through the
  upstream sharp loader, and paints it with the upstream Image component
  (transparent, presentation 'transcript') so the renderer owns placement,
  cropping, clearing and resize redraw.
- the sprite rows are passed as the Image component's children: any failed
  placement, missing sharp, or unsupported terminal keeps the ANSI fallback.
- the art slot stays a fixed height (20 rows wide / 13 rows compact, same
  HYPERAI_LOGO_WIDE_MIN_ROWS threshold as splashArtRows/Launchpad), so
  HD<->ANSI switches never move the title, composer or footer.

Verified in real terminals:
- Ghostty 1.4.0 (macOS 26.1) probe: Kitty Graphics query replies 'OK', cell
  size 8x17 px; startup, chat splash, small window and resize-back captures show
  the HD PNG with transparency, smooth edges and one placement (no ghosting);
- Terminal.app (no Kitty/Sixel), a PTY without terminal replies, and Ghostty
  with DSH_TUI_DISABLE_TERMINAL_IMAGES=1 all keep the ANSI sprite; under TMUX
  no Kitty payload is emitted;
- live Ghostty session answered GHOSTTY_HD_OK and ran the bash tool
  (GHOSTTY_TOOL_OK); PTY chat splash reports 'Skills 10'.

Docs updated (branding, verification, READMEs, provenance); verify 11/11,
tests 17/17. The dsh-tui profile and ~/.dsh-tui state stay byte-identical.
…) + diagnostics

Root cause of the reported "logo completely disappears" in the user's real
embedded terminal (Orca 1.4.244, xterm.js 6.0.0, light theme):

- real probes inside Orca: DA1 '?1;2c' (no Sixel), Kitty query: no reply,
  OSC 11 background rgb:ffff/ffff/ffff, XTVERSION xterm.js(6.0.0), no cell
  pixel replies;
- the renderer therefore correctly selects no image protocol and paints the
  ANSI sprite (the fallback was NOT hidden: the sprite is in the frame and its
  pale blend pixels are in the capture);
- the defect is contrast: the official mark is a #FFFFFF circle on
  transparency and Orca's light background is exactly #FFFFFF, so the plate and
  its near-white anti-aliased blends vanished and only the rose icon survived.
  Measured on real captures (icon-centred radial rose profile, circle-edge rim
  pixels): before fix 0, after fix 3811+2450; dark controls still 0.

Fix (no SVG change, no recolouring outside the SVG's own palette):
- generator now derives light-theme variants: it repaints only the circle's
  existing outer edge with the SVG's own icon accent (K = #E11D48) in the ANSI
  sprites, and blends the same ring into the 512x512 HD PNG;
- components/hyperaiLogo.js selects dark/light from the resolved TUI theme
  (useTheme + isLightThemeActive) for both the sprites and the embedded PNG;
  dark terminals keep the official rendering byte-for-byte (unit-tested);
- the ANSI sprites stay the Image component's children, so any placement or
  decode failure still renders the sprite (tested with a corrupted embedded PNG
  in real Ghostty).

Diagnostics: scripts/diagnose-terminal.mjs (human + --json) reports terminal
identity, real DA1/Kitty/XTVERSION/cell/OSC 11 probes, multiplexer state,
selected protocol, theme variant, chosen path and fallback reason without
reading secrets; covered by tests/diagnose-terminal.test.mjs and verify.

Verified for real: Orca light (fixed, before/after + small window + resize back
with no ghost), Terminal.app dark/light ANSI, Ghostty dark/light Kitty HD,
Ghostty images-disabled and corrupted-PNG ANSI fallbacks, PTY without replies
(ANSI, startup not blocked), tmux (no graphics bytes), live model + bash tool
(FIX_OK/FIX_TOOL_OK), Skills 10. Sixel code path only smoke-tested (no Sixel
terminal installable offline); iTerm2 inline images intentionally not
implemented (needs a third graphics manager in the upstream renderer); VS
Code/Cursor and Windows/Linux are NOT TESTED.

Docs: docs/image-protocols.md (source-level architecture + OpenTUI comparison),
docs/terminal-compatibility.md (matrix, diagnostics, limitations), branding,
verification, READMEs, provenance. verify 12/12, tests 20/20. Original
dsh-tui profile and ~/.dsh-tui stay byte-identical.
…6 title

Controlled simplification and directory refactor; no renderer or image-protocol
work, and the original dsh-tui distribution path is untouched.

Structure:
- apps/tui: the HyperAI TUI distribution only (brand data, patch builder,
  patch, tests, docs). It has no profile/model/skills code.
- apps/profiles/hyperai: the native DSH profile only (manifest + bundles,
  cordis.patch.yml model/TUI/skills wiring, profile installer, skills installer,
  skills lock, docs, tests). It contains no TUI implementation; the installer
  copies apps/tui's generated patch into the managed profile.
- the old hyperai/ tree is removed. apps/tui is intentionally excluded from the
  root pnpm workspace (no workspace deps/build graph), so the DSH lockfile,
  project list and build graph are unchanged.

TUI simplification:
- the startup splash renders no logo at all: no SVG/PNG/ANSI sprite, whale or
  mascot. Logo generation (SVG->PNG, whale-letter sprites, 512 base64 payloads,
  light rim variants), the logo component, its tests, screenshots and the
  terminal-image diagnostics are deleted. The splash hero is now the pixel
  wordmark only, with no reserved art rows (LogoV2 row/column branches and the
  launchpad budget suppress art).
- branding is one colour from src/brand.json: #FF6096. HYPERAI HARNESS, the
  wordmark and the welcome line all use it on dark and light themes; the four
  title colour sources are forced to the solid brand colour so a font palette or
  the bevel font's derived shading cannot reintroduce a gradient/purple ramp.
- the upstream big pixel font is kept unchanged; the two words are pyramid
  centred where alignment allows, and the narrow-terminal plain title also uses
  the brand pink.
- remaining brand-display copy drops DeepSeek/whale-girl wording (star/thanks
  modals, onboarding connection line, thinking description, interrupted-turn
  help). DeepSeek-platform-only surfaces (balance/coupon/login) keep their
  platform wording on purpose.
- the patch is 10 upstream files / ~35 KB, down from >150 KB with embedded art;
  every edit stays an exact-match replacement and the build self-applies the
  generated patch against a pristine upstream copy.

Verification:
- TUI: verify 8/8, tests 7/7; profile: verify 7/7, tests 10/10; patch rebuild is
  deterministic and matches the installed profile.
- real Terminal.app captures for dark, light, small-window, resize-back and chat
  splash show the pink pixel wordmark with no logo and no blank art block
  (#FF6096 pixels present, old logo rose/whale blue pixels absent).
- real Orca embedded-terminal screen buffer shows the same no-art splash
  (window screenshot capture unavailable in this environment).
- real model + tool regression through the OpenAI-compatible gateway:
  glm-5.3/deepseek-v4-pro answered SIMPLE_OK and ran bash SIMPLE_TOOL_OK;
  chat splash reports Skills 10; deepseek-v4-flash currently returns a
  provider-side 400 'no healthy deployment' (route unchanged).
- the installed profile was backed up, refreshed in place, and its skills
  directory + manifest stayed byte-identical; existing dsh-tui profile and
  ~/.dsh-tui state were not touched by this work.
The HyperAI profile no longer presets a model provider, endpoint, credential
variable or default model. It behaves like the original dsh-tui profile: model
configuration is DSH-native user configuration, made with /provider and /model.

Root causes fixed:
- The profile template's llm-pi-ai row used !!js expressions inside the
  volatile providers config. DSH settings writes validate the raw profile
  config before expressions resolve, so the expression node arrived as an
  object: "$.providers.hyperai.apiKeyEnv expected string but got [object
  Object]". Any provider add/edit failed while that row existed.
- The same row plus the dsh-tui provider/model override forced route
  "hyperai" resolving HYPERAI_API_KEY, which is absent for users: turns
  failed with 'no credential for provider route "hyperai"'.

Changes:
- cordis.patch.yml now contains only the profile-scoped skill root; the
  environment-driven llm-pi-ai preset and dsh-tui provider/model override are
  removed. DSH bundle defaults (deepseek-official / deepseek-flash) apply until
  the user configures a provider, and the native /provider and /model flows
  create plain, editable rows in the installed profile patch.
- installer: reinstall now merges the installed cordis.patch.yml instead of
  replacing it. The removed legacy preset is dropped, while user-created
  llm-pi-ai rows, insert rows and user-edited dsh-tui rows (minus the legacy
  env-driven provider/model keys) are preserved; replaced files are still
  backed up. Next-step output points at /provider and /model.
- verify/tests cover the minimal template, no forced credential/default, and
  migration that keeps user provider/TUI configuration.
- profile/TUI docs updated; TUI brand, patch and visual design untouched.

Verification (isolated profile under the real DSH home, no real-profile write):
- /provider add (custom route litellm + env key ref) saved successfully; the
  installed patch gained a plain llm-pi-ai row.
- /provider edit (base URL) reported 'configuration updated' with no
  apiKeyEnv type error; restart kept the provider.
- /model selection persisted to model.json across restart.
- real LiteLLM call via deepseek-v4-pro returned FIX_OK; direct gateway probes
  returned 200 for deepseek-v4-pro and glm-5.3 (claude-opus-4.6 read timed out).
- fresh profile without a provider shows the native llm-deepseek
  DEEPSEEK_API_KEY error, not a HYPERAI_API_KEY error; context line reports
  Skills 10.
- profile verify 8/8, profile tests 11/11; TUI verify 8/8, TUI tests 7/7.
- real installed profile migrated via the installer after a full backup; its
  skills and manifest are byte-identical, existing credentials refs
  (LITELLM_API_KEY/GONGSI_API_KEY) and TUI state untouched, original dsh-tui
  profile untouched, and a real launch shows the native deepseek-flash default
  with no HYPERAI_* error.
@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown

Preview for #1 (requires Cloudflare Access sign-in)

@lizhenhhh lizhenhhh changed the title feat: 集成 HyperAI TUI 与原生 Profile(Draft,待完整验收) feat: 集成 HyperAI TUI 与原生 Profile Nov 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant