Releases: Liyue-Cheng/marina
Release list
Marina v0.2.3 — issue #4 续:hideTopTabBar 重选 path 修复
修复
hideTopTabBar=true时,点已选中的 path 不会回到新建页(issue #4 续)。
现象:开了文件夹 A 的终端后再点 A 本身,view 不动;必须先点 B 再点回 A 才能看到 EmptyPathState。
根因:view/select-pathreducer 把"清空 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 升级
issue #4 落地 + xterm 6.1 升级对齐 VSCode + CURSOR-2 调研记录归档。
新增
- 设置 → 外观 → 隐藏顶部标签栏(issue #4)。 Sidebar 已按路径分组显示所有 session,TabBar 内容重复且占纵向空间。新增
appearance.hideTopTabBar开关(默认关),勾上后 MainPane 不渲染 TabBar;同时改写view/select-pathreducer 的拦截语义 —— 点 Sidebar 里的 PathItem 永远进 EmptyPathState 新建页(不再自动选第一个本窗口持有的 session),要切到已有 session 必须从 Sidebar 显式点 SessionItem。与 BETA-027 simpleMode 正交:simpleMode 仍连 Sidebar 一起藏,只是优先级更高。SettingsManagerdeep-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 从 preloados.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: false5 分钟)→ 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 终端模式正式就位
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.ts13 +ssh-agent.test.ts9 +known-hosts-manager.test.ts8 +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,列表面板属于增值功能。
- HostKeyPromptModal(首次连接的
- 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)。
- ProxyJump 多级跳板(§阶段 2.3):
-
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 变体sshProfileIdnarrow 为必填。所有使用 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)。
- PathKind discriminated union(§II.1):
修复 / 改进
- 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 在键盘 handlerreturn 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.tsmodule 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 三处永不漂移。
- Ctrl+V 不粘贴 + 双倍粘贴(PR #3):xterm 把 Ctrl+V 当 Unix literal-next 发
Marina v0.1.0-beta.9 — UI-1 视觉一致性收尾(ctx-menu + sidebar 加号)
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 修复)
紧急 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:
WindowsAdapter.getRefreshedPath从注册表HKLM\…\Environment\Path读到的是REG_EXPAND_SZ字面字符串(含%SystemRoot%\System32等占位符),直接塞进子进程 env 没做ExpandEnvironmentStrings。- 子进程 env 块里
SystemRoot(canonical casing)是空串,只有SYSTEMROOT有值;Win32 内部展开%SystemRoot%按字面 key 名查,casing 不一致就替换成空。
修复采用两层防御:
- Layer 1(源头):
getRefreshedPath读完注册表立即调expandWindowsEnvPlaceholders展开,对齐 Win32ExpandEnvironmentStringsW行为(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 重构 + 开源准备
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),LastSessionConfirmmodal 在 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 阶段如此,公测前会做
工程数据
- 测试 320+ 通过(含
linux.test.ts新增 18 个用例) - 完整 CHANGELOG:CHANGELOG.md
- 设计哲学:软件定义书 | 设计哲学备忘录
- 反馈:GitHub Issues
MIT License · 仓库:https://github.com/Liyue-Cheng/marina
Marina v0.1.0-beta.3 — TIT-2 + TIT-3 hotfix
beta.2 后三个真实用户报告 (同事干净 Win11 机器):
修复
-
TIT-2 (
ac8f20b) — Marina 已运行时点经典右键「在 Marina 终端中打开」, 新窗口出来不建 session 的 bug。
根因: Electron 31 在second-instanceargv 里把 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
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
首个 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.mddocs/后端代码审计备忘录-20260514.mddocs/前端代码质量审计-20260514.mddocs/UI设计系统审计备忘录-20260514.mddocs/打包安装审计备忘录-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)
⚠️ 本版本修复了 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。