Skip to content

feat(linux): support managed user installs and updates on Arch/Omarchy - #3922

Open
dashhuang wants to merge 2 commits into
mainfrom
feat/arch-linux-omarchy-support
Open

feat(linux): support managed user installs and updates on Arch/Omarchy#3922
dashhuang wants to merge 2 commits into
mainfrom
feat/arch-linux-omarchy-support

Conversation

@dashhuang

Copy link
Copy Markdown
Member

这次改了什么

摘要

为 Arch Linux / Omarchy 提供可维护的用户级安装、更新和桌面集成路径,解决手动解包 DEB 后更新仍走 apt/dpkg、重启丢失安全存储选择器的问题。目标是完整打通这条安装生命周期,不是宣称所有 Linux 功能和硬件都已验收。

更新器改动已与 owner 确认:本任务由已核验仓库管理员身份的 @dashhuang 明确授权 Linux 安装/更新/凭据兼容支持及提交 PR;没有执行合并或发布。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护

范围

  • 关联需求:Omarchy / Arch 手动安装后,应用更新未替换实际启动版本,且登录安全存储后端在重启时不一致。
  • 本 PR 包含:
    • 同一官方 DEB 作为用户安装载荷;libarchive 解包,不运行 Debian maintainer scripts,不依赖 apt/dpkg/root。
    • 明确的 owned marker、版本目录、稳定入口与原子 current 切换;私有快照的 size/SHA-256 校验,版本/架构/region 校验,失败清理与重试,保留旧版本。
    • 区分受管理用户安装、确实由 dpkg 拥有的安装和未知/第三方布局。后者在退出或停止活动工作前给出指南/稍后/重试提示,保留已下载文件。
    • Hyprland/Sway/Niri 的早期 gnome-libsecret 选择;显式选择优先,成功/失败更新重启均保留 selector;无新增 basic/plaintext 降级。
    • 稳定 reverse-DNS desktop identity、菜单入口、CLI launcher、cindy/xdt-maker 回调;旧安装迁移、依赖、密钥环、Wayland portals 和卸载说明。
    • Forge Linux build metadata、五种语言文案、Linux CI 夹具依赖与回归测试。
    • 真实 Linux gate 暴露的两处 Pi 测试夹具修正:canonical Linux 路径属于 project scope;保留 dotglob 的原操作后增加唯一匹配的 ordinary 控制读取,避免 Bash 将两个文件匹配判为 ambiguous redirect 导致无效的成功预期。Ask/Auto 的拒绝断言和所有生产权限逻辑不变。scope 的依据是已 pin Pi 的资源分类实现
  • 明确不包含:AUR/pacman 包、AppImage、发行发布、所有发行版/硬件认证;不修改 Windows/macOS 原生更新器、Pi runtime/pin、模型 prompt、权限策略、数据库 schema 或用户系统配置。
  • 用户可见变化:受管理用户安装可无提权更新;不支持的安装方式得到可行动提示;桌面回调与密钥环选择跨更新稳定。
  • breaking change:不自动接管手动/第三方安装;这类布局不再进入错误的 Debian 安装流程,需要按指南迁移或使用其包管理器。旧版缺少 build metadata 的包不能引导新布局。region/userData 名称保持不变。

UI 变化

  • 新增 Linux 安装前提提示(指南、稍后、重试)。重试重新探测活动工作,仍需用户确认重启。
  • 引用的设计规范:docs/design-rules/DESIGN.md §4 Dialog/Modal、§10 明暗主题、§14.2 焦点。复用 ConfirmDialog 和已有语义 token,主按钮自动获得焦点;五种语言齐全,明暗主题下均有 DOM 交互测试。
  • 尚未取得真实界面截图;没有把 jsdom 测试当作视觉验收。

怎么验证的

自动验证

Node 22.23.2 / pnpm 10.33.2
taskset -c 0,2,4,6 pnpm test:unit:related
  PASS — CI 文件变更触发完整 unit gate;28 个 workspace + test:runner 全部通过
  desktop 660.0s,mobile 45.3s,maker-core 362.2s;没有新增 skip 或修改 timeout
pnpm --filter desktop run --if-present typecheck
  PASS
pnpm --filter @cindy/maker-core run --if-present typecheck
  包没有此 script,按仓库 --if-present 规则不适用
pnpm check:i18n
  PASS — 5 种语言、8724 个 key 一致(既有非阻断告警保留)
pnpm check:i18n-glossary
  PASS — 无新增违规
desktop 定向测试(安装、更新、UI、后端选择、已有 Agent Island 用例)
  239 tests passed
