dsh-gitnexus-plus
在 DSH 侧栏读取 GitNexus 索引,报告被跳过的文件、索引新鲜度与语言覆盖,支持符号搜索和最近的 Git 活动审查。
安装
dsh plugin --profile web add dsh-gitnexus-plus
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-gitnexus-plus
  
English · [简体中文](README-CN.md)
Current release: 0.1.12 ·
npm ·
[What it does](#what-it-does) · [Install](#install) · [Troubleshooting](#troubleshooting) ·
[Upstream GitNexus docs](#upstream-gitnexus-documentation)
A DeepSeek Harness plugin: see what a GitNexus index covers and what it leaves out,
decide whether a refresh is worth running, browse the graph, read the repository's own
commit graph — each commit's files and patches included — open GitNexus's own 3D view for
the full picture, refresh the index from the sidebar, and search its symbols — and the
source text the index recorded — by keyword.
It does not fork GitNexus, rewrite its parser, or bundle/redistribute it. gitnexus is a
peer; you provide it.
What it does
- Refresh gate (Tier 0) — before offering a refresh, the panel compares the working
tree with the sha256 hashes the index recorded in .gitnexus/gitnexus.json and reports
what actually differs: modified / added / deleted, plus files the index's own policy
excludes. A clean tree answers in milliseconds without starting the analyzer, and the
button says so instead of running a minutes-long rebuild. The verdict is only called
"up to date" when it is anchored to the commit the index recorded; an index that
recorded none falls back to comparing the working tree with HEAD and says it cannot
confirm instead of claiming freshness.
- Storage state, not just "indexed or not" — GitNexus 1.6.13 inspects
.gitnexusbefore
writing and distinguishes six states, not two, so "no index" was the wrong answer for the
four that are neither owned nor absent. The panel now names the state it found: unowned (data with no ownership manifest),
foreign (the manifest names another repository or storage directory — a moved checkout,
or a directory copied together with its .gitnexus), invalid_storage (a manifest exists
but does not parse) and unknown (the bytes could not be read — this plugin's own state,
so an unreadable store is not called malformed). Only owned counts as a usable index;
the blocked screen says which state it is and offers 全量重建, withholding 初始化索引
because upstream rejects that write in all four. The text output follows the same rule:
GitNexus index: BLOCKED (<state>) instead of NOT FOUND.
- Read paths ask the same question as the panel — search and the three graph tools
(impact, context, query) used to check only that a manifest existed, then open
.gitnexus/lbug; for a moved or copied checkout that returned another repository's
graph. They now consult the storage state first and answer 409 index-not-usable with
the sentence the blocked panel shows (409 no-index for a project that never had an
index). The check runs before the manifest is parsed, because that parse does not
validate ownership. Routes that read git objects — a commit's files, file history,
checkout — still answer without an index, since they never touch the graph.
- Graph view — the index's communities drawn on a canvas, with aggregated
cross-community edges; click a community to see its member symbols and the relations
among them, click a symbol to open its file at the line. Node and edge budgets are
applied by the host, and the view states what it left out. A Symbol view button
switches to a bounded all-symbol projection when a symbol outside the current
communities matters; it is explicitly truncated by file order, and the community view
remains the structural overview. Single click selects a community; Expand opens a
centered dialog with the same projection and a community sidebar, not a full-screen
mode. The card defers its fetch until it is scrolled near the viewport.
- 3D view — the full, rotatable graph is GitNexus's own web UI, embedded instead of
reimplemented. The panel starts gitnexus serve (one process per plugin host, stopped
when the plugin unloads) and shows the SPA in an overlay iframe, with **open in a new
tab and stop the server** beside it. The server is spawned with the same CLI the
analyzer uses, against the GITNEXUS_HOME registry that actually holds this
repository, so the URL opens this project rather than another indexed one. A failed
start surfaces the process's own output — a version-mismatched index shows
Trying to read a database file with a different version instead of a blank frame. An
existing server on the port is adopted (and never killed) when it can see the
repository. The dialog opens at 86% of the usable viewport, has 紧凑 / 标准 / 铺满
presets, and can be dragged to any size from the bottom-right corner; the size is
remembered in localStorage and clamped whenever the window shrinks. Port and
embedding are configurable; see webViewPort.
- AI settings, pre-filled — the SPA keeps its provider settings in
sessionStorage,
which a cross-origin iframe cannot be written to. The plugin therefore serves it a
generated index.html (through GITNEXUS_WEB_DIST) that seeds gitnexus-llm-settings
before the app boots, taking provider, key and model from
GITNEXUS_PLUS_AI_PROVIDER / GITNEXUS_PLUS_AI_API_KEY /
GITNEXUS_PLUS_AI_MODEL (plus optional GITNEXUS_PLUS_AI_BASE_URL for
OpenAI-compatible endpoints, Azure endpoints and Ollama hosts), so chat works witho
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:13,最后更新 2026-11-06