Skip to content

Releases: Moowningstar/gitnexus-plus

0.1.5

Choose a tag to compare

@Moowningstar Moowningstar released this 21 Oct 08:08

0.1.5

这一版解决一个把面板变成死胡同的问题:工作区是“容器目录”时,面板只看工作区本身,找不到子目录里的 GitNexus 索引,只显示一行英文 404。

新增

  • 工作区内多项目解析与切换器:新模块 lib/gitnexus/discover.js 和路由 GET /api/gitnexus/projects?root=<workspace>。从当前工作区开始广度优先收集:
    • 工作区自身;
    • 子目录里的 GitNexus 索引(kind: index);
    • 子目录里的 git 仓库,即使还没有索引(kind: git)。
      每个候选带路径、相对路径、深度、indexedAt、分支、统计、是否有 lbug;未索引的 git 项目也会出现在切换器里,选中后可以针对该目录初始化。
    • 作用域就是当前工作区:包含工作区自身和子目录,不包含兄弟目录,也不向上找父仓库。
    • 一旦某个目录有索引或 .git,就把它当项目边界,不再向下钻。
    • 排序:工作区自身优先 → 已索引优先于未索引 → 层级最浅 → 完整索引(有 lbug)优先 → indexedAt 最新 → 路径名。
    • 默认上限:12 层、4000 个目录、2 秒;跳过 node_modules、构建产物与所有隐藏目录,不跟随符号链接。触发上限时返回 truncated,面板会写“项目搜索达到上限,可能还有未列出的项目”。
  • 标题栏切换器:候选多于一个时,标题栏的路径位置变成 <select>,下拉项标注已索引 / 未索引 / 本工作区;下方一行写明“工作区 … · N 个项目(X 个已索引)· 当前 <路径>”。只有一个候选时保持纯文本路径。切换后 coverage/delta/graph/search/activity/维护命令全部针对新项目。
  • 选择持久化:按工作区记住上次选择(localStorage);刷新或重开时仍然选它;项目消失时回退到默认项并覆盖存储。
  • 协议拆分:coverage 恢复“描述我给的路径”,不再内部自动重定向;客户端先 resolve 列表,再拿选中的 path 请求 coverage。旧客户端不受影响。
  • 没有索引时的扫描回退:工作区自身仍作为“本工作区”候选;没有已索引项目时默认显示工作区扫描,并写明“工作区内有 N 个 git 项目尚未建索引,可在标题栏切换后初始化”;解析失败也会退回扫描而不是白屏。

