Skip to content

Releases: Liyue-Cheng/marina

Marina v0.2.3 — issue #4 续:hideTopTabBar 重选 path 修复

Choose a tag to compare

@Liyue-Cheng Liyue-Cheng released this 05 Jun 12:31

修复

  • hideTopTabBar=true 时,点已选中的 path 不会回到新建页(issue #4 续)。
    现象:开了文件夹 A 的终端后再点 A 本身,view 不动;必须先点 B 再点回 A 才能看到 EmptyPathState。
    根因:view/select-path reducer 把"清空 selectedSessionId"放在 action.pathId !== state.selectedPathId 守卫里,同 path 走 no-op 分支,selectedSessionId 不变 → MainPane 继续渲染 TerminalView。
    修法:hideTopTabBar=true 时无条件清空 selectedSessionId(同 path / 切 path 都清),恢复 issue #4 设计意图——"点 PathItem 永远进新建页"。配套修正 Sidebar.handlePickFolderForTemp 在临时栏 + 新建 session 后显式补一次 view/select-session,否则新 reducer 行为会把 sessions/created 刚 set 的 selectedSessionId 又抹掉,用户刚显式新建却看到空白页。

下载

  • Marina-Setup-0.2.3-x64.exe — NSIS 安装版
  • Marina-Portable-0.2.3-x64.exe — 免安装版

完整变更见 CHANGELOG.md。

Marina v0.2.2 — issue #4 hideTopTabBar + xterm 6.1 升级

Choose a tag to compare

@Liyue-Cheng Liyue-Cheng released this 03 Jun 14:44

issue #4 落地 + xterm 6.1 升级对齐 VSCode + CURSOR-2 调研记录归档。

新增

  • 设置 → 外观 → 隐藏顶部标签栏(issue #4)。 Sidebar 已按路径分组显示所有 session,TabBar 内容重复且占纵向空间。新增 appearance.hideTopTabBar 开关(默认关),勾上后 MainPane 不渲染 TabBar;同时改写 view/select-path reducer 的拦截语义 —— 点 Sidebar 里的 PathItem 永远进 EmptyPathState 新建页(不再自动选第一个本窗口持有的 session),要切到已有 session 必须从 Sidebar 显式点 SessionItem。与 BETA-027 simpleMode 正交:simpleMode 仍连 Sidebar 一起藏,只是优先级更高。SettingsManager deep-merge 保证老 settings.json 缺字段时静默回落 false。

改进

  • @xterm/xterm / @xterm/headless 升级到 6.1.0-beta.256 — 对齐 VSCode bundle 版本。 6.x 破坏性变更:windowsMode: true → windowsPty: { backend: 'conpty' | 'winpty', buildNumber },buildNumber 从 preload os.release() 同步暴露给 renderer。本升级独立于 CURSOR-2 调研结论,版本对齐本身是基础设施层面的 hygiene(便于未来从 VSCode 反向移植 patch / 比对行为)。

文档

  • CURSOR-2 调研记录归档 — docs/issues/cursor-2-codex-tui-jitter-vs-vscode.md。 Codex TUI 在 Marina 中光标逐帧跳变(VSCode 无此问题)的三天调研挂起记录:7 条假说排除表 + 6 次实验细节 + 6 条尚未尝试的下一步方向(D1-D6,按 ROI 排序)。下次接手优先级:D1(cursorBlink: false 5 分钟)→ D2(读 xterm 6.1 WebGL CursorRenderLayer 源码)→ D3(onWriteParsed 探针)。GitHub issue #11 同步建档。

下载

  • Marina-Setup-0.2.2-x64.exe — Windows x64 安装版(NSIS,~86 MB)
  • Marina-Portable-0.2.2-x64.exe — Windows x64 免安装绿色版(~86 MB)

Marina v0.2.0 — M1 里程碑:SSH 终端模式正式就位

Choose a tag to compare

@Liyue-Cheng Liyue-Cheng released this 25 May 14:21

M1 里程碑达成 — Marina SSH 终端模式正式就位。 本地用户视野与 beta.9 完全一致(UI 层 segmented + filter 守住),SSH 用户能完成"管理远程服务器 + 进 shell 干活 + 用 tmux 保持会话 + 多 session 复用 SSH 连接 + 主动重连"完整工作流。同期合入 KBD-1 键盘交互全面整改 / SCROLL-1 session 切换二次修复 / ISO-1 跨平台构建隔离三层防御 / IME-2 候选框位置锁定 / spec §14 远程 SSH 模式定型 + presentation 三件升 v0.2.0 + 28 份 alpha 历史档案清理。

新增

  • SSH 阶段 2+3:ssh_config / ssh-agent / ProxyJump / ControlMaster / known_hosts / 重连按钮 — 一次性推到 M1 里程碑(0.2.0 GA)。 在阶段 1 的 UI 分离 + 类型强化基础上,把剩下的"基础 SSH 终端"功能全做掉。

    • ProxyJump 多级跳板(§阶段 2.3):SshProfile.proxyJump: string[] 字段,buildSshLaunchParams 拼成 -J host1,host2,host3。RemotePanel SSH 表单加 ProxyJump 输入(逗号分隔多跳板,支持 user@host:port 段)。每段最多 5 跳防滥用,空段静默过滤。3 个新单测覆盖单/多跳板 + 空数组。
    • ssh_config 集成(§阶段 2.1):新建 src/main/ssh-config-parser.ts(258 行 + 13 个单测),解析 ~/.ssh/config 的 Host 块 + Include 指令(递归深度 16 防循环)+ 通配符 Host 过滤 + Match 块整段跳过(V1 范围外)+ Key=Value / 引号 value / key value 三种行格式。advanced.includeSshConfig 开关默认 false;开后 RemotePanel 显示已发现 Host 列表(只读,改请直接编辑 ssh_config)。
    • ssh-agent 检测(§阶段 2.2):新建 src/main/ssh-agent.ts(140 行 + 9 个单测)。POSIX 看 SSH_AUTH_SOCK,Windows 看 OpenSSH Authentication Agent 服务;统一通过 ssh-add -l 列已加载 key(bits / SHA256 指纹 / comment / keyType)。RemotePanel 显示 agent 状态 ✅/⚠️ + key 列表 + 刷新按钮。无 agent 时给 actionable 提示(eval $(ssh-agent) 等)。
    • ControlMaster 性能层(§阶段 3.5):advanced.enableControlMaster 默认 true。buildSshLaunchParams 加 -o ControlMaster=auto -o ControlPath=~/.ssh/cm-%r@%h:%p -o ControlPersist=10m,同一 host:port:user 的 5 个 session 只 1 次握手(~3s → <100ms / session)。Windows OpenSSH 8.x+ 走 named pipe,ControlPath 被忽略仍照样复用,失败时 OpenSSH 自动回退到独立连接 — Marina 不需要兜底。2 个新单测验证 args 出现 / 不出现。PlatformAdapter.getSshControlPath() 可选接口(POSIX 三平台返回 ~/.ssh/cm-%r@%h:%p)。
    • KnownHostsManager(§阶段 3.1):新建 src/main/known-hosts-manager.ts(190 行 + 8 个单测),解析 ~/.ssh/known_hosts 每行(支持 plaintext / hashed |1| host / @cert-authority 跳过 / 注释跳过),计算 SHA256 指纹(与 ssh-keygen -lf 一致)。新增 known-hosts-history.json 持久化指纹时间线 — 同 host 指纹变化时报告 changes(potential MITM),timeline 跨重启保留。RemotePanel 顶部高亮变化条目(红框),下方列当前所有条目(前 10 条)。
    • ReconnectBanner(§阶段 3.4):TerminalView statusbar 在 SSH session state === 'exited' 时显示"重连"按钮(玫紫色 accent),点击 = 同 pathId + 同 templateId + 当前 dims 起新 session,reducer 自动 select 新 session,旧 exited tab 留给用户决定。不做自动重连(留 V2 配 powerMonitor / navigator.onLine 体系)。CSS .reconnect-button 配 hover / disabled 态。
    • IPC + bootstrap:新增 3 个通道 cmd:ssh-config:list / cmd:ssh-agent:status / cmd:known-hosts:refresh。KnownHostsManager 跟其他 store 一样走 JsonStore + initialize / flush 生命周期,挂进 installIpcLayer({ ...deps, knownHostsManager })。
    • RemotePanel UI 集成:新增 4 个 SettingRow — agent 状态卡片 / ssh_config 开关 + 列表 / ControlMaster 开关 / known_hosts 浏览器(含变化高亮)。新 CSS class 8 个(.ssh-agent-card / .ssh-agent-status-line / .ssh-agent-key-list / .ssh-config-list / .ssh-config-hint / .ssh-known-hosts-list / .ssh-known-hosts-changes / .reconnect-button)。新 i18n key 0 个(用 tx 双语字面量)。
    • 测试 + CI Gate:新增 33 条测试(ssh-config-parser.test.ts 13 + ssh-agent.test.ts 9 + known-hosts-manager.test.ts 8 + session-manager.test.ts 新增 ProxyJump×3 + ControlMaster×2 = 5)。全量 501 个测试通过,typecheck + ESLint + stylelint 全过。
    • 已跳过的 M1 后续工单(放 V1.1 或 V2):
      • HostKeyPromptModal(首次连接的 Are you sure you want to continue connecting? 拦截 + Marina 自绘 modal)— 需要 PTY 输出实时扫描 + 写 ssh stdin,跨平台行为细节多。当前体验:用户在终端里直接按 yes,known_hosts 由 OpenSSH 自动写入,Marina 下次 refresh 时检测到新条目。
      • MFA / TOTP modal(截获 Verification code: prompt → Marina modal)同上原因。
      • 自动重连 + 网络变化检测(navigator.onLine + powerMonitor sleep/wake → 倒计时自动重连)— 实现简单但需要时序测试,且重连频率受 ControlPersist 影响较大,V2 跟"会话冻结/解冻"一起做。
      • 远端 tmux session 列表面板(只看不操作)— PR #2 已实现 per-launch attach-or-create,列表面板属于增值功能。
    • M1 里程碑达成判定:阶段 0(spec + PR #2 merge)+ 阶段 1(UI 分离 + 类型强化)+ 阶段 2-3 核心(本 PR)= Marina SSH 终端模式正式就位。SSH 用户能完成"管理远程服务器 + 进 shell 干活 + 用 tmux 保持会话 + 多 session 复用连接 + 主动重连"完整工作流。下一步走 0.2.0 GA 发版(beta.10 → beta.11 → 0.2.0)。
  • SSH 阶段 1:UI 分离 + 类型强化 + PR #2 polish。 落地 docs/方案-SSH-完整支持-20260524.md §阶段 1,把 PR #2 的 SSH MVP 收尾成"本地用户视野与 beta.9 100% 一致 + SSH 用户专属入口"。

    • PathKind discriminated union(§II.1):Bookmark / RecentEntry / PathNode 改严格 discriminated union,kind 必填,ssh 变体 sshProfileId narrow 为必填。所有使用 Path 的函数走 switch on kind 自动 exhaustiveness check;新增 assertNeverPathKind 兜底,未来加 'wsl'/'docker' 时编译器强制找出所有需要补 case 的位置。
    • 磁盘迁移:beta.9 之前的旧 schema(无 kind 字段)在 PathManager 启动时由 migrateBookmarkOnLoad/migrateRecentOnLoad 静默 coerce 为 local;损坏条目(kind=ssh 缺 sshProfileId)启动期丢弃不让用户进不来 Marina,导入 archive 走严格校验直接拒。新增 PersistedBookmark/PersistedRecentEntry 磁盘宽松 schema,与内存严格类型分离。
    • Sidebar segmented control(§II.3):顶部加 [本地] [远程] segmented control,默认本地;hasSshProfiles || advanced.enableRemote 时才渲染(本地用户 = sidebar 跟 beta.9 完全一致);切到本地段时 device sections / temporary / recent 都按 kind !== 'ssh' 过滤,反之亦然。状态 localStorage 持久化跨重启保留。
    • 设置页 SSH 条件渲染(§II.6):把 SSH UI 从"数据"分类抽出来,做成顶级"远程"分类。buildVisibleCategories 纯函数控制 nav 显示:无 SshProfile 且 advanced.enableRemote=false 时不出现,设置页永远 8 个分类;有 profile 或勾了 enableRemote 时第 5 位插入"远程"成 9 个。RemotePanel 含 SSH 服务器 CRUD / 远程文件夹收藏 / enableRemote 开关。
    • advanced.enableRemote 设置:新增字段,默认 false。是"本地视野守护"的唯一显式触发条件;RemotePanel 内可勾掉,关掉后无 profile 则刷新设置后远程分类隐藏。
    • PR #2 polish:RemotePanel 全部 inline style → CSS class(ssh-profile-form / ssh-profile-grid / ssh-key-picker / ssh-password-field / ssh-profile-actions / ssh-enable-toggle / remote-bookmark-form)。Sidebar segmented control + 远程分类 i18n 中英全覆盖(sidebar.segment.* / settings.category.remote)。SSH profile edit / 密钥文件选择器 / 保存密码 PR #2 已实现,本阶段无需重做。
    • CI Gate-1 invariant 测试:新增 src/shared/path-invariants.test.ts(13 条 — 包含 // @ts-expect-error 验证 local 分支不能访问 sshProfileId)+ path-manager.test.ts 增 4 条迁移不变量。全量 466 个测试通过(原 452 + 新增 14),typecheck + ESLint + stylelint 全过。
    • M1 里程碑前进:阶段 0(spec §14 草案、PR #2 merge)+ 阶段 1(本次)完成。剩 ssh_config / 完整认证矩阵 / ProxyJump(阶段 2)+ known_hosts UX / 重连 / tmux / ControlMaster(阶段 3)。

修复 / 改进

  • KBD-1:键盘交互全面整改 — binding table + paste 路径 + overlay 栈 + SCROLL-1 二次修复。 整合 PR #3(Windows Ctrl+V 不粘贴 / 语音输入失效 / 双倍粘贴)并叠加架构层整改,把 spec / 代码 / 设置页 UI 三处对齐到唯一权威表,从根上消除"键位漂移 / 双倍粘贴 / SIGINT 失效 / Esc 优先级靠注册顺序 / IME 选词被吃 / replay 期 focus 错位"六类历史问题。
    • Ctrl+V 不粘贴 + 双倍粘贴(PR #3):xterm 把 Ctrl+V 当 Unix literal-next 发 0x16 给 PTY,且 Ctrl+Shift+V / Shift+Insert 跟 xterm native paste listener 双倍触发;语音输入程序(智模 / 闪电说)依赖"写剪贴板 → 模拟 Ctrl+V"的链路因此整个失效。修法:helper-textarea + container 双层 capture-phase paste listener,stopImmediatePropagation 阻 xterm bubble listener,所有粘贴来源(Ctrl+V / Ctrl+Shift+V / Shift+Insert / 语音输入 / 右键 / 浏览器)走同一个 handlePaste。Ctrl+V 在键盘 handler return false 不发字节,让浏览器 paste 事件由 capture listener 接管。
    • SIGINT 失效 bug(CPB-C3 扩展):Ctrl+Shift+C / Ctrl+Insert 复制后没清选区,残留 selection 让下次 Ctrl+C 走复制分支不发 SIGINT,死循环 / 卡住进程无法中断。修法:三套复制路径(copy-or-sigint / copy-and-clear)统一清选区。
    • 数据驱动 binding table:新建 src/shared/terminal-keybindings.ts,8 条 binding 集中,matchKeybinding 纯函数扫表;TerminalView 60 行嵌套 if/else 退化为"扫表 + switch dispatch" 50 行。新增 20 个单测覆盖所有键位 + 修饰键守护 + 表结构不变式。
    • Modal / ContextMenu IME 守卫:Modal 全局 keydown 无 isComposing 检查,中文 / 日文 / 韩文 IME 选词的 Enter 被误吃,modal 提前关闭。修法:Modal / ContextMenu 全局 keydown 首行 if (e.isComposing || e.keyCode === 229) return。
    • UiOverlayStack:Modal / ContextMenu 各自挂 window keydown 拦 Esc,多 overlay 嵌套时 Esc 由"注册顺序的隐式优先级"决定,不可预测。新建 src/shared/ui-overlay-stack.ts(命令式核心)+ src/renderer/ui-overlay-stack.ts(React hook 包装),overlay mount 时 push、unmount 时 pop;keydown 前问 isTop() 决定是否响应。多 overlay 嵌套时 Esc 永远从最上层关起。新增 8 个单测。
    • SCROLL-1 二次修复(visibility:hidden + inert):一次修复的 fence + scrollToBottom 只锚最终位置,没解决"分片 write + setTimeout(0) yield 之间 xterm RAF 把已处理 chunks 的部分 buffer 画到 canvas"的中间帧暴露。修法:terminal-host 在 hostRevealed=false 期间同时 visibility:hidden + inert,canvas 仍累积像素只跳 compositing,fit 仍能算尺寸;inert 阻 focus 落入子树,replay 100-500ms 期间用户按键不会误进 Sidebar 改名框 / Modal 等错位 focus。fence cb + scrollToBottom + 一帧 RAF 后才 reveal,reveal 后 useEffect 主动归还 focus 给 helper-textarea。React 18 不识别 inert 作为 known prop,src/renderer/global.d.ts module augmentation 让 TS 接受 inert={'' | undefined}(Electron 31 Chromium 126 原生支持)。产品决策:replay 期间不响应按键是有意为之,符合"切换中"直觉,避免 typeahead 误发到错位 focus。
    • spec / 文档同步:docs/软件定义书.md §7.1 加"§7.2.2 是唯一权威"不变式,§7.2.2 写完整终端键位清单表(Win/Linux + macOS 等价)+ 6 条实现不变式,§13.2 把"应用内快捷键(除 Ctrl+C/V/F)"扩展为"任何不在 §7.2.2 清单内的键位"。新建 docs/键盘交互规范.md 开发者实现锚,工单留档 docs/issues/kbd-1-shortcut-overhaul-20260524.md。
    • 设置页快捷键速查卡片:设置 → 行为末尾加 KeybindingsReference,数据源即 TERMINAL_KEYBINDINGS 数组,navigator.platform 判断 mac 显 Cmd 别名。spec / 代码 / UI 三处永不漂移。

Marina v0.1.0-beta.9 — UI-1 视觉一致性收尾(ctx-menu + sidebar 加号)

Choose a tag to compare

@Liyue-Cheng Liyue-Cheng released this 19 May 08:43

UI 视觉一致性收尾 release。把"无边框 / hairline / lucide 矢量图标"的统一语言推进到两处遗漏点:右键菜单边框和侧边栏 category 的加号按钮。延续 a393bfa "4 处布局边框清理"的方向,把同种"实色 token 画 1px"的隐藏遗漏全部对齐主流做法。

非紧急,纯视觉打磨。深色主题视觉变化极小,浅色主题(尤其 cutie 樱花粉)是本版受益最大的场景。

修了什么

1. ctx-menu 边框走 alpha hairline + 删双重描边

原实现是双层 1px 描边:border: 1px solid var(--color-bg-strong) + box-shadow: 0 0 0 1px var(--color-bg-elevated) 叠成 2px 实线。在浅色主题下 box-shadow ring 还会换成更重的 var(--color-text-muted),在 cutie 樱花粉底(#fff0f5)上呈"莓棕墨水线" — 跟最近 4 处删 sidebar/statusbar 边框的方向矛盾。

改成单层 color-mix(in srgb, var(--color-text-primary) 8%, transparent),跨 10 套主题自动做对的事:

  • 深底叠浅文字色 → 极淡 highlight 线
  • 浅底叠深文字色 → 极淡 shadow 线
  • box-shadow 第二层 ring 删除,drop shadow 单层足够撑立体感
  • 浅色主题 ctx-menu 特化块瘦身,只保留 28%→14% 阴影减淡

对齐 UI-1 RFC §3 "组件级浮卡边界用 hairline 而非实色 token"的主流做法。

2. sidebar 加号按钮去实色边框 + 字符 `+` 换 lucide `plus` icon

同批次又一处实色 token 描边遗漏 — .sidebar-category-action 的 border: 1px solid var(--color-bg-elevated) 在 cutie / dawn 浅色主题下边框色与 surface 对比 ΔL* < 1,基本隐形,既起不到 "有可点按钮" 的 affordance 又破坏无边框语言统一。

  • 边框改 ghost 风格:transparent + hover 出 --color-bg-active,跟 .tab-close / .titlebar-btn 同种语言
  • actionLabel=\"+\" 字符 → <Icon name=\"plus\" size={12} />。原 14px 字符的视觉中心与 SVG 不在同一基线,粗细跟旁边 bookmark/clock/history 三个 lucide icon 不一致
  • 默认色 --color-text-muted,hover 升 --color-text-primary,呼应"次要 affordance / hover 强化"层级
  • CategoryProps.actionLabel: string → ReactNode(类型放宽,内部 interface)

视觉效果对比

主题 之前 之后
深色(rose-pine 等) ctx-menu 紫灰实色 1px + 浅紫 ring(2px 厚度) 浅紫文字色 8% 极淡 highlight 线
cutie 樱花粉 ctx-menu `#a8627e` 莓棕 2px 实色框;+ 按钮粉边框几乎不可见 ctx-menu 与奶白樱花粉融洽的极淡 hairline;+ 按钮静止时仅 12px lucide 矢量符号,hover 浮现 bg
其他 4 套浅色主题 --color-text-muted 实色 2px 描边 各自 text-primary 8% 轻 hairline,跟 lucide icon 统一矢量语言

升级方式

直接安装 Marina-Setup-0.1.0-beta.9-x64.exe(覆盖),或下载 Marina-Portable-0.1.0-beta.9-x64.exe(免安装)。

beta.7 / beta.8 没单独发 release,本版包含从 beta.6 之后的全部累积改动(参见 CHANGELOG.md)。

完整 commit

  • 26b350e style(UI-1): ctx-menu 边框走 alpha hairline + 删双重描边
  • 6c819d0 style(UI-1): sidebar + 按钮去实色边框 + 字符换 lucide plus icon
  • 4ed6862 chore(release): bump 0.1.0-beta.9 + CHANGELOG 定版

🤖 Generated with Claude Code

Marina v0.1.0-beta.6 — BETA-ENV-1 hotfix (Windows 子进程 PATH 修复)

Choose a tag to compare

@Liyue-Cheng Liyue-Cheng released this 18 May 02:18

紧急 hotfix:Marina 启动的子进程里所有 `C:\Windows\System32` 系原生命令(`powershell.exe` / `cmd.exe` / `reg.exe` / `wmic.exe` / `tasklist.exe` / `ssh.exe`(OpenSSH 版) / `findstr.exe` 等)都从 PATH 上消失。Claude Code 用户报告的"PowerShell is not available on this system."就是这条。

修复一句话

子进程 env 里 PATH 含未展开的 %SystemRoot% 字面量,且 canonical SystemRoot 这个 key 是空串 —— 两个独立但叠加的 bug,任一未修都复现。

根因 + 修复

两个独立但叠加的 bug:

  1. WindowsAdapter.getRefreshedPath 从注册表 HKLM\…\Environment\Path 读到的是 REG_EXPAND_SZ 字面字符串(含 %SystemRoot%\System32 等占位符),直接塞进子进程 env 没做 ExpandEnvironmentStrings。
  2. 子进程 env 块里 SystemRoot(canonical casing)是空串,只有 SYSTEMROOT 有值;Win32 内部展开 %SystemRoot% 按字面 key 名查,casing 不一致就替换成空。

修复采用两层防御:

  • Layer 1(源头):getRefreshedPath 读完注册表立即调 expandWindowsEnvPlaceholders 展开,对齐 Win32 ExpandEnvironmentStringsW 行为(name 大小写不敏感、未命中保留原样、防递归 5 层)。
  • Layer 2(兜底):PlatformAdapter 新增 normalizeSpawnEnv 接口,Windows 实现在 spawn 前补齐 SystemRoot / SYSTEMROOT / windir 三种 casing 的 canonical 值,并对 PATH / Path / PATHEXT / PSModulePath / ComSpec 等 PATH-like 字段再做一次展开;残留占位符通过 logger.warn 上报。

40 条新单测把用户报告里 SystemRoot='' + SYSTEMROOT='C:\Windows' 的诡异组合钉成回归测,后续任何回归都会让 CI 挂掉。

影响范围

修这一个 commit:

  • ✅ Claude Code 的 PowerShell 工具恢复可用
  • ✅ Git Bash / cmd / pwsh 里 command -v powershell.exe / cmd.exe / reg.exe / wmic.exe / ssh.exe(OpenSSH 版)等系统工具全部恢复
  • ✅ 任何依赖 system32 系命令的脚本恢复
  • ✅ Linux / macOS adapter normalizeSpawnEnv 走 no-op,不影响其他平台

升级方式

直接装 Marina-Setup-0.1.0-beta.6-x64.exe(覆盖安装),或下载 Marina-Portable-0.1.0-beta.6-x64.exe(免安装)。

Marina v0.1.0-beta.5 — Linux 首发 + scrollback 重构 + 开源准备

Choose a tag to compare

@Liyue-Cheng Liyue-Cheng released this 17 May 11:23

Marina v0.1.0-beta.5 — Linux 首发 + scrollback 架构重构 + 开源准备

beta.4 之后的开源准备 + Linux 首发回合。三件大事:

  • 🐧 Linux 首发支持(Tier 2):.deb / .rpm / .AppImage 三种包,Ubuntu 22.04 GNOME 为 Tier 1 测试目标。可用但不可靠 — 五条已知限制见下方
  • 🔧 scrollback 架构重构(CURSOR-1):main 端切换到 state-replay 数据源,通过 @xterm/headless 维护权威 ANSI buffer,根治 BETA-019 cursor 闪烁
  • 📖 仓库正式开源 + 完整演示资料统稿(上手指南 / 产品完整介绍 / 分享会提纲)

📦 下载

平台 包 说明
Windows 10/11 x64 Marina-Setup-0.1.0-beta.5-x64.exe 安装版,含桌面快捷方式 + Explorer 右键集成
Windows 10/11 x64 Marina-Portable-0.1.0-beta.5-x64.exe 便携版,免安装
Ubuntu / Debian x64 Marina-0.1.0-beta.5-amd64.deb apt 包,postinst 自动注册 x-terminal-emulator
Fedora / RHEL / CentOS x64 Marina-0.1.0-beta.5-x86_64.rpm rpm 包,同上走 alternatives
Linux 通用 x64 Marina-0.1.0-beta.5-x86_64.AppImage 单文件,免 root

SmartScreen 拦截:Windows 包没有代码签名,首次启动需 "更多信息 → 仍要运行"。


⚠️ Linux 用户必读:可用但不可靠

beta.5 是 Marina 的 Linux 首发版,主体能跑、能装、能起 session、能跑 AI agent,但有 5 条已知限制:

项 现象 状态
RESIZE-1 (P1) 拖大窗口后旧行不 reflow,卡在小 cols 形态 根因已定位(windowsMode: true 无平台分支关闭 reflow),修复方案在 issue,beta.6 修
窗口圆角变方角 与 gnome-terminal / wezterm 一致 接受的妥协(Wayland 下 transparent:true 会污染 viewport 计算)
WebGL renderer 关闭 滚动比 Windows 略卡 某些发行版 / 显卡组合下 WebGL 触发秒级滚动卡顿
无系统托盘 关闭最后窗口 = 应用退出 = session 全销毁 GNOME 平台限制(自 3.x 移除 system tray),配套二次确认 modal
中文 IME 偶发 切换法标点可能冲刷历史输入 根因待定

适合:试用 / 反馈 / 评估。
暂不适合:Linux 上的日常生产工具(等下一版 RESIZE-1 修了再来)。


主要变更

新增

  • Linux 支持(BETA-003):LinuxAdapter 真实现替换全部 NOT_IMPLEMENTED 桩,PlatformAdapter.lifecycleModel 新增字段(tray-resident / dock-resident / no-persistence),LastSessionConfirm modal 在 Linux 最后窗口 + 仍有 alive session 时弹二次确认。详见 ADR-013。
  • dev / portable / installed 三套实例共存:数据目录、单实例锁、任务栏图标全自动按 instance kind 分离
  • AI 助手 v2.2:按键时间线元数据 + LLM 日志独立通道
  • CURSOR-1 / BETA-019 根治:scrollback 架构重构,main 端 @xterm/headless 维护权威 ANSI buffer,删 renderer 端 workaround
  • 在新窗口中打开 Tab:Tab 右键 / 标签拽出可直接送到新窗口

改动

  • Linux 上跳过 WebGL renderer(BETA-003 perf)
  • Linux 上 transparent: false + 方角窗口(BETA-003c)
  • i18n 切换语言实时生效
  • 取消"系统"独立分组,桌面 / 主目录改为默认收藏种子
  • 浅色主题 token 三层架构 + xterm dim 字对比度修复(BETA-038 后续)
  • Cutie 主题重设计为樱花奶昔风
  • UI 精简(无边框 + 工具栏瘦身)

修复

  • DROP-1 拖文件光标闪烁(F7-F11 五轮 sidebar dropzone 打磨)
  • BETA-019 cursor 闪烁(workaround → 通过 CURSOR-1 重构根治)
  • dev 端口探测器避开 Hyper-V/WinNAT 保留段(EACCES)
  • beta 勘误第二轮 F1-F6:系统路径 / 警告槽位 / 主题作用域 / 标题圆角 / 斜体切断 / AI Base URL

文档

  • 试用说明 → 上手指南(docs/presentation/上手指南.md)
  • 产品完整介绍(docs/presentation/产品完整介绍-20260517.md)
  • 分享会-完整介绍(docs/presentation/分享会-完整介绍-20260517.md)
  • RESIZE-1 / IME-1 / DROP-1 issue 文档存档
  • BETA-003 实施方案存档(docs/方案-BETA-003-Linux支持-20260517.md)

已知大限制(全平台)

  • KI-004:Windows ConPTY 强约束 — Marina 主进程崩则所有 PTY 必死。长任务请挂 tmux / screen / nohup 兜底
  • 无代码签名 + 无自动更新:beta 阶段如此,公测前会做

工程数据


MIT License · 仓库:https://github.com/Liyue-Cheng/marina

Marina v0.1.0-beta.3 — TIT-2 + TIT-3 hotfix

Choose a tag to compare

@Liyue-Cheng Liyue-Cheng released this 14 May 12:47

beta.2 后三个真实用户报告 (同事干净 Win11 机器):

修复

  • TIT-2 (ac8f20b) — Marina 已运行时点经典右键「在 Marina 终端中打开」, 新窗口出来不建 session 的 bug。
    根因: Electron 31 在 second-instance argv 里把 Chromium flag --allow-file-access-from-files 注入到 --open-here 和路径值之间, 老的 parseOpenHere 看到下一项以 -- 开头就 return null, primary 走 fallback "无 recent 就新开空窗口" 分支。
    修: parseOpenHere 改为从 --open-here 起向后扫, 跳过所有 -- 前缀 token, 第一个非 flag token 即 path。跨平台保持 (POSIX 路径开头是 / 不是 --, Chromium flag 总是 --key 或 --key=value 单 token)。

  • TIT-3 part 1 (8f51c53) — Win11 新菜单启用报 HRESULT 0x80073CF9 "必须使用外部位置安装"。
    根因: AppxManifest.xml 声明 <uap10:AllowExternalContent>true</...> (sparse package), 但发布版 install-context-menu.ps1 不传 -ExternalLocation。MSIX 本来就是自包含的, sparse 声明是冗余。
    修: 删 manifest 的 AllowExternalContent, 走标准 MSIX 流程; dev 版 install.ps1 同步删 -ExternalLocation。

  • TIT-3 part 2 (1f66527) — Win11 新菜单启用报 HRESULT 0x800B0109 CERT_E_UNTRUSTEDROOT。
    根因: 老 install.ps1 把自签证书装到 Cert:\CurrentUser\TrustedPeople (避 UAC), 但 Windows MSIX 签名验证按惯例查 LocalMachine\TrustedPeople。开发机能装是因为 dev-cert.ps1 跑过弹 UAC 装到 LocalMachine; 用户机器没跑过就只剩 CurrentUser 那条断链。
    修: install-context-menu.ps1 顶部检测 elevated, 非 elevated 时 Start-Process -Verb RunAs 自重启传 -_Relaunched 内部标志, elevated 上下文把证书装到 LocalMachine。跨 elevation 边界的 stdout 通过 Start-Transcript → %TEMP%\marina-msix-install.log 回传给非 elevated 父进程, 主进程 execFileAsync 收到的形态与改动前一致。

用户影响

  • 首次启用 Win11 新菜单弹一次 UAC (导证书到 LocalMachine 必需), 之后再启用不会弹。
  • 用户拒 UAC 时新增 exit code 5, 主进程能区分 "取消" 与 "真失败"。

升级路径

控制面板 / 设置 → 应用 → 卸载 Marina, 然后装新 Setup。
卸载会清掉 HKCU 经典菜单注册项 + 已注册的 Win11 MSIX 包 (证书保留, 重装免 UAC)。

测试

310 通过 (+3 新 case 覆盖 Chromium flag 注入场景 + POSIX 路径预留)。typecheck 干净。MSIX 重打 + 重签通过。本机干净状态 5 步诊断脚本验证全通过。

Marina v0.1.0-beta.2 — ENC-1 + TIT-1 hotfix

Choose a tag to compare

@Liyue-Cheng Liyue-Cheng released this 14 May 08:05

beta.1 后两个用户实测真问题热修复。强烈建议从 beta.1 升级。

ENC-1 — 中文 Windows 没装 PowerShell 7 时所有 session 启动失败

症状:中文 Windows 上(尤其没装 PowerShell 7 的机器)新建 PowerShell session,开头报:

C:\...\Marina\resources\shell-hooks\pwsh.ps1:20 字符: 1
+ }
+  ~
表达式或语句中包含意外的标记 "}"。

新终端虽然还能用,但每次都先吃一段错误信息。

根因:beta.1 出货的 pwsh.ps1 含中文注释。Windows PowerShell 5.1 在 .ps1 无 UTF-8 BOM 时按系统 ANSI 代码页读;中文系统是 CP936/GBK → 把 UTF-8 多字节中文字符按 GBK 错位解码 → 字节里命中 0x7D (}) 之类被当结构符号 → 解析炸。Marina 探测 shell 优先级是 pwsh 7 > powershell 5.1,开发机装了 pwsh 7 走 UTF-8 读所以测不出,用户机器只有 5.1 立刻翻。

修复:把 3 个 shipped .ps1 (pwsh.ps1, install-context-menu.ps1, uninstall-context-menu.ps1) + cmd.bat 全部转纯 ASCII。加文件顶部 !!! KEEP THIS FILE PURE ASCII !!! 告警 + 8 项断言回归测试,后续任何提交把中文塞回这些文件 → npm test 直接红。顺手把 install 脚本里靠匹配中文错误消息识别"包已存在"的逻辑改成 Get-AppxPackage 预检,locale-independent。

TIT-1 — Shell 模板会话的 displayName 显示成 shell exe 路径

症状:新建 Shell 模板的 session,tab / sidebar 显示:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
MINGW64:/c/Users/HP/Desktop/work/SimHDL
C:\Windows\System32\cmd.exe

而不是预期的 PowerShell / Bash / cmd。

机制:Windows ConPTY 自动把 powershell.exe / cmd.exe 启动期的 Win32 SetConsoleTitle() 调用翻译成 OSC 0 序列;Git Bash 默认 PS1 每次 prompt 主动发 \e]0;MINGW64:<cwd>\a。handleOscTitle 把这些都当合法标题接受,覆盖 pickDisplayName 算出的友好名。Claude Code / Codex 等带 template.command 的模板不受影响(他们启动后立刻发自己的 OSC 0 翻盘)。

修复(workaround):接收端启发式过滤 looksLikeShellStartupGarbage — 整段是裸路径 / MINGW(32|64|ARM)?: / MSYS\d?: 前缀 / 裸 *.exe 名 → 拒。CLI 工具的 verb-leading 标题(vim /etc/hosts / ✻ Claude · ~/p (...) / node app.js / make -j4)不受影响。36 个 case 覆盖。

根因尚未完全定位 — 用户体感与代码考古存在缺口(具体见 docs/issues/tit-1-osc-title-shell-startup-garbage.md),当前修复是 workaround。后续若找到根因会替换为根治版本。

安装

  • Marina-Setup-0.1.0-beta.2-x64.exe — NSIS 安装包
  • Marina-Portable-0.1.0-beta.2-x64.exe — 便携版

不变量

测试 263 → 307,typecheck 干净。原有功能(Claude Code / vim / 各 CLI 工具改 tab 标题)的正向用例全部保留。


完整 diff 见 v0.1.0-beta.1...v0.1.0-beta.2。

Marina v0.1.0-beta.1

Marina v0.1.0-beta.1 Pre-release
Pre-release

Choose a tag to compare

@Liyue-Cheng Liyue-Cheng released this 14 May 06:38

首个 beta — 自 alpha.3 (2026-05-12) 后三轮工作合并:

主要变化

Robustness pass (2026-05-13) — 29 fix

  • webgl 渲染器 + DOM 回退、scrollback 分片、bracketed paste、ANSI 注入警告
  • 自绘 Modal / Confirm / Prompt(Electron 不支持 window.confirm)
  • render-process-gone 自愈、renderer sandbox、焦点归还体系

UI refactor pass (2026-05-14)

  • 阻塞修复 + a11y/主题兜底 + 死代码清理 + hook 收敛

P0/P1 audit batch (2026-05-14) — 11 fix

  • NSIS HKCU 安装位置写入、MSIX RFC 3161 时间戳、IPC ownership、PTY 退出与最后一段输出的因果序
  • persistence flush 并发、logger 真等 fs flush、path useCount 累加、exe 内嵌图标接通经典右键菜单
  • console.* → logger 全量切换、IPC 协议 v1.3 同步 + 回归测试

审计备忘录(已入档)

  • docs/终端渲染审计备忘录-20260513.md
  • docs/后端代码审计备忘录-20260514.md
  • docs/前端代码质量审计-20260514.md
  • docs/UI设计系统审计备忘录-20260514.md
  • docs/打包安装审计备忘录-20260514.md

安装

  • Marina-Setup-0.1.0-beta.1-x64.exe — NSIS 安装包(可改安装目录、桌面+开始菜单快捷方式)
  • Marina-Portable-0.1.0-beta.1-x64.exe — 便携版(免安装,单 exe)

已知边界

  • 开源准备(README EN / CONTRIBUTING / CI)留到 0.1.0 正式版前。
  • macOS / Linux 配置就位但未启用,V2 由社区贡献。
  • 本 beta 仍处"作者 daily-drive 验证期",欢迎反馈真实使用问题。

完整 commit 列表见 v0.1.0-alpha.2...v0.1.0-beta.1。

Marina v0.1.0-alpha.2 — fix packed renderer (alpha.1 broken)

Choose a tag to compare

@Liyue-Cheng Liyue-Cheng released this 12 May 08:07

⚠️ 本版本修复了 v0.1.0-alpha.1 的致命 bug。请勿继续使用 alpha.1(packed exe 启动后白屏 / 报 "Not allowed to load local resource")。

本版本唯一改动

修复 vite renderer 输出目录配置 bug:

  • electron.vite.config.ts 里 outDir: '../../out/renderer' 被 electron-vite 从 CWD(项目根)再向上拼路径,产物跑到了项目目录外 E:\out\renderer\,导致 asar 里压根没有 renderer 文件
  • packed exe 启动时 loadURL('file://.../app.asar/out/renderer/index.html?...') 因 asar 内不存在该路径,Electron 报 Not allowed to load local resource
  • 改用 resolve('out/renderer') 给绝对路径修复

详见 commit 2ef6251。

为什么 CP-4 打包"验证通过"却没发现

历史 commit f064b5b 的"打包验证通过"只验证了 electron-builder 构建步骤完成,从没启动过 packed exe。CP-4 自测覆盖完整功能但跑在 npm run dev 下,dev 模式从 Vite dev server 拉 renderer(走另一条代码路径),所以 dev 一直正常。

教训:dev 跑通 ≠ packed 跑通。下版本起把"启动 packed exe + 截图主界面"加进 release checklist。

下载

文件 说明
Marina-Setup-0.1.0-alpha.2-x64.exe NSIS 安装器,推荐
Marina-Portable-0.1.0-alpha.2-x64.exe Portable 单文件免安装

累计功能(同 alpha.1)

  • Explorer 右键集成("在 Marina 终端中打开")
  • 多窗口 + 系统托盘 + 完整右键菜单
  • 4 内置模板 + 7 主题 + 设置导入导出
  • 226 单元测试通过

详细的功能清单参见 v0.1.0-alpha.1 release notes。

反馈

https://github.com/Liyue-Cheng/marina/issues