dsh-gitnexus-plus 0.0.0-stage → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +38 -0
- package/README.md +631 -2
- package/cordis.patch.yml +18 -0
- package/lib/bin/gitnexus-coverage.d.ts +14 -0
- package/lib/bin/gitnexus-coverage.d.ts.map +1 -0
- package/lib/bin/gitnexus-coverage.js +171 -0
- package/lib/bin/gitnexus-coverage.js.map +1 -0
- package/lib/bin/search-helper.d.ts +22 -0
- package/lib/bin/search-helper.d.ts.map +1 -0
- package/lib/bin/search-helper.js +57 -0
- package/lib/bin/search-helper.js.map +1 -0
- package/lib/client.js +2131 -0
- package/lib/gitnexus/analyze.d.ts +173 -0
- package/lib/gitnexus/analyze.d.ts.map +1 -0
- package/lib/gitnexus/analyze.js +308 -0
- package/lib/gitnexus/analyze.js.map +1 -0
- package/lib/gitnexus/commands.d.ts +129 -0
- package/lib/gitnexus/commands.d.ts.map +1 -0
- package/lib/gitnexus/commands.js +185 -0
- package/lib/gitnexus/commands.js.map +1 -0
- package/lib/gitnexus/coverage.d.ts +340 -0
- package/lib/gitnexus/coverage.d.ts.map +1 -0
- package/lib/gitnexus/coverage.js +554 -0
- package/lib/gitnexus/coverage.js.map +1 -0
- package/lib/gitnexus/format.d.ts +16 -0
- package/lib/gitnexus/format.d.ts.map +1 -0
- package/lib/gitnexus/format.js +178 -0
- package/lib/gitnexus/format.js.map +1 -0
- package/lib/gitnexus/git-activity.d.ts +136 -0
- package/lib/gitnexus/git-activity.d.ts.map +1 -0
- package/lib/gitnexus/git-activity.js +345 -0
- package/lib/gitnexus/git-activity.js.map +1 -0
- package/lib/gitnexus/git.d.ts +70 -0
- package/lib/gitnexus/git.d.ts.map +1 -0
- package/lib/gitnexus/git.js +121 -0
- package/lib/gitnexus/git.js.map +1 -0
- package/lib/gitnexus/index-meta.d.ts +160 -0
- package/lib/gitnexus/index-meta.d.ts.map +1 -0
- package/lib/gitnexus/index-meta.js +176 -0
- package/lib/gitnexus/index-meta.js.map +1 -0
- package/lib/gitnexus/install.d.ts +97 -0
- package/lib/gitnexus/install.d.ts.map +1 -0
- package/lib/gitnexus/install.js +228 -0
- package/lib/gitnexus/install.js.map +1 -0
- package/lib/gitnexus/languages.d.ts +80 -0
- package/lib/gitnexus/languages.d.ts.map +1 -0
- package/lib/gitnexus/languages.js +297 -0
- package/lib/gitnexus/languages.js.map +1 -0
- package/lib/gitnexus/root.d.ts +74 -0
- package/lib/gitnexus/root.d.ts.map +1 -0
- package/lib/gitnexus/root.js +168 -0
- package/lib/gitnexus/root.js.map +1 -0
- package/lib/gitnexus/scan.d.ts +68 -0
- package/lib/gitnexus/scan.d.ts.map +1 -0
- package/lib/gitnexus/scan.js +249 -0
- package/lib/gitnexus/scan.js.map +1 -0
- package/lib/gitnexus/search.d.ts +167 -0
- package/lib/gitnexus/search.d.ts.map +1 -0
- package/lib/gitnexus/search.js +517 -0
- package/lib/gitnexus/search.js.map +1 -0
- package/lib/gitnexus/toolchain.d.ts +136 -0
- package/lib/gitnexus/toolchain.d.ts.map +1 -0
- package/lib/gitnexus/toolchain.js +251 -0
- package/lib/gitnexus/toolchain.js.map +1 -0
- package/lib/index.d.ts +98 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +252 -0
- package/lib/index.js.map +1 -0
- package/lib/routes/analyze.d.ts +41 -0
- package/lib/routes/analyze.d.ts.map +1 -0
- package/lib/routes/analyze.js +75 -0
- package/lib/routes/analyze.js.map +1 -0
- package/lib/routes/coverage.d.ts +52 -0
- package/lib/routes/coverage.d.ts.map +1 -0
- package/lib/routes/coverage.js +81 -0
- package/lib/routes/coverage.js.map +1 -0
- package/lib/routes/guard.d.ts +92 -0
- package/lib/routes/guard.d.ts.map +1 -0
- package/lib/routes/guard.js +187 -0
- package/lib/routes/guard.js.map +1 -0
- package/lib/routes/install.d.ts +27 -0
- package/lib/routes/install.d.ts.map +1 -0
- package/lib/routes/install.js +46 -0
- package/lib/routes/install.js.map +1 -0
- package/lib/routes/search.d.ts +27 -0
- package/lib/routes/search.d.ts.map +1 -0
- package/lib/routes/search.js +77 -0
- package/lib/routes/search.js.map +1 -0
- package/package.json +87 -4
- package/scripts/link-runtime.mjs +146 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The maintenance commands this plugin hands to the operator.
|
|
3
|
+
*
|
|
4
|
+
* WHY THE TEXT STILL EXISTS AFTER THE BUTTONS
|
|
5
|
+
* -------------------------------------------
|
|
6
|
+
* A first revision spawned `gitnexus analyze` directly from the plugin and exposed
|
|
7
|
+
* it as a button. That was wrong: a plugin that spawns processes bypasses the host's
|
|
8
|
+
* permission system. The correction was not "never run it" but "run it through
|
|
9
|
+
* `ctx.shell`", which is what the analyze runner does. The exact command is still the
|
|
10
|
+
* deliverable here because it is what the confirmation shows, what a failed run can
|
|
11
|
+
* be reproduced with, and what an operator can paste when the deployment has no
|
|
12
|
+
* shell executor at all. The two must not drift: the runner builds its argv from the
|
|
13
|
+
* same decisions this module documents.
|
|
14
|
+
*
|
|
15
|
+
* WHAT MAKES THE COMMANDS NON-OBVIOUS
|
|
16
|
+
* -----------------------------------
|
|
17
|
+
* A bare `gitnexus analyze` does **not** work in every deployment, and the failures
|
|
18
|
+
* are silent-ish. Measured on this machine, under a confined DSH process:
|
|
19
|
+
*
|
|
20
|
+
* - `ensureHeap` re-spawns the CLI with a larger heap over piped stdio, which a
|
|
21
|
+
* confined sandbox denies (`spawn EPERM`). `GITNEXUS_MEMORY=off` suppresses the
|
|
22
|
+
* respawn; `NODE_OPTIONS` supplies the heap it was trying to obtain.
|
|
23
|
+
* - The FTS extension installs itself out-of-process and fails the same way.
|
|
24
|
+
* `--skip-fts` builds the index without it.
|
|
25
|
+
* - The global registry write (`~/.gitnexus/registry.json`) is outside the
|
|
26
|
+
* workspace and may be denied. `GITNEXUS_HOME` redirects it.
|
|
27
|
+
*
|
|
28
|
+
* `--index-only` on both commands is deliberate and not a sandbox workaround:
|
|
29
|
+
* the default `analyze` also rewrites AGENTS.md, CLAUDE.md and agent skill files
|
|
30
|
+
* inside the repository. A maintenance button must not edit the working tree.
|
|
31
|
+
*/
|
|
32
|
+
import { readFileSync } from 'node:fs';
|
|
33
|
+
import path from 'node:path';
|
|
34
|
+
/** Heap the CLI is given, matching what `ensureHeap` would have asked for. */
|
|
35
|
+
const HEAP_MB = 8192;
|
|
36
|
+
/**
|
|
37
|
+
* Where this plugin keeps GitNexus's global registry for one repository.
|
|
38
|
+
*
|
|
39
|
+
* `GITNEXUS_HOME` is normally `~/.gitnexus`, outside a confined host's writable
|
|
40
|
+
* scope. Pointing it at a directory inside the project's own `.gitnexus/` keeps the
|
|
41
|
+
* registry write next to the index and inside the workspace — which is the scope the
|
|
42
|
+
* operator already granted. The analysis itself still writes `.gitnexus/lbug`; this
|
|
43
|
+
* only moves the global registry side effect.
|
|
44
|
+
*/
|
|
45
|
+
export function defaultGitnexusHome(repoPath) {
|
|
46
|
+
return path.join(repoPath, '.gitnexus', 'plugin-home');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Whether this index says content-level FTS is available.
|
|
50
|
+
*
|
|
51
|
+
* A missing manifest, a legacy manifest, or a status other than `available` all mean
|
|
52
|
+
* "do not attempt FTS". The read is synchronous because both the maintenance-command
|
|
53
|
+
* builder and the analyze runner are synchronous; the manifest is a few kilobytes.
|
|
54
|
+
*/
|
|
55
|
+
export function ftsAvailable(repoPath) {
|
|
56
|
+
for (const name of ['gitnexus.json', 'meta.json']) {
|
|
57
|
+
try {
|
|
58
|
+
const raw = JSON.parse(readFileSync(path.join(repoPath, '.gitnexus', name), 'utf8'));
|
|
59
|
+
// The first manifest that parses is authoritative; falling through to the
|
|
60
|
+
// legacy copy on a `disabled-by-flag` status could resurrect a contradictory
|
|
61
|
+
// `available` from a stale `meta.json`.
|
|
62
|
+
return raw.capabilities?.fts?.status === 'available';
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
/* try the other manifest name */
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The effective `--skip-fts` decision for one repository.
|
|
72
|
+
*
|
|
73
|
+
* `false` (the default) means **automatic**: skip FTS when the index does not have
|
|
74
|
+
* it, so a refresh in a confined process does not die trying to install an extension
|
|
75
|
+
* out-of-process. `true` forces the flag. There is deliberately no "force FTS on":
|
|
76
|
+
* that is a repair action (`gitnexus analyze --repair-fts`), not an incremental
|
|
77
|
+
* refresh, and hiding a repair behind a config boolean would mislead.
|
|
78
|
+
*
|
|
79
|
+
* The alternative — a static default — was measured wrong in both directions: `true`
|
|
80
|
+
* forces a 21x full rebuild on an index that already has FTS, while `false` makes the
|
|
81
|
+
* refresh fail with `spawn EPERM` on an index that does not.
|
|
82
|
+
*/
|
|
83
|
+
export function effectiveSkipFts(repoPath, configured) {
|
|
84
|
+
return configured || !ftsAvailable(repoPath);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Build the two commands for a repository.
|
|
88
|
+
*
|
|
89
|
+
* Pure, because the exact text is the deliverable — a reviewer should be able to
|
|
90
|
+
* assert on it without spawning anything.
|
|
91
|
+
*
|
|
92
|
+
* WHY `--skip-fts` IS NOT A DEFAULT
|
|
93
|
+
* ---------------------------------
|
|
94
|
+
* It was one, on the reasoning that the FTS extension installs out-of-process and a
|
|
95
|
+
* confined process denies that (`spawn EPERM`). Measured on a 39-file repository,
|
|
96
|
+
* that reasoning is wrong in the case that matters:
|
|
97
|
+
*
|
|
98
|
+
* index has FTS + `--skip-fts` 179.22 s full DB wipe + bulk COPY
|
|
99
|
+
* index has FTS, no flag 8.57 s FTS fails to load, degrades cleanly
|
|
100
|
+
* index has no FTS + `--skip-fts` 8.25 s changed=0, 39 rows preserved
|
|
101
|
+
* same, warm 6.56 s
|
|
102
|
+
*
|
|
103
|
+
* Disabling a search index the store already has forces GitNexus to rebuild the
|
|
104
|
+
* whole graph store, which is the exact opposite of incremental — a 21x penalty on
|
|
105
|
+
* the one transition an operator is most likely to hit. Letting FTS fail on its own
|
|
106
|
+
* costs nothing: it prints a warning and indexes anyway.
|
|
107
|
+
*
|
|
108
|
+
* The flag remains available for the case it was written for, where the extension
|
|
109
|
+
* file is *absent* and the install itself is what fails.
|
|
110
|
+
*/
|
|
111
|
+
export function maintenanceCommands(repoPath, options = {}) {
|
|
112
|
+
const resolved = {
|
|
113
|
+
platform: options.platform ?? process.platform,
|
|
114
|
+
skipFts: options.skipFts === true,
|
|
115
|
+
memoryOff: options.memoryOff !== false,
|
|
116
|
+
gitnexusHome: options.gitnexusHome ?? null,
|
|
117
|
+
};
|
|
118
|
+
const { platform, skipFts, memoryOff, gitnexusHome } = resolved;
|
|
119
|
+
const common = ['analyze', '--index-only'];
|
|
120
|
+
if (skipFts)
|
|
121
|
+
common.push('--skip-fts');
|
|
122
|
+
const quote = (value) => platform === 'win32' ? `'${value.replace(/'/g, "''")}'` : `'${value.replace(/'/g, "'\\''")}'`;
|
|
123
|
+
/** Environment assignments, in the syntax of the operator's shell. */
|
|
124
|
+
const envPrefix = () => {
|
|
125
|
+
const pairs = [];
|
|
126
|
+
if (memoryOff)
|
|
127
|
+
pairs.push(['GITNEXUS_MEMORY', 'off']);
|
|
128
|
+
pairs.push(['NODE_OPTIONS', `--max-old-space-size=${HEAP_MB}`]);
|
|
129
|
+
if (gitnexusHome !== null && gitnexusHome !== '')
|
|
130
|
+
pairs.push(['GITNEXUS_HOME', gitnexusHome]);
|
|
131
|
+
if (platform === 'win32') {
|
|
132
|
+
return `${pairs.map(([k, v]) => `$env:${k}=${quote(v)}`).join('; ')}; `;
|
|
133
|
+
}
|
|
134
|
+
return `${pairs.map(([k, v]) => `${k}=${quote(v)}`).join(' ')} `;
|
|
135
|
+
};
|
|
136
|
+
const line = (extra) => {
|
|
137
|
+
const args = [...common, ...extra, quote(repoPath)];
|
|
138
|
+
return `gitnexus ${args.join(' ')}`;
|
|
139
|
+
};
|
|
140
|
+
return [
|
|
141
|
+
{
|
|
142
|
+
mode: 'init',
|
|
143
|
+
label: '初始化索引',
|
|
144
|
+
when: '该项目还没有 .gitnexus 索引时使用。',
|
|
145
|
+
argv: line([]),
|
|
146
|
+
shell: envPrefix() + line([]),
|
|
147
|
+
destructive: false,
|
|
148
|
+
caveat: skipFts
|
|
149
|
+
? '--skip-fts 会让一个已有 FTS 的索引清库重建(实测 179s vs 8.5s),非必要不要加。'
|
|
150
|
+
: // The measured range, not the best case. An earlier wording said "秒级(约 7s)"
|
|
151
|
+
// on the strength of a no-change run; five changed files on the same repository
|
|
152
|
+
// took 171 s. Understating this is how an operator concludes the button hung.
|
|
153
|
+
'耗时随改动量增长:无改动约 7s,5 个文件实测约 171s。日志会写 changed/added/deleted。',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
mode: 'full',
|
|
157
|
+
label: '强制全量重构',
|
|
158
|
+
when: '增量刷新卡死或结果反常时的逃生舱。重建图与 FTS,耗时数分钟;未变更文件的解析产物仍会复用。',
|
|
159
|
+
argv: line(['--force']),
|
|
160
|
+
shell: envPrefix() + line(['--force']),
|
|
161
|
+
destructive: true,
|
|
162
|
+
caveat: '--force 重建图与 FTS,未变更文件的解析产物仍会复用。',
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* A one-line explanation of why the environment prefix is there at all, for the
|
|
168
|
+
* panel to show under the commands rather than leaving them looking arbitrary.
|
|
169
|
+
*/
|
|
170
|
+
export function commandRationale(options) {
|
|
171
|
+
const notes = [];
|
|
172
|
+
if (options.memoryOff) {
|
|
173
|
+
notes.push('GITNEXUS_MEMORY=off:阻止 CLI 用管道 stdio 重启自身(受限环境下会 EPERM)。');
|
|
174
|
+
}
|
|
175
|
+
notes.push(`NODE_OPTIONS=--max-old-space-size=${HEAP_MB}:补上它本想通过重启获得的那份堆。`);
|
|
176
|
+
if (options.skipFts) {
|
|
177
|
+
notes.push('--skip-fts:FTS 扩展需在子进程安装,受限环境下会失败。');
|
|
178
|
+
}
|
|
179
|
+
if (options.gitnexusHome !== null && options.gitnexusHome !== '') {
|
|
180
|
+
notes.push(`GITNEXUS_HOME=${options.gitnexusHome}:把全局注册表写入重定向到受控目录。`);
|
|
181
|
+
}
|
|
182
|
+
notes.push('--index-only:不会改动仓库内的 AGENTS.md / CLAUDE.md / skills 文件。');
|
|
183
|
+
return notes;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/gitnexus/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index-coverage and large-file monitoring for one repository.
|
|
3
|
+
*
|
|
4
|
+
* The question this answers is not "how big is this repo" but "what did
|
|
5
|
+
* `analyze` silently leave out, and does that change how much I should trust the
|
|
6
|
+
* index?". GitNexus tells the operator, on stderr, once:
|
|
7
|
+
*
|
|
8
|
+
* Skipped 3 large files (>512KB, likely generated/vendored)
|
|
9
|
+
* - dist/app.min.js
|
|
10
|
+
* ...and 2 more (set GITNEXUS_VERBOSE=1 to list them all)
|
|
11
|
+
*
|
|
12
|
+
* That is the whole surface. It is not returned, not persisted, not queryable,
|
|
13
|
+
* and gone once the terminal scrolls. `scanRepository` turns it into data; this
|
|
14
|
+
* module turns it into a judgement — including the case that matters most, where
|
|
15
|
+
* one minified bundle dominates a language's byte share and makes the index look
|
|
16
|
+
* far more complete than it is.
|
|
17
|
+
*/
|
|
18
|
+
import { type IndexStats } from './index-meta.js';
|
|
19
|
+
import { type CapSource } from './scan.js';
|
|
20
|
+
import { type ClassifiedLanguage, type LanguageRow, type LanguageAggregate } from './languages.js';
|
|
21
|
+
import { type ActivityInfo } from './git-activity.js';
|
|
22
|
+
import { type ToolchainStatus } from './toolchain.js';
|
|
23
|
+
/**
|
|
24
|
+
* Re-exported so a consumer of the report can name these without also depending on
|
|
25
|
+
* the module that produces them. They are **not** redeclared here: an earlier draft
|
|
26
|
+
* of this file declared its own `ActivityInfo` and `LanguageRow`, which collided with
|
|
27
|
+
* the real ones — two structurally different interfaces under one name, and the
|
|
28
|
+
* compiler reported the mismatch as an assignment failure at the very end of
|
|
29
|
+
* `analyzeCoverage` rather than where the wrong guess was made.
|
|
30
|
+
*/
|
|
31
|
+
export type { CapSource, ClassifiedLanguage, LanguageRow, ActivityInfo };
|
|
32
|
+
export type { LanguageClass } from './languages.js';
|
|
33
|
+
export type { ActivityAuthor, ActivityBranch, ActivityFile, ActivityHistogram, ActivityTotals, ActivityWindow, FileVerdict, HistogramBucket, } from './git-activity.js';
|
|
34
|
+
/**
|
|
35
|
+
* What a byte-level probe concluded about one oversized file.
|
|
36
|
+
*
|
|
37
|
+
* `binary` is decided before `suspect`: a first revision tested only "no newlines ⇒
|
|
38
|
+
* one enormous line", which flagged every binary asset as minified.
|
|
39
|
+
*/
|
|
40
|
+
export interface FileShape {
|
|
41
|
+
/** Machine data, not text at all. */
|
|
42
|
+
binary: boolean;
|
|
43
|
+
/** Minified: text, but written as one enormous line. */
|
|
44
|
+
suspect: boolean;
|
|
45
|
+
/** Characters per line (meaningless when binary). */
|
|
46
|
+
avgLineLength: number;
|
|
47
|
+
estimatedLines: number | null;
|
|
48
|
+
sampledBytes: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The report's shape.
|
|
52
|
+
*
|
|
53
|
+
* These are declared rather than left to inference because the report is the
|
|
54
|
+
* plugin's contract: the same object is returned by the `gitnexus_coverage` tool,
|
|
55
|
+
* served by `GET /api/gitnexus/coverage`, and printed by the CLI.
|
|
56
|
+
*
|
|
57
|
+
* They were JSDoc typedefs first. Renaming the file to `.ts` did not carry them
|
|
58
|
+
* over — JSDoc annotations are only *used* by the compiler in `.js` files under
|
|
59
|
+
* `checkJs`, and in a `.ts` file they are documentation. So the migration is where
|
|
60
|
+
* these become real: `export interface` is what lets `format.ts`, the CLI and the
|
|
61
|
+
* route name a field instead of seeing `object`.
|
|
62
|
+
*/
|
|
63
|
+
export interface RepoInfo {
|
|
64
|
+
/** Absolute repository root. */
|
|
65
|
+
path: string;
|
|
66
|
+
name: string;
|
|
67
|
+
/** Where `.gitnexus` lives. */
|
|
68
|
+
storagePath: string;
|
|
69
|
+
/** Whether a manifest was found. */
|
|
70
|
+
indexed: boolean;
|
|
71
|
+
/** Whether GitNexus's own registry lists it. */
|
|
72
|
+
registered: boolean;
|
|
73
|
+
/** Which manifest was read. */
|
|
74
|
+
metaFile: string | null;
|
|
75
|
+
/** ISO timestamp. */
|
|
76
|
+
indexedAt: string | null;
|
|
77
|
+
/** Commit the index was built at. */
|
|
78
|
+
lastCommit: string | null;
|
|
79
|
+
branch: string | null;
|
|
80
|
+
remoteUrl: string | null;
|
|
81
|
+
/** Raw stats block from the manifest. */
|
|
82
|
+
stats: IndexStats | null;
|
|
83
|
+
graphEmbeddings: number | null;
|
|
84
|
+
}
|
|
85
|
+
export interface GraphInfo {
|
|
86
|
+
files: number;
|
|
87
|
+
nodes: number;
|
|
88
|
+
edges: number;
|
|
89
|
+
communities: number;
|
|
90
|
+
processes: number;
|
|
91
|
+
embeddings: number;
|
|
92
|
+
edgesPerNode: number;
|
|
93
|
+
}
|
|
94
|
+
/** Commit counts on either side of `indexed...HEAD`. */
|
|
95
|
+
export interface AheadBehind {
|
|
96
|
+
/** Commits the index has that HEAD does not — non-zero means a split history. */
|
|
97
|
+
behind: number;
|
|
98
|
+
/** Commits HEAD has that the index does not — how far the index lags. */
|
|
99
|
+
ahead: number;
|
|
100
|
+
}
|
|
101
|
+
export type StalenessState = 'current' | 'behind' | 'diverged' | 'unknown';
|
|
102
|
+
export interface StalenessInfo {
|
|
103
|
+
state: StalenessState;
|
|
104
|
+
indexedCommit: string | null;
|
|
105
|
+
headCommit: string | null;
|
|
106
|
+
branch: string | null;
|
|
107
|
+
/** Null when git could not be asked — distinct from a clean tree (`0`). */
|
|
108
|
+
dirtyCount: number | null;
|
|
109
|
+
aheadBehind: AheadBehind | null;
|
|
110
|
+
gitAvailable: boolean;
|
|
111
|
+
}
|
|
112
|
+
export interface ProvenanceInfo {
|
|
113
|
+
schemaFingerprint: string | null;
|
|
114
|
+
contentRetention: string | null;
|
|
115
|
+
ftsProfile: string | null;
|
|
116
|
+
analysisFeatures: unknown;
|
|
117
|
+
crossLanguageProperties: number;
|
|
118
|
+
runnerCliVersion: string | null;
|
|
119
|
+
}
|
|
120
|
+
/** Where the effective size cap came from — re-exported from `scan.ts`. */
|
|
121
|
+
export interface CapInfo {
|
|
122
|
+
bytes: number;
|
|
123
|
+
text: string;
|
|
124
|
+
source: CapSource;
|
|
125
|
+
defaultBytes: number;
|
|
126
|
+
defaultText: string;
|
|
127
|
+
maxBytes: number;
|
|
128
|
+
maxText: string;
|
|
129
|
+
recordedInIndex: boolean;
|
|
130
|
+
}
|
|
131
|
+
export interface Totals {
|
|
132
|
+
scanned: number;
|
|
133
|
+
selected: number;
|
|
134
|
+
large: number;
|
|
135
|
+
suppressedDeclarations: number;
|
|
136
|
+
indexedInGraph: number;
|
|
137
|
+
largeBytes: number;
|
|
138
|
+
scannedBytes: number;
|
|
139
|
+
}
|
|
140
|
+
/** The language identity attached to a file — the shape `classifyFile` returns. */
|
|
141
|
+
export type LanguageTag = ClassifiedLanguage;
|
|
142
|
+
export interface LargeFile {
|
|
143
|
+
path: string;
|
|
144
|
+
size: number;
|
|
145
|
+
sizeText: string;
|
|
146
|
+
shareOfScanned: number;
|
|
147
|
+
/**
|
|
148
|
+
* Never null: `classifyFile` always places a file, falling back to an `other`
|
|
149
|
+
* class rather than declining. An earlier declaration made this nullable, which
|
|
150
|
+
* was not a safer type but a wrong one — it forced five null guards onto call
|
|
151
|
+
* sites for a value that cannot be null.
|
|
152
|
+
*/
|
|
153
|
+
language: ClassifiedLanguage;
|
|
154
|
+
shareOfLanguage: number;
|
|
155
|
+
/**
|
|
156
|
+
* Null when the probe budget was exhausted, so the reader is never told a file is
|
|
157
|
+
* fine when it was simply not examined.
|
|
158
|
+
*/
|
|
159
|
+
minified: FileShape | null;
|
|
160
|
+
/** A boolean, not a label: it is consumed as `if (entry.generatedHint)`. */
|
|
161
|
+
generatedHint: boolean;
|
|
162
|
+
}
|
|
163
|
+
export interface Attribution {
|
|
164
|
+
oversizeCount: number;
|
|
165
|
+
oversizeBytes: number;
|
|
166
|
+
oversizeShareOfScanned: number;
|
|
167
|
+
}
|
|
168
|
+
export interface IndexInfo {
|
|
169
|
+
uncoveredCount: number;
|
|
170
|
+
uncoveredSample: Array<{
|
|
171
|
+
path: string;
|
|
172
|
+
size: number;
|
|
173
|
+
}>;
|
|
174
|
+
staleCount: number;
|
|
175
|
+
staleSample: string[];
|
|
176
|
+
dirtyPaths: string[];
|
|
177
|
+
}
|
|
178
|
+
export type WarningLevel = 'warn' | 'info';
|
|
179
|
+
export interface ReportWarning {
|
|
180
|
+
level: WarningLevel;
|
|
181
|
+
code: string;
|
|
182
|
+
message: string;
|
|
183
|
+
evidence: Record<string, unknown>;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* The language breakdown as this report shapes it: the aggregate plus the oversized
|
|
187
|
+
* files held out of it, so a reader can see which files the percentages exclude.
|
|
188
|
+
*/
|
|
189
|
+
export type LanguageBreakdown = LanguageAggregate & {
|
|
190
|
+
largeExcluded: LanguageRow[];
|
|
191
|
+
};
|
|
192
|
+
export interface AnalyzerInfo {
|
|
193
|
+
gitnexusVersion: string | null;
|
|
194
|
+
/**
|
|
195
|
+
* Whether the scan reused GitNexus's own primitives or the local fallback.
|
|
196
|
+
*
|
|
197
|
+
* A union, not a number: an earlier JSDoc declaration said `number` while the
|
|
198
|
+
* implementation compared it against the string `'gitnexus'`. The compiler found
|
|
199
|
+
* that the moment this became a real type.
|
|
200
|
+
*/
|
|
201
|
+
primitives: 'gitnexus' | 'fallback';
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Receiver members the resolver could not type, as GitNexus records them.
|
|
205
|
+
*
|
|
206
|
+
* While any of these exist, `impact`/`context` answer with a lower bound rather
|
|
207
|
+
* than an exact set — which is why the report surfaces the count next to every
|
|
208
|
+
* other number rather than burying it.
|
|
209
|
+
*/
|
|
210
|
+
export interface GraphQuality {
|
|
211
|
+
totalSites: number;
|
|
212
|
+
counts: Record<string, number>;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* One entry of the manifest's `capabilities` block: whether a query surface is live,
|
|
216
|
+
* which implementation backs it, and why it is not live when it is not.
|
|
217
|
+
*/
|
|
218
|
+
export interface CapabilityEntry {
|
|
219
|
+
status?: string;
|
|
220
|
+
skipReason?: string;
|
|
221
|
+
/** The implementation behind the surface, e.g. `ladybugdb`, `ladybugdb-fts`. */
|
|
222
|
+
provider?: string;
|
|
223
|
+
/** Anything else the manifest records, preserved rather than dropped. */
|
|
224
|
+
[key: string]: unknown;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Narrow the manifest's `capabilities` block.
|
|
228
|
+
*
|
|
229
|
+
* The manifest is JSON written by another tool, so at the boundary it is
|
|
230
|
+
* `Record<string, unknown>` and has to be **checked** rather than asserted. A cast
|
|
231
|
+
* here would move the failure from "a missing field renders as undefined" to "a
|
|
232
|
+
* malformed manifest crashes the panel", which is the wrong trade for data this
|
|
233
|
+
* plugin does not control.
|
|
234
|
+
*
|
|
235
|
+
* WHAT THE NARROWING IS AND IS NOT FOR
|
|
236
|
+
* ------------------------------------
|
|
237
|
+
* Its job is to make the JSON safe to *read*, not to decide which fields exist. A
|
|
238
|
+
* first version listed the two fields it expected and rebuilt each entry from just
|
|
239
|
+
* those, which silently dropped `provider` — a field the panel renders, and the
|
|
240
|
+
* reason it showed `unknown` for two surfaces that were available. So the original
|
|
241
|
+
* entry is spread first and only the validated fields are overwritten: something
|
|
242
|
+
* this plugin has not heard of yet survives, instead of being deleted by a checklist.
|
|
243
|
+
*/
|
|
244
|
+
export declare function readCapabilities(raw: Record<string, unknown> | null | undefined): Record<string, CapabilityEntry>;
|
|
245
|
+
/**
|
|
246
|
+
* Narrow the manifest's `unresolvedReceiverMembers` block.
|
|
247
|
+
*
|
|
248
|
+
* Returns null rather than a zero-filled object when the field is absent: an index
|
|
249
|
+
* written before this was recorded must render as "not recorded", not as "no untyped
|
|
250
|
+
* receivers", because those are opposite claims about how much to trust the graph.
|
|
251
|
+
*/
|
|
252
|
+
export declare function readGraphQuality(raw: unknown): GraphQuality | null;
|
|
253
|
+
export interface CoverageReport {
|
|
254
|
+
repo: RepoInfo;
|
|
255
|
+
analyzer: AnalyzerInfo;
|
|
256
|
+
cap: CapInfo;
|
|
257
|
+
totals: Totals;
|
|
258
|
+
largeFiles: LargeFile[];
|
|
259
|
+
attribution: Attribution;
|
|
260
|
+
index: IndexInfo;
|
|
261
|
+
graph: GraphInfo | null;
|
|
262
|
+
capabilities: Record<string, CapabilityEntry>;
|
|
263
|
+
staleness: StalenessInfo;
|
|
264
|
+
provenance: ProvenanceInfo | null;
|
|
265
|
+
graphQuality: GraphQuality | null;
|
|
266
|
+
warnings: ReportWarning[];
|
|
267
|
+
languages: LanguageBreakdown | null;
|
|
268
|
+
activity: ActivityInfo | null;
|
|
269
|
+
/**
|
|
270
|
+
* Whether GitNexus itself is present on this machine.
|
|
271
|
+
*
|
|
272
|
+
* Reported rather than thrown, because "no GitNexus" is a state the panel has to act
|
|
273
|
+
* on: it is the difference between showing an index and offering to produce one, and
|
|
274
|
+
* only the report can carry that distinction. The probe only stats the filesystem, so
|
|
275
|
+
* filling this costs nothing on the hot path.
|
|
276
|
+
*/
|
|
277
|
+
toolchain: ToolchainStatus | null;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Judge what kind of file this is from the head of its bytes.
|
|
281
|
+
*
|
|
282
|
+
* Reads only the head: a bundle megabytes wide on one line is identifiable from
|
|
283
|
+
* any prefix, and reading it whole to decide would cost exactly what the size cap
|
|
284
|
+
* exists to avoid.
|
|
285
|
+
*
|
|
286
|
+
* BINARY IS CHECKED FIRST, AND THAT ORDER IS THE WHOLE POINT
|
|
287
|
+
* ---------------------------------------------------------
|
|
288
|
+
* A first revision tested only "no newlines ⇒ one enormous line", which flagged
|
|
289
|
+
* every binary asset as minified. Measured on a real repository: a 380 MB `.glb`
|
|
290
|
+
* model and a 30 MB `.glb` reported "single-line ≈ 399 230 584 chars" — absurd on
|
|
291
|
+
* its face, and worse than absurd in effect, because it told the reader that 97 %
|
|
292
|
+
* of the repository's skipped bytes were compressed *source*. They were 3D assets
|
|
293
|
+
* that could never have held a symbol.
|
|
294
|
+
*
|
|
295
|
+
* A binary file has few newlines for a reason that has nothing to do with
|
|
296
|
+
* minification, so no line-length statistic over it means anything. The test is
|
|
297
|
+
* git's own: a NUL byte in the head means binary. A control-byte ratio backs it up
|
|
298
|
+
* for machine formats that happen to avoid NUL.
|
|
299
|
+
*
|
|
300
|
+
* The extrapolation is deliberately crude — newline density in the head is assumed
|
|
301
|
+
* to hold for the rest — and only ever produces a *warning*, never an exclusion.
|
|
302
|
+
*
|
|
303
|
+
* @param {string} absolutePath
|
|
304
|
+
* @param {number} size
|
|
305
|
+
* @returns {Promise<FileShape>}
|
|
306
|
+
*/
|
|
307
|
+
export declare function judgeMinified(absolutePath: string, size: number): Promise<FileShape>;
|
|
308
|
+
/**
|
|
309
|
+
* @param {string} filePath repo-relative
|
|
310
|
+
* @returns {boolean} whether the path conventionally denotes build output
|
|
311
|
+
*/
|
|
312
|
+
export declare function looksGenerated(filePath: string): boolean;
|
|
313
|
+
/** @param {number} bytes */
|
|
314
|
+
export declare function formatBytes(bytes: number): string;
|
|
315
|
+
/** Options for {@link analyzeCoverage}. */
|
|
316
|
+
export interface AnalyzeOptions {
|
|
317
|
+
/** Environment to read GitNexus settings from. Defaults to `process.env`. */
|
|
318
|
+
env?: NodeJS.ProcessEnv;
|
|
319
|
+
/** Set false to skip the per-language breakdown (it costs a full re-walk). */
|
|
320
|
+
includeLanguages?: boolean;
|
|
321
|
+
/** Set false to skip reading git history. */
|
|
322
|
+
includeActivity?: boolean;
|
|
323
|
+
/** How far back the activity window reaches. */
|
|
324
|
+
activitySinceDays?: number;
|
|
325
|
+
/** Cap on commits read for the activity window. */
|
|
326
|
+
activityMaxCommits?: number;
|
|
327
|
+
/** How many oversized files may be probed for minification before giving up. */
|
|
328
|
+
minifiedSampleLimit?: number;
|
|
329
|
+
/** Where the plugin installs GitNexus, so the probe finds that copy too. */
|
|
330
|
+
toolchain?: {
|
|
331
|
+
managedPrefix?: string;
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Build the full coverage report for a repository.
|
|
336
|
+
*
|
|
337
|
+
* @param repoPath absolute repository root
|
|
338
|
+
*/
|
|
339
|
+
export declare function analyzeCoverage(repoPath: string, options?: AnalyzeOptions): Promise<CoverageReport>;
|
|
340
|
+
//# sourceMappingURL=coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/gitnexus/coverage.ts"],"names":[],"mappings":"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"}
|