修复

  • 不是 git 仓库的目录也能出报告:/api/gitnexus/coverage 与 /api/gitnexus/delta 不再要求路径是“项目根”(有 .gitnexus 或 .git)。一个真实的工作区(截图里是 D:\Project\geo,其下是 admin/、backend/、frontend/ 等独立目录)两者都没有,旧版于是返回 404 not-a-project,面板只剩报错和空的维护区。
    • 新的边界是调用方给出的那个存在的目录;仍拒绝不存在的路径和文件系统根目录(不会去扫整个盘)。
    • 路由仍然不提供浏览/列举其它路径的接口。
    • 扫描本身从来不需要 git;GitNexus 也可以索引普通目录(--skip-git),拒绝这种目录是在隐藏数据。
  • 普通目录的初始化命令带 --skip-git:GitNexus 在没有 .git 时连显式传入的路径都拒绝,并提示 --skip-git。面板按目录是否带 .git 自动加这个标记,初始化、强制全量、FTS 修复三条命令都覆盖;分析器执行时用同一判断,按钮与实际命令不会不一致。
  • 如实说明代价:没有 .git 的目录建出的索引没有提交基线、没有增量刷新、没有 Git 活动。
    • 扫描概览的引导文案会说明这一点。
    • 已索引的普通目录,维护区把“增量刷新”改称“重新分析”,确认框写明 --skip-git 与完整重分析。
    • 报告的 repo.hasGit 与 no-commit-baseline 提示把这件事带给宿主和模型,而不只是 UI 文案。
  • 404 文案:路径不存在/不是文件夹/是根目录时返回 not-a-directory 和中文说明,不再把英文原始错误贴到面板。
  • 不再渲染空的“维护命令”卡片:读取失败或宿主不返回命令时,面板以前会合成一个没有命令的 maintenance 对象,标题照常出现、内容是空的(截图里那个空卡片)。现在只有真的存在命令才渲染这一节。
  • Windows 沙箱 SetNamedSecurityInfoW … grantWrite(D:\Program Files\DSH Desktop):搜索/图/安装子进程都由没有 session 的路由启动,没有显式 sandboxPolicy 时部署默认回退到 DSH 应用目录;Windows ACL 后端无法在 Program Files 下建立 workspace-write 授权,于是在命令启动前就失败,面板只看到 windows-acl-run 原始错误。
    • 搜索与图 helper 现在和分析器一样,由宿主把部署策略原样转发,但只把 workspaceRoot 换成 <repo>/.gitnexus(helper 只读图并写该目录内的锁/缓存)。模式不变(只读部署仍是只读),这是收窄而不是扩权。
    • 图视图部分项目一直加载/504:Windows ACL 的 workspace 授权会把可继承 ACE 传播到整棵工作区树,DSH 官方注释写明大仓库上可能需要数分钟。前端这种大仓库第一次读图时,授权还没完成就撞上 25 秒 helper 超时;backend 的授权已经缓存,所以能出图。把搜索/图 helper 的策略根从仓库根收窄到 .gitnexus 后,授权只覆盖索引目录,不再传播到源码/node_modules。
    • 安装把策略根换成插件自己的安装前缀,先创建该目录,并把 npm_config_cache 放到前缀内,避免 npm 写用户级缓存时再次被沙箱拒绝。shell.resolve 的失败现在被捕获,返回带可复制命令的 failed 状态,不再从路由抛出 500。
    • 如果普通 shell 命令仍报同一错误,说明 DSH 会话的工作区本身就是 D:\Program Files\DSH Desktop;这不是插件能修的,需把工作区切到可写项目。不要给 Program Files 加 ACL。
  • 项目切换的残留状态:切换项目时清掉上一项目的报告、维护命令、图投影、差量门禁和运行状态;图只对已索引项目请求,不再对未索引 git 项目发 409。搜索被上限截断时,不把“没列到”误当成“已删除”,不覆盖已保存的项目选择。
  • analyze POST 的目标校验:此前只检查 repo 非空,POST repo=C:\ 会把整个盘交给 analyze --skip-git;现在和只读路由一样拒绝不存在/不是目录/文件系统根目录(404 not-a-directory)。analyze 路由注释里“runner 从不设置 sandboxPolicy”的旧描述也已改成“只转发宿主策略、不选择模式”。

验证

  • 自 0.1.5 起共 636 项测试通过:380 引擎 + 60 插件 + 196 客户端。
  • tsc 三套项目(host / scripts / client)通过。
  • 真机实测解析:D:\Project → 13 个已索引 + 20 个未索引 git 项目,默认选中已索引且最新的 gitnexus-plus,263 个目录 / 397ms;D:\Project\geo(用户已建 frontend/backend 索引)→ 工作区 + 2 个已索引 + 4 个未索引 git 项目,7ms;D:\Project\gitnexus-plus(自身索引)→ 1 个候选。
  • 真机实测扫描 D:\Project\geo:225ms,1120 个文件,17 种语言,hasGit=false,不再 404。
  • 真机实测 gitnexus analyze --index-only --skip-git --skip-fts <普通目录>(两文件小目录):4.4s 完成,写出 .gitnexus/gitnexus.json、lbug 与缓存目录;输出警告“no .git directory found — commit-tracking and incremental updates disabled”。
  • 路由回归:projects 列出工作区、索引和未索引 git 项目并带 kind/深度/完整度;coverage 对选中路径精确作答、不再重定向;不存在的目录与 D:\ 根目录返回 404 not-a-directory。
  • 重启后的实际宿主(127.0.0.1:6172)实测:projects?root=D:\Project\geo 返回 200、7 个候选(workspace + frontend/backend 两个索引 + admin/deploy/docs/landing 四个未索引 git 项目);coverage?repo=...\frontend 返回 200、indexed=true、扫描 193 个文件;graph / search 对 D:\Project\gitnexus-plus 返回 200(search 走 graph 模式)。安装路径未做真实 npm 安装,只验证了策略转发与失败返回。
  • 图视图对照实测:修复前 backend 200 / 235 节点 / 32ms,frontend 504 / 25s 超时,但同一个 helper 直接运行 0.4s 成功——确认是 ACL 授权传播,不是图数据。收窄到 .gitnexus 并完整重启后,frontend 200 / 17ms / 88 节点,backend 200 / 36ms / 235 节点。

