Skip to content

0.1.9

Choose a tag to compare

@Moowningstar Moowningstar released this 27 Oct 11:35
· 18 commits to main since this release

0.1.9

0.1.8 把索引交给 agent,并让它记得自己描述的是哪个提交。0.1.9 做的是另一件事:让索引和引擎说清楚自己知道什么、不知道什么——流程数旁边写清预算,版本不一致时写清是跨线还是出界;顺带把 Git 活动面板修到能用(文件时间线点哪开哪、顶栏真切分支)。

新增

流程预算(图质量说真话)

索引清单里的 processDetection(maxProcesses / maxProcessBranching / maxProcessTraceDepth / maxEntryPointCandidates)现在被读出来,和 stats.processes 一起解释:

  • 被预算截断:流程数达到 maxProcesses,或分析器记录了分支/深度/入口候选上限 —— 卡片写「可能漏报,不代表流程只有这些」。
  • 全程未见:0 条流程但入口点候选 > 0 —— 写「本次没有流程进入排名;不代表仓库里没有流程」,不再把 0 读成「没有流程」。
  • 确实没有 / 没有预算:两者分开。旧版分析器的清单没有 processDetection,写「该索引未记录流程检测预算;N 条流程的完整性无法判断」,不是「没有上限」。
  • 文本输出(bin/gitnexus-coverage.js)在图例行后追加 process budgets: …,只在该结论不是「完整」时出现。

实测本仓库:{"maxProcesses":null,"maxProcessBranching":4,"maxProcessTraceDepth":10,"maxEntryPointCandidates":200},315 条流程 → budget-limited,文案「流程 315 条——在分支 ≤4、深度 ≤10、入口候选 ≤200 的预算内得到;可能漏报,不代表流程只有这些。」

版本线(跨线不是错误)

runnerIdentity.cliVersion 与当前 CLI 的比较不再只给「一致 / 不一致」:

  • 新增 src/gitnexus/version-lines.ts:解析版本、比较(含 prerelease 数字段,rc.159 > rc.9)、判定 stable / candidate / other / unknown,并把一对版本归为 same / cross-line / index-out-of-range / cli-out-of-range / out-of-range / unknown。
  • readCompatibility 的 status 保持字符串相等(match/mismatch/unknown),新增 supportedRange、relation、indexedLine、installedLine;message 三分支:一致、跨线(「两者都在受支持范围内(^1.6.12 || >=1.6.13-rc.0 <2.0.0),属跨线,不是版本错误」)、出界(「查询/刷新行为可能不一致」)。
  • 面板在「索引/CLI」指标下渲染这一行:跨线与一致是弱提示,只有一方出界才标琥珀色。
  • 「语义搜索」不可用时不再只显示「不可用」:写明「未建向量索引时语义检索退化为精确扫描(上限 10.0k 块)」——上限来自 provider 的 exactScanLimit,没有报上限就不臆造。
  • 不引 semver:^1.6.12 的上界是 2.0.0,1.6.14-rc.1 按 npm 规则不在范围内——这套判定不依赖 semver 库就能说清楚。

顶栏切换分支(真 git checkout)

  • 顶部栏项目选择器旁新增分支下拉(多于一个分支才出现),当前项标注「(当前)」。
  • 选中即 POST /api/gitnexus/checkout?repo=…,服务端跑 git checkout <branch> --(唯一会写工作树的路由,走写守卫),成功后重读报告。
  • 不做任何自动处置:不 stash、不 rebase、不切换前检查脏工作区;git 拒绝(冲突、未提交改动)就把 git 的原话显示在顶栏,按钮恢复可用。
  • dubious ownership(Windows 上常见的“仓库属主不同”)只对这一条路径做一次 -c safe.directory=<repo> 重试,不写全局配置。
  • 卡片里的只读分支视图和「回到当前分支」一并删除——切换就是切换。

文件时间线点哪开哪

  • 点文件行的「时间线」,提交时间线展开在被点的那一行下面,滚动仅滚到最近边缘,不把卡片顶上去。
  • 同一文件同时出现在「自基线以来」「最近改动」「索引缺失」多个列表时,先点的那个列表负责承载;再点一次收起,换列表点则移动。
  • 表头选择器选中的文件,时间线渲染在卡片顶部(没有行可挂)。

顶栏置顶且不透明

  • 项目头部(项目名、分支下拉、刷新)改为 sticky 顶栏,背景取宿主 --dsw-alias-bg-base,卡片滚过去不会从背后透出来;根容器的顶部内边距挪进顶栏,消除 12px 缝隙。

