资讯动态

MooTool Next Compose Vault Git 远程仓库同步与 Compose 场景 Tab 焦点回归指南

发布时间:2026/10/14 5:19:48 来源:尧图企业网站定制
桌面应用开发工具【免费下载链接】MooToolHandy tool set for developers项目地址https://gitcode.com/gh_mirrors/mo/MooTool点击查看免费下载导读本文以 MooTool Next Compose 的 DIFF-107 证据文档next-compose/docs/diff/107-git-remote-sync-tab-focus-evidence.md为主体系统讲解 Vault Git 面板中远程仓库地址remote的保存/删除状态机、ahead/behind同步计数展示以及配套的 Compose 场景 Tab 焦点环回归证据。读完本文你将掌握remote 操作按钮如何在「保存远程地址 / 删除远程地址」之间随输入内容动态切换、底层 URL 校验与持久化链路如何工作以及团队用「像素级焦点环断言」把键盘可达性写进桌面测试的完整做法。1. 背景原行为ElectronVaultGitDialog.tsx与迁移目标DIFF-107 是 MooTool Next Compose 从 Electron 版本对齐 Vault Git 交互行为的一个切片。文档明确记录了两个「原行为」基线它们全部来自 Electron 端实现 next/src/features/json/VaultGitDialog.tsx配置 remote 时的按钮语义当输入框内有 URL 时按钮显示「保存」当输入框被清空、且仓库已存在originremote 时按钮切换为「删除远程地址」点击后以configure-remote动作提交一个空串实现删除。已配置 remote 时的同步状态展示面板顶部在分支名旁边展示↑ahead ↓behind同步计数让用户一眼看出本地分支与远端origin的领先/落后提交数。这两条行为是 Vault Git 远程仓库管理的核心交互骨架Compose 端必须与之对齐而不是另起炉灶。2. 本产品行为ComposeVaultGitDialog的 remote 状态机Compose 端实现位于 next-compose/composeApp/src/desktopMain/kotlin/com/rememberber/mootool/next/compose/features/git/VaultGitDialog.kt。DIFF-107 记录了三个关键行为点2.1 展示git.sync同步计数面板顶栏在仓库状态行渲染Text( container.t(git.sync, mapOf(ahead to status.ahead.toString(), behind to status.behind.toString())), color colors.textMuted, fontSize 11.sp )对应的 i18n 文案键为git.sync占位符{ahead}/{behind}。这与 Electron 端 next/src/features/json/VaultGitDialog.tsx 第 157 行的t(json.git.sync, { ahead: ..., behind: ... })一一对应。ahead/behind数值来自GitEngine.status()。查看 next-compose/composeApp/src/desktopMain/kotlin/com/rememberber/mootool/next/compose/domain/GitEngine.kt 第 129-130 行它通过解析git status --porcelainv1 -z --branch输出中的ahead N/behind N文本得到ahead Regex(ahead (\\d)).find(parsed.branchLine)?.groupValues?.get(1)?.toIntOrNull() ?: 0, behind Regex(behind (\\d)).find(parsed.branchLine)?.groupValues?.get(1)?.toIntOrNull() ?: 0,2.2 remote 操作按钮saveRemote/removeRemote动态切换remote 行核心逻辑在 VaultGitDialog.kt 第 451-499 行。按钮文案按输入框内容动态决定val remoteTrimmed remote.trim() val remoteLabel if (remoteTrimmed.isNotEmpty()) container.t(git.saveRemote) else container.t(git.removeRemote) MooButton( remoteLabel, p5Toolbar true, enabled GitVaultRemotePresentation.saveRemoteEnabled( busy busy, repository status.repository, draftRemoteTrimmed remoteTrimmed, statusRemote status.remote, ), onClick { ... }, )规则提炼输入框内容按钮文案可点击条件非空输入了新 URLgit.saveRemote保存远程地址非 busy、是 Git 仓库、草稿或已有 remote 至少一项非空空且origin已配置git.removeRemote删除远程地址同上statusRemote.isNotBlank()使按钮可用空且未配置origingit.removeRemote删除远程地址禁用既没有草稿也没有已有 remote2.3 删除成功后的回写点击删除后runAction通过GitEngine.setRemote(root, )移除originremoteOverrideAfterReload committed保证刷新状态后输入框仍为空成功后再把settings.vault.gitRemote写空实现「清空本地 remote 输入 写入设置」两条同时落地afterSuccess { container.updateSettings { current - current.copy(vault current.vault.copy(gitRemote committed)) } },对照 Electron 端 next/src/features/json/VaultGitDialog.tsx 第 105-106 行configuredRemote extra.remote?.trim() ?? 随后updateSettings({ vault: { gitRemote: configuredRemote } })——Compose 端在语义上完全对齐。3. 底层原理URL 校验与按钮启用的两级防线3.1 前置校验层SettingsVaultGitNormalizeCompose 在提交 remote 前会先走一次规范化校验实现在 next-compose/composeApp/src/commonMain/kotlin/com/rememberber/mootool/next/compose/domain/SettingsVaultGitNormalize.ktsanitizeGitRemote(value)trim 后截断到 2048 字符含\r/\n/\u0000视为非法必须以https?://、ssh://、git://、git、file://前缀之一开头正则GIT_REMOTE_PREFIX忽略大小写否则返回空串。commitGitRemote(raw)返回三种结果——空串 →Cleared删除合法前缀 →Accepted(sanitized)非法非空 →Rejected。在 VaultGitDialog.kt 第 472-479 行点击按钮时val committed when (val outcome SettingsVaultGitNormalize.commitGitRemote(remote)) { GitRemoteCommitResult.Cleared - is GitRemoteCommitResult.Accepted - outcome.remote GitRemoteCommitResult.Rejected - { notifyVaultGitInvalidRemote(container) // toast settings.vault.gitRemoteInvalid returnMooButton } }即非法 URL如ftp://、javascript:alert(1)会被前置拒绝并弹出错误 toast不会走到 Git 命令层。单测 SettingsVaultGitNormalizeTest.kt 明确断言了Cleared/Accepted/Rejected三种分支。3.2 引擎层校验GitEngine.normalizeGitRemote即使绕过 UI引擎层还有第二道防线。GitEngine.kt 第 208-218 行的normalizeGitRemote复刻同一套前缀规则setRemote第 220-236 行随后按以下分支执行真正的 Git 命令场景执行命令URL 为空且origin存在git remote remove originURL 为空且origin不存在直接返回成功「Remote is already removed」幂等URL 非空且origin存在git remote set-url origin urlURL 非空且origin不存在git remote add origin url3.3 按钮启用规则GitVaultRemotePresentation按钮是否可点由 next-compose/composeApp/src/commonMain/kotlin/com/rememberber/mootool/next/compose/domain/GitVaultRemotePresentation.kt 中的saveRemoteEnabled统一决定它委托给 GitOperationPresentation.kt 第 63-64 行的configureRemoteEnabledfun configureRemoteEnabled(repository: Boolean, draftRemoteTrimmed: String, statusRemote: String): Boolean repository (draftRemoteTrimmed.isNotEmpty() || statusRemote.isNotBlank())语义即 DIFF-107 所述空 remote 且未配置 origin 时按钮禁用。对应的行为级单测 GitVaultRemotePresentationTest.kt 覆盖了saveRemoteEnabled的 busy / repository / 草稿 / statusRemote 四种组合。4. 焦点环证据Compose 场景 Tab 焦点回归帧4.1 证据帧 129 / 130 的来龙去脉DIFF-107 同时登记了两张 Compose 场景焦点环证据帧HTTP 工具的「发送」按钮129-compose-http-send-tab-focus.png与翻译工具的「翻译」按钮130-compose-translation-now-tab-focus.png。它们由 next-compose/composeApp/src/desktopTest/kotlin/com/rememberber/mootool/next/compose/ui/workbench/ToolbarFocusCaptureTest.kt 中的captureHttpSendAndTranslationNowFocusRings测试生成。两个按钮都以p5Toolbar true, prominent true渲染与产品工具栏主按钮一致测试用FocusRequester主动请求焦点把runDesktopComposeUiTest场景截图写入docs/evidence/2026-09-15-inspector-screencapture/windows/ ├── 129-compose-http-send-tab-focus.png (520x132) └── 130-compose-translation-now-tab-focus.png (520x132)4.2 像素级断言如何证明「焦点环真的画出来了」测试的判定方法值得注意——它不是人工目测而是像素计数val expected 0x316DC0 ... assertTrue(countRingPixels(image, expected) 8, http send focus ring)countRingPixels遍历整张截图统计精确匹配主题焦点环色0x316DC0蓝色焦点环 token的像素数量断言不低于 8 个。只有当焦点环真实渲染出来该颜色像素数才会达标。同一文件内的其余焦点回归帧命令盘结果行、侧栏导航项、强调色色片、JSON Vault 搜索等复用同一套模式。4.3 适用范围声明Compose 场景 ≠ 产品主窗文档在登记时特别强调这些帧是Compose 测试场景非产品主窗作用是回归 modern 焦点环 token与产品窗口 AX 帧如116-json-tab-focus.png互补不能代替产品主窗的系统 IME / 完整键盘走查验收。同一目录 next-compose/docs/evidence/2026-09-15-inspector-screencapture/results.md 第 169 行也明确写了「有窗口帧不等于该工具整行已验收」。关于 remote 行本身后续 DIFF-562 又在同一目录新增了156-compose-git-vault-remote-save-tab-focus.png见 GitVaultRemoteCaptureTest.kt同样断言焦点环色像素 ≥ 8用相同方法锁定了「保存 remote」按钮的 Tab 可达性与 DIFF-107 的 129/130 帧构成完整的按钮焦点回归序列。5. 证据链与测试入口DIFF-107 的验收证据挂在 next-compose/docs/acceptance.mdF04JSON行注明「Vault Git 远程删除与 ahead/behind 见 DIFF-107」并连锁引用同族 DIFFremote 字段同步DIFF-325/326/327/328、无 remote 的同步展示DIFF-325、configure-remote空串删除语义DIFF-475。A03Git行同样登记 DIFF-107与git remote 删除、ahead/behind两条能力对应。F09HTTP与 F20翻译行分别登记 Compose「发送」焦点帧129、翻译「翻译」焦点帧130。本机desktopTest计数在该阶段为 263/263含ToolbarFocusCaptureTest后续 DIFF-669 时已达到 1342/1344说明焦点回归测试持续随 CI 稳定运行。6. 未做事项与边界诚实声明DIFF-107 文档明确记录了四条「未做」写代码或二次开发前需知悉Electron 中止合并二次确认Electron 端 abort merge 的二次确认对话框交互未在本切片对齐对应 DIFF-108 后续处理。Git 面板逐选择器 CSS尚未逐选择器对照 Electron 六套 CSS 皮肤。真实 pull/push 联网验收本切片只覆盖了 remote 配置与同步计数的本地行为真实网络下的 pull/push 未做联网验收。三平台安装仍未测Windows/Linux 的安装镜像与升级卸载不在本切片范围。结论DIFF-107 交付的是可运行、可单测回归的 Vault Git 远程配置状态机与 Compose 焦点环证据切片而不是完整产品验收。若要在 MooTool Next Compose 上继续做 Vault Git 开发建议把 GitVaultRemotePresentationTest.kt 与ToolbarFocusCaptureTest作为基准回归用例并保留「Compose 场景帧不能代替产品主窗手工验收」的边界意识。赞分享桌面应用开发工具【免费下载链接】MooToolHandy tool set for developers项目地址https://gitcode.com/gh_mirrors/mo/MooTool点击查看免费下载相关推荐MooTool Next Compose 随手记 frontmatter、Vault 树 CRUD、Git 定时器与跨产品导入DIFF-029 差异工程解析MooTool Next Compose 随手记 frontmatter、Vault 树 CRUD、Git 定时器与跨产品导入DIFF 029 差异工程解析桌面应用开发工具MooTool Next Compose 的 Git 远程操作安全实践CLI ASKPASS 凭据通道拒绝把 token 写入 URLMooTool Next Compose 的 Git 远程操作安全实践CLI ASKPASS 凭据通道拒绝把 token 写入 URL MooTool桌面应用开发工具MooTool Next Compose 文本对比同步滚动、Git 前后分栏与 1080 工具栏溢出实现解析DIFF-043MooTool Next Compose 文本对比同步滚动、Git 前后分栏与 1080 工具栏溢出实现解析DIFF 043 导读 本文以 MooTool桌面应用开发工具上一篇evpp核心组件详解EventLoop、Buffer、Timer源码分析下一篇DDParser 使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