Repository navigation
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:\、/),不把它当作项目。