真实 pinned Pi + fake gateway / resource discovery
  67 passed,1 个历史二进制恢复用例按既有条件 skip
git diff --cached --check
  PASS
PR design-basis 本地校验
  PASS
pnpm test:runner(最终文档顺序调整后重跑)
  PASS — 502 passed, 1 existing skip
pnpm check:dco(远端实际 PR commit)
  PASS — 1 signed-off commit

首轮验证曾出现 native module 加载崩溃(测试与开发启动的原生模块重建并发)和并发下的 5s import 超时。改用受支持的 Node 22、将原生模块重建与测试分开、降低测试并发后,最终完整 gate 通过。发现的 Linux Pi 夹具错误经真实二进制和上游实现核对后修正,未改任何生产权限逻辑。

手工验证

  • 本机:Omarchy 4.0.2 / Arch,Hyprland Wayland,x86_64;Node 22.23.2、pnpm 10.33.2、Electron 41.10.3。
  • 使用独立 D-Bus、临时 keyring/profile 和合成测试值,两个独立 Electron 进程先加密后解密成功,backend 为 gnome_libsecret。未读取或改动真实账户凭据;这不是实际账号登录验收。
  • 合成 DEB 的安装/连续更新/损坏与错误 region/version 拒绝/symlink escape/激活失败后重试/桌面文件校验/真实 detached updater 成功和失败后重启均自动实跑;临时 HOME、fake app 和 fake xdg-mime,不改本机安装或默认回调。
  • 已核对最新 main 的新增提交与本 PR 文件无重叠。

未执行的验证

  • 尚未用含此改动的两个真实发行版做全链升级、真实账号冷启动登录保持和存量 profile 迁移;合并后需先生成候选包,并把安装脚本与可信 checksum 连接到官方分发入口,完成文档中的验收清单后再推广。
  • 隔离开发启动的 main/preload 编译完成,但正式启动工具最终给出 DESKTOP_DEV_VERDICT=failed code=WHOAMI_MISMATCH,不能宣称启动验收通过;没有为绕过它改启动判定。
  • 未实测 ARM、GNOME/KDE、Debian 提权更新、Windows/macOS 硬件、Wayland 屏幕共享/通知/文件对话框或明暗主题视觉截图。既有平台路径保留,仍须对应发布 runner/设备验收。
  • Pi 改动只在测试夹具中;生产 prompt、tool 暴露、translator、usage、热路径均无 diff,因此没有新增模型调用或缓存率变化的运行时实现。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异

影响与回滚

  • 影响范围:Linux 安装/更新/凭据后端及其 UI;存量插件影响:无,安装器不复制、清空或迁移 userData/插件/密钥环。受管理安装必须归当前用户、位于 HOME 内并带有效 marker;不覆盖未标记目录。
  • 密钥环锁定或丢失仍需要用户修复/登录,不保证恢复已吊销 token。迁移时有显式 backend 的用户应保留该选择。
  • 失败在激活前时保留当前版本并重启它;成功后通过稳定入口启动新版本,旧 release 不自动删除。二进制回滚不是数据库回滚:新版本运行过迁移后不得盲目自动启动 previous;优先前向修复或恢复匹配的数据备份。
  • 全链发布验收未完成前不要面向所有 Linux 用户宣称完整支持或默认迁移;旧的 Debian 系统包路径继续保留。可撤回此 PR 或发布修正版本,不涉及服务端 manifest 格式变更。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名
  • UI 改动已注明引用的设计规范章节
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

Add verified user-owned installation transactions, stable desktop and login callbacks, and keyring selector preservation. Document migration and release acceptance; cover native updater failures and Linux test fixtures.

Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
@dashhuang
dashhuang requested a review from a team as a code owner September 4, 2026 12:26
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 4, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-04T20:51:09.915504Z efff6d9 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@greptile-apps

greptile-apps Bot commented Sep 4, 2026

Copy link
Copy Markdown

Greptile Summary

此 PR 为 Arch Linux/Omarchy 增加受管理的用户级安装与更新流程,同时完善 Linux 安装识别、密码存储后端选择、桌面集成、更新恢复提示、构建元数据、文档及回归测试。

  • 通过经过大小、SHA-256、版本、架构及 region 校验的 DEB 载荷创建版本化用户安装。
  • 区分受管理用户安装、dpkg 所有的系统安装与不受支持的第三方布局。
  • 为 Hyprland、Sway 和 Niri 提前选择 Secret Service,并在更新重启时保留显式后端。
  • 新增稳定启动入口、桌面文件、深链接关联及多语言恢复对话框。
  • 当前安装事务仍有两个中断一致性问题:首次安装可能无法通过重试补齐启动器,激活失败可能破坏 previous 指针。

Confidence Score: 4/5

此 PR 暂不宜合并,因为首次安装在激活后的中断无法通过正常重试恢复稳定启动器。

用户级安装器先激活 release、后创建启动器,却在重试相同 release 时提前退出;此外,激活失败会提前覆盖并损坏文档化的 previous 回退指针。其余更新预检、打包和 UI 恢复路径未发现明确的阻断问题。

Files Needing Attention: apps/desktop/resources/linux/install-user.sh

Important Files Changed

Filename Overview
apps/desktop/resources/linux/install-user.sh 实现用户级安装和原子版本切换,但中断后的幂等修复及 previous 提交顺序存在一致性缺陷。
apps/desktop/src/main/linuxInstallation.ts 对受管理用户安装和 dpkg 所有关系进行保守识别,并检查用户、路径、marker 与当前 release。
apps/desktop/src/main/updateScriptLinux.ts 将用户安装事务嵌入脱离进程的 Linux 更新脚本,并保留稳定启动路径和密码存储参数。
apps/desktop/src/main/updateService.ts 在停止活动工作前执行 Linux 安装方式和依赖预检,并在执行前再次验证布局。
apps/desktop/src/renderer/components/sidebar/UpdateBanner.tsx 为不受支持的 Linux 安装新增指南、稍后和重新检查流程,并复用现有活动任务保护。
apps/desktop/forge-linux.ts 为 Linux 打包产物写入安装器所需的版本、架构、region 与可执行文件身份。
apps/desktop/resources/linux/register-desktop.sh 为受管理安装创建稳定的桌面入口、CLI 启动路径和深链接关联。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[下载官方 DEB] --> B[校验大小与 SHA-256]
  B --> C{识别当前 Linux 安装}
  C -->|受管理用户安装| D[私有快照并解包载荷]
  C -->|dpkg 所有| E[通过 pkexec 安装系统 DEB]
  C -->|未知或第三方布局| F[保留下载并显示迁移/包管理器指南]
  D --> G[校验版本、架构、region 与链接]
  G --> H[创建版本化 release]
  H --> I[记录 previous]
  I --> J[原子切换 current]
  J --> K[通过稳定 current/Cindy 重新启动]
  E --> K
Loading
Prompt To Fix All With AI
### Issue 1
apps/desktop/resources/linux/install-user.sh:117-118
**中断后无法补齐启动器**

首次安装在切换 `current` 后、创建 `launch` 前如果被信号、崩溃或断电中断,已激活的 release 会被保留。用户重试同一安装包时,这里的幂等分支会直接成功退出,跳过 `launch` 的创建。结果是文档要求的 `PREFIX/launch` 不存在,`register-desktop.sh` 也会因为该文件不可执行而拒绝注册,正常重试无法修复安装。应让幂等重试补齐启动器,或在激活前原子地准备启动器。

### Issue 2
apps/desktop/resources/linux/install-user.sh:127-133
**激活失败会破坏回退指针**

更新事务在切换 `current` 之前就覆盖了 `previous`。如果激活重命名失败,或进程在两次重命名之间中断,`current` 仍指向旧版本,但 `previous` 也已被改成同一个版本,原来的回退指针就会丢失;退出清理也不会恢复它。这会让文档中保留的上一版本指针失去作用。请将两个指针作为可恢复的提交步骤处理,或在激活失败时恢复旧的 `previous`---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "feat(linux): support managed user instal..." | Re-trigger Greptile

Comment thread apps/desktop/resources/linux/install-user.sh Outdated
Comment thread apps/desktop/resources/linux/install-user.sh Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bf89981d63

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/desktop/resources/linux/install-user.sh Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

@dashhuang 👋 这个 PR 还有 3 条 review conversation 没 resolve(apps/desktop/resources/linux/install-user.sh),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi

Copy link
Copy Markdown
Contributor

@dashhuang 👋 这个 PR 改动了受保护的路径(.github/workflows/ci.yml),auto-review 因此不合并、也不会自动审查。

这些路径的改动需要人工处理。如果执意要改,请联系 Lizi。

@MagicLizi MagicLizi added status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:security 改动碰到安全边界(review-pr 自动维护,仅展示) and removed status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) labels Sep 4, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/desktop/src/renderer/components/sidebar/UpdateBanner.tsx)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范

Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:security 改动碰到安全边界(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants