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.
Files changed (90) hide show
  1. package/LICENSE +38 -0
  2. package/README.md +631 -2
  3. package/cordis.patch.yml +18 -0
  4. package/lib/bin/gitnexus-coverage.d.ts +14 -0
  5. package/lib/bin/gitnexus-coverage.d.ts.map +1 -0
  6. package/lib/bin/gitnexus-coverage.js +171 -0
  7. package/lib/bin/gitnexus-coverage.js.map +1 -0
  8. package/lib/bin/search-helper.d.ts +22 -0
  9. package/lib/bin/search-helper.d.ts.map +1 -0
  10. package/lib/bin/search-helper.js +57 -0
  11. package/lib/bin/search-helper.js.map +1 -0
  12. package/lib/client.js +2131 -0
  13. package/lib/gitnexus/analyze.d.ts +173 -0
  14. package/lib/gitnexus/analyze.d.ts.map +1 -0
  15. package/lib/gitnexus/analyze.js +308 -0
  16. package/lib/gitnexus/analyze.js.map +1 -0
  17. package/lib/gitnexus/commands.d.ts +129 -0
  18. package/lib/gitnexus/commands.d.ts.map +1 -0
  19. package/lib/gitnexus/commands.js +185 -0
  20. package/lib/gitnexus/commands.js.map +1 -0
  21. package/lib/gitnexus/coverage.d.ts +340 -0
  22. package/lib/gitnexus/coverage.d.ts.map +1 -0
  23. package/lib/gitnexus/coverage.js +554 -0
  24. package/lib/gitnexus/coverage.js.map +1 -0
  25. package/lib/gitnexus/format.d.ts +16 -0
  26. package/lib/gitnexus/format.d.ts.map +1 -0
  27. package/lib/gitnexus/format.js +178 -0
  28. package/lib/gitnexus/format.js.map +1 -0
  29. package/lib/gitnexus/git-activity.d.ts +136 -0
  30. package/lib/gitnexus/git-activity.d.ts.map +1 -0
  31. package/lib/gitnexus/git-activity.js +345 -0
  32. package/lib/gitnexus/git-activity.js.map +1 -0
  33. package/lib/gitnexus/git.d.ts +70 -0
  34. package/lib/gitnexus/git.d.ts.map +1 -0
  35. package/lib/gitnexus/git.js +121 -0
  36. package/lib/gitnexus/git.js.map +1 -0
  37. package/lib/gitnexus/index-meta.d.ts +160 -0
  38. package/lib/gitnexus/index-meta.d.ts.map +1 -0
  39. package/lib/gitnexus/index-meta.js +176 -0
  40. package/lib/gitnexus/index-meta.js.map +1 -0
  41. package/lib/gitnexus/install.d.ts +97 -0
  42. package/lib/gitnexus/install.d.ts.map +1 -0
  43. package/lib/gitnexus/install.js +228 -0
  44. package/lib/gitnexus/install.js.map +1 -0
  45. package/lib/gitnexus/languages.d.ts +80 -0
  46. package/lib/gitnexus/languages.d.ts.map +1 -0
  47. package/lib/gitnexus/languages.js +297 -0
  48. package/lib/gitnexus/languages.js.map +1 -0
  49. package/lib/gitnexus/root.d.ts +74 -0
  50. package/lib/gitnexus/root.d.ts.map +1 -0
  51. package/lib/gitnexus/root.js +168 -0
  52. package/lib/gitnexus/root.js.map +1 -0
  53. package/lib/gitnexus/scan.d.ts +68 -0
  54. package/lib/gitnexus/scan.d.ts.map +1 -0
  55. package/lib/gitnexus/scan.js +249 -0
  56. package/lib/gitnexus/scan.js.map +1 -0
  57. package/lib/gitnexus/search.d.ts +167 -0
  58. package/lib/gitnexus/search.d.ts.map +1 -0
  59. package/lib/gitnexus/search.js +517 -0
  60. package/lib/gitnexus/search.js.map +1 -0
  61. package/lib/gitnexus/toolchain.d.ts +136 -0
  62. package/lib/gitnexus/toolchain.d.ts.map +1 -0
  63. package/lib/gitnexus/toolchain.js +251 -0
  64. package/lib/gitnexus/toolchain.js.map +1 -0
  65. package/lib/index.d.ts +98 -0
  66. package/lib/index.d.ts.map +1 -0
  67. package/lib/index.js +252 -0
  68. package/lib/index.js.map +1 -0
  69. package/lib/routes/analyze.d.ts +41 -0
  70. package/lib/routes/analyze.d.ts.map +1 -0
  71. package/lib/routes/analyze.js +75 -0
  72. package/lib/routes/analyze.js.map +1 -0
  73. package/lib/routes/coverage.d.ts +52 -0
  74. package/lib/routes/coverage.d.ts.map +1 -0
  75. package/lib/routes/coverage.js +81 -0
  76. package/lib/routes/coverage.js.map +1 -0
  77. package/lib/routes/guard.d.ts +92 -0
  78. package/lib/routes/guard.d.ts.map +1 -0
  79. package/lib/routes/guard.js +187 -0
  80. package/lib/routes/guard.js.map +1 -0
  81. package/lib/routes/install.d.ts +27 -0
  82. package/lib/routes/install.d.ts.map +1 -0
  83. package/lib/routes/install.js +46 -0
  84. package/lib/routes/install.js.map +1 -0
  85. package/lib/routes/search.d.ts +27 -0
  86. package/lib/routes/search.d.ts.map +1 -0
  87. package/lib/routes/search.js +77 -0
  88. package/lib/routes/search.js.map +1 -0
  89. package/package.json +87 -4
  90. package/scripts/link-runtime.mjs +146 -0
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Plain-text rendering of a coverage report.
3
+ *
4
+ * Kept free of any DSH import so it can be tested — and reused — without a host
5
+ * running. Tool output is read by a model as often as by a person, so there is no
6
+ * ANSI here; `bin/gitnexus-coverage.mjs` owns the colourised terminal variant.
7
+ */
8
+ import { formatBytes, } from './coverage.js';
9
+ /**
10
+ * Render a coverage report as plain text.
11
+ *
12
+ * @param report the report to render
13
+ * @param withLanguages include the per-language breakdown
14
+ */
15
+ export function formatReport(report, withLanguages = true) {
16
+ const lines = [];
17
+ const { repo, cap, totals } = report;
18
+ if (!repo.indexed) {
19
+ return (`GitNexus index: NOT FOUND\n${repo.path}\n` +
20
+ 'No .gitnexus/gitnexus.json or .gitnexus/meta.json — run `gitnexus analyze` first.');
21
+ }
22
+ lines.push(`GitNexus coverage · ${repo.name}`);
23
+ lines.push(` ${repo.path}`);
24
+ lines.push(` indexed ${repo.indexedAt} · ${repo.branch ?? 'unknown'}@${(repo.lastCommit || 'unknown').slice(0, 8)}` +
25
+ ` · manifest ${repo.metaFile ?? 'unknown'} · GitNexus ${report.analyzer.gitnexusVersion}`);
26
+ lines.push(` scanned ${totals.scanned} · selected ${totals.selected} · in graph ${totals.indexedInGraph}` +
27
+ ` · skipped ${totals.large} · declarations suppressed ${totals.suppressedDeclarations}`);
28
+ lines.push(` size cap ${cap.text} (${cap.source})`);
29
+ // Freshness. The commit above is the *indexed* one; without this line a reader
30
+ // takes it for HEAD, which on a real repository it was not.
31
+ if (report.staleness !== undefined && report.staleness !== null) {
32
+ const s = report.staleness;
33
+ const short = (sha) => (typeof sha === 'string' && sha !== '' ? sha.slice(0, 8) : '?');
34
+ // `dirtyCount` is null when git could not be asked at all — which must not render
35
+ // as "0 uncommitted", because that is a claim about the tree, not an absence of
36
+ // information.
37
+ const dirtyCount = s.dirtyCount;
38
+ const dirty = dirtyCount !== null && dirtyCount > 0 ? `, ${dirtyCount} uncommitted` : '';
39
+ if (s.gitAvailable !== true) {
40
+ lines.push(' freshness unknown (git unavailable)');
41
+ }
42
+ else if (s.state === 'current') {
43
+ lines.push(` freshness current — HEAD ${short(s.headCommit)} matches the index${dirty}`);
44
+ }
45
+ else if (s.state === 'behind') {
46
+ // `ahead`, not `behind`. `rev-list --left-right --count <indexed>...<HEAD>`
47
+ // reports the index side first, so a linear fast-forward is `behind: 0` — the
48
+ // distance the index lags is `ahead`. Reading `.behind` here printed
49
+ // "index is 0 commit(s) behind" for an index that was one commit behind, which
50
+ // is how this was caught: the deployed plugin's own tool output said it.
51
+ const lag = s.aheadBehind?.ahead ?? '?';
52
+ lines.push(` freshness BEHIND — index is ${lag} commit(s) behind ` +
53
+ `(${short(s.indexedCommit)} -> ${short(s.headCommit)})${dirty}`);
54
+ }
55
+ else if (s.state === 'diverged') {
56
+ lines.push(` freshness DIVERGED — HEAD ${short(s.headCommit)} is not on the indexed commit ` +
57
+ `${short(s.indexedCommit)}; the gap is not countable${dirty}`);
58
+ }
59
+ else {
60
+ lines.push(` freshness unknown — cannot compare ${short(s.indexedCommit)} with ${short(s.headCommit)}${dirty}`);
61
+ }
62
+ }
63
+ // What the graph holds, and which query surfaces are live. Both were already in
64
+ // the manifest and previously went unreported.
65
+ if (report.graph !== null && report.graph !== undefined) {
66
+ const g = report.graph;
67
+ lines.push(` graph: ${g.nodes} nodes, ${g.edges} edges, ${g.communities} communities, ` +
68
+ `${g.processes} processes, ${g.embeddings} embeddings (${g.edgesPerNode.toFixed(2)} edges/node)`);
69
+ }
70
+ const caps = report.capabilities ?? {};
71
+ const capNames = ['graph', 'fts', 'vectorSearch'];
72
+ if (capNames.some((n) => caps[n] !== undefined)) {
73
+ lines.push(` query surfaces: ${capNames
74
+ .map((n) => {
75
+ const entry = caps[n];
76
+ if (entry === undefined)
77
+ return `${n}=absent`;
78
+ return entry.status === 'available'
79
+ ? `${n}=available`
80
+ : `${n}=UNAVAILABLE (${entry.skipReason ?? entry.status})`;
81
+ })
82
+ .join(', ')}`);
83
+ }
84
+ if (report.largeFiles.length > 0) {
85
+ lines.push('');
86
+ lines.push(`Skipped large files (${report.largeFiles.length}, ${formatBytes(totals.largeBytes)}):`);
87
+ for (const file of report.largeFiles.slice(0, 30)) {
88
+ const flags = [];
89
+ if (file.minified?.binary)
90
+ flags.push('binary asset — cannot hold symbols');
91
+ else if (file.minified?.suspect) {
92
+ flags.push(`single-line ~${Math.round(file.minified.avgLineLength)} chars`);
93
+ }
94
+ if (file.generatedHint)
95
+ flags.push('generated-output path');
96
+ const share = file.shareOfLanguage > 0
97
+ ? ` (${(file.shareOfLanguage * 100).toFixed(0)}% of ${file.language.label})`
98
+ : '';
99
+ lines.push(` ${file.sizeText.padStart(9)} ${file.path}${share}` +
100
+ `${flags.length > 0 ? ` [${flags.join('; ')}]` : ''}`);
101
+ }
102
+ if (report.largeFiles.length > 30)
103
+ lines.push(` …and ${report.largeFiles.length - 30} more`);
104
+ }
105
+ if (withLanguages && report.languages !== null) {
106
+ lines.push('');
107
+ lines.push(`Languages (${report.languages.rows.length}, by bytes):`);
108
+ const total = report.languages.totalBytes || 1;
109
+ for (const row of report.languages.rows.slice(0, 15)) {
110
+ lines.push(` ${row.label.padEnd(14)} ${((row.bytes / total) * 100).toFixed(1).padStart(5)}%` +
111
+ ` ${row.files} files ${row.klass}`);
112
+ }
113
+ if (report.languages.rows.length > 15) {
114
+ lines.push(` …and ${report.languages.rows.length - 15} more`);
115
+ }
116
+ }
117
+ const notable = report.warnings.filter((w) => w.level === 'warn');
118
+ if (notable.length > 0) {
119
+ lines.push('');
120
+ for (const w of notable)
121
+ lines.push(` ! ${w.message}`);
122
+ }
123
+ const info = report.warnings.filter((w) => w.level === 'info');
124
+ if (info.length > 0) {
125
+ lines.push('');
126
+ for (const w of info)
127
+ lines.push(` - ${w.message}`);
128
+ }
129
+ // Git activity crossed with the index. The three-way verdict is the point: a
130
+ // bare "not indexed" count reads as a defect, when most of it is files no scan
131
+ // would select either (lockfiles, dotfiles, binary assets).
132
+ const activity = report.activity;
133
+ if (activity !== null && activity !== undefined) {
134
+ const v = activity.totals.verdicts;
135
+ lines.push('');
136
+ lines.push(`Git activity, last ${activity.window.sinceDays} days` +
137
+ `${activity.window.truncated ? ` (capped at ${activity.window.maxCommits} commits)` : ''}: ` +
138
+ `${activity.totals.commits} commits by ${activity.totals.authors} author(s)` +
139
+ `${activity.totals.bots > 0 ? ` (${activity.totals.bots} bot)` : ''}, ` +
140
+ `+${activity.totals.insertions}/-${activity.totals.deletions} lines across ${activity.totals.files} file(s)`);
141
+ lines.push(` touched files: ${v.indexed} indexed, ${v.missing} MISSING from the index, ${v.excluded} excluded by design`);
142
+ if (v.missing > 0) {
143
+ lines.push(' files that should be indexed but are not:');
144
+ const missing = activity.missingFiles ?? activity.byChanges.filter((f) => f.verdict === 'missing');
145
+ for (const file of missing.slice(0, 10)) {
146
+ lines.push(` ${String(file.changes).padStart(3)}x ${file.path}`);
147
+ }
148
+ if (missing.length < v.missing)
149
+ lines.push(` …and ${v.missing - missing.length} more`);
150
+ }
151
+ if (activity.byChanges.some((f) => f.verdict === 'indexed')) {
152
+ lines.push(' most-changed indexed files:');
153
+ for (const file of activity.byChanges.filter((f) => f.verdict === 'indexed').slice(0, 5)) {
154
+ lines.push(` ${String(file.changes).padStart(3)}x ${file.path}`);
155
+ }
156
+ }
157
+ if (activity.authors.length > 0) {
158
+ lines.push(` authors: ${activity.authors
159
+ .slice(0, 5)
160
+ .map((a) => `${a.name}${a.bot ? ' [bot]' : ''} (${a.commits})`)
161
+ .join(', ')}`);
162
+ }
163
+ }
164
+ const quality = report.graphQuality;
165
+ if (quality !== null && quality !== undefined && quality.counts !== undefined) {
166
+ const names = Object.entries(quality.counts)
167
+ .sort((a, b) => b[1] - a[1])
168
+ .slice(0, 6)
169
+ .map(([name, count]) => `${name} ${count}`);
170
+ lines.push('');
171
+ lines.push(` resolver: ${quality.totalSites ?? 0} untyped receiver site(s) — while these exist, ` +
172
+ `impact/context results are a LOWER BOUND, not exact`);
173
+ if (names.length > 0)
174
+ lines.push(` ${names.join(', ')}`);
175
+ }
176
+ return lines.join('\n');
177
+ }
178
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/gitnexus/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Git activity, correlated with the index.
3
+ *
4
+ * WHAT THIS ADDS THAT PLAIN `git log` DOES NOT
5
+ * -------------------------------------------
6
+ * GitNexus is built on git, and its manifest records a content hash for every file
7
+ * it indexed. Crossing recent git activity with that set answers a question neither
8
+ * tool answers alone:
9
+ *
10
+ * of the files people are actively changing right now,
11
+ * how many does the knowledge graph even see?
12
+ *
13
+ * A file that is edited weekly but absent from the index contributes nothing to
14
+ * `impact`, `context` or `query` — and nothing in GitNexus's own UI says so. That
15
+ * is the `indexed` flag on every row here.
16
+ *
17
+ * BOUNDS ARE PART OF THE CONTRACT
18
+ * -------------------------------
19
+ * `git log --numstat` on a large repository is unbounded work, so every dimension
20
+ * is capped and the result says when a cap was hit (`window.truncated`). A silently
21
+ * truncated activity list reads as "this is all the activity there was", which is
22
+ * the one thing it must not mean.
23
+ */
24
+ /**
25
+ * indexed — the manifest holds this path, so the graph can answer about it.
26
+ * excluded — a fresh scan would not select it either (dotfile, ignore rule, or
27
+ * over the size cap). Absent by design; not a staleness signal.
28
+ * missing — a fresh scan *would* select it, but the index does not hold it.
29
+ * This is the only verdict that means the index is behind.
30
+ */
31
+ export type FileVerdict = 'indexed' | 'excluded' | 'missing';
32
+ export interface ActivityFile {
33
+ path: string;
34
+ /** commits touching this file */
35
+ changes: number;
36
+ insertions: number;
37
+ deletions: number;
38
+ /** ISO date of the most recent change */
39
+ lastChange: string;
40
+ indexed: boolean;
41
+ verdict: FileVerdict;
42
+ }
43
+ export interface ActivityAuthor {
44
+ name: string;
45
+ email: string;
46
+ commits: number;
47
+ insertions: number;
48
+ deletions: number;
49
+ /** distinct files touched */
50
+ files: number;
51
+ lastCommit: string;
52
+ /** machine account, judged from the conventional markers */
53
+ bot: boolean;
54
+ }
55
+ export interface ActivityBranch {
56
+ name: string;
57
+ lastCommitDate: string;
58
+ lastAuthor: string;
59
+ current: boolean;
60
+ }
61
+ export interface HistogramBucket {
62
+ label: string;
63
+ commits: number;
64
+ insertions: number;
65
+ deletions: number;
66
+ }
67
+ export interface ActivityHistogram {
68
+ bucketDays: number;
69
+ buckets: HistogramBucket[];
70
+ }
71
+ /** One commit-stamp feeding the histogram. */
72
+ export interface ActivityStamp {
73
+ date: string;
74
+ insertions: number;
75
+ deletions: number;
76
+ }
77
+ export interface ActivityWindow {
78
+ sinceDays: number;
79
+ since: string;
80
+ maxCommits: number;
81
+ maxFiles: number;
82
+ truncated: boolean;
83
+ oldestCommit: string | null;
84
+ newestCommit: string | null;
85
+ }
86
+ export interface ActivityTotals {
87
+ commits: number;
88
+ authors: number;
89
+ bots: number;
90
+ files: number;
91
+ insertions: number;
92
+ deletions: number;
93
+ verdicts: Record<FileVerdict, number>;
94
+ indexKnown: boolean;
95
+ filesTouchedThatAreIndexed: number;
96
+ filesTouchedThatAreNotIndexed: number;
97
+ }
98
+ export interface ActivityInfo {
99
+ window: ActivityWindow;
100
+ totals: ActivityTotals;
101
+ authors: ActivityAuthor[];
102
+ byChanges: ActivityFile[];
103
+ byRecency: ActivityFile[];
104
+ missingFiles: ActivityFile[];
105
+ branches: ActivityBranch[];
106
+ histogram: ActivityHistogram;
107
+ currentBranch: string | null;
108
+ }
109
+ export interface ReadGitActivityOptions {
110
+ sinceDays?: number;
111
+ maxCommits?: number;
112
+ maxFiles?: number;
113
+ maxAuthors?: number;
114
+ maxBranches?: number;
115
+ indexedPaths?: Iterable<string>;
116
+ scannablePaths?: Iterable<string>;
117
+ }
118
+ /**
119
+ * Bucket commit stamps into a time histogram.
120
+ *
121
+ * Daily buckets while the window is short enough to read, weekly once it is not:
122
+ * 90 daily columns in a sidebar is a smear, not a chart. The bucket width is
123
+ * returned so the axis can be labelled with the real unit instead of implying one.
124
+ *
125
+ * Empty buckets are materialised rather than skipped — a gap in a bar chart must
126
+ * read as "no commits that day", and inferring that from irregular spacing is
127
+ * exactly the misreading the chart exists to prevent.
128
+ */
129
+ export declare function buildHistogram(stamps: ActivityStamp[], sinceDays: number): ActivityHistogram;
130
+ /**
131
+ * Read recent commits, authors, changed files and branches.
132
+ *
133
+ * Returns `null` when git cannot answer at all.
134
+ */
135
+ export declare function readGitActivity(repoPath: string, options?: ReadGitActivityOptions): Promise<ActivityInfo | null>;
136
+ //# sourceMappingURL=git-activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-activity.d.ts","sourceRoot":"","sources":["../../src/gitnexus/git-activity.ts"],"names":[],"mappings":"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"}