Repository navigation
Releases: Moowningstar/gitnexus-plus
Releases · Moowningstar/gitnexus-plus
Release list
0.1.5
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/等独立目录)两者都没有,旧版于是返回 404not-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。
- 搜索与图 helper 现在和分析器一样,由宿主把部署策略原样转发,但只把
- 项目切换的残留状态:切换项目时清掉上一项目的报告、维护命令、图投影、差量门禁和运行状态;图只对已索引项目请求,不再对未索引 git 项目发 409。搜索被上限截断时,不把“没列到”误当成“已删除”,不覆盖已保存的项目选择。
- analyze POST 的目标校验:此前只检查
repo非空,POST repo=C:\会把整个盘交给analyze --skip-git;现在和只读路由一样拒绝不存在/不是目录/文件系统根目录(404not-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:\根目录返回 404not-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并完整重启后,frontend200 / 17ms / 88 节点,backend200 / 36ms / 235 节点。
已知限制
- 只向下搜索,不向上寻找父仓库;兄弟目录里的项目不会被发现。
- 搜索有界(层数/目录数/时间);大目录会触发 2 秒上限,面板会标注
truncated。 - 默认优先已索引项目;没有已索引项目时停在“本工作区”扫描,未索引 git 项目在切换器里列出,点选后可针对该项目初始化。
- 遇到已有索引或
.git的目录即停止下钻,所以一个 git 项目内部的嵌套仓库不会单独列出。 - 不做跨项目的指标合并,也不做全局仓库列表。
--skip-git建的索引没有提交基线,门禁只能给“无法确认”;刷新是完整重分析,不是增量。- 自动跳过文件系统根目录(
D:\、/),不把它当作项目。
0.1.4
亮点
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.40.1.3
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
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