已知限制

  • 只向下搜索,不向上寻找父仓库;兄弟目录里的项目不会被发现。
  • 搜索有界(层数/目录数/时间);大目录会触发 2 秒上限,面板会标注 truncated。
  • 默认优先已索引项目;没有已索引项目时停在“本工作区”扫描,未索引 git 项目在切换器里列出,点选后可针对该项目初始化。
  • 遇到已有索引或 .git 的目录即停止下钻,所以一个 git 项目内部的嵌套仓库不会单独列出。
  • 不做跨项目的指标合并,也不做全局仓库列表。
  • --skip-git 建的索引没有提交基线,门禁只能给“无法确认”;刷新是完整重分析,不是增量。
  • 自动跳过文件系统根目录(D:\、/),不把它当作项目。

0.1.4

Choose a tag to compare

@Moowningstar Moowningstar released this 20 Oct 08:37

亮点

0.1.4 回答三个问题:要不要刷新、索引里有什么、最近改了什么。

新增

  • 刷新门禁(Tier 0 差量):新增 GET /api/gitnexus/delta。只对 git diff <索引提交> 的候选文件算 sha256,与 manifest 的 fileHashes 比对;工作区干净时直接给出「无需刷新」,并保留「仍然刷新」作为逃生舱。结论带 certain 字段——索引没有提交基线时如实显示「无法确认」,不再冒充「已是最新」。
  • 图视图:社区总览与下钻两个视图,服务端有界投影(默认 220 节点 / 800 边,超出明确标注);客户端零依赖 canvas 渲染,支持滚轮缩放、拖动平移、悬停标签、点社区下钻、点符号在文件查看器中定位。
  • 文件时间线 + 提交改动:活动卡片里点文件,时间线在该行下方就地展开;再点任一提交,展开该次提交对这个文件的 patch(+/- 行级着色 + 语法高亮)。
  • FTS 修复入口:索引报告 FTS 不可用时,维护区提供 analyze --repair-fts(只修搜索索引,不重跑分析),并在按钮旁写明前置条件(Windows 需 VC++ 2015-2022 x64 与 OpenSSL 3)。

面板体验

  • 卡片改为平台主题 token(--dsw-alias-*)、13px 正文、响应式网格:宽面板两列、窄侧栏单列;
  • 长列表改为卡内滚动,不再把整页越拉越长;
  • 索引概览重排:环形覆盖与扫描摘要同行,文件/图谱/查询能力进网格,各指标带色点;
  • Git 活动:范围选择器移到卡片头,提交时间线默认折叠但保留计数;
  • 失败的原始堆栈默认收进「查看原始输出」,首屏只留结论。

性能

  • coverage 结果缓存 15s,并加上限(8 个仓库),不再按访问过的仓库无限累积;
  • 搜索:60s 结果缓存(键含索引 mtime)+ 并发合并——同一查询的第二次提交复用第一次的进程,不再冷启动;
  • 图投影缓存(键含索引 mtime,刷新即失效);
  • GitNexus 根解析记忆化;PATH 中带 shim 的安装优先(避免新旧版本混用);
  • Git 活动 7 次串行 git 改为两轮并行;Diff 分词按 (路径, patch) 缓存;运行计时移入卡片,不再每秒重渲染整份报告。

修复

  • 面板刷新失败(EPERM)的真正根因:无 session 的路由拿到的工作区根是 DSH 应用目录,沙箱按该路径派生写权限 SID,仓库的授权对它无效。现在宿主把部署解析出的策略原样传递,只替换 workspaceRoot;模式从不由插件改写。
  • EPERM 三类区分:解析缓存目录删除、lbug.init.lock 瞬时占用、worker 建目录被拒——分别给出重试 / 清理后重试 / 直接说明并指向终端。
  • Windows 上 PATH 的 Path 拼写,以及多安装时的 shim 优先(修复 Database file version: 42 vs 41)。
  • 缺图/差量路由时明确提示「重启 DSH」,不再表现为一直「读取中」或静默无门禁。

已知限制

  • 全文检索(FTS)依赖系统原生运行时;缺失时搜索按名称/路径匹配并明示。
  • 受限沙箱内分析器起不了 git,刷新成功但 manifest 无 lastCommit,门禁只能给「无法确认」;在普通终端跑一次即可补上。
  • 图是社区级投影,不是全图;单社区超过节点预算会截断并标注。