活动卡片降密度

  • 四个文件列表(基线以来 / 改动最频繁 / 最近改动 / 应被索引缺失)合并成一个分段控件,同一时刻只渲染一个列表,计数放在控件标签里;交叉表与提交者收进「更多统计」折叠区。卡片高度约减半,不再三次重复同一路径。

提交改动块

  • 展开提交后的 patch 从纯彩色 <pre> 改为带边框的代码块:头部显示 改动 · 语言 与 +A −R 计数、可复制整段补丁;正文按 unified diff 解析出新旧两列行号、hunk 分隔条,增删行以背景着色 + 左侧色条标记;超过 60 行时折叠为「显示其余 N 行」,不再嵌套滚动。

点击项统一成按钮

  • 新增共享样式 INLINE_BUTTON(src/client/primitives.ts):细边框、淡填充、圆角、指针光标,供「行尾动作」使用。
  • 活动文件行、提交行都改为带边框的按钮行(不可点击的行保持纯文本);行尾 时间线 / 收起 / 改动 是带边框的小按钮。
  • 提交时间线折叠、更多统计、技术详情、查看原始输出、服务输出 等由纯文本 role="button" 改为真按钮样式;diff 的 复制 与 显示其余 N 行 同样。
  • 顶部工作区选择器从无边框 select 改为带边框填充的选择器(保留原生箭头),搜索命中行的「打开」区域也套上按钮外壳。

修复

  • 时间线「打开跑上面去了」:曾把时间线钉在卡片顶部,离所点行很远。现在按行内展开,并记住来源列表。
  • 点上面列表、下面列表展开:块的位置原按路径推导,同一路径在多个列表出现时会挂到错误的列表。现在记录来源(路径 + 列表),只在被点的列表渲染。
  • 只在上方列表出现的文件点了没反应:基线列表原先不渲染块,现在也渲染。
  • 文件列表突然全空:修复「活动窗口天数」曾经改从 /api/gitnexus/activity 当前分支重读、因缺索引分类而把所有行判为 excluded 的回归。现在天数随 coverage 请求下发(一次扫描既分类又限窗),缓存键带上天数。
  • hook 顺序违规:GitActivitySection 的 useEffect 原先写在 if (view === null) return 之后,空报告时 hook 数量会变;现在所有 hook 提前。
  • 触发 已停止切换:分支操作曾走宿主命令通道,被判定为「Scoped 命令不可用」后 provider 停止。现在走 HTTP 路由。

内部整理

  • 新增 src/gitnexus/version-lines.ts、src/routes/checkout.ts、test/suites/checkout-route.mjs、test/suites/version-lines.mjs;src/routes/activity.ts(只读分支视图)删除。
  • readIndexMeta 增 processDetection;analyzeCoverage 的 graph 增 processDetection / processCoverage;readCompatibility 增四个字段。
  • 客户端新增 processCoverageLine / compatibilityLine(src/client/format.ts,随 src/client/index.ts 导出),ClientGraph / ClientCompatibility 补齐可选字段。
  • 测试从 1045 项到 1167 项(807 引擎 / 81 插件 / 279 客户端),新增 version-lines 与 checkout-route 两个套件。引擎侧有 3 项 smoke 检查依赖本机索引记录过提交,未记录时为 804。
  • 版本号 package.json、package-lock.json → 0.1.9;README 的功能清单、测试计数同步更新。

验证

  • npm run build → lib/client.js 320 018 字节。
  • npm test:807 / 81 / 279 = 1167 passed, 0 failed。
  • 真仓库:readIndexMeta('.') 读出四个预算字段;analyzeCoverage → processes 315 / budget-limited;readCompatibility → match / same。
  • 两版 manifest 夹具(含 processDetection 的 rc 清单、不含的旧清单)断言 processCoverage 与 compatibility.relation 不同——即「两份清单文案不同」的验收。

已知限制

  • detect-changes 仍不能在受限环境跑(git diff 走管道 → EPERM);发布前需在非受限终端补一次。
  • 切换分支只执行 git checkout:有未提交改动、冲突或 detached HEAD 时由 git 决定成败,插件不代为处理。
  • 切换后索引仍描述旧分支,直到刷新;面板不会自动刷新索引(刷新是分钟级操作,不该藏在切换里)。
  • 流程预算只在清单记录了 processDetection 时可判定;旧索引一律 unknown。
  • 版本线识别只认「1.6.12 稳定线」与「1.6.13-rc 候选线」;其它版本落 other,按出界告警。