Repository navigation
0.1.7
0.1.7
侧边栏的「3D 视图」不再自己画。0.1.6 的 Canvas 伪 3D 社区总览被删除,改为按需启动 gitnexus serve 并把 GitNexus 自带的 Web 前端嵌进弹层;同一版把这个前端的「AI 设置」接上当前在用的 API,打开就能对话。
新增
- 3D 视图卡片:启动并打开、在新标签页打开、重新启动、停止服务,外加可折叠的服务输出。弹层默认占可用视口 86%,支持「紧凑 / 标准 / 铺满」三档、右下角拖拽调整、双击恢复默认,尺寸记在
localStorage。 - AI 设置自动注入:
GITNEXUS_PLUS_AI_PROVIDER+GITNEXUS_PLUS_AI_API_KEY+GITNEXUS_PLUS_AI_MODEL(可选GITNEXUS_PLUS_AI_BASE_URL)在服务启动时写进 SPA 的sessionStorage,卡片上会显示「已注入:provider · model」。 - 不经过网络,也不把 Key 交给面板:注入只发生在服务端交出的那一页(
GITNEXUS_WEB_DIST+ 生成的index.html+ 指向包内assets的链接),客户端状态里只有 provider / model / baseUrl。 - 失败会说话:端口被占、索引版本不匹配、注册表里没有本仓库、没装 CLI,都把原因和进程输出尾部放在卡片上;写错 AI 变量只跳过注入,不影响 3D 视图。
- 接管而不是抢占:端口上已有
gitnexus serve时判它能否看见本仓库,能就接管(不杀),不能就换端口。 webViewPort配置:默认 4747。
移除
src/client/sections/graph3d.ts:手写 3D 投影整体删除,社区总览回到通用 2D canvas(按社区着色、点社区下钻),作为没有 CLI 时的兜底。
修复
- 社区总览不再占一块看不出名堂的 3D 画布,也不再提示「拖拽旋转」。
- 宿主响应缺
ai字段时不再抛错,退化为「未注入 AI 设置」。 - 截断不再误报:搜索与 Git 活动窗口原来「条数 ≥ 上限」就报截断,正好取满一页时也会说「还有更多」。现在各多取一条(
limit + 1/--max-count=<cap + 1>),只有真取到超出上限的那一条才置truncated: true。 - 搜索真的会搜正文:
searchSymbols以前无条件skipFts: true,FTS 从未执行,面板却按「FTS 不可用」提示。现在符号名/文件路径来自图查询(带精确符号与行号),正文来自索引自带的file_fts(QUERY_FTS_INDEX),按路径合并去重;contentSearch报告本次实际范围,页脚写「…与文件正文(FTS)匹配」或「不搜索正文」;声明可用却加载失败时先不带 FTS 重试一次再报错。面板曾经一律写「FTS 不可用」,根因是我们把整份 manifest 当能力表读(capabilities实际在 manifest 里、且可能是陈旧记录,analyze --index-only --repair-fts可修)。
内部整理
- 新增
src/shell.ts:把六份逐字重复的引号规则、两份几乎逐行相同的子进程调用与 JSON 解析收成一处(quoteArg/envPrefix/invokeCommand/tailToLine/tailChars/parseHelperOutput/readLineNumber/exitDetail/runHelper),analyze、commands、install、search、graph、webview全部改为调用它。 - 拆开超大文件(四轮,行为不变):
coverage.ts1028 → 690(字节探测进file-shape.ts,告警规则进coverage-rules.ts);panel.ts1878 → 726(CoverageView进coverage-view.ts,关键词搜索与安装各成一个钩子);search.ts1028 → 852(FTS 正文那一段进search-fts.ts);test/run.mjs4683 → 45(test/harness.mjs+test/suites/*.mjs);test/client.mjs2167 → 684(test/client/render.mjs+test/client/graph.mjs);git-activity.ts914 → 801(numstat 解析进git-log.ts);webview.ts867 → 772(探针进webview-probe.ts,页面播种进webview-inject.ts)。 - 与宿主 0.2.1-rc.3 逐条核对:
engines/ peer 声明、shell.resolve、webServer.register({kind:'prefix'})、sandboxPolicy.resolve()、tools.register、槽位sidebar.right.pane.tab、服务sidebarRightTabs、客户端模块@deepseek-ai/dsh-client-ui-primitives的九个导出都仍在。两条规范偏好被刻意保留:3D 视图嵌的是另一个产品自己的界面(拿不到宿主主题与 locale);面板仍引宿主的 primitives 包(空槽风险与回归手段已写进文档)。 - 原来两个同名的
looksDenied其实是两条规则,现分名为looksDeniedBySandbox(只认沙箱标记与access is denied)与looksPermissionDenied(再加EPERM/EACCES),并写明各自适用场景。
验证
562 engine + 60 plugin + 230 client = 852 passed, 0 failed(受限沙箱内 git 不可 spawn 时跳过相关检查,为526 + 60 + 230 = 816);npm run check与git diff --check通过。- 服务生命周期、路由、尺寸策略、AI 注入与页面重写都有测试;CI 不装 gitnexus 也能跑(用
GITNEXUS_CLI伪一个空文件)。新增src/shell.ts的纯函数测试覆盖引号(空格 / 单引号 / 中文 / UNC)、环境前缀、调用运算符、尾部截断、权限判定、runHelper三种结局,以及两条真实 git 的「正好等于上限不报截断 / 多一条才报」。FTS 另有一组测试:索引目录发现、行形状、按路径去重合并、扩展加载失败识别、缺索引与库被锁的区别、无 FTS 接口时的降级、以及装了包时适配器确实暴露queryFTS/executeQuery。 - 真实 CLI 与真实
web/端到端验过:/api/health正常、/?repo=<路径>返回带种子的页面、/assets/index-*.js照常 1.49 MB。
已知限制
- 跨源 iframe:面板只能显示,图上的交互都在 SPA 里。
- 需要本机有
gitnexusCLI;未安装时其余卡片照常可用。 - 接管来的外部服务用它的页面,AI 设置需手填一次。
- AI 变量在 DSH 启动时读取,改完要重启 DSH;注入值随标签页关闭而清,靠下次启动重新注入。
- Windows 上无建链权限时,
assets回退为复制(约 4 MB)。 - 正文命中只有文件级、没有行号(FTS 只记文件,符号边界在图里);要定位到行用 text 模式。
--skip-fts建的索引没有file_fts,此时退回名称/路径匹配。
npm: dsh-gitnexus-plus@0.1.7