升级

npm i -g dsh-gitnexus-plus@0.1.4

0.1.3

Choose a tag to compare

@Moowningstar Moowningstar released this 20 Oct 03:40

0.1.3

这一版补齐了“读索引时的可见进度”和 Git 活动的三个审查视图,并修复了 GitNexus 解析缓存的 EPERM。

新增

  • 真实数值进度条:覆盖路由以 NDJSON 流上报清单、Git、扫描文件计数、超大文件探测和汇总阶段;客户端显示确定百分比和 扫描文件 N/总数,拿到完整报告后才到 100%。
  • 活动 × 索引交叉对比:已索引 / 设计排除 / 索引缺失,带文件数、变更次数和增删行。
  • 基线审查:HEAD 对索引记录的提交做有界 diff;索引没有记录提交时,明确降级为“活动窗口基线”,不冒充索引基线。
  • 项目时间线:默认 7 天,可选 7/14/30 天;超出 100 个提交会明确提示。
  • 文件时间线:点击活动文件行,按需读取 git log --follow,显示该文件自己的提交时间线;天数复用 7/14/30 选择器。
  • 文件时间线路由:GET /api/gitnexus/file-history?repo=<project>&path=<file>&days=7,只读、仅 loopback、路径限制在项目内、最多 100 个提交。

修复

  • analyze 启动前由宿主预建 .gitnexus/parsedfile-store 等缓存目录,避免受限令牌在 parse worker 里 mkdir 失败导致 EPERM。
  • 文件时间线在新客户端、旧宿主时会明确提示重启 DSH,而不是只显示“请求失败 (404)”。

验证

  • 395 项测试通过:215 引擎 + 39 插件 + 141 客户端。
  • npm run check 通过。
  • npm: dsh-gitnexus-plus@0.1.3。

0.1.2

Choose a tag to compare

@Moowningstar Moowningstar released this 19 Oct 09:30

0.1.2

关键词搜索、图查询不可用时的源码回退,以及 0.1.1 真机反馈的面板修复。

新增

  • 只读 /api/gitnexus/search:按符号名/文件路径查 LadybugDB 图,返回 kind / name / path / line。
  • 搜索在系统 Node 子进程(lib/bin/search-helper.js)中执行,宿主不再加载原生 lbug,消除 Electron ABI 的 DLL 初始化失败。
  • 图查询无法启动时(无可用 shell 沙箱、DLL/ABI、索引忙),回退到索引清单内文件的有界源码关键词搜索(mode: "text",代码文件优先,文件/字节/匹配数有上限)。
  • 点击搜索结果直接打开文件并定位到行(dsh-resource://file/session/... + params.line);复制 path:line 保留为独立按钮。
  • 没有索引的项目显示扫描概览、语言分布和初始化命令。

修复

  • skipFts 改为按索引自适应:无 FTS 的索引自动 --skip-fts,有 FTS 的索引不加,避免刷新时 spawn EPERM 和 21× 重建惩罚。
  • GITNEXUS_HOME 默认重定向到 <repo>/.gitnexus/plugin-home,避免写全局 ~/.gitnexus 被沙箱拒绝导致索引停在 incremental-in-progress。
  • 修复面板单列布局在窄侧栏被裁切、单桶直方图、虚构的 --dsw-color-* token、index 来源显示英文、语言分布无 GitNexus 时的回退。
  • 全量重建按钮与需重启宿主的禁用态;旧宿主不会提供可用的 force 操作。

安装

dsh plugin add dsh-gitnexus-plus

需要 GitNexus 1.6.x(peer,不随本包安装)和 DSH。npm: dsh-gitnexus-plus@0.1.2。

验证

  • 367 项测试通过:197 引擎 + 38 插件 + 132 客户端。
  • npm run check(host / scripts / client 三套 tsc)通过。
  • 包内容 90 files / 176 kB,包含 lib/bin/search-helper.js 与搜索路由。

已知限制

  • 图搜索是名称/路径匹配,不搜正文;源码回退才按行文本匹配,且有上限。
  • 源码回退只覆盖索引清单里的文件,新文件需先刷新索引。
  • GitNexus 为 PolyForm-Noncommercial-1.0.0 peer;本插件 MIT,不打包/再分发 GitNexus。

Full changelog: v0.1.1...v0.1.2