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
package/src/types.ts
ADDED
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
// ── SCIP Symbol Grammar Types ──────────────────────────────
|
|
2
|
+
|
|
3
|
+
/** Parsed components of a SCIP symbol string */
|
|
4
|
+
export interface ScipSymbol {
|
|
5
|
+
/** The indexer scheme (e.g. "scip-typescript", "scip-java", "rust-analyzer") */
|
|
6
|
+
scheme: string;
|
|
7
|
+
/** Package manager (e.g. "npm", "maven", "cargo") */
|
|
8
|
+
manager: string;
|
|
9
|
+
/** Package name (e.g. "@vega/api", "com.example/mylib") */
|
|
10
|
+
packageName: string;
|
|
11
|
+
/** Package version */
|
|
12
|
+
version: string;
|
|
13
|
+
/** Descriptor chain — the path to the symbol within the file */
|
|
14
|
+
descriptors: ScipDescriptor[];
|
|
15
|
+
/** The raw, unparsed symbol string */
|
|
16
|
+
raw: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ScipDescriptor {
|
|
20
|
+
name: string;
|
|
21
|
+
suffix: DescriptorSuffix;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type DescriptorSuffix =
|
|
25
|
+
| 'namespace' // /
|
|
26
|
+
| 'type' // #
|
|
27
|
+
| 'term' // .
|
|
28
|
+
| 'method' // ().
|
|
29
|
+
| 'type-param' // [
|
|
30
|
+
| 'parameter' // ()
|
|
31
|
+
| 'meta' // :
|
|
32
|
+
| 'macro'; // !
|
|
33
|
+
|
|
34
|
+
/** A local symbol (file-scoped, no cross-file identity) */
|
|
35
|
+
export interface ScipLocalSymbol {
|
|
36
|
+
kind: 'local';
|
|
37
|
+
id: string;
|
|
38
|
+
raw: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ── Query Result Types ─────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
export interface StatsResult {
|
|
44
|
+
documents: number;
|
|
45
|
+
symbols: number;
|
|
46
|
+
definitions: number;
|
|
47
|
+
references: number;
|
|
48
|
+
indexSizeBytes: number;
|
|
49
|
+
lastBuilt: Date | null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface FileResult {
|
|
53
|
+
relativePath: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface SymbolResult {
|
|
57
|
+
startLine: number;
|
|
58
|
+
endLine: number;
|
|
59
|
+
symbol: string;
|
|
60
|
+
shortName: string;
|
|
61
|
+
signature: string | null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface MethodResult {
|
|
65
|
+
startLine: number;
|
|
66
|
+
endLine: number;
|
|
67
|
+
name: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface RefResult {
|
|
71
|
+
relativePath: string;
|
|
72
|
+
line: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface DepResult {
|
|
76
|
+
relativePath: string;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface TraceResult {
|
|
80
|
+
definitions: Array<{
|
|
81
|
+
relativePath: string;
|
|
82
|
+
startLine: number;
|
|
83
|
+
endLine: number;
|
|
84
|
+
signature: string | null;
|
|
85
|
+
}>;
|
|
86
|
+
referencedBy: string[];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface SystemResult {
|
|
90
|
+
files: string[];
|
|
91
|
+
symbols: SymbolResult[];
|
|
92
|
+
dependsOn: string[];
|
|
93
|
+
dependedOnBy: string[];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface SurfaceResult {
|
|
97
|
+
consumer: string;
|
|
98
|
+
symbol: string;
|
|
99
|
+
shortName: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export interface DeadSymbolResult {
|
|
103
|
+
relativePath: string;
|
|
104
|
+
startLine: number;
|
|
105
|
+
endLine: number;
|
|
106
|
+
loc: number;
|
|
107
|
+
symbol: string;
|
|
108
|
+
shortName: string;
|
|
109
|
+
sameFileRefs: number;
|
|
110
|
+
kind: 'dead-code' | 'file-internal';
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface DeadSummary {
|
|
114
|
+
symbols: DeadSymbolResult[];
|
|
115
|
+
totalCount: number;
|
|
116
|
+
/** Symbols with zero references anywhere — safe to delete */
|
|
117
|
+
deadCodeCount: number;
|
|
118
|
+
/** Symbols referenced only within their own file — no cross-file consumers.
|
|
119
|
+
* May be private helpers (fine) or forgotten exports (needs review). */
|
|
120
|
+
fileInternalCount: number;
|
|
121
|
+
totalLoc: number;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ── Hotspot / Fan / Coupling Types ─────────────────────────
|
|
125
|
+
|
|
126
|
+
export interface HotspotResult {
|
|
127
|
+
symbol: string;
|
|
128
|
+
shortName: string;
|
|
129
|
+
refCount: number;
|
|
130
|
+
fileCount: number;
|
|
131
|
+
definedIn: string;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export interface ImportResult {
|
|
135
|
+
symbol: string;
|
|
136
|
+
shortName: string;
|
|
137
|
+
fromFile: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export interface UnusedImportResult {
|
|
141
|
+
symbol: string;
|
|
142
|
+
shortName: string;
|
|
143
|
+
importedIn: string;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export interface OutlineNode {
|
|
147
|
+
symbol: string;
|
|
148
|
+
shortName: string;
|
|
149
|
+
startLine: number;
|
|
150
|
+
endLine: number;
|
|
151
|
+
children: OutlineNode[];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export interface MemberResult {
|
|
155
|
+
symbol: string;
|
|
156
|
+
shortName: string;
|
|
157
|
+
startLine: number;
|
|
158
|
+
endLine: number;
|
|
159
|
+
kind: string;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export interface FanResult {
|
|
163
|
+
name: string;
|
|
164
|
+
count: number;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export interface CouplingResult {
|
|
168
|
+
file1: string;
|
|
169
|
+
file2: string;
|
|
170
|
+
sharedSymbols: number;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export interface CycleResult {
|
|
174
|
+
/** Files forming a cycle, in order */
|
|
175
|
+
path: string[];
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ── Bottleneck / Isolated / Coverage / Chain Types ─────────
|
|
179
|
+
|
|
180
|
+
export interface BottleneckResult {
|
|
181
|
+
symbol: string;
|
|
182
|
+
shortName: string;
|
|
183
|
+
fanIn: number;
|
|
184
|
+
fanOut: number;
|
|
185
|
+
/** fanIn * fanOut — higher = more central coupling hub */
|
|
186
|
+
score: number;
|
|
187
|
+
definedIn: string;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export interface IsolatedResult {
|
|
191
|
+
symbol: string;
|
|
192
|
+
shortName: string;
|
|
193
|
+
relativePath: string;
|
|
194
|
+
startLine: number;
|
|
195
|
+
endLine: number;
|
|
196
|
+
loc: number;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export interface ByKindResult {
|
|
200
|
+
symbol: string;
|
|
201
|
+
shortName: string;
|
|
202
|
+
kind: number;
|
|
203
|
+
kindName: string;
|
|
204
|
+
relativePath: string;
|
|
205
|
+
startLine: number;
|
|
206
|
+
endLine: number;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export interface TestCoverageResult {
|
|
210
|
+
symbol: string;
|
|
211
|
+
shortName: string;
|
|
212
|
+
definedIn: string;
|
|
213
|
+
testFiles: string[];
|
|
214
|
+
covered: boolean;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface DocCoverageResult {
|
|
218
|
+
totalSymbols: number;
|
|
219
|
+
documented: number;
|
|
220
|
+
undocumented: number;
|
|
221
|
+
coveragePercent: number;
|
|
222
|
+
undocumentedSymbols: Array<{
|
|
223
|
+
symbol: string;
|
|
224
|
+
shortName: string;
|
|
225
|
+
relativePath: string;
|
|
226
|
+
startLine: number;
|
|
227
|
+
}>;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export interface DeepChainResult {
|
|
231
|
+
/** Files in the chain, from leaf to root */
|
|
232
|
+
chain: string[];
|
|
233
|
+
depth: number;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export interface HierarchyNode {
|
|
237
|
+
symbol: string;
|
|
238
|
+
shortName: string;
|
|
239
|
+
depth: number;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export interface CallGraphResult {
|
|
243
|
+
symbol: string;
|
|
244
|
+
shortName: string;
|
|
245
|
+
/** Symbols that call this one (incoming) */
|
|
246
|
+
callers: Array<{ symbol: string; shortName: string; file: string }>;
|
|
247
|
+
/** Symbols called by this one (outgoing) */
|
|
248
|
+
callees: Array<{ symbol: string; shortName: string; file: string }>;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// ── Drift / Wrapper / Passthrough / Stale / Complexity Types
|
|
252
|
+
|
|
253
|
+
export interface DriftResult {
|
|
254
|
+
file: string;
|
|
255
|
+
kind: 'unused-import' | 'layer-violation' | 'pattern-deviation';
|
|
256
|
+
description: string;
|
|
257
|
+
/** The dependency involved */
|
|
258
|
+
dep: string;
|
|
259
|
+
/** For layer violations: the expected layer boundary */
|
|
260
|
+
detail?: string;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export interface DriftSummary {
|
|
264
|
+
results: DriftResult[];
|
|
265
|
+
unusedImports: number;
|
|
266
|
+
layerViolations: number;
|
|
267
|
+
patternDeviations: number;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export interface WrapperCandidate {
|
|
271
|
+
symbol: string;
|
|
272
|
+
shortName: string;
|
|
273
|
+
file: string;
|
|
274
|
+
startLine: number;
|
|
275
|
+
endLine: number;
|
|
276
|
+
loc: number;
|
|
277
|
+
singleCaller: string;
|
|
278
|
+
singleCallerShort: string;
|
|
279
|
+
callerFanIn: number;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export interface PassthroughCandidate {
|
|
283
|
+
symbol: string;
|
|
284
|
+
shortName: string;
|
|
285
|
+
file: string;
|
|
286
|
+
startLine: number;
|
|
287
|
+
endLine: number;
|
|
288
|
+
loc: number;
|
|
289
|
+
forwardsTo: string;
|
|
290
|
+
forwardsToShort: string;
|
|
291
|
+
forwardsToFile: string;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export interface StaleAbstraction {
|
|
295
|
+
symbol: string;
|
|
296
|
+
shortName: string;
|
|
297
|
+
file: string;
|
|
298
|
+
startLine: number;
|
|
299
|
+
endLine: number;
|
|
300
|
+
loc: number;
|
|
301
|
+
consumers: number;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export interface ComplexityHotspot {
|
|
305
|
+
symbol: string;
|
|
306
|
+
shortName: string;
|
|
307
|
+
file: string;
|
|
308
|
+
startLine: number;
|
|
309
|
+
endLine: number;
|
|
310
|
+
loc: number;
|
|
311
|
+
fanIn: number;
|
|
312
|
+
fanOut: number;
|
|
313
|
+
calleeCount: number;
|
|
314
|
+
score: number;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// ── Similarity / Extraction Types ──────────────────────────
|
|
318
|
+
|
|
319
|
+
export interface SimilarSymbolResult {
|
|
320
|
+
symbolA: string;
|
|
321
|
+
shortNameA: string;
|
|
322
|
+
fileA: string;
|
|
323
|
+
symbolB: string;
|
|
324
|
+
shortNameB: string;
|
|
325
|
+
fileB: string;
|
|
326
|
+
/** Jaccard similarity of callee sets (0-1) */
|
|
327
|
+
similarity: number;
|
|
328
|
+
/** Callees shared by both symbols */
|
|
329
|
+
sharedCallees: string[];
|
|
330
|
+
/** Callees unique to A */
|
|
331
|
+
uniqueToA: string[];
|
|
332
|
+
/** Callees unique to B */
|
|
333
|
+
uniqueToB: string[];
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export interface SimilarFileResult {
|
|
337
|
+
fileA: string;
|
|
338
|
+
fileB: string;
|
|
339
|
+
/** Jaccard similarity of dependency sets (0-1) */
|
|
340
|
+
similarity: number;
|
|
341
|
+
sharedDeps: string[];
|
|
342
|
+
uniqueToA: string[];
|
|
343
|
+
uniqueToB: string[];
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
export interface SimilarChainResult {
|
|
347
|
+
chainA: string[];
|
|
348
|
+
chainB: string[];
|
|
349
|
+
/** Fraction of nodes shared (0-1) */
|
|
350
|
+
similarity: number;
|
|
351
|
+
/** Edit distance between the two chains */
|
|
352
|
+
editDistance: number;
|
|
353
|
+
/** Indices where the chains diverge — the consolidation targets */
|
|
354
|
+
divergencePoints: Array<{
|
|
355
|
+
index: number;
|
|
356
|
+
nodeA: string;
|
|
357
|
+
nodeB: string;
|
|
358
|
+
}>;
|
|
359
|
+
/** Shared prefix */
|
|
360
|
+
commonPrefix: string[];
|
|
361
|
+
/** Shared suffix */
|
|
362
|
+
commonSuffix: string[];
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
export interface ExtractCandidate {
|
|
366
|
+
symbol: string;
|
|
367
|
+
shortName: string;
|
|
368
|
+
relativePath: string;
|
|
369
|
+
startLine: number;
|
|
370
|
+
endLine: number;
|
|
371
|
+
loc: number;
|
|
372
|
+
/** Total callees */
|
|
373
|
+
totalCallees: number;
|
|
374
|
+
/** Distinct clusters of callees (natural extraction seams) */
|
|
375
|
+
clusters: Array<{
|
|
376
|
+
callees: string[];
|
|
377
|
+
/** How isolated this cluster is from the rest (0-1, higher = more extractable) */
|
|
378
|
+
isolation: number;
|
|
379
|
+
}>;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// ── Health / Convergence Types ──────────────────────────────
|
|
383
|
+
|
|
384
|
+
export interface HealthAction {
|
|
385
|
+
category: string;
|
|
386
|
+
description: string;
|
|
387
|
+
effort: 'low' | 'medium' | 'high';
|
|
388
|
+
impact: 'low' | 'medium' | 'high';
|
|
389
|
+
count: number;
|
|
390
|
+
locRecoverable: number;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
export interface HealthReport {
|
|
394
|
+
score: number;
|
|
395
|
+
overview: { documents: number; symbols: number; indexSizeBytes: number };
|
|
396
|
+
findings: {
|
|
397
|
+
deadSymbols: number;
|
|
398
|
+
deadLoc: number;
|
|
399
|
+
isolatedSymbols: number;
|
|
400
|
+
isolatedLoc: number;
|
|
401
|
+
cycles: number;
|
|
402
|
+
similarPairs: number;
|
|
403
|
+
extractionCandidates: number;
|
|
404
|
+
wrappers: number;
|
|
405
|
+
passthroughs: number;
|
|
406
|
+
staleTypes: number;
|
|
407
|
+
driftedFiles: number;
|
|
408
|
+
complexityHotspotCount: number;
|
|
409
|
+
testCoveragePercent: number;
|
|
410
|
+
};
|
|
411
|
+
actions: HealthAction[];
|
|
412
|
+
topComplexity: Array<{ symbol: string; score: number }>;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
export interface ConvergenceResult {
|
|
416
|
+
symbolA: { symbol: string; shortName: string; file: string; loc: number };
|
|
417
|
+
symbolB: { symbol: string; shortName: string; file: string; loc: number };
|
|
418
|
+
similarity: number;
|
|
419
|
+
sharedCallees: string[];
|
|
420
|
+
uniqueToA: string[];
|
|
421
|
+
uniqueToB: string[];
|
|
422
|
+
consolidationStrategy: string;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// ── Code / Complexity / Dataflow / Slice Types ─────────────
|
|
426
|
+
|
|
427
|
+
export interface CodeResult {
|
|
428
|
+
symbol: string;
|
|
429
|
+
shortName: string;
|
|
430
|
+
relativePath: string;
|
|
431
|
+
startLine: number;
|
|
432
|
+
endLine: number;
|
|
433
|
+
language: string | null;
|
|
434
|
+
source: string;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export interface ComplexityResult {
|
|
438
|
+
symbol: string;
|
|
439
|
+
shortName: string;
|
|
440
|
+
relativePath: string;
|
|
441
|
+
startLine: number;
|
|
442
|
+
endLine: number;
|
|
443
|
+
loc: number;
|
|
444
|
+
/** Branch count from source-level regex (if, else, for, while, switch, catch, ternary, &&, ||) */
|
|
445
|
+
branches: number;
|
|
446
|
+
/** Cyclomatic complexity estimate: branches + 1 */
|
|
447
|
+
cyclomaticEstimate: number;
|
|
448
|
+
/** Number of distinct callees within the definition */
|
|
449
|
+
calleeCount: number;
|
|
450
|
+
fanIn: number;
|
|
451
|
+
fanOut: number;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
export interface DataflowResult {
|
|
455
|
+
symbol: string;
|
|
456
|
+
shortName: string;
|
|
457
|
+
relativePath: string;
|
|
458
|
+
/** Where the symbol is defined (role=1) */
|
|
459
|
+
definitionSites: Array<{ file: string; line: number }>;
|
|
460
|
+
/** Where the symbol is referenced (role=0) */
|
|
461
|
+
usageSites: Array<{ file: string; line: number; enclosingSymbol: string; enclosingShort: string }>;
|
|
462
|
+
/** Symbols that appear in the same function that defines this symbol (producers/inputs) */
|
|
463
|
+
producers: Array<{ symbol: string; shortName: string; file: string }>;
|
|
464
|
+
/** Symbols defined by functions that reference this symbol (consumers/outputs) */
|
|
465
|
+
consumers: Array<{ symbol: string; shortName: string; file: string }>;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
export interface SliceResult {
|
|
469
|
+
symbol: string;
|
|
470
|
+
shortName: string;
|
|
471
|
+
direction: 'backward' | 'forward';
|
|
472
|
+
/** Backward: symbols referenced in the same function as the target's definition (inputs) */
|
|
473
|
+
/** Forward: symbols defined by functions that reference the target (outputs) */
|
|
474
|
+
connectedSymbols: Array<{ symbol: string; shortName: string; file: string; relationship: string }>;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// ── Affected / Change Surface / Diff Impact Types ────────
|
|
478
|
+
|
|
479
|
+
export interface AffectedResult {
|
|
480
|
+
symbol: string;
|
|
481
|
+
shortName: string;
|
|
482
|
+
file: string;
|
|
483
|
+
depth: number;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
export interface ChangeSurfaceEntry {
|
|
487
|
+
symbol: string;
|
|
488
|
+
shortName: string;
|
|
489
|
+
startLine: number;
|
|
490
|
+
endLine: number;
|
|
491
|
+
externalConsumers: number;
|
|
492
|
+
testFiles: string[];
|
|
493
|
+
riskLevel: 'low' | 'medium' | 'high';
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
export interface ChangeSurfaceResult {
|
|
497
|
+
file: string;
|
|
498
|
+
symbols: ChangeSurfaceEntry[];
|
|
499
|
+
totalExternalConsumers: number;
|
|
500
|
+
testCoveragePercent: number;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
export interface DiffImpactResult {
|
|
504
|
+
changedFiles: string[];
|
|
505
|
+
changedSymbols: Array<{ symbol: string; shortName: string; file: string; fanIn: number }>;
|
|
506
|
+
affectedConsumers: Array<{ file: string; consumedSymbols: number }>;
|
|
507
|
+
uncoveredSymbols: Array<{ symbol: string; shortName: string; file: string }>;
|
|
508
|
+
summary: {
|
|
509
|
+
totalChangedFiles: number;
|
|
510
|
+
totalChangedSymbols: number;
|
|
511
|
+
totalAffectedFiles: number;
|
|
512
|
+
testCoveragePercent: number;
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// ── Dead Code Query Options ────────────────────────────────
|
|
517
|
+
|
|
518
|
+
export interface DeadOptions {
|
|
519
|
+
scope?: string;
|
|
520
|
+
minLoc?: number;
|
|
521
|
+
includeTests?: boolean;
|
|
522
|
+
skipBarrels?: boolean;
|
|
523
|
+
includeMembers?: boolean;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// ── Auto-Install Types ────────────────────────────────────
|
|
527
|
+
|
|
528
|
+
export interface InstallMethod {
|
|
529
|
+
/** Human-readable label (e.g., "npm", "pip", "go install") */
|
|
530
|
+
label: string;
|
|
531
|
+
/** Binary that must exist for this install method to work (e.g., "npm", "pip3", "go") */
|
|
532
|
+
prerequisite: string;
|
|
533
|
+
/** Command to execute */
|
|
534
|
+
binary: string;
|
|
535
|
+
/** Arguments for the command */
|
|
536
|
+
args: string[];
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
// ── Reindex Types ──────────────────────────────────────────
|
|
540
|
+
|
|
541
|
+
export type SupportedLanguage =
|
|
542
|
+
| 'typescript'
|
|
543
|
+
| 'javascript'
|
|
544
|
+
| 'java'
|
|
545
|
+
| 'scala'
|
|
546
|
+
| 'kotlin'
|
|
547
|
+
| 'rust'
|
|
548
|
+
| 'python'
|
|
549
|
+
| 'ruby'
|
|
550
|
+
| 'go'
|
|
551
|
+
| 'cpp'
|
|
552
|
+
| 'c'
|
|
553
|
+
| 'csharp'
|
|
554
|
+
| 'dart'
|
|
555
|
+
| 'php';
|
|
556
|
+
|
|
557
|
+
export interface IndexerConfig {
|
|
558
|
+
language: SupportedLanguage;
|
|
559
|
+
/** The npm/cargo/pip package or binary that produces the SCIP index */
|
|
560
|
+
indexerBinary: string;
|
|
561
|
+
/** Command to check if the indexer is installed */
|
|
562
|
+
checkCommand: string;
|
|
563
|
+
/** Returns the binary + args array for execFileSync (no shell injection) */
|
|
564
|
+
indexArgs: (opts: {
|
|
565
|
+
projectRoot: string;
|
|
566
|
+
outputPath: string;
|
|
567
|
+
pnpmWorkspaces?: boolean;
|
|
568
|
+
}) => { binary: string; args: string[] };
|
|
569
|
+
/** Marker files that indicate this language is present */
|
|
570
|
+
markerFiles: string[];
|
|
571
|
+
/** Installation methods to try in order of preference */
|
|
572
|
+
installMethods?: InstallMethod[];
|
|
573
|
+
/** URL for manual installation if auto-install fails */
|
|
574
|
+
installUrl?: string;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
// ── Database Config ────────────────────────────────────────
|
|
578
|
+
|
|
579
|
+
export interface ScipQueryConfig {
|
|
580
|
+
/** Path to the SQLite database (index.db) */
|
|
581
|
+
dbPath: string;
|
|
582
|
+
/** Path to the SCIP protobuf index (index.scip) */
|
|
583
|
+
indexPath: string;
|
|
584
|
+
/** Project root directory */
|
|
585
|
+
projectRoot: string;
|
|
586
|
+
/** Paths to .gitignore files to load for filtering */
|
|
587
|
+
gitignorePaths?: string[];
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
// ── Project Config (.scipquery.json) ───────────────────────
|
|
591
|
+
|
|
592
|
+
export interface ProjectConfig {
|
|
593
|
+
/** Override which languages to index (default: auto-detect) */
|
|
594
|
+
languages?: SupportedLanguage[];
|
|
595
|
+
/** Watch mode settings */
|
|
596
|
+
watch?: WatchConfig;
|
|
597
|
+
/** Per-language indexer overrides */
|
|
598
|
+
indexer?: Partial<Record<SupportedLanguage, IndexerOverrides>>;
|
|
599
|
+
/** Override the database storage path (default: ~/.cache/scip-query/<hash>/) */
|
|
600
|
+
dbPath?: string;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
export interface WatchConfig {
|
|
604
|
+
/** Enable file watching (default: false, must opt in) */
|
|
605
|
+
enabled?: boolean;
|
|
606
|
+
/** Ms to wait after the last file change before triggering reindex (default: 30000) */
|
|
607
|
+
debounceMs?: number;
|
|
608
|
+
/** Minimum ms between reindex completions (default: 60000) */
|
|
609
|
+
cooldownMs?: number;
|
|
610
|
+
/** Extra glob patterns to ignore beyond .gitignore */
|
|
611
|
+
ignore?: string[];
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
export interface IndexerOverrides {
|
|
615
|
+
/** Enable pnpm workspace support (TypeScript) */
|
|
616
|
+
pnpmWorkspaces?: boolean;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
// ── Redundant Re-export Types ─────────────────────────────
|
|
620
|
+
|
|
621
|
+
export interface RedundantReexport {
|
|
622
|
+
barrelFile: string;
|
|
623
|
+
symbol: string;
|
|
624
|
+
shortName: string;
|
|
625
|
+
originalFile: string;
|
|
626
|
+
/** How many consumers import through the barrel */
|
|
627
|
+
barrelConsumers: number;
|
|
628
|
+
/** How many consumers import directly from the source */
|
|
629
|
+
directConsumers: number;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
// ── Similar Signature Types ───────────────────────────────
|
|
633
|
+
|
|
634
|
+
export interface SimilarSignatureGroup {
|
|
635
|
+
/** The normalized signature shared by all functions in the group */
|
|
636
|
+
signature: string;
|
|
637
|
+
/** Functions that share this signature */
|
|
638
|
+
functions: Array<{
|
|
639
|
+
symbol: string;
|
|
640
|
+
shortName: string;
|
|
641
|
+
file: string;
|
|
642
|
+
startLine: number;
|
|
643
|
+
endLine: number;
|
|
644
|
+
loc: number;
|
|
645
|
+
}>;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
// ── Watch State ────────────────────────────────────────────
|
|
649
|
+
|
|
650
|
+
export type WatcherStatus =
|
|
651
|
+
| { state: 'idle' }
|
|
652
|
+
| { state: 'waiting'; changedFiles: number; reindexAt: number }
|
|
653
|
+
| { state: 'indexing'; startedAt: number }
|
|
654
|
+
| { state: 'cooldown'; until: number; dirty: boolean };
|