ghagga 3.2.0 → 3.4.0
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.md +1 -1
- package/dist/commands/audit.js +6 -2
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/index-cmd.d.ts +49 -0
- package/dist/commands/index-cmd.d.ts.map +1 -0
- package/dist/commands/index-cmd.js +367 -0
- package/dist/commands/index-cmd.js.map +1 -0
- package/dist/commands/index-cmd.test.d.ts +17 -0
- package/dist/commands/index-cmd.test.d.ts.map +1 -0
- package/dist/commands/index-cmd.test.js +535 -0
- package/dist/commands/index-cmd.test.js.map +1 -0
- package/dist/commands/indexer-registry.d.ts +93 -0
- package/dist/commands/indexer-registry.d.ts.map +1 -0
- package/dist/commands/indexer-registry.js +342 -0
- package/dist/commands/indexer-registry.js.map +1 -0
- package/dist/commands/indexer-registry.test.d.ts +10 -0
- package/dist/commands/indexer-registry.test.d.ts.map +1 -0
- package/dist/commands/indexer-registry.test.js +538 -0
- package/dist/commands/indexer-registry.test.js.map +1 -0
- package/dist/commands/review-blast-radius.test.d.ts +13 -0
- package/dist/commands/review-blast-radius.test.d.ts.map +1 -0
- package/dist/commands/review-blast-radius.test.js +179 -0
- package/dist/commands/review-blast-radius.test.js.map +1 -0
- package/dist/commands/review.d.ts +136 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +357 -2
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/review.test.js +527 -1
- package/dist/commands/review.test.js.map +1 -1
- package/dist/commands/triage.d.ts +14 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +248 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/triage.test.d.ts +8 -0
- package/dist/commands/triage.test.d.ts.map +1 -0
- package/dist/commands/triage.test.js +272 -0
- package/dist/commands/triage.test.js.map +1 -0
- package/dist/index.js +38 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/cli-github-client-port.d.ts +2 -0
- package/dist/lib/cli-github-client-port.d.ts.map +1 -1
- package/dist/lib/cli-github-client-port.js +12 -0
- package/dist/lib/cli-github-client-port.js.map +1 -1
- package/dist/ui/__tests__/theme.test.js +3 -2
- package/dist/ui/__tests__/theme.test.js.map +1 -1
- package/dist/ui/theme.d.ts.map +1 -1
- package/dist/ui/theme.js +1 -0
- package/dist/ui/theme.js.map +1 -1
- package/package.json +11 -10
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-language SCIP indexer registry (D1) + marker-file language detection.
|
|
3
|
+
*
|
|
4
|
+
* Hand-rolled, not a scip-io orchestrator wrapper (D1): full control over
|
|
5
|
+
* invocation flags, per-language degradation, and trivially mockable in
|
|
6
|
+
* tests. Tier A shipped the Go entry (refactored from the previous
|
|
7
|
+
* Go-hardcoded `index-cmd.ts`); Tier B added TS/JS, Python, and Rust. Tier C
|
|
8
|
+
* (this PR) adds Java+Kotlin (shared `scip-java` indexer, `heavy` maturity)
|
|
9
|
+
* and C# (`scip-dotnet`, `experimental` maturity — scip-dotnet 0.2.x is an
|
|
10
|
+
* immature upstream indexer, not merely "heavy" like scip-java). Tier D
|
|
11
|
+
* (this PR) adds PHP (`scip-php`, `experimental`).
|
|
12
|
+
*/
|
|
13
|
+
import { type SupportedLanguage } from 'ghagga-core';
|
|
14
|
+
export type IndexerMaturity = 'stable' | 'heavy' | 'experimental';
|
|
15
|
+
export interface IndexerEntry {
|
|
16
|
+
/** The underlying SCIP indexer binary, e.g. `scip-go`. */
|
|
17
|
+
bin: string;
|
|
18
|
+
/** Languages this indexer produces documents for (scip-java → java+kotlin). */
|
|
19
|
+
languages: SupportedLanguage[];
|
|
20
|
+
/** Marker files whose presence (any one) triggers detection for this entry. */
|
|
21
|
+
markers: string[];
|
|
22
|
+
/** True when the indexer binary (and any required toolchain) is on PATH. */
|
|
23
|
+
toolchainCheck(): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Run the indexer against `dir`, writing its SCIP output to `outPath`
|
|
26
|
+
* (an absolute path chosen by the DISPATCHER — D3: centralized under
|
|
27
|
+
* `<repoPath>/.ghagga/scip/`, disambiguated per marker directory) and
|
|
28
|
+
* returning `outPath`. Entries never compute their own output path —
|
|
29
|
+
* once runs multiply (one dir → many possible marker dirs per entry),
|
|
30
|
+
* the dispatcher owns the output namespace to avoid same-bin collisions
|
|
31
|
+
* (e.g. two `scip-python` runs both wanting `scip-python.scip`).
|
|
32
|
+
* Throws on runtime failure — the dispatcher catches and degrades.
|
|
33
|
+
*/
|
|
34
|
+
run(dir: string, outPath: string): string;
|
|
35
|
+
/** Human-readable install instructions, shown when the toolchain is absent. */
|
|
36
|
+
installHint: string;
|
|
37
|
+
maturity: IndexerMaturity;
|
|
38
|
+
}
|
|
39
|
+
/** Directory (relative to repo root) where isolated per-indexer `.scip` outputs live. */
|
|
40
|
+
export declare const SCIP_OUTPUT_DIR = ".ghagga/scip";
|
|
41
|
+
/** Absolute isolated output path for a given indexer bin name, under `dir`. */
|
|
42
|
+
export declare function scipOutputPath(dir: string, bin: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Tier A shipped the Go entry; Tier B added TS/JS, Python, Rust. Tier C/D
|
|
45
|
+
* (this PR) add Java+Kotlin, C#, and PHP — the dispatcher (`index-cmd.ts`)
|
|
46
|
+
* and `detectPresentLanguages` already generalize over N entries.
|
|
47
|
+
*/
|
|
48
|
+
export declare const INDEXER_REGISTRY: IndexerEntry[];
|
|
49
|
+
/** One `{indexer entry, marker directory}` pair discovered by the marker walk. */
|
|
50
|
+
export interface MarkerDirPair {
|
|
51
|
+
entry: IndexerEntry;
|
|
52
|
+
/** Absolute path to the directory the marker was found in. */
|
|
53
|
+
dir: string;
|
|
54
|
+
}
|
|
55
|
+
export interface DetectMarkerDirectoriesOptions {
|
|
56
|
+
/** Maximum depth (repo root = 0) the walk descends to. Default `DEFAULT_MARKER_DEPTH`. */
|
|
57
|
+
maxDepth?: number;
|
|
58
|
+
/** Directory names to skip, IN ADDITION TO `EXCLUDED_DIRS`. */
|
|
59
|
+
extraExcludedDirs?: Set<string>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Default marker-walk depth bound (D2). biogas-scale monorepos put
|
|
63
|
+
* `apps/*` and `services/*` marker dirs at depth 2; depth 4 gives headroom
|
|
64
|
+
* for `packages/x/y`-shaped nesting while bounding pathological repos'
|
|
65
|
+
* walk time. Configurable via `opts.maxDepth`.
|
|
66
|
+
*/
|
|
67
|
+
export declare const DEFAULT_MARKER_DEPTH = 4;
|
|
68
|
+
/**
|
|
69
|
+
* Walk `repoPath` depth-bounded (default `DEFAULT_MARKER_DEPTH`), evaluating
|
|
70
|
+
* every `INDEXER_REGISTRY` entry's markers against EVERY visited directory's
|
|
71
|
+
* entries (not just repo root) — reusing `markerPresent` per dir. Skips
|
|
72
|
+
* `EXCLUDED_DIRS` (plus `opts.extraExcludedDirs`). Root = depth 0.
|
|
73
|
+
*
|
|
74
|
+
* One pair is emitted per (entry that matches, directory) — this is how
|
|
75
|
+
* multi-lang-per-dir and same-lang-multi-dir both fall out naturally,
|
|
76
|
+
* deduped structurally (a Set keyed by `bin:dir`) so an entry with multiple
|
|
77
|
+
* matching markers in the same dir (e.g. `package.json` + `tsconfig.json`)
|
|
78
|
+
* still yields exactly one pair for that dir.
|
|
79
|
+
*
|
|
80
|
+
* Does not check toolchain availability — that remains the dispatcher's job.
|
|
81
|
+
*/
|
|
82
|
+
export declare function detectMarkerDirectories(repoPath: string, opts?: DetectMarkerDirectoriesOptions): MarkerDirPair[];
|
|
83
|
+
/**
|
|
84
|
+
* Detect which registry entries are "present" in `repoPath`, based on
|
|
85
|
+
* marker files at the repo root only (depth 0 wrapper over
|
|
86
|
+
* `detectMarkerDirectories`, kept for back-compat with callers that only
|
|
87
|
+
* care about "which languages", not "in which directories").
|
|
88
|
+
* Does not check toolchain availability — that's a separate step so the
|
|
89
|
+
* dispatcher can warn about missing toolchains for detected-but-unavailable
|
|
90
|
+
* languages instead of silently skipping them.
|
|
91
|
+
*/
|
|
92
|
+
export declare function detectPresentLanguages(repoPath: string): IndexerEntry[];
|
|
93
|
+
//# sourceMappingURL=indexer-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer-registry.d.ts","sourceRoot":"","sources":["../../src/commands/indexer-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIpE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,OAAO,GAAG,cAAc,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,+EAA+E;IAC/E,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,+EAA+E;IAC/E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,4EAA4E;IAC5E,cAAc,IAAI,OAAO,CAAC;IAC1B;;;;;;;;;OASG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1C,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAID,yFAAyF;AACzF,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/D;AAgPD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,YAAY,EAQ1C,CAAC;AAoBF,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,8BAA8B;IAC7C,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACjC;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,8BAAmC,GACxC,aAAa,EAAE,CAsCjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAUvE"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-language SCIP indexer registry (D1) + marker-file language detection.
|
|
3
|
+
*
|
|
4
|
+
* Hand-rolled, not a scip-io orchestrator wrapper (D1): full control over
|
|
5
|
+
* invocation flags, per-language degradation, and trivially mockable in
|
|
6
|
+
* tests. Tier A shipped the Go entry (refactored from the previous
|
|
7
|
+
* Go-hardcoded `index-cmd.ts`); Tier B added TS/JS, Python, and Rust. Tier C
|
|
8
|
+
* (this PR) adds Java+Kotlin (shared `scip-java` indexer, `heavy` maturity)
|
|
9
|
+
* and C# (`scip-dotnet`, `experimental` maturity — scip-dotnet 0.2.x is an
|
|
10
|
+
* immature upstream indexer, not merely "heavy" like scip-java). Tier D
|
|
11
|
+
* (this PR) adds PHP (`scip-php`, `experimental`).
|
|
12
|
+
*/
|
|
13
|
+
import { execFileSync } from 'node:child_process';
|
|
14
|
+
import { existsSync, mkdirSync, readdirSync, renameSync, rmSync } from 'node:fs';
|
|
15
|
+
import { dirname, join } from 'node:path';
|
|
16
|
+
import { EXCLUDED_DIRS } from 'ghagga-core';
|
|
17
|
+
// ─── Output Isolation Helpers (D2) ───────────────────────────────
|
|
18
|
+
/** Directory (relative to repo root) where isolated per-indexer `.scip` outputs live. */
|
|
19
|
+
export const SCIP_OUTPUT_DIR = '.ghagga/scip';
|
|
20
|
+
/** Absolute isolated output path for a given indexer bin name, under `dir`. */
|
|
21
|
+
export function scipOutputPath(dir, bin) {
|
|
22
|
+
return join(dir, SCIP_OUTPUT_DIR, `${bin}.scip`);
|
|
23
|
+
}
|
|
24
|
+
// ─── Go Entry ───────────────────────────────────────────────────
|
|
25
|
+
const SCIP_GO_INSTALL_HINT = 'go install github.com/scip-code/scip-go/cmd/scip-go@latest';
|
|
26
|
+
/** Check whether a command is resolvable on PATH. */
|
|
27
|
+
function commandExists(cmd) {
|
|
28
|
+
try {
|
|
29
|
+
const finder = process.platform === 'win32' ? 'where' : 'which';
|
|
30
|
+
execFileSync(finder, [cmd], { stdio: 'ignore' });
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const goEntry = {
|
|
38
|
+
bin: 'scip-go',
|
|
39
|
+
languages: ['go'],
|
|
40
|
+
markers: ['go.mod'],
|
|
41
|
+
toolchainCheck() {
|
|
42
|
+
return commandExists('go') && commandExists('scip-go');
|
|
43
|
+
},
|
|
44
|
+
run(dir, outPath) {
|
|
45
|
+
const producedPath = join(dir, 'index.scip');
|
|
46
|
+
// Guard against a stale root-level `index.scip` from a prior manual
|
|
47
|
+
// `scip-go` run being mistaken for output from THIS run.
|
|
48
|
+
if (existsSync(producedPath)) {
|
|
49
|
+
rmSync(producedPath);
|
|
50
|
+
}
|
|
51
|
+
// scip-go always writes `index.scip` in its cwd — no native --output
|
|
52
|
+
// flag — so run in cwd then move to the dispatcher-chosen path (D2/D3
|
|
53
|
+
// run-then-move fallback).
|
|
54
|
+
execFileSync('scip-go', [], { cwd: dir, stdio: 'inherit' });
|
|
55
|
+
if (!existsSync(producedPath)) {
|
|
56
|
+
throw new Error(`scip-go did not produce an index at ${producedPath}`);
|
|
57
|
+
}
|
|
58
|
+
// The isolated output dir (.ghagga/scip/) is not guaranteed to exist on
|
|
59
|
+
// a fresh repo — create it before moving the produced file into it.
|
|
60
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
61
|
+
renameSync(producedPath, outPath);
|
|
62
|
+
return outPath;
|
|
63
|
+
},
|
|
64
|
+
installHint: SCIP_GO_INSTALL_HINT,
|
|
65
|
+
maturity: 'stable',
|
|
66
|
+
};
|
|
67
|
+
// ─── TypeScript/JavaScript Entry ─────────────────────────────────
|
|
68
|
+
const SCIP_TYPESCRIPT_INSTALL_HINT = 'npm install -g @sourcegraph/scip-typescript';
|
|
69
|
+
const tsEntry = {
|
|
70
|
+
bin: 'scip-typescript',
|
|
71
|
+
languages: ['typescript', 'javascript'],
|
|
72
|
+
markers: ['package.json', 'tsconfig.json'],
|
|
73
|
+
toolchainCheck() {
|
|
74
|
+
return commandExists('scip-typescript');
|
|
75
|
+
},
|
|
76
|
+
run(dir, outPath) {
|
|
77
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
78
|
+
// scip-typescript supports a native --output flag, unlike scip-go — no
|
|
79
|
+
// run-then-move needed (D2: still isolated, just directly).
|
|
80
|
+
execFileSync('scip-typescript', ['index', '--cwd', dir, '--infer-tsconfig', '--output', outPath], {
|
|
81
|
+
cwd: dir,
|
|
82
|
+
stdio: 'inherit',
|
|
83
|
+
});
|
|
84
|
+
if (!existsSync(outPath)) {
|
|
85
|
+
throw new Error(`scip-typescript did not produce an index at ${outPath}`);
|
|
86
|
+
}
|
|
87
|
+
return outPath;
|
|
88
|
+
},
|
|
89
|
+
installHint: SCIP_TYPESCRIPT_INSTALL_HINT,
|
|
90
|
+
maturity: 'stable',
|
|
91
|
+
};
|
|
92
|
+
// ─── Python Entry ─────────────────────────────────────────────────
|
|
93
|
+
const SCIP_PYTHON_INSTALL_HINT = 'npm install -g @sourcegraph/scip-python';
|
|
94
|
+
const pythonEntry = {
|
|
95
|
+
bin: 'scip-python',
|
|
96
|
+
languages: ['python'],
|
|
97
|
+
markers: ['pyproject.toml', 'requirements.txt', 'setup.py'],
|
|
98
|
+
toolchainCheck() {
|
|
99
|
+
return commandExists('scip-python');
|
|
100
|
+
},
|
|
101
|
+
run(dir, outPath) {
|
|
102
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
103
|
+
// scip-python also supports a native --output flag.
|
|
104
|
+
execFileSync('scip-python', ['index', '--cwd', dir, '--output', outPath], {
|
|
105
|
+
cwd: dir,
|
|
106
|
+
stdio: 'inherit',
|
|
107
|
+
});
|
|
108
|
+
if (!existsSync(outPath)) {
|
|
109
|
+
throw new Error(`scip-python did not produce an index at ${outPath}`);
|
|
110
|
+
}
|
|
111
|
+
return outPath;
|
|
112
|
+
},
|
|
113
|
+
installHint: SCIP_PYTHON_INSTALL_HINT,
|
|
114
|
+
maturity: 'stable',
|
|
115
|
+
};
|
|
116
|
+
// ─── Rust Entry ─────────────────────────────────────────────────
|
|
117
|
+
const RUST_ANALYZER_INSTALL_HINT = 'rustup component add rust-analyzer';
|
|
118
|
+
const rustEntry = {
|
|
119
|
+
bin: 'rust-analyzer',
|
|
120
|
+
languages: ['rust'],
|
|
121
|
+
markers: ['Cargo.toml'],
|
|
122
|
+
toolchainCheck() {
|
|
123
|
+
return commandExists('rust-analyzer');
|
|
124
|
+
},
|
|
125
|
+
run(dir, outPath) {
|
|
126
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
127
|
+
// rust-analyzer's `scip` subcommand also supports a native --output flag.
|
|
128
|
+
execFileSync('rust-analyzer', ['scip', dir, '--output', outPath], {
|
|
129
|
+
cwd: dir,
|
|
130
|
+
stdio: 'inherit',
|
|
131
|
+
});
|
|
132
|
+
if (!existsSync(outPath)) {
|
|
133
|
+
throw new Error(`rust-analyzer did not produce an index at ${outPath}`);
|
|
134
|
+
}
|
|
135
|
+
return outPath;
|
|
136
|
+
},
|
|
137
|
+
installHint: RUST_ANALYZER_INSTALL_HINT,
|
|
138
|
+
maturity: 'stable',
|
|
139
|
+
};
|
|
140
|
+
// ─── Java/Kotlin Entry ────────────────────────────────────────────
|
|
141
|
+
// Coordinate VERIFIED 2026-07-15 against Maven Central: `org.scip-code:scip-java`
|
|
142
|
+
// resolves (latest 0.13.1); the older `com.sourcegraph:scip-java` is 404 (only
|
|
143
|
+
// the Scala-suffixed `com.sourcegraph:scip-java_2.13` @ 0.12.x exists). The hint
|
|
144
|
+
// below is correct — closes the BL-SCIP-JAVA-INSTALL-HINT "possibly-wrong" concern.
|
|
145
|
+
const SCIP_JAVA_INSTALL_HINT = 'curl -fLo coursier https://git.io/coursier-cli && chmod +x coursier && ' +
|
|
146
|
+
'./coursier bootstrap --standalone -o scip-java org.scip-code:scip-java:latest.stable ' +
|
|
147
|
+
'--main org.scip_code.scip_java.ScipJava (requires a JDK 17+ host JVM and a ' +
|
|
148
|
+
'Gradle or Maven build in the target repo — Kotlin support is Gradle-only)';
|
|
149
|
+
const javaEntry = {
|
|
150
|
+
bin: 'scip-java',
|
|
151
|
+
languages: ['java', 'kotlin'],
|
|
152
|
+
markers: ['pom.xml', 'build.gradle', 'build.gradle.kts'],
|
|
153
|
+
toolchainCheck() {
|
|
154
|
+
return commandExists('scip-java') && (commandExists('gradle') || commandExists('mvn'));
|
|
155
|
+
},
|
|
156
|
+
run(dir, outPath) {
|
|
157
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
158
|
+
// scip-java's `index` command supports a native --output flag (unlike
|
|
159
|
+
// scip-go/scip-php) — it auto-detects Gradle vs Maven in `dir` and shells
|
|
160
|
+
// out to it (D2: still isolated, just directly, like tsEntry/pythonEntry).
|
|
161
|
+
execFileSync('scip-java', ['index', '--output', outPath], {
|
|
162
|
+
cwd: dir,
|
|
163
|
+
stdio: 'inherit',
|
|
164
|
+
});
|
|
165
|
+
if (!existsSync(outPath)) {
|
|
166
|
+
throw new Error(`scip-java did not produce an index at ${outPath}`);
|
|
167
|
+
}
|
|
168
|
+
return outPath;
|
|
169
|
+
},
|
|
170
|
+
installHint: SCIP_JAVA_INSTALL_HINT,
|
|
171
|
+
maturity: 'heavy',
|
|
172
|
+
};
|
|
173
|
+
// ─── C# Entry ─────────────────────────────────────────────────────
|
|
174
|
+
const SCIP_DOTNET_INSTALL_HINT = 'dotnet tool install --global scip-dotnet (requires .NET 8.0+ SDK; experimental indexer)';
|
|
175
|
+
const csharpEntry = {
|
|
176
|
+
bin: 'scip-dotnet',
|
|
177
|
+
languages: ['csharp'],
|
|
178
|
+
markers: ['*.csproj', '*.sln'],
|
|
179
|
+
toolchainCheck() {
|
|
180
|
+
return commandExists('scip-dotnet') && commandExists('dotnet');
|
|
181
|
+
},
|
|
182
|
+
run(dir, outPath) {
|
|
183
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
184
|
+
// scip-dotnet's `index` command supports a native --output flag plus
|
|
185
|
+
// --working-directory (its own project/solution auto-discovery arg is
|
|
186
|
+
// positional and optional — omitted here to let it self-discover).
|
|
187
|
+
execFileSync('scip-dotnet', ['index', '--output', outPath, '--working-directory', dir], {
|
|
188
|
+
cwd: dir,
|
|
189
|
+
stdio: 'inherit',
|
|
190
|
+
});
|
|
191
|
+
if (!existsSync(outPath)) {
|
|
192
|
+
throw new Error(`scip-dotnet did not produce an index at ${outPath}`);
|
|
193
|
+
}
|
|
194
|
+
return outPath;
|
|
195
|
+
},
|
|
196
|
+
installHint: SCIP_DOTNET_INSTALL_HINT,
|
|
197
|
+
maturity: 'experimental',
|
|
198
|
+
};
|
|
199
|
+
// ─── PHP Entry ────────────────────────────────────────────────────
|
|
200
|
+
const SCIP_PHP_INSTALL_HINT = 'composer require --dev davidrjenni/scip-php && composer dump-autoload ' +
|
|
201
|
+
'(requires a composer.json with autoload psr-4/classmap entries covering ' +
|
|
202
|
+
'the sources to index; experimental, solo-maintained indexer)';
|
|
203
|
+
const phpEntry = {
|
|
204
|
+
bin: 'scip-php',
|
|
205
|
+
languages: ['php'],
|
|
206
|
+
markers: ['composer.json'],
|
|
207
|
+
toolchainCheck() {
|
|
208
|
+
return commandExists('scip-php');
|
|
209
|
+
},
|
|
210
|
+
run(dir, outPath) {
|
|
211
|
+
const producedPath = join(dir, 'index.scip');
|
|
212
|
+
// Guard against a stale root-level `index.scip` from a prior manual run
|
|
213
|
+
// (same rationale as goEntry).
|
|
214
|
+
if (existsSync(producedPath)) {
|
|
215
|
+
rmSync(producedPath);
|
|
216
|
+
}
|
|
217
|
+
// scip-php has no --output flag — it always writes `index.scip` to its
|
|
218
|
+
// cwd (verified against davidrjenni/scip-php's bin/scip-php source,
|
|
219
|
+
// which hardcodes `file_put_contents('index.scip', ...)`). Run-then-move
|
|
220
|
+
// (D2 fallback), same pattern as scip-go.
|
|
221
|
+
execFileSync('scip-php', [], { cwd: dir, stdio: 'inherit' });
|
|
222
|
+
if (!existsSync(producedPath)) {
|
|
223
|
+
throw new Error(`scip-php did not produce an index at ${producedPath}`);
|
|
224
|
+
}
|
|
225
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
226
|
+
renameSync(producedPath, outPath);
|
|
227
|
+
return outPath;
|
|
228
|
+
},
|
|
229
|
+
installHint: SCIP_PHP_INSTALL_HINT,
|
|
230
|
+
maturity: 'experimental',
|
|
231
|
+
};
|
|
232
|
+
// ─── Registry ───────────────────────────────────────────────────
|
|
233
|
+
/**
|
|
234
|
+
* Tier A shipped the Go entry; Tier B added TS/JS, Python, Rust. Tier C/D
|
|
235
|
+
* (this PR) add Java+Kotlin, C#, and PHP — the dispatcher (`index-cmd.ts`)
|
|
236
|
+
* and `detectPresentLanguages` already generalize over N entries.
|
|
237
|
+
*/
|
|
238
|
+
export const INDEXER_REGISTRY = [
|
|
239
|
+
goEntry,
|
|
240
|
+
tsEntry,
|
|
241
|
+
pythonEntry,
|
|
242
|
+
rustEntry,
|
|
243
|
+
javaEntry,
|
|
244
|
+
csharpEntry,
|
|
245
|
+
phpEntry,
|
|
246
|
+
];
|
|
247
|
+
// ─── Language Detection ─────────────────────────────────────────
|
|
248
|
+
/**
|
|
249
|
+
* Match a single marker against the repo root's entries. Most markers are
|
|
250
|
+
* exact filenames (`Set.has`); a marker starting with `*.` is a minimal
|
|
251
|
+
* glob — any-present file with that extension (e.g. C#'s `*.csproj`/`*.sln`,
|
|
252
|
+
* which have no fixed name).
|
|
253
|
+
*/
|
|
254
|
+
function markerPresent(marker, present, rootEntries) {
|
|
255
|
+
if (marker.startsWith('*.')) {
|
|
256
|
+
const ext = marker.slice(1);
|
|
257
|
+
return rootEntries.some((f) => f.endsWith(ext));
|
|
258
|
+
}
|
|
259
|
+
return present.has(marker);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Default marker-walk depth bound (D2). biogas-scale monorepos put
|
|
263
|
+
* `apps/*` and `services/*` marker dirs at depth 2; depth 4 gives headroom
|
|
264
|
+
* for `packages/x/y`-shaped nesting while bounding pathological repos'
|
|
265
|
+
* walk time. Configurable via `opts.maxDepth`.
|
|
266
|
+
*/
|
|
267
|
+
export const DEFAULT_MARKER_DEPTH = 4;
|
|
268
|
+
/**
|
|
269
|
+
* Walk `repoPath` depth-bounded (default `DEFAULT_MARKER_DEPTH`), evaluating
|
|
270
|
+
* every `INDEXER_REGISTRY` entry's markers against EVERY visited directory's
|
|
271
|
+
* entries (not just repo root) — reusing `markerPresent` per dir. Skips
|
|
272
|
+
* `EXCLUDED_DIRS` (plus `opts.extraExcludedDirs`). Root = depth 0.
|
|
273
|
+
*
|
|
274
|
+
* One pair is emitted per (entry that matches, directory) — this is how
|
|
275
|
+
* multi-lang-per-dir and same-lang-multi-dir both fall out naturally,
|
|
276
|
+
* deduped structurally (a Set keyed by `bin:dir`) so an entry with multiple
|
|
277
|
+
* matching markers in the same dir (e.g. `package.json` + `tsconfig.json`)
|
|
278
|
+
* still yields exactly one pair for that dir.
|
|
279
|
+
*
|
|
280
|
+
* Does not check toolchain availability — that remains the dispatcher's job.
|
|
281
|
+
*/
|
|
282
|
+
export function detectMarkerDirectories(repoPath, opts = {}) {
|
|
283
|
+
const maxDepth = opts.maxDepth ?? DEFAULT_MARKER_DEPTH;
|
|
284
|
+
const excluded = opts.extraExcludedDirs
|
|
285
|
+
? new Set([...EXCLUDED_DIRS, ...opts.extraExcludedDirs])
|
|
286
|
+
: EXCLUDED_DIRS;
|
|
287
|
+
const pairs = [];
|
|
288
|
+
const seen = new Set();
|
|
289
|
+
function walk(dir, depth) {
|
|
290
|
+
let dirents;
|
|
291
|
+
try {
|
|
292
|
+
dirents = readdirSync(dir, { withFileTypes: true });
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const names = dirents.map((d) => d.name);
|
|
298
|
+
const present = new Set(names);
|
|
299
|
+
for (const entry of INDEXER_REGISTRY) {
|
|
300
|
+
if (!entry.markers.some((marker) => markerPresent(marker, present, names)))
|
|
301
|
+
continue;
|
|
302
|
+
const key = `${entry.bin}:${dir}`;
|
|
303
|
+
if (seen.has(key))
|
|
304
|
+
continue;
|
|
305
|
+
seen.add(key);
|
|
306
|
+
pairs.push({ entry, dir });
|
|
307
|
+
}
|
|
308
|
+
if (depth >= maxDepth)
|
|
309
|
+
return;
|
|
310
|
+
for (const dirent of dirents) {
|
|
311
|
+
if (!dirent.isDirectory())
|
|
312
|
+
continue;
|
|
313
|
+
if (excluded.has(dirent.name))
|
|
314
|
+
continue;
|
|
315
|
+
walk(join(dir, dirent.name), depth + 1);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
walk(repoPath, 0);
|
|
319
|
+
return pairs;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Detect which registry entries are "present" in `repoPath`, based on
|
|
323
|
+
* marker files at the repo root only (depth 0 wrapper over
|
|
324
|
+
* `detectMarkerDirectories`, kept for back-compat with callers that only
|
|
325
|
+
* care about "which languages", not "in which directories").
|
|
326
|
+
* Does not check toolchain availability — that's a separate step so the
|
|
327
|
+
* dispatcher can warn about missing toolchains for detected-but-unavailable
|
|
328
|
+
* languages instead of silently skipping them.
|
|
329
|
+
*/
|
|
330
|
+
export function detectPresentLanguages(repoPath) {
|
|
331
|
+
const pairs = detectMarkerDirectories(repoPath, { maxDepth: 0 });
|
|
332
|
+
const entries = [];
|
|
333
|
+
const seen = new Set();
|
|
334
|
+
for (const { entry } of pairs) {
|
|
335
|
+
if (seen.has(entry))
|
|
336
|
+
continue;
|
|
337
|
+
seen.add(entry);
|
|
338
|
+
entries.push(entry);
|
|
339
|
+
}
|
|
340
|
+
return entries;
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=indexer-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer-registry.js","sourceRoot":"","sources":["../../src/commands/indexer-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the per-language SCIP indexer registry (D1) and marker-file
|
|
3
|
+
* language detection (spec "Language Detection").
|
|
4
|
+
*
|
|
5
|
+
* Mocked: `execFileSync` (toolchain checks/`run` under the hood) — no real
|
|
6
|
+
* toolchains are ever invoked. `detectPresentLanguages` only touches the
|
|
7
|
+
* filesystem (marker files), so it's tested against a real temp dir.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=indexer-registry.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer-registry.test.d.ts","sourceRoot":"","sources":["../../src/commands/indexer-registry.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|