Plannotator “Since main“ 默认视图:用 since-base 复合 diff 与三段式文件面板还原 GitHub 代码评审体验
【免费下载链接】plannotatorAnnotate and review coding agent plans and code diffs visually, share with your team, send feedback to agents with one click.项目地址https://gitcode.com/gh_mirrors/pl/plannotator点击查看免费下载导读本文围绕 Plannotator 代码评审应用的since-basediff 类型展开它把「如果我现在提交并推送GitHub PR 会显示什么」这一意图固化为零配置的默认评审视图并用 Committed / Changes / Untracked 三段式文件面板同时回答「git status 会告诉我什么」。读完本文你将掌握since-base的 git 命令组合与退化保护、sections 分组 sidecar 的计算规则、客户端三段面板与渐进式披露设计以及基线滞后检测与一键 Fetch 的完整链路。1. 背景两种最常见诉求与 DiffTypePicker 的失效用户对评审应用的两条高频反馈是「我只想看到 GitHub 上会显示什么」和「我只想看到 git status 会显示什么」(决策文档)。旧默认体验让这两者都落空DiffTypePicker强制用户在渲染前把意图翻译成 git 机制staged / unstaged / merge-base / allmerge-base类型虽然提示语写着「与 GitHub PR 视图相同」却排除了工作区改动而默认的unstaged对刚提交完的用户显示为空。无论默认选哪个都会背叛其中一种心智。注since-base相关设计文档与决策位于 intent 文档、规格文档、SPIKE 验证、综合论证本文同时对照了当前仓库源码实现。2. 方案核心溶解选择而不是换一个默认决策不是换一个「更好的默认」而是溶解选择本身让一个复合比较同时服务两种心智。merge-base(origin/default, HEAD) → 工作区 未跟踪文件 「如果我现在推送GitHub PR 会显示什么」diff 内容回答 GitHub 问题屏幕上每个 diff 都意味着同一件事——「自 main 以来的变更」没有例外没有按文件切换模式。分组回答 git status 问题Committed弱化、Changes修改新增合并带暂存点、Untracked 三个分区正是三段式面板。「只看上一次提交」的诉求不作为本视图的开关——它本来就是高级菜单里的last-commitdiff 类型决策文档。3. 服务端一个since-basecase 走通所有既有接缝SPIKE 验证的核心结论是三段式面板不需要三个并行 diff服务器整台状态机currentPatch 单个currentDiffType 单个 fingerprint只容纳一个活跃 patch而一个复合比较正好契合SPIKE 文档。3.1 计算命令实现位于 packages/shared/review-core.tssince-basecase 在 runGitDiff 的 switch 中git rev-parse --verify HEAD # hasHead 守卫无 HEAD全新仓库时退化 git merge-base --end-of-options base HEAD # 与 merge-base 模式同源 git diff --no-ext-diff [-w] --src-prefixa/ --dst-prefixb/ --end-of-options mb # mb 后不带 ..HEAD → 对比的是工作区 # 再加上 getUntrackedFileDiffs()/dev/null --no-index 合成 diff要点merge-base 查找失败如仓库没有 main/master/origin、默认分支为trunk且无远端时退化到 HEAD用户仍能看到工作区改动而不是裸 git 报错无 HEAD 时则降级为仅未跟踪文件的 patch——与uncommitted的hasHead守卫同模式review-core.ts#L1671-L1695。3.2 伴随 case每个既有接缝加一个分支SPIKE 逐行验证的触点清单当前源码全部落位文件新增内容review-core.tsDiffType联合since-base加入类型联合约 L29review-core.tsgetGitDiffFingerprintsince-basecaseHEAD sha hashDiffOutput([mb])hashUntracked() base tip约 L2063-2076getFileContentsForDiffold git show mb:pathnew 工作区读取getGitContextdiffOptions存在默认分支时第一个发出选项labelAll changes since base经既有resolveInitialDiffType成为初始类型约 L724vcs-core.tsGIT_DIFF_TYPES加入since-basegit 专属canStageFiles返回 true工作区文件可暂存config.tsresolveDefaultDiffType白名单加入新 id默认从unstaged翻转为since-baseconfig.ts#L617-L623WORKTREE_SUB_TYPES加入since-base使worktree:path:since-base可解析、切换工作区时保留模式review-core.ts#L1517-L1527compareTarget.diffTypes变为[since-base, branch, merge-base]是「vs origin/main」基准选择器的门控来源约 L772agent-review-message.tsgetLocalDiffInstructiontarget 自与 的 merge-base 以来的全部变更含已提交与未提交加未跟踪文件——GitHub PR 会显示的完整集合inspect mb 查找 git diff mb命令3.3 默认值翻转与显式配置resolveDefaultDiffType的当前实现packages/shared/config.ts#L620-L623export function resolveDefaultDiffType(cfg?: PlannotatorConfig): DefaultDiffType { const v cfg?.diffOptions?.defaultDiffType as string | undefined; return v since-base || v local-vs-remote || v uncommitted || v unstaged || v staged || v merge-base || v all ? v : since-base; }即所有用户默认翻转为since-base但显式配置defaultDiffType的用户保留自己的选择旧配置中的branch到merge-base的映射继续保留intent 文档明确。3.4 客户端配套STAGEABLE_DIFF_TYPESuseGitAdd.ts加入since-base——行内暂存按钮与暂存点依赖它。OPTION_HINTSDiffTypePicker.tsx为新选项提供提示文案。App.tsx 的 worktree 子类型解析与WORKTREE_SUB_TYPES保持同步源码注释明确警告该副本若不同步会静默破坏 guide/tour 任务的上下文匹配。Pi 扩展vendor.sh构建期自动 vendorpackages/shared/与agent-review-message.ts到generated/共享层改动自动传播只需手工镜像sectionspayload 字段与POST /api/fetch-baseapps/pi-extension/server/serverReview.ts。4. Sections sidecar分组不是 diff是状态旁路三个分组加总恰好等于复合 patch 的文件清单因为分区只是同一数据集的三种视图。服务器在/api/diff与/api/diff/switch响应中、当diffType since-base时附带review.ts#L805 起有buildSectionsSidecarsections: { base: string; // 已解析的基准 ref如 origin/main mergeBase: string; // sha用于展示/调试 files: Recordstring, { group: committed | changes | untracked; status: A | M | D | R; // 相对 merge-base取自 patch 本身 staged: boolean; // porcelain 第一列 }; }数据来源是两条已有命令review-core.ts#L2346-L2381git status --porcelain # 工作区状态指纹计算本就在跑 git diff --name-only mb..HEAD # 「分支上改过」的文件集合分区规则Committed在 mb..HEAD 集合内、且 status 干净Changes被跟踪且工作区脏M/A 合流暂存位取 status 第一列Untracked??行。已在分支提交又本地编辑的文件只出现一次、落在 Changes其 diff 展示完整的「自 base 以来」故事——这是确认过的决策不做按文件覆盖。暂存但工作区已回退的文件会从 patch 中消失而 status 仍显示已暂存属于可接受的外观瑕疵SPIKE 边缘用例。5. 客户端三段式 Sections 面板新组件 SectionsPanel.tsx 与FileTree平级、共用左面板槽位是since-base的默认视图advanced 模式只渲染 Tree。逐行结构来自 mockup 原型Header「Review」 分支 chip下方安静的「vs origin/main」入口 → 打开既有BaseBranchPicker。三个可折叠分区带计数Committed约 55% 透明度弱化、Changes、Untracked。Committed 尺寸视口自适应已确认决策Changes 与 Untracked 永远完整渲染——每个可操作文件无需滚动即可见Committed 填满剩余垂直空间空间紧张时仍有「最少几行」的下限随后是「N more files」展开行展开态在面板内滚动实现见 SectionsPanel.tsx#L267-L330 的committedExpanded状态与高度计算。行解剖已阅复选框主操作沿用viewedFiles设施含v键与暂存自动标记已阅· 文件名 · 暂存点紫色· 安静 stage/ 按钮/api/git-add· 状态字母M 琥珀 / A 绿 / U 灰D 红未装饰的 modified 沿用树视图惯例。客户端在暂存后即时修正分组untracked且staged移入changes反之移回SectionsPanel.tsx#L282-L298。Sections | Tree 切换在面板头部选择以 cookie 持久化与其他设置一致第三个槽位 Commits 预留给 backlog 中的 git-graph 工作SPIKE-git-graph-view-20260618-220909.mdPhase 1 扁平提交列表 每提交 diff视图层零改动即可接入。渐进式披露默认屏零选择器。「vs origin/main」→ 基准选择器第 1 层。「Advanced」安静页脚行与既有复制 diff 页脚相邻→ 今天的DiffTypePicker完整模式列表staged/unstaged/last-commit/merge-base/all/worktrees选 advanced 模式自动切到 Tree 视图。DiffTypeSetupDialog新增「GitHub view (recommended)」为默认项进阶用户仍可选经典默认。6. 基线滞后让「这是 GitHub 视图」可信的一个横幅「我们对比的是 origin/main 上次 fetch 时的 GitHub」——诚实性是整套设计的信任前提。方案完全复用启动期ls-remote已有却丢弃的远端 tip SHA扩展detectRemoteDefaultBranch或同级函数从同一次git ls-remote --symref origin HEAD输出中保留sha\tHEAD行与本地git rev-parse origin/branch比对不同则 payload / fresh-probe 携带baseBehindRemote: true当前实现见 review.ts#L636-L711 的computeBaseBehindRemoteUI安静横幅「Baseline is behind GitHub · Fetch」→专用端点POST /api/fetch-base执行git fetch origin branch成功后客户端重跑/api/diff/switchpreserveFile。决策明确独立端点而非重载/api/diff/switch因为 fetch 是带自身失败模式的网络变更review.ts#L2279节奏启动时 约每 60s 检查一次网络调用不走 5s 指纹轮询。7. 范围边界与验收要点仅 Git。jj 保持jj-current默认与现 UIPerforce 与 workspace 模式不变since-base经GIT_DIFF_TYPES归 git 所有PR 模式不变——它本身就是 GitHub 视图。没有任何既有 diff 类型、端点或控件被删除。验收草图规格文档第 6 节特性分支 提交 编辑 新文件三段齐全、计数正确、每个文件 diff 都是「自 main」默认分支 本地编辑Committed 空Changes/Untracked 等同今天的 uncommitted 视图行内暂存按钮出现暂存点、文件自动标记已阅、文件留在 ChangesSections ↔ Tree 切换同一批文件、无重新拉取origin/main 过期横幅出现Fetch 刷新并重新分区Advanced →「Staged changes」经典行为、Tree 视图、无分区jj 仓库行为零变化。8. 实现代价与影响面源码结构视角从当前源码结构看这是一次「沿既有接缝的增量」服务端/共享层 6 个左右小 casediff 执行、指纹、文件内容、暂存门控、agent 上下文、配置默认加上一个 payload sidecar 与一个 fetch 端点客户端新增 Sections 面板组件、Sections/Tree 切换、页脚 Advanced 入口与滞后横幅。注释、反馈导出、已阅同步、新鲜度轮询与 diff 查看器全部零改动——它们本就作用于单一 patch 与扁平文件列表sections分组只影响左面板呈现diff 查看器依然消费扁平DiffFile[]SPIKE 与 git-graph spike 的共同发现。潜在影响默认体验对既有用户全员改变但旧行为离页脚一次点击之遥显式配置默认被尊重。baseBehindRemote会随每个 diff payload 与新鲜度探针携带客户端据此点亮/熄灭横幅review.ts#L2228-L2231保证 Fetch 后横幅即时收敛。赞分享【免费下载链接】plannotatorAnnotate and review coding agent plans and code diffs visually, share with your team, send feedback to agents with one click.项目地址https://gitcode.com/gh_mirrors/pl/plannotator点击查看免费下载相关推荐ChatGPT桌面应用窗口还原默认大小恢复窗口的默认尺寸ChatGPT桌面应用窗口还原默认大小恢复窗口的默认尺寸 你是否曾不小心将ChatGPT桌面应用窗口调整到不合适的大小导致操作不便本文将详细介绍如何快速恢桌面应用AI 应用BambooAI重新定义对话式数据发现与分析的终极Python库BambooAI重新定义对话式数据发现与分析的终极Python库 BambooAI是一款由语言模型LLMs驱动的Python库专为对话式数据发现与分析设Watchman的since命令详解高效追踪文件变更Watchman的since命令详解高效追踪文件变更 什么是Watchman的since命令 Watchman是一个由Facebook开发的文件监控服务它的后端开发工具上一篇GHelper全面重构华硕笔记本的智能轻量级控制革命下一篇5分钟完全指南用ModAssistant轻松管理Beat Saber模组创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Claude Code MCP 查 Bug 实战:一句话串联 5 个工具的配置骨架

Claude Code MCP 查 Bug 实战:一句话串联 5 个工具的配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 10:55:35 阅读更多 →
OpenAI AI 智能体逃逸沙箱挖零日漏洞:用 TaoToken 统一 Key 复现 Hugging Face 攻防链路

OpenAI AI 智能体逃逸沙箱挖零日漏洞:用 TaoToken 统一 Key 复现 Hugging Face 攻防链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 10:55:35 阅读更多 →
用钉钉远程操作 Claude Code:TaoToken 统一 Key 配置与 settings.json 骨架

用钉钉远程操作 Claude Code:TaoToken 统一 Key 配置与 settings.json 骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 10:55:35 阅读更多 →

最新新闻

取代Navicat!40+种数据库,这款数据库管理工具配 TaoToken 统一 Key 通道

取代Navicat!40+种数据库,这款数据库管理工具配 TaoToken 统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:32:52 阅读更多 →
第二章 工具的界限就是 Agent 世界的界限:用 TaoToken 统一 Key 打通 Cline 工具边界

第二章 工具的界限就是 Agent 世界的界限:用 TaoToken 统一 Key 打通 Cline 工具边界

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:32:52 阅读更多 →
Sybase ASA 12.0 解压即用客户端实战指南

Sybase ASA 12.0 解压即用客户端实战指南

简介:本资源是Sybase Adaptive Server Anywhere(ASA)12.0官方客户端工具的绿色免安装版本,专为数据库开发、运维及DBA人员设计,用于连接、管理与调试ASA/SAP SQL Anywhere数据库系统。解压即用,内置JRE运行…

2026/9/25 13:32:52 阅读更多 →
家庭财务管理系统源码从拆包到部署实战与常见排错指南

家庭财务管理系统源码从拆包到部署实战与常见排错指南

简介:一套面向家庭收支管理场景的ASP.NET WebForms源码包,适合软件专业学生、毕业设计者以及需要构建个人记账工具的开发者。压缩包共200个文件,主要文件包括C#业务逻辑文件(.cs)、ASP.NET页面(.aspx)、GIF图标素材(.gif)、运行依赖库(.dll)及…

2026/9/25 13:32:52 阅读更多 →
Codex vs DeepSeek Harness:两种Agent架构路线,谁才是未来?TaoToken统一Key接入实测

Codex vs DeepSeek Harness:两种Agent架构路线,谁才是未来?TaoToken统一Key接入实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:32:52 阅读更多 →
Atlas 300V 24G推理卡部署YOLOv5全流程实战指南

Atlas 300V 24G推理卡部署YOLOv5全流程实战指南

最近后台连续收到好几条差不多的提问:Atlas 300V 24G是不是运算加速卡啊,能不能拿来部署YOLO?问的人多了,我就知道这不是个例,而是大家在采购清单、项目验收文件、二手平台里看到“Atlas 300V 24G”这个型号之后的普遍…

2026/9/25 13:31:51 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →