scip-query 0.1.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/IMPROVEMENTS.md +143 -0
- package/PLAN.md +320 -0
- package/README.md +1213 -0
- package/dist/chunk-2QZ23IBN.js +55 -0
- package/dist/chunk-2QZ23IBN.js.map +1 -0
- package/dist/chunk-36OMT7ZJ.js +144 -0
- package/dist/chunk-36OMT7ZJ.js.map +1 -0
- package/dist/chunk-3E2X7RIE.js +101 -0
- package/dist/chunk-3E2X7RIE.js.map +1 -0
- package/dist/chunk-3UOUTZQT.js +45 -0
- package/dist/chunk-3UOUTZQT.js.map +1 -0
- package/dist/chunk-3ZZJVBIO.js +88 -0
- package/dist/chunk-3ZZJVBIO.js.map +1 -0
- package/dist/chunk-4TYLS5XX.js +10 -0
- package/dist/chunk-4TYLS5XX.js.map +1 -0
- package/dist/chunk-5FGUEU7N.js +101 -0
- package/dist/chunk-5FGUEU7N.js.map +1 -0
- package/dist/chunk-5WTJAXY2.js +61 -0
- package/dist/chunk-5WTJAXY2.js.map +1 -0
- package/dist/chunk-6NBLIDF4.js +24 -0
- package/dist/chunk-6NBLIDF4.js.map +1 -0
- package/dist/chunk-6SXADWLW.js +43 -0
- package/dist/chunk-6SXADWLW.js.map +1 -0
- package/dist/chunk-6VJ6Q7IE.js +65 -0
- package/dist/chunk-6VJ6Q7IE.js.map +1 -0
- package/dist/chunk-7OZPA5OO.js +258 -0
- package/dist/chunk-7OZPA5OO.js.map +1 -0
- package/dist/chunk-BEPIEVLR.js +76 -0
- package/dist/chunk-BEPIEVLR.js.map +1 -0
- package/dist/chunk-BFSCMC22.js +42 -0
- package/dist/chunk-BFSCMC22.js.map +1 -0
- package/dist/chunk-BP2ATLK2.js +110 -0
- package/dist/chunk-BP2ATLK2.js.map +1 -0
- package/dist/chunk-CM454WL3.js +114 -0
- package/dist/chunk-CM454WL3.js.map +1 -0
- package/dist/chunk-DCKMSTJ4.js +74 -0
- package/dist/chunk-DCKMSTJ4.js.map +1 -0
- package/dist/chunk-DEZKCZXD.js +40 -0
- package/dist/chunk-DEZKCZXD.js.map +1 -0
- package/dist/chunk-DVWGWHFW.js +99 -0
- package/dist/chunk-DVWGWHFW.js.map +1 -0
- package/dist/chunk-EMDQWNYR.js +102 -0
- package/dist/chunk-EMDQWNYR.js.map +1 -0
- package/dist/chunk-FFSWWE5O.js +33 -0
- package/dist/chunk-FFSWWE5O.js.map +1 -0
- package/dist/chunk-FGXRVW7G.js +73 -0
- package/dist/chunk-FGXRVW7G.js.map +1 -0
- package/dist/chunk-FUHJCHS4.js +158 -0
- package/dist/chunk-FUHJCHS4.js.map +1 -0
- package/dist/chunk-GJFURBEW.js +64 -0
- package/dist/chunk-GJFURBEW.js.map +1 -0
- package/dist/chunk-GTILYBH6.js +102 -0
- package/dist/chunk-GTILYBH6.js.map +1 -0
- package/dist/chunk-JJP7KQND.js +1 -0
- package/dist/chunk-JJP7KQND.js.map +1 -0
- package/dist/chunk-JKP5GH6T.js +213 -0
- package/dist/chunk-JKP5GH6T.js.map +1 -0
- package/dist/chunk-KCBMVQL5.js +38 -0
- package/dist/chunk-KCBMVQL5.js.map +1 -0
- package/dist/chunk-KVSW5KYP.js +78 -0
- package/dist/chunk-KVSW5KYP.js.map +1 -0
- package/dist/chunk-LAWMH22O.js +172 -0
- package/dist/chunk-LAWMH22O.js.map +1 -0
- package/dist/chunk-LB7OS35Q.js +72 -0
- package/dist/chunk-LB7OS35Q.js.map +1 -0
- package/dist/chunk-LUSIFBXO.js +57 -0
- package/dist/chunk-LUSIFBXO.js.map +1 -0
- package/dist/chunk-MBVNHJVN.js +44 -0
- package/dist/chunk-MBVNHJVN.js.map +1 -0
- package/dist/chunk-MGNMHKX3.js +15 -0
- package/dist/chunk-MGNMHKX3.js.map +1 -0
- package/dist/chunk-N5KEREIA.js +41 -0
- package/dist/chunk-N5KEREIA.js.map +1 -0
- package/dist/chunk-NDSQYIWT.js +71 -0
- package/dist/chunk-NDSQYIWT.js.map +1 -0
- package/dist/chunk-NUZ4OMU3.js +28 -0
- package/dist/chunk-NUZ4OMU3.js.map +1 -0
- package/dist/chunk-QOV2R2WT.js +170 -0
- package/dist/chunk-QOV2R2WT.js.map +1 -0
- package/dist/chunk-SEFSL2GF.js +78 -0
- package/dist/chunk-SEFSL2GF.js.map +1 -0
- package/dist/chunk-T6ARFSBZ.js +103 -0
- package/dist/chunk-T6ARFSBZ.js.map +1 -0
- package/dist/chunk-TBP6BICL.js +46 -0
- package/dist/chunk-TBP6BICL.js.map +1 -0
- package/dist/chunk-TDNNOR6D.js +97 -0
- package/dist/chunk-TDNNOR6D.js.map +1 -0
- package/dist/chunk-TSPZOMHC.js +195 -0
- package/dist/chunk-TSPZOMHC.js.map +1 -0
- package/dist/chunk-UNTPVD36.js +55 -0
- package/dist/chunk-UNTPVD36.js.map +1 -0
- package/dist/chunk-VRUJH4BO.js +88 -0
- package/dist/chunk-VRUJH4BO.js.map +1 -0
- package/dist/chunk-VZ7AMAFL.js +76 -0
- package/dist/chunk-VZ7AMAFL.js.map +1 -0
- package/dist/chunk-XFXDXEUN.js +24 -0
- package/dist/chunk-XFXDXEUN.js.map +1 -0
- package/dist/chunk-YZAA4LYG.js +169 -0
- package/dist/chunk-YZAA4LYG.js.map +1 -0
- package/dist/chunk-Z73NYSBZ.js +92 -0
- package/dist/chunk-Z73NYSBZ.js.map +1 -0
- package/dist/chunk-ZJRYBOEE.js +125 -0
- package/dist/chunk-ZJRYBOEE.js.map +1 -0
- package/dist/cli.js +5798 -0
- package/dist/cli.js.map +1 -0
- package/dist/db-BxaevAyc.d.ts +683 -0
- package/dist/index.d.ts +254 -0
- package/dist/index.js +1271 -0
- package/dist/index.js.map +1 -0
- package/dist/postinstall.js +167 -0
- package/dist/postinstall.js.map +1 -0
- package/dist/queries/affected.d.ts +14 -0
- package/dist/queries/affected.js +9 -0
- package/dist/queries/affected.js.map +1 -0
- package/dist/queries/bottlenecks.d.ts +18 -0
- package/dist/queries/bottlenecks.js +8 -0
- package/dist/queries/bottlenecks.js.map +1 -0
- package/dist/queries/by-kind.d.ts +20 -0
- package/dist/queries/by-kind.js +10 -0
- package/dist/queries/by-kind.js.map +1 -0
- package/dist/queries/call-graph.d.ts +13 -0
- package/dist/queries/call-graph.js +9 -0
- package/dist/queries/call-graph.js.map +1 -0
- package/dist/queries/change-surface.d.ts +10 -0
- package/dist/queries/change-surface.js +9 -0
- package/dist/queries/change-surface.js.map +1 -0
- package/dist/queries/clean-signature.d.ts +9 -0
- package/dist/queries/clean-signature.js +7 -0
- package/dist/queries/clean-signature.js.map +1 -0
- package/dist/queries/code.d.ts +17 -0
- package/dist/queries/code.js +9 -0
- package/dist/queries/code.js.map +1 -0
- package/dist/queries/complexity-hotspots.d.ts +19 -0
- package/dist/queries/complexity-hotspots.js +9 -0
- package/dist/queries/complexity-hotspots.js.map +1 -0
- package/dist/queries/complexity.d.ts +13 -0
- package/dist/queries/complexity.js +9 -0
- package/dist/queries/complexity.js.map +1 -0
- package/dist/queries/convergence.d.ts +11 -0
- package/dist/queries/convergence.js +9 -0
- package/dist/queries/convergence.js.map +1 -0
- package/dist/queries/coupling.d.ts +17 -0
- package/dist/queries/coupling.js +9 -0
- package/dist/queries/coupling.js.map +1 -0
- package/dist/queries/cycles.d.ts +16 -0
- package/dist/queries/cycles.js +8 -0
- package/dist/queries/cycles.js.map +1 -0
- package/dist/queries/dataflow.d.ts +19 -0
- package/dist/queries/dataflow.js +9 -0
- package/dist/queries/dataflow.js.map +1 -0
- package/dist/queries/dead.d.ts +10 -0
- package/dist/queries/dead.js +9 -0
- package/dist/queries/dead.js.map +1 -0
- package/dist/queries/deep-chains.d.ts +16 -0
- package/dist/queries/deep-chains.js +8 -0
- package/dist/queries/deep-chains.js.map +1 -0
- package/dist/queries/deps.d.ts +9 -0
- package/dist/queries/deps.js +9 -0
- package/dist/queries/deps.js.map +1 -0
- package/dist/queries/diff-impact.d.ts +13 -0
- package/dist/queries/diff-impact.js +9 -0
- package/dist/queries/diff-impact.js.map +1 -0
- package/dist/queries/doc-coverage.d.ts +14 -0
- package/dist/queries/doc-coverage.js +8 -0
- package/dist/queries/doc-coverage.js.map +1 -0
- package/dist/queries/drift.d.ts +25 -0
- package/dist/queries/drift.js +8 -0
- package/dist/queries/drift.js.map +1 -0
- package/dist/queries/extract-candidates.d.ts +25 -0
- package/dist/queries/extract-candidates.js +9 -0
- package/dist/queries/extract-candidates.js.map +1 -0
- package/dist/queries/fan.d.ts +29 -0
- package/dist/queries/fan.js +14 -0
- package/dist/queries/fan.js.map +1 -0
- package/dist/queries/files.d.ts +6 -0
- package/dist/queries/files.js +7 -0
- package/dist/queries/files.js.map +1 -0
- package/dist/queries/health.d.ts +18 -0
- package/dist/queries/health.js +21 -0
- package/dist/queries/health.js.map +1 -0
- package/dist/queries/hierarchy.d.ts +13 -0
- package/dist/queries/hierarchy.js +8 -0
- package/dist/queries/hierarchy.js.map +1 -0
- package/dist/queries/hotspots.d.ts +13 -0
- package/dist/queries/hotspots.js +8 -0
- package/dist/queries/hotspots.js.map +1 -0
- package/dist/queries/imports.d.ts +19 -0
- package/dist/queries/imports.js +12 -0
- package/dist/queries/imports.js.map +1 -0
- package/dist/queries/index.d.ts +47 -0
- package/dist/queries/index.js +207 -0
- package/dist/queries/index.js.map +1 -0
- package/dist/queries/isolated.d.ts +14 -0
- package/dist/queries/isolated.js +9 -0
- package/dist/queries/isolated.js.map +1 -0
- package/dist/queries/members.d.ts +10 -0
- package/dist/queries/members.js +8 -0
- package/dist/queries/members.js.map +1 -0
- package/dist/queries/methods.d.ts +6 -0
- package/dist/queries/methods.js +8 -0
- package/dist/queries/methods.js.map +1 -0
- package/dist/queries/outline.d.ts +10 -0
- package/dist/queries/outline.js +8 -0
- package/dist/queries/outline.js.map +1 -0
- package/dist/queries/passthrough-candidates.d.ts +18 -0
- package/dist/queries/passthrough-candidates.js +9 -0
- package/dist/queries/passthrough-candidates.js.map +1 -0
- package/dist/queries/redundant-reexports.d.ts +22 -0
- package/dist/queries/redundant-reexports.js +8 -0
- package/dist/queries/redundant-reexports.js.map +1 -0
- package/dist/queries/refs.d.ts +6 -0
- package/dist/queries/refs.js +7 -0
- package/dist/queries/refs.js.map +1 -0
- package/dist/queries/similar-chains.d.ts +29 -0
- package/dist/queries/similar-chains.js +8 -0
- package/dist/queries/similar-chains.js.map +1 -0
- package/dist/queries/similar-files.d.ts +19 -0
- package/dist/queries/similar-files.js +8 -0
- package/dist/queries/similar-files.js.map +1 -0
- package/dist/queries/similar-signatures.d.ts +21 -0
- package/dist/queries/similar-signatures.js +8 -0
- package/dist/queries/similar-signatures.js.map +1 -0
- package/dist/queries/similar.d.ts +34 -0
- package/dist/queries/similar.js +11 -0
- package/dist/queries/similar.js.map +1 -0
- package/dist/queries/slice.d.ts +21 -0
- package/dist/queries/slice.js +9 -0
- package/dist/queries/slice.js.map +1 -0
- package/dist/queries/stale-abstractions.d.ts +18 -0
- package/dist/queries/stale-abstractions.js +9 -0
- package/dist/queries/stale-abstractions.js.map +1 -0
- package/dist/queries/stats.d.ts +6 -0
- package/dist/queries/stats.js +7 -0
- package/dist/queries/stats.js.map +1 -0
- package/dist/queries/surface.d.ts +7 -0
- package/dist/queries/surface.js +8 -0
- package/dist/queries/surface.js.map +1 -0
- package/dist/queries/symbols.d.ts +6 -0
- package/dist/queries/symbols.js +9 -0
- package/dist/queries/symbols.js.map +1 -0
- package/dist/queries/system.d.ts +7 -0
- package/dist/queries/system.js +9 -0
- package/dist/queries/system.js.map +1 -0
- package/dist/queries/test-coverage.d.ts +22 -0
- package/dist/queries/test-coverage.js +11 -0
- package/dist/queries/test-coverage.js.map +1 -0
- package/dist/queries/trace.d.ts +6 -0
- package/dist/queries/trace.js +8 -0
- package/dist/queries/trace.js.map +1 -0
- package/dist/queries/wrapper-candidates.d.ts +17 -0
- package/dist/queries/wrapper-candidates.js +9 -0
- package/dist/queries/wrapper-candidates.js.map +1 -0
- package/dist/reindex-worker.js +368 -0
- package/dist/reindex-worker.js.map +1 -0
- package/docs/AGENT_GUIDE.md +359 -0
- package/package.json +70 -0
- package/reports/debloat/2026-04-10-scip-query-self-audit.md +161 -0
- package/skills/concrete-plan/SKILL.md +318 -0
- package/skills/scip-debloat/SKILL.md +413 -0
- package/skills/scip-explore/SKILL.md +235 -0
- package/skills/scip-verify/SKILL.md +323 -0
- package/src/cli.ts +1480 -0
- package/src/config.ts +117 -0
- package/src/db.ts +127 -0
- package/src/gitignore-filter.ts +143 -0
- package/src/index.ts +11 -0
- package/src/postinstall.ts +8 -0
- package/src/queries/affected.ts +86 -0
- package/src/queries/bottlenecks.ts +67 -0
- package/src/queries/by-kind.ts +204 -0
- package/src/queries/call-graph.ts +66 -0
- package/src/queries/change-surface.ts +110 -0
- package/src/queries/clean-signature.ts +22 -0
- package/src/queries/code.ts +101 -0
- package/src/queries/complexity-hotspots.ts +119 -0
- package/src/queries/complexity.ts +152 -0
- package/src/queries/convergence.ts +82 -0
- package/src/queries/coupling.ts +99 -0
- package/src/queries/cycles.ts +78 -0
- package/src/queries/dataflow.ts +128 -0
- package/src/queries/dead.ts +122 -0
- package/src/queries/deep-chains.ts +59 -0
- package/src/queries/deps.ts +46 -0
- package/src/queries/diff-impact.ts +204 -0
- package/src/queries/doc-coverage.ts +86 -0
- package/src/queries/drift.ts +224 -0
- package/src/queries/extract-candidates.ts +167 -0
- package/src/queries/fan.ts +148 -0
- package/src/queries/files.ts +16 -0
- package/src/queries/health.ts +324 -0
- package/src/queries/hierarchy.ts +49 -0
- package/src/queries/hotspots.ts +53 -0
- package/src/queries/imports.ts +95 -0
- package/src/queries/index.ts +45 -0
- package/src/queries/isolated.ts +67 -0
- package/src/queries/members.ts +54 -0
- package/src/queries/methods.ts +27 -0
- package/src/queries/outline.ts +52 -0
- package/src/queries/passthrough-candidates.ts +94 -0
- package/src/queries/redundant-reexports.ts +170 -0
- package/src/queries/refs.ts +27 -0
- package/src/queries/similar-chains.ts +314 -0
- package/src/queries/similar-files.ts +140 -0
- package/src/queries/similar-signatures.ts +151 -0
- package/src/queries/similar.ts +305 -0
- package/src/queries/slice.ts +154 -0
- package/src/queries/stale-abstractions.ts +82 -0
- package/src/queries/stats.ts +22 -0
- package/src/queries/surface.ts +34 -0
- package/src/queries/symbols.ts +39 -0
- package/src/queries/system.ts +86 -0
- package/src/queries/test-coverage.ts +106 -0
- package/src/queries/trace.ts +55 -0
- package/src/queries/wrapper-candidates.ts +112 -0
- package/src/query-support.ts +226 -0
- package/src/reindex/detect.ts +58 -0
- package/src/reindex/index.ts +153 -0
- package/src/reindex/indexers.ts +220 -0
- package/src/reindex/install.ts +125 -0
- package/src/reindex-worker.ts +35 -0
- package/src/setup.ts +202 -0
- package/src/symbol-parser.ts +278 -0
- package/src/types.ts +654 -0
- package/src/watch.ts +274 -0
- package/tests/gitignore-filter.test.ts +48 -0
- package/tests/queries.test.ts +300 -0
- package/tests/symbol-parser.test.ts +157 -0
- package/tsconfig.json +20 -0
- package/tsup.config.ts +40 -0
- package/vitest.config.ts +7 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import type { SupportedLanguage } from '../types.js';
|
|
4
|
+
|
|
5
|
+
interface LanguageMarker {
|
|
6
|
+
language: SupportedLanguage;
|
|
7
|
+
files: string[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Marker files that indicate a language is present in a project.
|
|
12
|
+
* Ordered roughly by specificity — more specific markers first.
|
|
13
|
+
*/
|
|
14
|
+
const LANGUAGE_MARKERS: LanguageMarker[] = [
|
|
15
|
+
{ language: 'typescript', files: ['tsconfig.json', 'tsconfig.base.json'] },
|
|
16
|
+
{ language: 'rust', files: ['Cargo.toml'] },
|
|
17
|
+
{ language: 'go', files: ['go.mod'] },
|
|
18
|
+
{ language: 'java', files: ['pom.xml', 'build.gradle', 'build.gradle.kts'] },
|
|
19
|
+
{ language: 'kotlin', files: ['build.gradle.kts'] },
|
|
20
|
+
{ language: 'scala', files: ['build.sbt'] },
|
|
21
|
+
{ language: 'python', files: ['pyproject.toml', 'setup.py', 'setup.cfg', 'Pipfile'] },
|
|
22
|
+
{ language: 'ruby', files: ['Gemfile'] },
|
|
23
|
+
{ language: 'csharp', files: ['*.csproj', '*.sln'] },
|
|
24
|
+
{ language: 'dart', files: ['pubspec.yaml'] },
|
|
25
|
+
{ language: 'php', files: ['composer.json'] },
|
|
26
|
+
{ language: 'javascript', files: ['package.json'] }, // Last — very common, low specificity
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Detect which languages are present in a project directory
|
|
31
|
+
* by checking for marker files.
|
|
32
|
+
*/
|
|
33
|
+
export function detectLanguages(projectRoot: string): SupportedLanguage[] {
|
|
34
|
+
const detected: SupportedLanguage[] = [];
|
|
35
|
+
|
|
36
|
+
for (const marker of LANGUAGE_MARKERS) {
|
|
37
|
+
for (const file of marker.files) {
|
|
38
|
+
if (file.includes('*')) {
|
|
39
|
+
// Glob patterns — skip for now, basic detection only
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (existsSync(join(projectRoot, file))) {
|
|
43
|
+
if (!detected.includes(marker.language)) {
|
|
44
|
+
detected.push(marker.language);
|
|
45
|
+
}
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// If we found TypeScript, don't also report JavaScript (it's implied)
|
|
52
|
+
if (detected.includes('typescript')) {
|
|
53
|
+
const jsIdx = detected.indexOf('javascript');
|
|
54
|
+
if (jsIdx !== -1) detected.splice(jsIdx, 1);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return detected;
|
|
58
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import type { SupportedLanguage } from '../types.js';
|
|
5
|
+
import { detectLanguages } from './detect.js';
|
|
6
|
+
import { getIndexerConfig } from './indexers.js';
|
|
7
|
+
import { isBinaryAvailable, isIndexerInstalled, tryInstallIndexer, tryInstallScipCli } from './install.js';
|
|
8
|
+
|
|
9
|
+
export interface ReindexOptions {
|
|
10
|
+
projectRoot: string;
|
|
11
|
+
/** Override language detection — index only these languages */
|
|
12
|
+
languages?: SupportedLanguage[];
|
|
13
|
+
/** Path for the SCIP protobuf output (default: <projectRoot>/index.scip) */
|
|
14
|
+
outputScip?: string;
|
|
15
|
+
/** Path for the SQLite output (default: <projectRoot>/index.db) */
|
|
16
|
+
outputDb?: string;
|
|
17
|
+
/** Max Node.js heap size in MB (default: 8192) */
|
|
18
|
+
maxHeapMb?: number;
|
|
19
|
+
/** Callback for status updates */
|
|
20
|
+
onStatus?: (message: string) => void;
|
|
21
|
+
/** Extra flags for pnpm-workspace-aware TS indexing */
|
|
22
|
+
pnpmWorkspaces?: boolean;
|
|
23
|
+
/** Skip auto-install prompts */
|
|
24
|
+
skipAutoInstall?: boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ReindexResult {
|
|
28
|
+
languages: SupportedLanguage[];
|
|
29
|
+
indexPath: string;
|
|
30
|
+
dbPath: string;
|
|
31
|
+
durationMs: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Reindex a project: detect languages, run the appropriate SCIP indexer(s),
|
|
36
|
+
* and convert the output to SQLite.
|
|
37
|
+
*/
|
|
38
|
+
export async function reindex(opts: ReindexOptions): Promise<ReindexResult> {
|
|
39
|
+
const {
|
|
40
|
+
projectRoot,
|
|
41
|
+
maxHeapMb = 8192,
|
|
42
|
+
onStatus = console.log,
|
|
43
|
+
skipAutoInstall = false,
|
|
44
|
+
} = opts;
|
|
45
|
+
|
|
46
|
+
const outputScip = opts.outputScip ?? join(projectRoot, 'index.scip');
|
|
47
|
+
const outputDb = opts.outputDb ?? join(projectRoot, 'index.db');
|
|
48
|
+
const start = Date.now();
|
|
49
|
+
|
|
50
|
+
// Detect or use provided languages
|
|
51
|
+
const languages = opts.languages ?? detectLanguages(projectRoot);
|
|
52
|
+
if (languages.length === 0) {
|
|
53
|
+
throw new Error(
|
|
54
|
+
'No supported languages detected in this project. ' +
|
|
55
|
+
'Looked for: tsconfig.json, Cargo.toml, go.mod, pyproject.toml, etc.',
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
onStatus(`Detected languages: ${languages.join(', ')}`);
|
|
60
|
+
|
|
61
|
+
// Check that the scip CLI is available, auto-install if needed
|
|
62
|
+
if (!isBinaryAvailable('scip')) {
|
|
63
|
+
if (skipAutoInstall) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
'The scip CLI is required but not found on PATH.\n' +
|
|
66
|
+
'Install from: https://github.com/sourcegraph/scip/releases',
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
onStatus('scip CLI not found on PATH. Attempting auto-install...');
|
|
70
|
+
if (!tryInstallScipCli(onStatus)) {
|
|
71
|
+
throw new Error(
|
|
72
|
+
'The scip CLI is required but could not be installed.\n' +
|
|
73
|
+
'Install manually from: https://github.com/sourcegraph/scip/releases',
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const env = {
|
|
79
|
+
...process.env,
|
|
80
|
+
NODE_OPTIONS: `--max-old-space-size=${maxHeapMb}`,
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// Index each language
|
|
84
|
+
for (const lang of languages) {
|
|
85
|
+
const config = getIndexerConfig(lang);
|
|
86
|
+
|
|
87
|
+
// Check if indexer is installed, auto-install if needed
|
|
88
|
+
if (!isIndexerInstalled(config)) {
|
|
89
|
+
if (skipAutoInstall) {
|
|
90
|
+
throw new Error(
|
|
91
|
+
`${config.indexerBinary} is required to index ${lang} but not found on PATH.\n` +
|
|
92
|
+
(config.installUrl ? `Install from: ${config.installUrl}` : `Make sure ${config.indexerBinary} is installed and available on PATH.`),
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
onStatus(`${config.indexerBinary} not found. Attempting auto-install...`);
|
|
96
|
+
if (!tryInstallIndexer(config, onStatus)) {
|
|
97
|
+
throw new Error(
|
|
98
|
+
`${config.indexerBinary} is required to index ${lang} but could not be installed.\n` +
|
|
99
|
+
(config.installUrl ? `Install manually from: ${config.installUrl}` : `Make sure ${config.indexerBinary} is installed and available on PATH.`),
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
onStatus(`Indexing ${lang} with ${config.indexerBinary}...`);
|
|
105
|
+
|
|
106
|
+
const { binary, args } = config.indexArgs({
|
|
107
|
+
projectRoot,
|
|
108
|
+
outputPath: outputScip,
|
|
109
|
+
pnpmWorkspaces: opts.pnpmWorkspaces,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
try {
|
|
113
|
+
execFileSync(binary, args, {
|
|
114
|
+
cwd: projectRoot,
|
|
115
|
+
env,
|
|
116
|
+
stdio: 'pipe',
|
|
117
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
118
|
+
});
|
|
119
|
+
} catch (err) {
|
|
120
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
121
|
+
throw new Error(
|
|
122
|
+
`Failed to index ${lang} with ${config.indexerBinary}: ${msg}\n` +
|
|
123
|
+
`Make sure ${config.indexerBinary} is installed and available on PATH.`,
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Convert SCIP protobuf to SQLite
|
|
129
|
+
onStatus('Converting to SQLite...');
|
|
130
|
+
if (!existsSync(outputScip)) {
|
|
131
|
+
throw new Error(`SCIP index not found at ${outputScip} after indexing`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
execFileSync('scip', ['expt-convert', '--output', outputDb, outputScip], {
|
|
136
|
+
env,
|
|
137
|
+
stdio: 'pipe',
|
|
138
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
139
|
+
});
|
|
140
|
+
} catch (err) {
|
|
141
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
142
|
+
throw new Error(`Failed to convert SCIP index to SQLite: ${msg}`);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const durationMs = Date.now() - start;
|
|
146
|
+
onStatus(`Done in ${(durationMs / 1000).toFixed(1)}s`);
|
|
147
|
+
|
|
148
|
+
return { languages, indexPath: outputScip, dbPath: outputDb, durationMs };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export { detectLanguages } from './detect.js';
|
|
152
|
+
export { getIndexerConfig, INDEXER_CONFIGS } from './indexers.js';
|
|
153
|
+
export { isBinaryAvailable, isIndexerInstalled, tryInstallIndexer, tryInstallScipCli } from './install.js';
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import type { SupportedLanguage, IndexerConfig } from '../types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Indexer configurations for each supported language.
|
|
5
|
+
* Each entry describes how to produce a SCIP index for that language.
|
|
6
|
+
*
|
|
7
|
+
* The `scip` CLI binary is required for all languages (to convert protobuf -> SQLite).
|
|
8
|
+
* Each language also needs its own SCIP indexer installed.
|
|
9
|
+
*/
|
|
10
|
+
export const INDEXER_CONFIGS: Record<SupportedLanguage, IndexerConfig> = {
|
|
11
|
+
typescript: {
|
|
12
|
+
language: 'typescript',
|
|
13
|
+
indexerBinary: 'scip-typescript',
|
|
14
|
+
checkCommand: 'npx scip-typescript --version',
|
|
15
|
+
indexArgs: ({ outputPath, pnpmWorkspaces }) => {
|
|
16
|
+
const args = ['scip-typescript', 'index', '--infer-tsconfig', '--output', outputPath, '--no-progress-bar'];
|
|
17
|
+
if (pnpmWorkspaces) args.splice(2, 0, '--pnpm-workspaces');
|
|
18
|
+
return { binary: 'npx', args };
|
|
19
|
+
},
|
|
20
|
+
markerFiles: ['tsconfig.json'],
|
|
21
|
+
installMethods: [
|
|
22
|
+
{ label: 'npm', prerequisite: 'npm', binary: 'npm', args: ['install', '-g', '@sourcegraph/scip-typescript'] },
|
|
23
|
+
],
|
|
24
|
+
installUrl: 'https://github.com/sourcegraph/scip-typescript',
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
javascript: {
|
|
28
|
+
language: 'javascript',
|
|
29
|
+
indexerBinary: 'scip-typescript',
|
|
30
|
+
checkCommand: 'npx scip-typescript --version',
|
|
31
|
+
indexArgs: ({ outputPath }) => ({
|
|
32
|
+
binary: 'npx',
|
|
33
|
+
args: ['scip-typescript', 'index', '--infer-tsconfig', '--output', outputPath, '--no-progress-bar'],
|
|
34
|
+
}),
|
|
35
|
+
markerFiles: ['package.json'],
|
|
36
|
+
installMethods: [
|
|
37
|
+
{ label: 'npm', prerequisite: 'npm', binary: 'npm', args: ['install', '-g', '@sourcegraph/scip-typescript'] },
|
|
38
|
+
],
|
|
39
|
+
installUrl: 'https://github.com/sourcegraph/scip-typescript',
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
java: {
|
|
43
|
+
language: 'java',
|
|
44
|
+
indexerBinary: 'scip-java',
|
|
45
|
+
checkCommand: 'scip-java --version',
|
|
46
|
+
indexArgs: ({ outputPath }) => ({
|
|
47
|
+
binary: 'scip-java',
|
|
48
|
+
args: ['index', '--output', outputPath],
|
|
49
|
+
}),
|
|
50
|
+
markerFiles: ['pom.xml', 'build.gradle'],
|
|
51
|
+
installMethods: [
|
|
52
|
+
{ label: 'coursier', prerequisite: 'cs', binary: 'cs', args: ['install', 'scip-java'] },
|
|
53
|
+
],
|
|
54
|
+
installUrl: 'https://github.com/sourcegraph/scip-java/releases',
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
scala: {
|
|
58
|
+
language: 'scala',
|
|
59
|
+
indexerBinary: 'scip-java',
|
|
60
|
+
checkCommand: 'scip-java --version',
|
|
61
|
+
indexArgs: ({ outputPath }) => ({
|
|
62
|
+
binary: 'scip-java',
|
|
63
|
+
args: ['index', '--output', outputPath],
|
|
64
|
+
}),
|
|
65
|
+
markerFiles: ['build.sbt'],
|
|
66
|
+
installMethods: [
|
|
67
|
+
{ label: 'coursier', prerequisite: 'cs', binary: 'cs', args: ['install', 'scip-java'] },
|
|
68
|
+
],
|
|
69
|
+
installUrl: 'https://github.com/sourcegraph/scip-java/releases',
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
kotlin: {
|
|
73
|
+
language: 'kotlin',
|
|
74
|
+
indexerBinary: 'scip-java',
|
|
75
|
+
checkCommand: 'scip-java --version',
|
|
76
|
+
indexArgs: ({ outputPath }) => ({
|
|
77
|
+
binary: 'scip-java',
|
|
78
|
+
args: ['index', '--output', outputPath],
|
|
79
|
+
}),
|
|
80
|
+
markerFiles: ['build.gradle.kts'],
|
|
81
|
+
installMethods: [
|
|
82
|
+
{ label: 'coursier', prerequisite: 'cs', binary: 'cs', args: ['install', 'scip-java'] },
|
|
83
|
+
],
|
|
84
|
+
installUrl: 'https://github.com/sourcegraph/scip-java/releases',
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
rust: {
|
|
88
|
+
language: 'rust',
|
|
89
|
+
indexerBinary: 'rust-analyzer',
|
|
90
|
+
checkCommand: 'rust-analyzer --version',
|
|
91
|
+
indexArgs: ({ outputPath }) => ({
|
|
92
|
+
binary: 'rust-analyzer',
|
|
93
|
+
args: ['scip', '.', '--output', outputPath],
|
|
94
|
+
}),
|
|
95
|
+
markerFiles: ['Cargo.toml'],
|
|
96
|
+
installMethods: [
|
|
97
|
+
{ label: 'rustup', prerequisite: 'rustup', binary: 'rustup', args: ['component', 'add', 'rust-analyzer'] },
|
|
98
|
+
],
|
|
99
|
+
installUrl: 'https://github.com/rust-lang/rust-analyzer',
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
python: {
|
|
103
|
+
language: 'python',
|
|
104
|
+
indexerBinary: 'scip-python',
|
|
105
|
+
checkCommand: 'scip-python --version',
|
|
106
|
+
indexArgs: ({ outputPath }) => ({
|
|
107
|
+
binary: 'scip-python',
|
|
108
|
+
args: ['index', '--output', outputPath, '--project-name', 'project'],
|
|
109
|
+
}),
|
|
110
|
+
markerFiles: ['pyproject.toml', 'setup.py'],
|
|
111
|
+
installMethods: [
|
|
112
|
+
{ label: 'npm', prerequisite: 'npm', binary: 'npm', args: ['install', '-g', 'scip-python-plus'] },
|
|
113
|
+
],
|
|
114
|
+
installUrl: 'https://github.com/PlunderStruck/scip-python',
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
ruby: {
|
|
118
|
+
language: 'ruby',
|
|
119
|
+
indexerBinary: 'scip-ruby',
|
|
120
|
+
checkCommand: 'scip-ruby --version',
|
|
121
|
+
indexArgs: ({ outputPath }) => ({
|
|
122
|
+
binary: 'scip-ruby',
|
|
123
|
+
args: ['--output', outputPath],
|
|
124
|
+
}),
|
|
125
|
+
markerFiles: ['Gemfile'],
|
|
126
|
+
installMethods: [],
|
|
127
|
+
installUrl: 'https://github.com/sourcegraph/scip-ruby/releases',
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
go: {
|
|
131
|
+
language: 'go',
|
|
132
|
+
indexerBinary: 'scip-go',
|
|
133
|
+
checkCommand: 'scip-go --version',
|
|
134
|
+
indexArgs: ({ outputPath }) => ({
|
|
135
|
+
binary: 'scip-go',
|
|
136
|
+
args: ['--output', outputPath],
|
|
137
|
+
}),
|
|
138
|
+
markerFiles: ['go.mod'],
|
|
139
|
+
installMethods: [
|
|
140
|
+
{ label: 'go install', prerequisite: 'go', binary: 'go', args: ['install', 'github.com/sourcegraph/scip-go@latest'] },
|
|
141
|
+
],
|
|
142
|
+
installUrl: 'https://github.com/sourcegraph/scip-go',
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
cpp: {
|
|
146
|
+
language: 'cpp',
|
|
147
|
+
indexerBinary: 'scip-clang',
|
|
148
|
+
checkCommand: 'scip-clang --version',
|
|
149
|
+
indexArgs: ({ outputPath }) => ({
|
|
150
|
+
binary: 'scip-clang',
|
|
151
|
+
args: ['--output', outputPath],
|
|
152
|
+
}),
|
|
153
|
+
markerFiles: ['CMakeLists.txt', 'Makefile'],
|
|
154
|
+
installMethods: [],
|
|
155
|
+
installUrl: 'https://github.com/sourcegraph/scip-clang/releases',
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
c: {
|
|
159
|
+
language: 'c',
|
|
160
|
+
indexerBinary: 'scip-clang',
|
|
161
|
+
checkCommand: 'scip-clang --version',
|
|
162
|
+
indexArgs: ({ outputPath }) => ({
|
|
163
|
+
binary: 'scip-clang',
|
|
164
|
+
args: ['--output', outputPath],
|
|
165
|
+
}),
|
|
166
|
+
markerFiles: ['CMakeLists.txt', 'Makefile'],
|
|
167
|
+
installMethods: [],
|
|
168
|
+
installUrl: 'https://github.com/sourcegraph/scip-clang/releases',
|
|
169
|
+
},
|
|
170
|
+
|
|
171
|
+
csharp: {
|
|
172
|
+
language: 'csharp',
|
|
173
|
+
indexerBinary: 'scip-dotnet',
|
|
174
|
+
checkCommand: 'scip-dotnet --version',
|
|
175
|
+
indexArgs: ({ outputPath }) => ({
|
|
176
|
+
binary: 'scip-dotnet',
|
|
177
|
+
args: ['index', '--output', outputPath],
|
|
178
|
+
}),
|
|
179
|
+
markerFiles: [],
|
|
180
|
+
installMethods: [
|
|
181
|
+
{ label: 'dotnet', prerequisite: 'dotnet', binary: 'dotnet', args: ['tool', 'install', '--global', 'scip-dotnet'] },
|
|
182
|
+
],
|
|
183
|
+
installUrl: 'https://github.com/sourcegraph/scip-dotnet/releases',
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
dart: {
|
|
187
|
+
language: 'dart',
|
|
188
|
+
indexerBinary: 'scip-dart',
|
|
189
|
+
checkCommand: 'scip-dart --version',
|
|
190
|
+
indexArgs: ({ outputPath }) => ({
|
|
191
|
+
binary: 'scip-dart',
|
|
192
|
+
args: ['index', '--output', outputPath],
|
|
193
|
+
}),
|
|
194
|
+
markerFiles: ['pubspec.yaml'],
|
|
195
|
+
installMethods: [
|
|
196
|
+
{ label: 'dart pub', prerequisite: 'dart', binary: 'dart', args: ['pub', 'global', 'activate', 'scip_dart'] },
|
|
197
|
+
],
|
|
198
|
+
installUrl: 'https://github.com/Workiva/scip-dart/releases',
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
php: {
|
|
202
|
+
language: 'php',
|
|
203
|
+
indexerBinary: 'scip-php',
|
|
204
|
+
checkCommand: 'scip-php --version',
|
|
205
|
+
indexArgs: ({ outputPath }) => ({
|
|
206
|
+
binary: 'scip-php',
|
|
207
|
+
args: ['index', '--output', outputPath],
|
|
208
|
+
}),
|
|
209
|
+
markerFiles: ['composer.json'],
|
|
210
|
+
installMethods: [
|
|
211
|
+
{ label: 'composer', prerequisite: 'composer', binary: 'composer', args: ['global', 'require', 'davidrjenni/scip-php'] },
|
|
212
|
+
],
|
|
213
|
+
installUrl: 'https://github.com/davidrjenni/scip-php/releases',
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
/** Get the indexer config for a language */
|
|
218
|
+
export function getIndexerConfig(language: SupportedLanguage): IndexerConfig {
|
|
219
|
+
return INDEXER_CONFIGS[language];
|
|
220
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { platform } from 'node:os';
|
|
3
|
+
import type { IndexerConfig } from '../types.js';
|
|
4
|
+
|
|
5
|
+
const IS_WINDOWS = platform() === 'win32';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Check if a binary is available on PATH.
|
|
9
|
+
*/
|
|
10
|
+
export function isBinaryAvailable(name: string): boolean {
|
|
11
|
+
const cmd = IS_WINDOWS ? 'where' : 'which';
|
|
12
|
+
try {
|
|
13
|
+
execFileSync(cmd, [name], { stdio: 'pipe' });
|
|
14
|
+
return true;
|
|
15
|
+
} catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Check if an indexer's binary is available on PATH.
|
|
22
|
+
*/
|
|
23
|
+
export function isIndexerInstalled(config: IndexerConfig): boolean {
|
|
24
|
+
return isBinaryAvailable(config.indexerBinary);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Attempt to auto-install an indexer using its configured install methods.
|
|
29
|
+
* Tries each method in order, checking prerequisites first.
|
|
30
|
+
* Returns true if installation succeeded.
|
|
31
|
+
*/
|
|
32
|
+
export function tryInstallIndexer(
|
|
33
|
+
config: IndexerConfig,
|
|
34
|
+
onStatus: (msg: string) => void,
|
|
35
|
+
): boolean {
|
|
36
|
+
const methods = config.installMethods;
|
|
37
|
+
if (!methods?.length) {
|
|
38
|
+
onStatus(`No auto-install method available for ${config.indexerBinary}.`);
|
|
39
|
+
if (config.installUrl) {
|
|
40
|
+
onStatus(`Install manually from: ${config.installUrl}`);
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
for (const method of methods) {
|
|
46
|
+
if (!isBinaryAvailable(method.prerequisite)) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
onStatus(`Installing ${config.indexerBinary} via ${method.label}...`);
|
|
51
|
+
try {
|
|
52
|
+
execFileSync(method.binary, method.args, {
|
|
53
|
+
stdio: 'inherit',
|
|
54
|
+
timeout: 300_000,
|
|
55
|
+
env: process.env,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
if (isIndexerInstalled(config)) {
|
|
59
|
+
onStatus(`Successfully installed ${config.indexerBinary} via ${method.label}`);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
onStatus(`${method.label} command completed but ${config.indexerBinary} not found on PATH`);
|
|
63
|
+
} catch (err) {
|
|
64
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
65
|
+
onStatus(`${method.label} install failed: ${msg}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
onStatus(`Could not auto-install ${config.indexerBinary}.`);
|
|
70
|
+
if (config.installUrl) {
|
|
71
|
+
onStatus(`Install manually from: ${config.installUrl}`);
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Attempt to auto-install the `scip` CLI binary.
|
|
78
|
+
* Tries brew (macOS), then go install, then prints manual instructions.
|
|
79
|
+
* Returns true if installation succeeded.
|
|
80
|
+
*/
|
|
81
|
+
export function tryInstallScipCli(
|
|
82
|
+
onStatus: (msg: string) => void,
|
|
83
|
+
): boolean {
|
|
84
|
+
// macOS: try Homebrew first
|
|
85
|
+
if (platform() === 'darwin' && isBinaryAvailable('brew')) {
|
|
86
|
+
onStatus('Installing scip CLI via Homebrew...');
|
|
87
|
+
try {
|
|
88
|
+
execFileSync('brew', ['install', 'sourcegraph/scip/scip'], {
|
|
89
|
+
stdio: 'inherit',
|
|
90
|
+
timeout: 300_000,
|
|
91
|
+
env: process.env,
|
|
92
|
+
});
|
|
93
|
+
if (isBinaryAvailable('scip')) {
|
|
94
|
+
onStatus('Successfully installed scip CLI via Homebrew');
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
} catch (err) {
|
|
98
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
99
|
+
onStatus(`Homebrew install failed: ${msg}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Any platform: try go install
|
|
104
|
+
if (isBinaryAvailable('go')) {
|
|
105
|
+
onStatus('Installing scip CLI via go install...');
|
|
106
|
+
try {
|
|
107
|
+
execFileSync('go', ['install', 'github.com/sourcegraph/scip/cmd/scip@latest'], {
|
|
108
|
+
stdio: 'inherit',
|
|
109
|
+
timeout: 300_000,
|
|
110
|
+
env: process.env,
|
|
111
|
+
});
|
|
112
|
+
if (isBinaryAvailable('scip')) {
|
|
113
|
+
onStatus('Successfully installed scip CLI via go install');
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
} catch (err) {
|
|
117
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
118
|
+
onStatus(`go install failed: ${msg}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
onStatus('Could not auto-install scip CLI.');
|
|
123
|
+
onStatus('Install manually from: https://github.com/sourcegraph/scip/releases');
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Child process worker for background reindexing.
|
|
3
|
+
* Invoked by the watcher via fork(). Reads config from env vars.
|
|
4
|
+
*/
|
|
5
|
+
import { reindex } from './reindex/index.js';
|
|
6
|
+
import type { SupportedLanguage } from './types.js';
|
|
7
|
+
|
|
8
|
+
const projectRoot = process.env['SCIP_REINDEX_PROJECT_ROOT'];
|
|
9
|
+
const outputScip = process.env['SCIP_REINDEX_OUTPUT_SCIP'];
|
|
10
|
+
const outputDb = process.env['SCIP_REINDEX_OUTPUT_DB'];
|
|
11
|
+
const languagesRaw = process.env['SCIP_REINDEX_LANGUAGES'];
|
|
12
|
+
const pnpmWorkspaces = process.env['SCIP_REINDEX_PNPM_WORKSPACES'] === '1';
|
|
13
|
+
|
|
14
|
+
if (!projectRoot || !outputScip || !outputDb) {
|
|
15
|
+
console.error('reindex-worker: missing required env vars');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const languages = languagesRaw
|
|
20
|
+
? (languagesRaw.split(',').filter(Boolean) as SupportedLanguage[])
|
|
21
|
+
: undefined;
|
|
22
|
+
|
|
23
|
+
reindex({
|
|
24
|
+
projectRoot,
|
|
25
|
+
outputScip,
|
|
26
|
+
outputDb,
|
|
27
|
+
languages: languages?.length ? languages : undefined,
|
|
28
|
+
pnpmWorkspaces,
|
|
29
|
+
onStatus: (msg) => process.stderr.write(`[reindex] ${msg}\n`),
|
|
30
|
+
}).then(() => {
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}).catch((err) => {
|
|
33
|
+
console.error(`reindex-worker error: ${err}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
});
|