Files
ycode/docs/沙盒Git完整接入-2026-10-18.md
T

82 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 沙盒 Git 完整接入(2026-10-18)
状态:**工程接入已完成(Windows x64 验收范围内)**。本批集中交付完整支持子集,不再把分散的局部增量当作 Git 对齐完成。沙盒全量目标和 WorkBuddy 1:1 等价仍未完成;见本文件的明确边界和[专用验收矩阵](沙盒Git接入验收矩阵-2026-10-18.md)。基线组件升级为 0.7.0 / protocol 1,保留 0.6.0 私有快照 Git 和会话草稿作为兼容路径。
## 本批验收范围
1. 应用携带可校验、可离线复现的 Git 及远程传输依赖,无需宿主 Git/PATH。
2. 支持宿主普通仓库和 linked worktree 的历史、真实 HEAD、索引、分支、标签、stash、忽略规则;导入先获明确审批,不导入 hook、凭证 helper、任意配置程序或 alternates 外部对象路径。
3. 对话中的本地 Git 在 AppContainer/Job 内运行;验证 status/diff/add/commit、分支/切换、merge/冲突处理、rebase/cherry-pick/revert/reset、stash/tag 和 detached HEAD。保留跨命令状态。
4. 显式宿主提交同时处理项目文件、索引/引用/对象等仓库变更;绑定原根身份、策略、版本和审批,拒绝宿主外部冲突。复用原生事务,组事务记录提交/补偿/恢复结果。
5. 远程查询、clone/fetch/pull/push 通过专用宿主控制面代理,限定结构化参数、固定 Git 和净化环境。每次远程操作有目标/引用/内容审批;沙盒普通命令继续禁网。凭证显式提供并限定目标,不自动使用宿主 SSH/全局 Git/凭证管理器。
6. 工具、OMP/备用内核、维护 CLI、状态/结果查询和错误说明一致;不在当前用户真实仓库或远程仓库上做写入测试。
7. 用真实临时仓库/远程服务验证成功、拒绝、取消、冲突、传输失败、篡改和恢复;构建、兼容回归、资源身份和文档一起验收。
交互式编辑器、任意用户 hook/filter/helper、LFS/外部扩展及子模块各自的执行/凭证权限不得通过普通 Git 参数绕过沙盒。测试报告仅记录工程侧行为;未知原版行为不会自动算已对齐。
## 原版依据
参考目录仍为材料声明的 WorkBuddy 5.8.6,版本未独立证明,目录摘要 `d87c4cab25fb1feec426332fe01b1680538577405cf82476cb6f5b1b14d94b84`。本批通过 REA 复核程序策略和文件代理两个 CJS,父 Evidence `ev_3f45718a91d5c7f20b8940aff699cf62e42467e1c60df9448b8ef9ff4b4be0ab`,摘要视图 `ev_8e62a51a397ca733c115e7bb42d5925b9fbdda1be19ab33b8ff4cbf8b525638c`。仅有静态职责线索,无完整 Git 宿主/远程运行证据;本批工程验收与原版同场景验收分开记录。
## 架构决定
- 宿主历史通过审批导入为会话私有镜像,Git 命令继续在隔离 stage 使用副本;不直接给 AppContainer 开放宿主 `.git`。
- 普通项目文件与 Git 元数据使用分别绑定根身份的原生事务,另有组事务记录跨根提交和补偿;不承诺跨根/断电原子性。
- 原始配置仅由宿主控制面读取和合并白名单数据;沙盒执行配置和传输配置均重新生成,不运行宿主 alias/hook/filter/fsmonitor/credential helper。
- 远程代理是有网络能力的受信控制面,不向命令 Job 添加网络 capability,也不接受任意 shell/可执行文件/环境变量。
## 实施结果
### 接入能力
- 应用内置并校验官方 MinGit 2.56.0.windows.2;HTTPS、SSH、HTTP/HTTPS helper、OpenSSH、必要 DLL 和许可证作为同一固定归档/清单交付。SHA-256:归档 `da35e72aa21c005a5a0d298cfbae110bc1609a815730ea0dde84b01a1b3cd3be`,运行时清单 `17cbe59d1fdd9230e528be9ec6402b870637d5e7148215f278bbaff01b92ed01`;82 个文件、30,197,068 bytes。普通构建离线复核,不扫描宿主 PATH。
- `sandbox_git` 接入对话工具,`sandbox_workspace` 的 commit/discard/recover 统一转到 Git 管理路径;受控 Git argv 仍在 AppContainer/Job 执行。状态、远程持久操作结果、会话/项目 owner 只读 IPC 和维护 CLI 已接线。
- 本地常用流程包含 status/diff/add/commit、分支/标签/switch、merge 冲突继续/abort、rebase、cherry-pick、revert、reset、stash、detached HEAD;非交互 Git editor 只用于已允许的继续操作。
- `import` 先逐次审批,把宿主普通仓库或现有 linked worktree 的真实历史、HEAD、索引、引用及安全白名单配置导入当前会话镜像;不执行导入的 hook/helper/filter,也不带入凭证或外部对象路径。源内容在审批期间变化即拒绝。
- `init` 创建真正 unborn 私有仓库。`clone` 读取远程默认分支/全部引用,包含空远程和 SHA-256;首次发布新仓库时先单独审批创建 `.git`,再审批工作区和 Git 元数据组提交。
- 只有显式批准的宿主提交会同步项目文件及 `.git` 元数据;使用原生目录身份、写前摘要、Git 锁协调和组事务恢复。Linked worktree 按工作树私有目录、common Git 目录拆分提交阶段。对象先发布、引用后发布,宿主对象只追加。
- 远程操作包括 `ls-remote`/`clone`/`fetch`/`pull`/`push`。HTTPS 校验证书、禁止重定向,SSH 使用显式私钥和 pinned `known_hosts`;凭证经用户 DPAPI 保护并限定到精确 URL。审批指定 endpoint、远端引用和对象 ID;push 使用原子更新,force-with-lease 需用户提供期望旧 OID。普通命令及 AppContainer 仍不获通用网络权限。
- pull 默认 ff-only,另有显式 merge/rebase;拒绝/取消/策略变化会终止对应作业。Push 响应丢失作为 `unknown` 保存,不自动重试;用户可单独批准只读 reconcile,核对当前引用状态。
- 控制 Job 使用原生 Git runner 固定 argv/环境、父进程监控、期限和进程树限制。异常控制目录由维护入口仅在 owner/native lease 都无活进程时清理。
### 维护者 CLI
所有带状态的命令都要求显式 `--state-root` 及绝对路径;需要向宿主项目或远程写入的操作必须额外写 `--approve`。请求文件只承载 argv 或结构化远程参数,不使用 shell 拼接:
```powershell
npm run sandbox:maintain -- git-host-status --workspace 'C:\Project' --session SESSION_ID --state-root 'C:\YCodeData\sandbox'
npm run sandbox:maintain -- git-host-import --workspace 'C:\Project' --session SESSION_ID --state-root 'C:\YCodeData\sandbox' --approve
npm run sandbox:maintain -- git-host-commit --workspace 'C:\Project' --session SESSION_ID --state-root 'C:\YCodeData\sandbox' --approve
npm run sandbox:maintain -- git-host-recover --workspace 'C:\Project' --session SESSION_ID --state-root 'C:\YCodeData\sandbox'
npm run sandbox:maintain -- git-run --workspace 'C:\Project' --session SESSION_ID --state-root 'C:\YCodeData\sandbox' --request 'C:\requests\git-argv.json'
npm run sandbox:maintain -- git-remote --workspace 'C:\Project' --session SESSION_ID --state-root 'C:\YCodeData\sandbox' --request 'C:\requests\fetch.json' --approve
npm run sandbox:maintain -- git-remote-operation OPERATION_UUID --workspace 'C:\Project' --session SESSION_ID --state-root 'C:\YCodeData\sandbox'
npm run sandbox:maintain -- git-credential-add --url 'https://example.invalid/team/repo.git' --credential-file 'C:\secure\credential.json' --state-root 'C:\YCodeData\sandbox'
npm run sandbox:maintain -- git-credentials --state-root 'C:\YCodeData\sandbox'
npm run sandbox:maintain -- git-cleanup --state-root 'C:\YCodeData\sandbox'
```
`git-argv.json` 为 JSON 字符串数组,例如 `["status", "--short"]`;`fetch.json` 是 `{"action":"fetch","url":"https://example.invalid/team/repo.git","branch":"main","credentialId":"CREDENTIAL_UUID"}`。HTTPS 凭证文件格式为 `{"type":"https","username":"...","secret":"...","caCertificate":"可选 PEM"}`,SSH 凭证则提供 PEM private key 和 exact-host `knownHosts`。凭证导入经过 DPAPI 加密,清单只显示 id/URL/type;不要把真实 token 写入命令行、请求或日志。
### 最终验证
- `npm run build`:通过;包含 Windows x64 原生重建、两套 TypeScript 检查、生产 main/preload/renderer 构建。实际构建日志:`.tmp/git-complete-final-build.log`。
- 整批新专项:本地完整流程 29/29、安全/并发/事务/崩溃恢复 25/25、HTTP/HTTPS/SSH 真实 loopback remote 40/40、真实生产 Electron + OMP + localhost 模型 52/52;最终目录包内 Git 20/20。
- 兼容回归:工作区 51、基础沙盒 52、既有 Git 43、策略 38、目录 13、原生写回 32、内置 Git 20、读取桥 21、进程 20、工具链 24;314 项全通过,总计 480 项。
- 目录包:Windows x64 `win-unpacked` 已构建;包内 native/adapter/manifest 与 82 个 Git 文件核对 SHA-256,并使用包内资源跑 Git 专项。只验未安装/未签名编辑目录包,不代表 NSIS 安装、升级/卸载、公开签名链或标准用户验收。
- 当前机器 Windows 11 x64、提升权限。本批未对用户真实仓库或远端执行写操作;所有仓库、HTTP/HTTPS/SSH 服务、凭证、用户数据和模型服务均为隔离测试夹具/loopback。未重启用户窗口、未改生产沙盒状态、未提交代码。
### 已知不支持 / 未验证
- 只验 Windows x64 与当前本地 NTFS/提升权限;标准用户、支持 Windows 版本/文件系统矩阵和独立安全审查仍未验。macOS/Linux/ARM64 不支持。
- 元数据仅支持 files ref backend;reftable 显式拒绝。Git alternates、partial clone/promisor 必须先明确物化;不跟随外部对象路径。
- 任意 hook/alias/filter/fsmonitor/credential helper、交互式编辑器、GPG/SSH agent/GCM、LFS、子模块的独立程序/网络执行、项目任意远程 helper/扩展均未开放。宿主配置只读安全白名单。
- 上限包括 30,000 项元数据、256 MiB 仓库总量、128 MiB 单文件;不承诺大于这些上限的 monorepo/历史。
- 新仓库 `.git` 骨架初始化与后续组提交是两个显式审批/事务;多根 linked worktree 组提交可暴露中间态,不承诺跨根/断电原子性。原生覆盖仍采用两次 rename,有短暂缺名窗口。
- 远端 TLS/SSH 行为在真实 loopback fixtures 验证;未对公网托管、企业代理、真实供应商账号/产品仓库做生产凭证验证。代理是受信宿主控制面,不等同于普通命令受控联网。
- 工程实现覆盖常用 Git,而不是完整 Git 子命令/平台语义。版本兼容范围、长历史资源/性能与所有并发时序仍需扩大测试。
### 原版等价范围
参考材料目录 SHA-256 `d87c4cab25fb1feec426332fe01b1680538577405cf82476cb6f5b1b14d94b84`,材料声明 WorkBuddy 5.8.6,版本未独立证明。本批仅通过 REA 静态查看 `shims/broker-program-policy-check.cjs` 与 `shims/node-brokered-fs-shim.cjs`;Evidence parent `ev_3f45718a91d5c7f20b8940aff699cf62e42467e1c60df9448b8ef9ff4b4be0ab`,summary `ev_8e62a51a397ca733c115e7bb42d5925b9fbdda1be19ab33b8ff4cbf8b525638c`。没有原版 Git 导入、命令、审批、远程或 UI 的同场景执行证据,故这里只宣称 YCode 的工程集成/实测,不宣称 WorkBuddy 1:1 等价。