dsh-gitnexus-plus 0.1.1 → 0.1.3
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/README-CN.md +174 -0
- package/README.md +184 -447
- 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 +978 -122
- package/lib/gitnexus/analyze.d.ts +27 -2
- package/lib/gitnexus/analyze.d.ts.map +1 -1
- package/lib/gitnexus/analyze.js +71 -6
- package/lib/gitnexus/analyze.js.map +1 -1
- package/lib/gitnexus/commands.d.ts +41 -8
- package/lib/gitnexus/commands.d.ts.map +1 -1
- package/lib/gitnexus/commands.js +62 -9
- package/lib/gitnexus/commands.js.map +1 -1
- package/lib/gitnexus/coverage.d.ts +16 -0
- package/lib/gitnexus/coverage.d.ts.map +1 -1
- package/lib/gitnexus/coverage.js +61 -2
- package/lib/gitnexus/coverage.js.map +1 -1
- package/lib/gitnexus/git-activity.d.ts +85 -0
- package/lib/gitnexus/git-activity.d.ts.map +1 -1
- package/lib/gitnexus/git-activity.js +286 -1
- package/lib/gitnexus/git-activity.js.map +1 -1
- package/lib/gitnexus/index-meta.d.ts +15 -5
- package/lib/gitnexus/index-meta.d.ts.map +1 -1
- package/lib/gitnexus/index-meta.js +25 -5
- package/lib/gitnexus/index-meta.js.map +1 -1
- package/lib/gitnexus/languages.d.ts +7 -0
- package/lib/gitnexus/languages.d.ts.map +1 -1
- package/lib/gitnexus/languages.js +82 -2
- package/lib/gitnexus/languages.js.map +1 -1
- package/lib/gitnexus/root.d.ts +6 -0
- package/lib/gitnexus/root.d.ts.map +1 -1
- package/lib/gitnexus/root.js +6 -0
- package/lib/gitnexus/root.js.map +1 -1
- package/lib/gitnexus/scan.d.ts +3 -0
- package/lib/gitnexus/scan.d.ts.map +1 -1
- package/lib/gitnexus/scan.js +6 -3
- package/lib/gitnexus/scan.js.map +1 -1
- 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/index.d.ts +32 -13
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +68 -21
- package/lib/index.js.map +1 -1
- package/lib/routes/analyze.d.ts +8 -2
- package/lib/routes/analyze.d.ts.map +1 -1
- package/lib/routes/analyze.js +5 -1
- package/lib/routes/analyze.js.map +1 -1
- package/lib/routes/coverage.d.ts +15 -6
- package/lib/routes/coverage.d.ts.map +1 -1
- package/lib/routes/coverage.js +77 -12
- package/lib/routes/coverage.js.map +1 -1
- package/lib/routes/file-history.d.ts +21 -0
- package/lib/routes/file-history.d.ts.map +1 -0
- package/lib/routes/file-history.js +69 -0
- package/lib/routes/file-history.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 +3 -2
|
@@ -39,6 +39,8 @@ export type AnalyzeState =
|
|
|
39
39
|
export interface AnalyzeStatus {
|
|
40
40
|
repoPath: string;
|
|
41
41
|
state: AnalyzeState;
|
|
42
|
+
/** Whether this run was a full rebuild (`--force`). */
|
|
43
|
+
force: boolean;
|
|
42
44
|
/** The command as run, so a failure can be reproduced by hand. */
|
|
43
45
|
command: string;
|
|
44
46
|
startedAt: number;
|
|
@@ -108,11 +110,29 @@ export interface AnalyzeRunnerOptions {
|
|
|
108
110
|
*/
|
|
109
111
|
memoryOff?: boolean;
|
|
110
112
|
heapMb?: number;
|
|
113
|
+
/**
|
|
114
|
+
* `true` forces `--skip-fts`. `false`/absent is **automatic**: the runner asks the
|
|
115
|
+
* index whether FTS exists and skips it when it does not. A static `false` was
|
|
116
|
+
* measured to fail with `spawn EPERM` on an index without FTS (the extension tries
|
|
117
|
+
* to install out-of-process), while a static `true` forces a full rebuild on one
|
|
118
|
+
* that has it.
|
|
119
|
+
*/
|
|
120
|
+
skipFts?: boolean;
|
|
121
|
+
/** Override the redirect of the global registry write. */
|
|
122
|
+
gitnexusHome?: string | null;
|
|
111
123
|
now?: () => number;
|
|
112
124
|
}
|
|
113
125
|
export interface AnalyzeRunner {
|
|
114
|
-
/**
|
|
115
|
-
|
|
126
|
+
/**
|
|
127
|
+
* Begin a run, or report the one already in flight for this repository.
|
|
128
|
+
*
|
|
129
|
+
* `force` selects a full rebuild. It is a request, not a second run: two analyze
|
|
130
|
+
* processes on one store contend, so a force request while an incremental run is
|
|
131
|
+
* in flight returns that run.
|
|
132
|
+
*/
|
|
133
|
+
start(repoPath: string, options?: {
|
|
134
|
+
force?: boolean;
|
|
135
|
+
}): AnalyzeStatus;
|
|
116
136
|
status(repoPath: string): AnalyzeStatus | null;
|
|
117
137
|
cancel(repoPath: string): boolean;
|
|
118
138
|
/** Abort every in-flight run. Called on plugin teardown. */
|
|
@@ -143,6 +163,11 @@ export declare function analyzeCommandLine(cliPath: string, repoPath: string, op
|
|
|
143
163
|
memoryOff?: boolean;
|
|
144
164
|
heapMb?: number;
|
|
145
165
|
viaNode?: boolean;
|
|
166
|
+
/** Full rebuild. This is the destructive escape hatch; the button must say so. */
|
|
167
|
+
force?: boolean;
|
|
168
|
+
/** Must match `maintenanceCommands`; see the note on the runner option. */
|
|
169
|
+
skipFts?: boolean;
|
|
170
|
+
gitnexusHome?: string | null;
|
|
146
171
|
}): string;
|
|
147
172
|
export declare function createAnalyzeRunner(options: AnalyzeRunnerOptions): AnalyzeRunner;
|
|
148
173
|
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/gitnexus/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/gitnexus/analyze.ts"],"names":[],"mappings":"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"}
|
package/lib/gitnexus/analyze.js
CHANGED
|
@@ -27,7 +27,9 @@
|
|
|
27
27
|
* deployment's decision. A denial is then reported as a denial, not retried wider:
|
|
28
28
|
* the same rule the subagent prompt states, for the same reason.
|
|
29
29
|
*/
|
|
30
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
30
31
|
import path from 'node:path';
|
|
32
|
+
import { defaultGitnexusHome, effectiveSkipFts } from './commands.js';
|
|
31
33
|
import { findGitnexusCli } from './toolchain.js';
|
|
32
34
|
const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
|
|
33
35
|
const DEFAULT_OUTPUT_LIMIT = 256 * 1024;
|
|
@@ -72,18 +74,26 @@ export function analyzeCommandLine(cliPath, repoPath, options = {}) {
|
|
|
72
74
|
// is spawned through `node`. This is the better shape when available: no shim, no
|
|
73
75
|
// `.cmd`/`.ps1` selection, and therefore no reliance on the shell's call operator.
|
|
74
76
|
const viaNode = options.viaNode === true;
|
|
75
|
-
const args = `analyze --index-only
|
|
77
|
+
const args = `analyze --index-only` +
|
|
78
|
+
`${options.skipFts === true ? ' --skip-fts' : ''}` +
|
|
79
|
+
`${options.force === true ? ' --force' : ''} ` +
|
|
80
|
+
quoteFor(flavor, repoPath);
|
|
76
81
|
const head = viaNode ? `node ${quoteFor(flavor, cliPath)}` : quoteFor(flavor, cliPath);
|
|
77
82
|
// On Windows a `.cmd` or `.ps1` reached by absolute path needs `&`. POSIX needs none,
|
|
78
83
|
// because an absolute path in command position is already a command.
|
|
79
84
|
const invocation = viaNode || flavor !== 'win32' ? `${head} ${args}` : `& ${head} ${args}`;
|
|
80
85
|
const heap = quoteFor(flavor, `--max-old-space-size=${heapMb}`);
|
|
86
|
+
const home = typeof options.gitnexusHome === 'string' && options.gitnexusHome !== ''
|
|
87
|
+
? quoteFor(flavor, options.gitnexusHome)
|
|
88
|
+
: null;
|
|
81
89
|
if (flavor === 'win32') {
|
|
82
90
|
const prefix = memoryOff ? `$env:GITNEXUS_MEMORY='off'; ` : '';
|
|
83
|
-
|
|
91
|
+
const homePrefix = home === null ? '' : `$env:GITNEXUS_HOME=${home}; `;
|
|
92
|
+
return `${prefix}${homePrefix}$env:NODE_OPTIONS=${heap}; ${invocation}`;
|
|
84
93
|
}
|
|
85
94
|
const prefix = memoryOff ? `GITNEXUS_MEMORY='off' ` : '';
|
|
86
|
-
|
|
95
|
+
const homePrefix = home === null ? '' : `GITNEXUS_HOME=${home} `;
|
|
96
|
+
return `${prefix}${homePrefix}NODE_OPTIONS=${heap} ${invocation}`;
|
|
87
97
|
}
|
|
88
98
|
/**
|
|
89
99
|
* A sandbox refusal, recognised from the marker DSH writes into the output.
|
|
@@ -94,6 +104,34 @@ export function analyzeCommandLine(cliPath, repoPath, options = {}) {
|
|
|
94
104
|
function looksDenied(text) {
|
|
95
105
|
return /\[sandbox:[^\]]*denied/i.test(text) || /access is denied|permission denied|EPERM/i.test(text);
|
|
96
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* GitNexus 1.6.12 creates these cache directories from the parse worker.
|
|
109
|
+
*
|
|
110
|
+
* A worker running under a restricted host token can be denied `mkdir` on the
|
|
111
|
+
* project's inherited `.gitnexus` ACL even though it can write files there. The
|
|
112
|
+
* failure is EPERM at the first shard write and takes the whole parse phase down
|
|
113
|
+
* with it. Creating the directories from the host, before the shell starts, makes
|
|
114
|
+
* the worker use the directories that already exist. Returns an actionable error
|
|
115
|
+
* instead of letting the worker fail on a path the panel then has to explain.
|
|
116
|
+
*/
|
|
117
|
+
const ANALYZE_CACHE_DIRS = ['parsedfile-store', 'parsedfile-cache', 'parse-cache'];
|
|
118
|
+
function prepareAnalyzeCacheDirs(repoPath) {
|
|
119
|
+
const indexDir = path.join(repoPath, '.gitnexus');
|
|
120
|
+
if (!existsSync(indexDir))
|
|
121
|
+
return null;
|
|
122
|
+
for (const name of ANALYZE_CACHE_DIRS) {
|
|
123
|
+
const target = path.join(indexDir, name);
|
|
124
|
+
try {
|
|
125
|
+
mkdirSync(target, { recursive: true });
|
|
126
|
+
}
|
|
127
|
+
catch (cause) {
|
|
128
|
+
return (`无法创建 GitNexus 缓存目录(${path.join('.gitnexus', name)}):` +
|
|
129
|
+
`${String(cause?.message ?? cause)}。` +
|
|
130
|
+
'请给项目 .gitnexus 目录写权限,或在普通终端执行下面的命令。');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
97
135
|
/** Keep the last `limit` characters, on a line boundary when one is available. */
|
|
98
136
|
function tail(text, limit) {
|
|
99
137
|
if (text.length <= limit)
|
|
@@ -114,6 +152,7 @@ export function createAnalyzeRunner(options) {
|
|
|
114
152
|
/** The shape a status starts from, before any run has touched it. */
|
|
115
153
|
const BLANK = {
|
|
116
154
|
state: 'failed',
|
|
155
|
+
force: false,
|
|
117
156
|
command: '',
|
|
118
157
|
startedAt: 0,
|
|
119
158
|
finishedAt: null,
|
|
@@ -136,8 +175,17 @@ export function createAnalyzeRunner(options) {
|
|
|
136
175
|
inFlight.delete(repoPath);
|
|
137
176
|
return next;
|
|
138
177
|
};
|
|
139
|
-
const start = (repoPath) => {
|
|
178
|
+
const start = (repoPath, request = {}) => {
|
|
140
179
|
const key = path.resolve(repoPath);
|
|
180
|
+
// Named `request`, not `options`: the runner's own configuration is the outer
|
|
181
|
+
// `options`, and shadowing it silently dropped `toolchain`, `memoryOff` and
|
|
182
|
+
// `heapMb` from every run built after the force argument was added.
|
|
183
|
+
const force = request.force === true;
|
|
184
|
+
// Both decisions are per repository, not per plugin: the skip-fts policy depends
|
|
185
|
+
// on the index's own FTS capability, and the registry redirect belongs beside the
|
|
186
|
+
// index so it stays inside the workspace the host was granted.
|
|
187
|
+
const skipFts = effectiveSkipFts(key, options.skipFts === true);
|
|
188
|
+
const gitnexusHome = options.gitnexusHome ?? defaultGitnexusHome(key);
|
|
141
189
|
// One run per repository. Two concurrent `analyze` processes would contend for the
|
|
142
190
|
// same store, and the second would report a failure that says nothing about the
|
|
143
191
|
// repository — so a second request reports the first rather than starting one.
|
|
@@ -147,7 +195,8 @@ export function createAnalyzeRunner(options) {
|
|
|
147
195
|
if (shell === null) {
|
|
148
196
|
return finish(key, {
|
|
149
197
|
state: 'unavailable',
|
|
150
|
-
|
|
198
|
+
force,
|
|
199
|
+
command: `gitnexus analyze --index-only${force ? ' --force' : ''}`,
|
|
151
200
|
startedAt: now(),
|
|
152
201
|
output: '',
|
|
153
202
|
message: '当前部署没有提供 shell 执行器(ctx.shell 未挂载),无法运行命令。' +
|
|
@@ -161,7 +210,8 @@ export function createAnalyzeRunner(options) {
|
|
|
161
210
|
if (!cli.present) {
|
|
162
211
|
return finish(key, {
|
|
163
212
|
state: 'unavailable',
|
|
164
|
-
|
|
213
|
+
force,
|
|
214
|
+
command: `gitnexus analyze --index-only${force ? ' --force' : ''}`,
|
|
165
215
|
startedAt: now(),
|
|
166
216
|
output: '',
|
|
167
217
|
message: '本机没有找到 gitnexus 命令,无法执行。安装后重试:`npm i -g gitnexus`。' +
|
|
@@ -176,12 +226,27 @@ export function createAnalyzeRunner(options) {
|
|
|
176
226
|
memoryOff: options.memoryOff,
|
|
177
227
|
heapMb: options.heapMb,
|
|
178
228
|
viaNode: cli.viaNode,
|
|
229
|
+
force,
|
|
230
|
+
skipFts,
|
|
231
|
+
gitnexusHome,
|
|
179
232
|
});
|
|
233
|
+
const cacheError = prepareAnalyzeCacheDirs(key);
|
|
234
|
+
if (cacheError !== null) {
|
|
235
|
+
return finish(key, {
|
|
236
|
+
state: 'failed',
|
|
237
|
+
force,
|
|
238
|
+
command,
|
|
239
|
+
startedAt: now(),
|
|
240
|
+
output: '',
|
|
241
|
+
message: cacheError,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
180
244
|
const controller = new AbortController();
|
|
181
245
|
inFlight.set(key, controller);
|
|
182
246
|
const started = {
|
|
183
247
|
repoPath: key,
|
|
184
248
|
state: 'running',
|
|
249
|
+
force,
|
|
185
250
|
command,
|
|
186
251
|
startedAt: now(),
|
|
187
252
|
finishedAt: null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/gitnexus/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAyB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/gitnexus/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The maintenance commands this plugin hands to the operator.
|
|
3
3
|
*
|
|
4
|
-
* WHY THE
|
|
5
|
-
*
|
|
4
|
+
* WHY THE TEXT STILL EXISTS AFTER THE BUTTONS
|
|
5
|
+
* -------------------------------------------
|
|
6
6
|
* A first revision spawned `gitnexus analyze` directly from the plugin and exposed
|
|
7
|
-
* it as a button. That was wrong
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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.
|
|
13
14
|
*
|
|
14
15
|
* WHAT MAKES THE COMMANDS NON-OBVIOUS
|
|
15
16
|
* -----------------------------------
|
|
@@ -28,6 +29,38 @@
|
|
|
28
29
|
* the default `analyze` also rewrites AGENTS.md, CLAUDE.md and agent skill files
|
|
29
30
|
* inside the repository. A maintenance button must not edit the working tree.
|
|
30
31
|
*/
|
|
32
|
+
/**
|
|
33
|
+
* Where this plugin keeps GitNexus's global registry for one repository.
|
|
34
|
+
*
|
|
35
|
+
* `GITNEXUS_HOME` is normally `~/.gitnexus`, outside a confined host's writable
|
|
36
|
+
* scope. Pointing it at a directory inside the project's own `.gitnexus/` keeps the
|
|
37
|
+
* registry write next to the index and inside the workspace — which is the scope the
|
|
38
|
+
* operator already granted. The analysis itself still writes `.gitnexus/lbug`; this
|
|
39
|
+
* only moves the global registry side effect.
|
|
40
|
+
*/
|
|
41
|
+
export declare function defaultGitnexusHome(repoPath: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Whether this index says content-level FTS is available.
|
|
44
|
+
*
|
|
45
|
+
* A missing manifest, a legacy manifest, or a status other than `available` all mean
|
|
46
|
+
* "do not attempt FTS". The read is synchronous because both the maintenance-command
|
|
47
|
+
* builder and the analyze runner are synchronous; the manifest is a few kilobytes.
|
|
48
|
+
*/
|
|
49
|
+
export declare function ftsAvailable(repoPath: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* The effective `--skip-fts` decision for one repository.
|
|
52
|
+
*
|
|
53
|
+
* `false` (the default) means **automatic**: skip FTS when the index does not have
|
|
54
|
+
* it, so a refresh in a confined process does not die trying to install an extension
|
|
55
|
+
* out-of-process. `true` forces the flag. There is deliberately no "force FTS on":
|
|
56
|
+
* that is a repair action (`gitnexus analyze --repair-fts`), not an incremental
|
|
57
|
+
* refresh, and hiding a repair behind a config boolean would mislead.
|
|
58
|
+
*
|
|
59
|
+
* The alternative — a static default — was measured wrong in both directions: `true`
|
|
60
|
+
* forces a 21x full rebuild on an index that already has FTS, while `false` makes the
|
|
61
|
+
* refresh fail with `spawn EPERM` on an index that does not.
|
|
62
|
+
*/
|
|
63
|
+
export declare function effectiveSkipFts(repoPath: string, configured: boolean): boolean;
|
|
31
64
|
export type MaintenanceMode = 'init' | 'full';
|
|
32
65
|
export interface MaintenanceCommand {
|
|
33
66
|
mode: MaintenanceMode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/gitnexus/commands.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/gitnexus/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAQH;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAetD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAE/E;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,mFAAmF;AACnF,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,kBAAkB,EAAE,CA0D5G;AAED,oFAAoF;AACpF,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC,CAAC;AAE/F;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAcpE"}
|
package/lib/gitnexus/commands.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The maintenance commands this plugin hands to the operator.
|
|
3
3
|
*
|
|
4
|
-
* WHY THE
|
|
5
|
-
*
|
|
4
|
+
* WHY THE TEXT STILL EXISTS AFTER THE BUTTONS
|
|
5
|
+
* -------------------------------------------
|
|
6
6
|
* A first revision spawned `gitnexus analyze` directly from the plugin and exposed
|
|
7
|
-
* it as a button. That was wrong
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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.
|
|
13
14
|
*
|
|
14
15
|
* WHAT MAKES THE COMMANDS NON-OBVIOUS
|
|
15
16
|
* -----------------------------------
|
|
@@ -28,8 +29,60 @@
|
|
|
28
29
|
* the default `analyze` also rewrites AGENTS.md, CLAUDE.md and agent skill files
|
|
29
30
|
* inside the repository. A maintenance button must not edit the working tree.
|
|
30
31
|
*/
|
|
32
|
+
import { readFileSync } from 'node:fs';
|
|
33
|
+
import path from 'node:path';
|
|
31
34
|
/** Heap the CLI is given, matching what `ensureHeap` would have asked for. */
|
|
32
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
|
+
}
|
|
33
86
|
/**
|
|
34
87
|
* Build the two commands for a repository.
|
|
35
88
|
*
|
|
@@ -102,7 +155,7 @@ export function maintenanceCommands(repoPath, options = {}) {
|
|
|
102
155
|
{
|
|
103
156
|
mode: 'full',
|
|
104
157
|
label: '强制全量重构',
|
|
105
|
-
when: '
|
|
158
|
+
when: '增量刷新卡死或结果反常时的逃生舱。重建图与 FTS,耗时数分钟;未变更文件的解析产物仍会复用。',
|
|
106
159
|
argv: line(['--force']),
|
|
107
160
|
shell: envPrefix() + line(['--force']),
|
|
108
161
|
destructive: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/gitnexus/commands.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/gitnexus/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -312,6 +312,17 @@ export declare function judgeMinified(absolutePath: string, size: number): Promi
|
|
|
312
312
|
export declare function looksGenerated(filePath: string): boolean;
|
|
313
313
|
/** @param {number} bytes */
|
|
314
314
|
export declare function formatBytes(bytes: number): string;
|
|
315
|
+
/** A real phase of the coverage read, reported while the work is still running. */
|
|
316
|
+
export type CoveragePhase = 'manifest' | 'git' | 'scan' | 'large-files' | 'assemble';
|
|
317
|
+
/** One numeric progress event. `current`/`total` are real counts where they exist. */
|
|
318
|
+
export interface CoverageProgress {
|
|
319
|
+
phase: CoveragePhase;
|
|
320
|
+
/** 0–100, based on completed phases and the real scan/probe counters. */
|
|
321
|
+
percent: number;
|
|
322
|
+
label: string;
|
|
323
|
+
current?: number;
|
|
324
|
+
total?: number;
|
|
325
|
+
}
|
|
315
326
|
/** Options for {@link analyzeCoverage}. */
|
|
316
327
|
export interface AnalyzeOptions {
|
|
317
328
|
/** Environment to read GitNexus settings from. Defaults to `process.env`. */
|
|
@@ -330,6 +341,11 @@ export interface AnalyzeOptions {
|
|
|
330
341
|
toolchain?: {
|
|
331
342
|
managedPrefix?: string;
|
|
332
343
|
};
|
|
344
|
+
/**
|
|
345
|
+
* Receives real phase/count updates while the report is being built. A thrown
|
|
346
|
+
* callback is ignored: progress is observability, not a reason to fail the read.
|
|
347
|
+
*/
|
|
348
|
+
onProgress?: (progress: CoverageProgress) => void;
|
|
333
349
|
}
|
|
334
350
|
/**
|
|
335
351
|
* Build the full coverage report for a repository.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/gitnexus/coverage.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/gitnexus/coverage.ts"],"names":[],"mappings":"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"}
|
package/lib/gitnexus/coverage.js
CHANGED
|
@@ -225,25 +225,72 @@ export function formatBytes(bytes) {
|
|
|
225
225
|
export async function analyzeCoverage(repoPath, options = {}) {
|
|
226
226
|
const env = options.env ?? process.env;
|
|
227
227
|
const absRepo = path.resolve(repoPath);
|
|
228
|
+
const emit = (progress) => {
|
|
229
|
+
try {
|
|
230
|
+
options.onProgress?.(progress);
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
// Observability must never be able to fail the report it observes.
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
const managedPrefix = options.toolchain?.managedPrefix;
|
|
237
|
+
emit({ phase: 'manifest', percent: 2, label: '读取索引清单…' });
|
|
228
238
|
const [meta, registryEntry, detector] = await Promise.all([
|
|
229
239
|
readIndexMeta(absRepo),
|
|
230
240
|
findRegistryEntry(absRepo, { env }),
|
|
231
|
-
loadLanguageDetector({ env }),
|
|
241
|
+
loadLanguageDetector({ env, managedPrefix }),
|
|
232
242
|
]);
|
|
243
|
+
emit({ phase: 'manifest', percent: 10, label: '索引清单已读取' });
|
|
233
244
|
// Read after the manifest, because classifying staleness needs the indexed commit.
|
|
245
|
+
emit({ phase: 'git', percent: 12, label: '读取 Git 状态…' });
|
|
234
246
|
const git = await readGitState(absRepo, meta?.lastCommit ?? null);
|
|
235
247
|
const staleness = classifyStaleness({ lastCommit: meta?.lastCommit ?? null, git });
|
|
248
|
+
emit({ phase: 'git', percent: 16, label: 'Git 状态已读取' });
|
|
236
249
|
// When the index recorded the cap it was built under, judge it by that cap —
|
|
237
250
|
// not by today's default, which would report files as "skipped" that the index
|
|
238
251
|
// in fact covers.
|
|
252
|
+
emit({ phase: 'scan', percent: 18, label: '扫描工作区…' });
|
|
253
|
+
let lastScanPercent = -1;
|
|
254
|
+
let lastScanAt = 0;
|
|
239
255
|
const scan = await scanRepository(absRepo, {
|
|
240
256
|
env,
|
|
241
257
|
capBytes: meta?.coverageMaxFileSizeBytes ?? undefined,
|
|
258
|
+
managedPrefix,
|
|
259
|
+
onProgress: (done, total) => {
|
|
260
|
+
const percent = 18 + Math.round((done / Math.max(total, 1)) * 42);
|
|
261
|
+
const at = Date.now();
|
|
262
|
+
if (done < total && percent === lastScanPercent && at - lastScanAt < 120)
|
|
263
|
+
return;
|
|
264
|
+
lastScanPercent = percent;
|
|
265
|
+
lastScanAt = at;
|
|
266
|
+
emit({
|
|
267
|
+
phase: 'scan',
|
|
268
|
+
percent,
|
|
269
|
+
label: `扫描文件 ${done}/${total}`,
|
|
270
|
+
current: done,
|
|
271
|
+
total,
|
|
272
|
+
});
|
|
273
|
+
},
|
|
274
|
+
});
|
|
275
|
+
emit({
|
|
276
|
+
phase: 'scan',
|
|
277
|
+
percent: 60,
|
|
278
|
+
label: `扫描完成:${scan.scannedCount} 个文件`,
|
|
279
|
+
current: scan.scannedCount,
|
|
280
|
+
total: scan.scannedCount,
|
|
242
281
|
});
|
|
243
282
|
const largeFiles = [];
|
|
244
283
|
const minifiedBudget = options.minifiedSampleLimit ?? 40;
|
|
245
284
|
let minifiedProbes = 0;
|
|
246
|
-
|
|
285
|
+
emit({
|
|
286
|
+
phase: 'large-files',
|
|
287
|
+
percent: 62,
|
|
288
|
+
label: scan.large.length === 0 ? '没有超大文件' : `检查超大文件 0/${scan.large.length}`,
|
|
289
|
+
current: 0,
|
|
290
|
+
total: scan.large.length,
|
|
291
|
+
});
|
|
292
|
+
for (let index = 0; index < scan.large.length; index += 1) {
|
|
293
|
+
const file = scan.large[index];
|
|
247
294
|
const lang = classifyFile(file.path, detector);
|
|
248
295
|
/** @type {FileShape | null} */
|
|
249
296
|
let minified = null;
|
|
@@ -266,6 +313,13 @@ export async function analyzeCoverage(repoPath, options = {}) {
|
|
|
266
313
|
shareOfScanned: 0,
|
|
267
314
|
shareOfLanguage: 0,
|
|
268
315
|
});
|
|
316
|
+
emit({
|
|
317
|
+
phase: 'large-files',
|
|
318
|
+
percent: 62 + Math.round(((index + 1) / Math.max(scan.large.length, 1)) * 28),
|
|
319
|
+
label: `检查超大文件 ${index + 1}/${scan.large.length}`,
|
|
320
|
+
current: index + 1,
|
|
321
|
+
total: scan.large.length,
|
|
322
|
+
});
|
|
269
323
|
}
|
|
270
324
|
// Share of a language's bytes held by each large file, computed over every
|
|
271
325
|
// scanned file of that language so the denominator is the honest one.
|
|
@@ -409,12 +463,16 @@ export async function analyzeCoverage(repoPath, options = {}) {
|
|
|
409
463
|
// Git activity, crossed with both sets so each touched file gets a three-way
|
|
410
464
|
// verdict rather than a bare "in the index / not in the index". Both sets are
|
|
411
465
|
// already computed above, so this costs one git call and no extra filesystem work.
|
|
466
|
+
emit({ phase: 'assemble', percent: 90, label: '汇总 Git 活动与报告…' });
|
|
412
467
|
const activity = options.includeActivity === false
|
|
413
468
|
? null
|
|
414
469
|
: await readGitActivity(absRepo, {
|
|
415
470
|
sinceDays: options.activitySinceDays ?? undefined,
|
|
416
471
|
indexedPaths: Object.keys(meta?.fileHashes ?? {}),
|
|
417
472
|
scannablePaths: scan.selected.map((f) => f.path),
|
|
473
|
+
// The manifest's commit is the only honest baseline: it says what the
|
|
474
|
+
// graph was built from, not what HEAD happened to be when the panel opened.
|
|
475
|
+
baselineRef: meta?.lastCommit ?? null,
|
|
418
476
|
});
|
|
419
477
|
if (activity !== null && activity.totals.verdicts.missing > 0) {
|
|
420
478
|
warnings.push({
|
|
@@ -441,6 +499,7 @@ export async function analyzeCoverage(repoPath, options = {}) {
|
|
|
441
499
|
evidence: { maxCommits: activity.window.maxCommits, sinceDays: activity.window.sinceDays },
|
|
442
500
|
});
|
|
443
501
|
}
|
|
502
|
+
emit({ phase: 'assemble', percent: 99, label: '报告已汇总' });
|
|
444
503
|
return {
|
|
445
504
|
repo: {
|
|
446
505
|
path: absRepo,
|