@skillsmith/core 0.2.0 → 2.0.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 +233 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
- package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/incremental.test.js +515 -0
- package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.js +1059 -0
- package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.js +369 -0
- package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.js +402 -0
- package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
- package/dist/src/analysis/adapters/base.d.ts +83 -0
- package/dist/src/analysis/adapters/base.d.ts.map +1 -0
- package/dist/src/analysis/adapters/base.js +40 -0
- package/dist/src/analysis/adapters/base.js.map +1 -0
- package/dist/src/analysis/adapters/factory.d.ts +150 -0
- package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
- package/dist/src/analysis/adapters/factory.js +244 -0
- package/dist/src/analysis/adapters/factory.js.map +1 -0
- package/dist/src/analysis/adapters/go.d.ts +131 -0
- package/dist/src/analysis/adapters/go.d.ts.map +1 -0
- package/dist/src/analysis/adapters/go.js +414 -0
- package/dist/src/analysis/adapters/go.js.map +1 -0
- package/dist/src/analysis/adapters/index.d.ts +20 -0
- package/dist/src/analysis/adapters/index.d.ts.map +1 -0
- package/dist/src/analysis/adapters/index.js +23 -0
- package/dist/src/analysis/adapters/index.js.map +1 -0
- package/dist/src/analysis/adapters/java.d.ts +154 -0
- package/dist/src/analysis/adapters/java.d.ts.map +1 -0
- package/dist/src/analysis/adapters/java.js +407 -0
- package/dist/src/analysis/adapters/java.js.map +1 -0
- package/dist/src/analysis/adapters/python.d.ts +165 -0
- package/dist/src/analysis/adapters/python.d.ts.map +1 -0
- package/dist/src/analysis/adapters/python.js +475 -0
- package/dist/src/analysis/adapters/python.js.map +1 -0
- package/dist/src/analysis/adapters/rust.d.ts +116 -0
- package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
- package/dist/src/analysis/adapters/rust.js +476 -0
- package/dist/src/analysis/adapters/rust.js.map +1 -0
- package/dist/src/analysis/adapters/typescript.d.ts +68 -0
- package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
- package/dist/src/analysis/adapters/typescript.js +79 -0
- package/dist/src/analysis/adapters/typescript.js.map +1 -0
- package/dist/src/analysis/aggregator.d.ts +193 -0
- package/dist/src/analysis/aggregator.d.ts.map +1 -0
- package/dist/src/analysis/aggregator.js +283 -0
- package/dist/src/analysis/aggregator.js.map +1 -0
- package/dist/src/analysis/cache.d.ts +180 -0
- package/dist/src/analysis/cache.d.ts.map +1 -0
- package/dist/src/analysis/cache.js +279 -0
- package/dist/src/analysis/cache.js.map +1 -0
- package/dist/src/analysis/file-streamer.d.ts +136 -0
- package/dist/src/analysis/file-streamer.d.ts.map +1 -0
- package/dist/src/analysis/file-streamer.js +291 -0
- package/dist/src/analysis/file-streamer.js.map +1 -0
- package/dist/src/analysis/incremental-parser.d.ts +186 -0
- package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
- package/dist/src/analysis/incremental-parser.js +291 -0
- package/dist/src/analysis/incremental-parser.js.map +1 -0
- package/dist/src/analysis/incremental.d.ts +186 -0
- package/dist/src/analysis/incremental.d.ts.map +1 -0
- package/dist/src/analysis/incremental.js +247 -0
- package/dist/src/analysis/incremental.js.map +1 -0
- package/dist/src/analysis/index.d.ts +25 -3
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +45 -3
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +92 -0
- package/dist/src/analysis/language-detector.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.js +602 -0
- package/dist/src/analysis/language-detector.js.map +1 -0
- package/dist/src/analysis/memory-monitor.d.ts +199 -0
- package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
- package/dist/src/analysis/memory-monitor.js +271 -0
- package/dist/src/analysis/memory-monitor.js.map +1 -0
- package/dist/src/analysis/metrics.d.ts +300 -0
- package/dist/src/analysis/metrics.d.ts.map +1 -0
- package/dist/src/analysis/metrics.js +537 -0
- package/dist/src/analysis/metrics.js.map +1 -0
- package/dist/src/analysis/router.d.ts +264 -0
- package/dist/src/analysis/router.d.ts.map +1 -0
- package/dist/src/analysis/router.js +398 -0
- package/dist/src/analysis/router.js.map +1 -0
- package/dist/src/analysis/tree-cache.d.ts +208 -0
- package/dist/src/analysis/tree-cache.d.ts.map +1 -0
- package/dist/src/analysis/tree-cache.js +288 -0
- package/dist/src/analysis/tree-cache.js.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.js +239 -0
- package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
- package/dist/src/analysis/types.d.ts +69 -6
- package/dist/src/analysis/types.d.ts.map +1 -1
- package/dist/src/analysis/types.js +23 -2
- package/dist/src/analysis/types.js.map +1 -1
- package/dist/src/analysis/worker-pool.d.ts +141 -0
- package/dist/src/analysis/worker-pool.d.ts.map +1 -0
- package/dist/src/analysis/worker-pool.js +418 -0
- package/dist/src/analysis/worker-pool.js.map +1 -0
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/schema.js +72 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/cache.d.ts +24 -1
- package/dist/src/api/cache.d.ts.map +1 -1
- package/dist/src/api/cache.js +50 -2
- package/dist/src/api/cache.js.map +1 -1
- package/dist/src/api/client.d.ts +132 -2
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +214 -18
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/index.d.ts +2 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +7 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/types.d.ts +251 -0
- package/dist/src/api/types.d.ts.map +1 -0
- package/dist/src/api/types.js +9 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +1 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +1 -0
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.js +1 -1
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/index.js.map +1 -1
- package/dist/src/scripts/import-github-skills.js +1 -1
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
- package/dist/src/scripts/validation/index.js +1 -2
- package/dist/src/scripts/validation/index.js.map +1 -1
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
- package/dist/src/scripts/validation/pipeline.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +2 -2
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.js +1 -0
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +1 -1
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +27 -5
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +20 -5
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/types/skill.d.ts +3 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +2 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +2 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tests/adapters-factory.test.d.ts +13 -0
- package/dist/tests/adapters-factory.test.d.ts.map +1 -0
- package/dist/tests/adapters-factory.test.js +308 -0
- package/dist/tests/adapters-factory.test.js.map +1 -0
- package/dist/tests/adapters-java.test.d.ts +13 -0
- package/dist/tests/adapters-java.test.d.ts.map +1 -0
- package/dist/tests/adapters-java.test.js +925 -0
- package/dist/tests/adapters-java.test.js.map +1 -0
- package/dist/tests/api/client.validation.test.d.ts +7 -0
- package/dist/tests/api/client.validation.test.d.ts.map +1 -0
- package/dist/tests/api/client.validation.test.js +183 -0
- package/dist/tests/api/client.validation.test.js.map +1 -0
- package/dist/tests/language-detector.test.d.ts +13 -0
- package/dist/tests/language-detector.test.d.ts.map +1 -0
- package/dist/tests/language-detector.test.js +674 -0
- package/dist/tests/language-detector.test.js.map +1 -0
- package/dist/tests/telemetry/posthog.test.d.ts +13 -0
- package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
- package/dist/tests/telemetry/posthog.test.js +600 -0
- package/dist/tests/telemetry/posthog.test.js.map +1 -0
- package/package.json +5 -6
- package/dist/src/security/RateLimiter.d.ts +0 -337
- package/dist/src/security/RateLimiter.d.ts.map +0 -1
- package/dist/src/security/RateLimiter.js +0 -782
- package/dist/src/security/RateLimiter.js.map +0 -1
- package/dist/src/security/scanner.d.ts +0 -151
- package/dist/src/security/scanner.d.ts.map +0 -1
- package/dist/src/security/scanner.js +0 -599
- package/dist/src/security/scanner.js.map +0 -1
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1309: Incremental Parsing Support
|
|
3
|
+
*
|
|
4
|
+
* Edit tracking utilities for multi-language AST analysis.
|
|
5
|
+
* Enables efficient incremental parsing by detecting minimal
|
|
6
|
+
* edit regions between old and new content.
|
|
7
|
+
*
|
|
8
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
9
|
+
* @module analysis/incremental
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Calculate file edit from content diff
|
|
13
|
+
*
|
|
14
|
+
* Converts a simple diff into the format required by
|
|
15
|
+
* tree-sitter's incremental parsing API.
|
|
16
|
+
*
|
|
17
|
+
* @param oldContent - Original file content
|
|
18
|
+
* @param newContent - Updated file content
|
|
19
|
+
* @param changeStart - Start index of the change
|
|
20
|
+
* @param changeEnd - End index in old content
|
|
21
|
+
* @param newText - Replacement text
|
|
22
|
+
* @returns FileEdit structure for tree-sitter
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const edit = calculateEdit(
|
|
27
|
+
* 'hello world',
|
|
28
|
+
* 'hello there world',
|
|
29
|
+
* 6, // after 'hello '
|
|
30
|
+
* 6, // no text removed
|
|
31
|
+
* 'there ' // inserted text
|
|
32
|
+
* )
|
|
33
|
+
* tree.edit(edit)
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function calculateEdit(oldContent, newContent, changeStart, changeEnd, newText) {
|
|
37
|
+
const startPosition = indexToPosition(oldContent, changeStart);
|
|
38
|
+
const oldEndPosition = indexToPosition(oldContent, changeEnd);
|
|
39
|
+
const newEndPosition = indexToPosition(newContent, changeStart + newText.length);
|
|
40
|
+
return {
|
|
41
|
+
startIndex: changeStart,
|
|
42
|
+
oldEndIndex: changeEnd,
|
|
43
|
+
newEndIndex: changeStart + newText.length,
|
|
44
|
+
startPosition,
|
|
45
|
+
oldEndPosition,
|
|
46
|
+
newEndPosition,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Convert byte index to row/column position
|
|
51
|
+
*
|
|
52
|
+
* Scans through content counting newlines to determine
|
|
53
|
+
* the row and column for a given byte offset.
|
|
54
|
+
*
|
|
55
|
+
* @param content - File content to scan
|
|
56
|
+
* @param index - Byte offset to convert
|
|
57
|
+
* @returns Position with row and column (both zero-based)
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const pos = indexToPosition('hello\nworld', 8)
|
|
62
|
+
* // pos = { row: 1, column: 2 } (the 'r' in 'world')
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export function indexToPosition(content, index) {
|
|
66
|
+
let row = 0;
|
|
67
|
+
let column = 0;
|
|
68
|
+
const limit = Math.min(index, content.length);
|
|
69
|
+
for (let i = 0; i < limit; i++) {
|
|
70
|
+
if (content[i] === '\n') {
|
|
71
|
+
row++;
|
|
72
|
+
column = 0;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
column++;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return { row, column };
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Convert row/column position to byte index
|
|
82
|
+
*
|
|
83
|
+
* Scans through content to find the byte offset for
|
|
84
|
+
* a given row and column position.
|
|
85
|
+
*
|
|
86
|
+
* @param content - File content to scan
|
|
87
|
+
* @param position - Position to convert
|
|
88
|
+
* @returns Byte offset, or content length if position is past end
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const index = positionToIndex('hello\nworld', { row: 1, column: 2 })
|
|
93
|
+
* // index = 8 (the 'r' in 'world')
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export function positionToIndex(content, position) {
|
|
97
|
+
let currentRow = 0;
|
|
98
|
+
let currentColumn = 0;
|
|
99
|
+
for (let i = 0; i < content.length; i++) {
|
|
100
|
+
if (currentRow === position.row && currentColumn === position.column) {
|
|
101
|
+
return i;
|
|
102
|
+
}
|
|
103
|
+
if (content[i] === '\n') {
|
|
104
|
+
currentRow++;
|
|
105
|
+
currentColumn = 0;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
currentColumn++;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return content.length;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Find the minimal edit between two strings
|
|
115
|
+
*
|
|
116
|
+
* Uses a simple prefix/suffix matching algorithm to find
|
|
117
|
+
* the smallest region that changed between old and new content.
|
|
118
|
+
* Returns null if contents are identical.
|
|
119
|
+
*
|
|
120
|
+
* @param oldContent - Original string
|
|
121
|
+
* @param newContent - Modified string
|
|
122
|
+
* @returns EditDiff describing the change, or null if identical
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* const diff = findMinimalEdit('hello world', 'hello there world')
|
|
127
|
+
* // diff = { changeStart: 6, changeEnd: 6, newText: 'there ' }
|
|
128
|
+
*
|
|
129
|
+
* const same = findMinimalEdit('hello', 'hello')
|
|
130
|
+
* // same = null
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
export function findMinimalEdit(oldContent, newContent) {
|
|
134
|
+
if (oldContent === newContent) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
// Find common prefix length
|
|
138
|
+
let prefixLength = 0;
|
|
139
|
+
const minLength = Math.min(oldContent.length, newContent.length);
|
|
140
|
+
while (prefixLength < minLength && oldContent[prefixLength] === newContent[prefixLength]) {
|
|
141
|
+
prefixLength++;
|
|
142
|
+
}
|
|
143
|
+
// Find common suffix length (after prefix)
|
|
144
|
+
let oldSuffixStart = oldContent.length;
|
|
145
|
+
let newSuffixStart = newContent.length;
|
|
146
|
+
while (oldSuffixStart > prefixLength &&
|
|
147
|
+
newSuffixStart > prefixLength &&
|
|
148
|
+
oldContent[oldSuffixStart - 1] === newContent[newSuffixStart - 1]) {
|
|
149
|
+
oldSuffixStart--;
|
|
150
|
+
newSuffixStart--;
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
changeStart: prefixLength,
|
|
154
|
+
changeEnd: oldSuffixStart,
|
|
155
|
+
newText: newContent.slice(prefixLength, newSuffixStart),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Merge multiple edits into a single encompassing edit
|
|
160
|
+
*
|
|
161
|
+
* Useful when multiple small edits occur and need to be
|
|
162
|
+
* applied as a single incremental update.
|
|
163
|
+
*
|
|
164
|
+
* Note: This is a simplistic merge that finds the bounding
|
|
165
|
+
* region. It may over-invalidate if edits are far apart.
|
|
166
|
+
*
|
|
167
|
+
* @param edits - Array of edits to merge
|
|
168
|
+
* @returns Single merged edit, or null if array is empty
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```typescript
|
|
172
|
+
* const merged = batchEdits([
|
|
173
|
+
* { changeStart: 0, changeEnd: 5, newText: 'HELLO' },
|
|
174
|
+
* { changeStart: 10, changeEnd: 15, newText: 'WORLD' }
|
|
175
|
+
* ])
|
|
176
|
+
* // merged encompasses both edit regions
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export function batchEdits(edits) {
|
|
180
|
+
if (edits.length === 0) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
if (edits.length === 1) {
|
|
184
|
+
return edits[0];
|
|
185
|
+
}
|
|
186
|
+
// Sort by start position
|
|
187
|
+
const sorted = [...edits].sort((a, b) => a.changeStart - b.changeStart);
|
|
188
|
+
// Find the bounding box of all edits
|
|
189
|
+
let minStart = sorted[0].changeStart;
|
|
190
|
+
let maxEnd = sorted[0].changeEnd;
|
|
191
|
+
let combinedNewText = '';
|
|
192
|
+
let lastEnd = sorted[0].changeStart;
|
|
193
|
+
for (const edit of sorted) {
|
|
194
|
+
// Check for gaps between edits
|
|
195
|
+
if (edit.changeStart > lastEnd) {
|
|
196
|
+
// Gap exists - this is a complex case
|
|
197
|
+
// For simplicity, we merge anyway and note it may over-invalidate
|
|
198
|
+
}
|
|
199
|
+
minStart = Math.min(minStart, edit.changeStart);
|
|
200
|
+
maxEnd = Math.max(maxEnd, edit.changeEnd);
|
|
201
|
+
combinedNewText += edit.newText;
|
|
202
|
+
lastEnd = edit.changeEnd;
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
changeStart: minStart,
|
|
206
|
+
changeEnd: maxEnd,
|
|
207
|
+
newText: combinedNewText,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Check if an edit is a simple insertion (no deletion)
|
|
212
|
+
*
|
|
213
|
+
* @param edit - Edit to check
|
|
214
|
+
* @returns True if edit only inserts text
|
|
215
|
+
*/
|
|
216
|
+
export function isInsertion(edit) {
|
|
217
|
+
return edit.changeStart === edit.changeEnd && edit.newText.length > 0;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Check if an edit is a simple deletion (no insertion)
|
|
221
|
+
*
|
|
222
|
+
* @param edit - Edit to check
|
|
223
|
+
* @returns True if edit only deletes text
|
|
224
|
+
*/
|
|
225
|
+
export function isDeletion(edit) {
|
|
226
|
+
return edit.changeStart < edit.changeEnd && edit.newText.length === 0;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Check if an edit is a replacement (both deletion and insertion)
|
|
230
|
+
*
|
|
231
|
+
* @param edit - Edit to check
|
|
232
|
+
* @returns True if edit replaces text
|
|
233
|
+
*/
|
|
234
|
+
export function isReplacement(edit) {
|
|
235
|
+
return edit.changeStart < edit.changeEnd && edit.newText.length > 0;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Calculate the size delta of an edit
|
|
239
|
+
*
|
|
240
|
+
* @param edit - Edit to analyze
|
|
241
|
+
* @returns Positive for growth, negative for shrinkage, zero for same size
|
|
242
|
+
*/
|
|
243
|
+
export function editSizeDelta(edit) {
|
|
244
|
+
const deletedLength = edit.changeEnd - edit.changeStart;
|
|
245
|
+
return edit.newText.length - deletedLength;
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=incremental.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental.js","sourceRoot":"","sources":["../../../src/analysis/incremental.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SMI-600: Codebase Analysis Module
|
|
3
3
|
* SMI-1189: Updated to export from split modules
|
|
4
|
+
* SMI-1303: Extended with multi-language support
|
|
5
|
+
* SMI-1337: Added metrics and telemetry
|
|
4
6
|
*
|
|
5
|
-
* Provides tools for analyzing
|
|
7
|
+
* Provides tools for analyzing multi-language codebases
|
|
6
8
|
* to extract context for skill recommendations.
|
|
7
9
|
*
|
|
8
10
|
* @see ADR-010: Codebase Analysis Scope
|
|
11
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
9
12
|
*/
|
|
10
13
|
export { CodebaseAnalyzer } from './CodebaseAnalyzer.js';
|
|
11
14
|
export { default } from './CodebaseAnalyzer.js';
|
|
12
|
-
export { SUPPORTED_EXTENSIONS, DEFAULT_EXCLUDE_DIRS, type ImportInfo, type ExportInfo, type FunctionInfo, type FrameworkInfo, type DependencyInfo, type CodebaseContext, type AnalyzeOptions, type ParseResult, } from './types.js';
|
|
15
|
+
export { SUPPORTED_EXTENSIONS, DEFAULT_EXCLUDE_DIRS, LANGUAGE_EXTENSIONS, type SupportedLanguage, type ImportInfo, type ExportInfo, type ExportKind, type FunctionInfo, type FrameworkInfo, type FrameworkRule, type DependencyInfo, type CodebaseContext, type AnalyzeOptions, type ParseResult, type CacheStats, } from './types.js';
|
|
13
16
|
export { parseFile, extractImport, extractExport, extractFunction } from './parsers.js';
|
|
14
|
-
export { detectFrameworks, hasFramework, getPrimaryFramework, FRAMEWORK_RULES,
|
|
17
|
+
export { detectFrameworks, hasFramework, getPrimaryFramework, FRAMEWORK_RULES, } from './framework-detector.js';
|
|
18
|
+
export { LanguageRouter, type LanguageRouterOptions } from './router.js';
|
|
19
|
+
export { AdapterFactory } from './adapters/factory.js';
|
|
20
|
+
export { LanguageDetector, detectLanguage, type LanguageDetectionResult, } from './language-detector.js';
|
|
21
|
+
export { ParseCache, type ParseCacheOptions } from './cache.js';
|
|
22
|
+
export { ResultAggregator, type AggregatorInput, type AggregatorMetadata, type AggregatorOptions, } from './aggregator.js';
|
|
23
|
+
export { AnalysisMetrics, getAnalysisMetrics, initializeAnalysisMetrics, timeParseAsync, timeParseSync, type AnalysisMetricsConfig, type AnalysisMetricsSnapshot, } from './metrics.js';
|
|
24
|
+
export { TreeSitterManager, type TreeSitterManagerOptions, type TreeSitterParser, type TreeSitterTree, type TreeSitterNode, type TreeSitterLanguage, } from './tree-sitter/manager.js';
|
|
25
|
+
export { LanguageAdapter, type LanguageInfo } from './adapters/base.js';
|
|
26
|
+
export { TypeScriptAdapter } from './adapters/typescript.js';
|
|
27
|
+
export { PythonAdapter } from './adapters/python.js';
|
|
28
|
+
export { GoAdapter, parseGoMod, type GoModInfo, type GoExportInfo, type GoFunctionInfo, } from './adapters/go.js';
|
|
29
|
+
export { RustAdapter, parseCargoToml, type RustExportInfo, type RustFunctionInfo, type CargoDependency, } from './adapters/rust.js';
|
|
30
|
+
export { JavaAdapter, parsePomXml, parseBuildGradle, type JavaExportInfo, type JavaFunctionInfo, type MavenDependency, } from './adapters/java.js';
|
|
31
|
+
export { ParserWorkerPool, type ParseTask, type WorkerResult, type WorkerPoolOptions, } from './worker-pool.js';
|
|
32
|
+
export { MemoryMonitor, type MemoryStats, type CleanupResult, type MemoryMonitorOptions, } from './memory-monitor.js';
|
|
33
|
+
export { streamFiles, batchReadFiles, readFilesAsMap, filterByExtension, getFileExtension, estimateMemoryUsage, type FileContent, type StreamOptions, type BatchReadOptions, } from './file-streamer.js';
|
|
34
|
+
export { calculateEdit, indexToPosition, positionToIndex, findMinimalEdit, batchEdits, isInsertion, isDeletion, isReplacement, editSizeDelta, type Point, type FileEdit, type EditDiff, } from './incremental.js';
|
|
35
|
+
export { TreeCache, type CachedTree, type TreeCacheStats, type TreeCacheOptions, } from './tree-cache.js';
|
|
36
|
+
export { IncrementalParser, type IncrementalParseResult, type IncrementalParserOptions, type IncrementalParserStats, } from './incremental-parser.js';
|
|
15
37
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analysis/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analysis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAG/C,OAAO,EAEL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EAEnB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAGvF,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,eAAe,GAChB,MAAM,yBAAyB,CAAA;AAKhC,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAGxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAGtD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,KAAK,uBAAuB,GAC7B,MAAM,wBAAwB,CAAA;AAG/B,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAG/D,OAAO,EACL,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,yBAAyB,EACzB,cAAc,EACd,aAAa,EACb,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,GAC7B,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,kBAAkB,GACxB,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EACL,SAAS,EACT,UAAU,EACV,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,WAAW,EACX,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAA;AAK3B,OAAO,EACL,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAA;AAK3B,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,eAAe,EACf,UAAU,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACb,KAAK,KAAK,EACV,KAAK,QAAQ,EACb,KAAK,QAAQ,GACd,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,SAAS,EACT,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,GAC5B,MAAM,yBAAyB,CAAA"}
|
|
@@ -1,19 +1,61 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SMI-600: Codebase Analysis Module
|
|
3
3
|
* SMI-1189: Updated to export from split modules
|
|
4
|
+
* SMI-1303: Extended with multi-language support
|
|
5
|
+
* SMI-1337: Added metrics and telemetry
|
|
4
6
|
*
|
|
5
|
-
* Provides tools for analyzing
|
|
7
|
+
* Provides tools for analyzing multi-language codebases
|
|
6
8
|
* to extract context for skill recommendations.
|
|
7
9
|
*
|
|
8
10
|
* @see ADR-010: Codebase Analysis Scope
|
|
11
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
9
12
|
*/
|
|
10
13
|
// Main analyzer class
|
|
11
14
|
export { CodebaseAnalyzer } from './CodebaseAnalyzer.js';
|
|
12
15
|
export { default } from './CodebaseAnalyzer.js';
|
|
13
|
-
// Types and constants
|
|
14
|
-
export {
|
|
16
|
+
// Types and constants (extended for multi-language support)
|
|
17
|
+
export {
|
|
18
|
+
// Constants
|
|
19
|
+
SUPPORTED_EXTENSIONS, DEFAULT_EXCLUDE_DIRS, LANGUAGE_EXTENSIONS, } from './types.js';
|
|
15
20
|
// Parser functions
|
|
16
21
|
export { parseFile, extractImport, extractExport, extractFunction } from './parsers.js';
|
|
17
22
|
// Framework detection
|
|
18
23
|
export { detectFrameworks, hasFramework, getPrimaryFramework, FRAMEWORK_RULES, } from './framework-detector.js';
|
|
24
|
+
// SMI-1303: Multi-language infrastructure
|
|
25
|
+
// Language router for dispatching to appropriate adapters
|
|
26
|
+
export { LanguageRouter } from './router.js';
|
|
27
|
+
// SMI-1339: Adapter Factory Pattern
|
|
28
|
+
export { AdapterFactory } from './adapters/factory.js';
|
|
29
|
+
// SMI-1340: Language Detection for extensionless files
|
|
30
|
+
export { LanguageDetector, detectLanguage, } from './language-detector.js';
|
|
31
|
+
// Parse result caching
|
|
32
|
+
export { ParseCache } from './cache.js';
|
|
33
|
+
// Result aggregation
|
|
34
|
+
export { ResultAggregator, } from './aggregator.js';
|
|
35
|
+
// SMI-1337: Analysis metrics and telemetry
|
|
36
|
+
export { AnalysisMetrics, getAnalysisMetrics, initializeAnalysisMetrics, timeParseAsync, timeParseSync, } from './metrics.js';
|
|
37
|
+
// Tree-sitter parser management
|
|
38
|
+
export { TreeSitterManager, } from './tree-sitter/manager.js';
|
|
39
|
+
// Language adapters
|
|
40
|
+
export { LanguageAdapter } from './adapters/base.js';
|
|
41
|
+
// Re-export specific adapters
|
|
42
|
+
export { TypeScriptAdapter } from './adapters/typescript.js';
|
|
43
|
+
export { PythonAdapter } from './adapters/python.js';
|
|
44
|
+
export { GoAdapter, parseGoMod, } from './adapters/go.js';
|
|
45
|
+
export { RustAdapter, parseCargoToml, } from './adapters/rust.js';
|
|
46
|
+
export { JavaAdapter, parsePomXml, parseBuildGradle, } from './adapters/java.js';
|
|
47
|
+
// SMI-1308: Performance optimization modules
|
|
48
|
+
// Worker thread pool for parallel file parsing
|
|
49
|
+
export { ParserWorkerPool, } from './worker-pool.js';
|
|
50
|
+
// Memory usage monitoring and cleanup
|
|
51
|
+
export { MemoryMonitor, } from './memory-monitor.js';
|
|
52
|
+
// Memory-efficient file streaming
|
|
53
|
+
export { streamFiles, batchReadFiles, readFilesAsMap, filterByExtension, getFileExtension, estimateMemoryUsage, } from './file-streamer.js';
|
|
54
|
+
// SMI-1309: Incremental Parsing & Tree Caching
|
|
55
|
+
// Edit tracking utilities
|
|
56
|
+
export { calculateEdit, indexToPosition, positionToIndex, findMinimalEdit, batchEdits, isInsertion, isDeletion, isReplacement, editSizeDelta, } from './incremental.js';
|
|
57
|
+
// Tree caching for incremental parsing
|
|
58
|
+
export { TreeCache, } from './tree-cache.js';
|
|
59
|
+
// Incremental parser coordinator
|
|
60
|
+
export { IncrementalParser, } from './incremental-parser.js';
|
|
19
61
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analysis/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analysis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,sBAAsB;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAE/C,4DAA4D;AAC5D,OAAO;AACL,YAAY;AACZ,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GAcpB,MAAM,YAAY,CAAA;AAEnB,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAEvF,sBAAsB;AACtB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,eAAe,GAChB,MAAM,yBAAyB,CAAA;AAEhC,0CAA0C;AAE1C,0DAA0D;AAC1D,OAAO,EAAE,cAAc,EAA8B,MAAM,aAAa,CAAA;AAExE,oCAAoC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,uDAAuD;AACvD,OAAO,EACL,gBAAgB,EAChB,cAAc,GAEf,MAAM,wBAAwB,CAAA;AAE/B,uBAAuB;AACvB,OAAO,EAAE,UAAU,EAA0B,MAAM,YAAY,CAAA;AAE/D,qBAAqB;AACrB,OAAO,EACL,gBAAgB,GAIjB,MAAM,iBAAiB,CAAA;AAExB,2CAA2C;AAC3C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,yBAAyB,EACzB,cAAc,EACd,aAAa,GAGd,MAAM,cAAc,CAAA;AAErB,gCAAgC;AAChC,OAAO,EACL,iBAAiB,GAMlB,MAAM,0BAA0B,CAAA;AAEjC,oBAAoB;AACpB,OAAO,EAAE,eAAe,EAAqB,MAAM,oBAAoB,CAAA;AAEvE,8BAA8B;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EACL,SAAS,EACT,UAAU,GAIX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,WAAW,EACX,cAAc,GAIf,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,WAAW,EACX,WAAW,EACX,gBAAgB,GAIjB,MAAM,oBAAoB,CAAA;AAE3B,6CAA6C;AAE7C,+CAA+C;AAC/C,OAAO,EACL,gBAAgB,GAIjB,MAAM,kBAAkB,CAAA;AAEzB,sCAAsC;AACtC,OAAO,EACL,aAAa,GAId,MAAM,qBAAqB,CAAA;AAE5B,kCAAkC;AAClC,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,GAIpB,MAAM,oBAAoB,CAAA;AAE3B,+CAA+C;AAE/C,0BAA0B;AAC1B,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,eAAe,EACf,UAAU,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,GAId,MAAM,kBAAkB,CAAA;AAEzB,uCAAuC;AACvC,OAAO,EACL,SAAS,GAIV,MAAM,iBAAiB,CAAA;AAExB,iCAAiC;AACjC,OAAO,EACL,iBAAiB,GAIlB,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1340: Language Detection Heuristics
|
|
3
|
+
*
|
|
4
|
+
* Detects programming language of files without extensions using:
|
|
5
|
+
* - Shebang analysis (#!/usr/bin/python, #!/bin/bash, etc.)
|
|
6
|
+
* - Content patterns (import statements, syntax markers)
|
|
7
|
+
* - Magic bytes detection
|
|
8
|
+
* - Statistical analysis of keywords
|
|
9
|
+
*
|
|
10
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
11
|
+
* @module analysis/language-detector
|
|
12
|
+
*/
|
|
13
|
+
import type { SupportedLanguage } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Detection result with confidence score
|
|
16
|
+
*/
|
|
17
|
+
export interface LanguageDetectionResult {
|
|
18
|
+
/** Detected language (null if unknown) */
|
|
19
|
+
language: SupportedLanguage | null;
|
|
20
|
+
/** Confidence score (0-1) */
|
|
21
|
+
confidence: number;
|
|
22
|
+
/** Detection method that succeeded */
|
|
23
|
+
method: 'shebang' | 'pattern' | 'magic' | 'statistical' | 'none';
|
|
24
|
+
/** Evidence for the detection */
|
|
25
|
+
evidence: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Detects programming language from file content
|
|
29
|
+
*
|
|
30
|
+
* Uses multiple heuristics in order of reliability:
|
|
31
|
+
* 1. Shebang analysis (highest confidence)
|
|
32
|
+
* 2. Content patterns (high confidence)
|
|
33
|
+
* 3. Statistical keyword analysis (lower confidence)
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const detector = new LanguageDetector()
|
|
38
|
+
*
|
|
39
|
+
* // Detect from shebang
|
|
40
|
+
* const result1 = detector.detect('#!/usr/bin/env python3\nprint("hello")')
|
|
41
|
+
* // { language: 'python', confidence: 1.0, method: 'shebang', evidence: ['shebang: #!/usr/bin/env python3'] }
|
|
42
|
+
*
|
|
43
|
+
* // Detect from patterns
|
|
44
|
+
* const result2 = detector.detect('fn main() {\n println!("Hello");\n}')
|
|
45
|
+
* // { language: 'rust', confidence: 0.85, method: 'pattern', evidence: ['function definition'] }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare class LanguageDetector {
|
|
49
|
+
/** Minimum confidence threshold for detection */
|
|
50
|
+
private minConfidence;
|
|
51
|
+
constructor(options?: {
|
|
52
|
+
minConfidence?: number;
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* Detect language from file content
|
|
56
|
+
*
|
|
57
|
+
* @param content - File content to analyze
|
|
58
|
+
* @returns Detection result with language, confidence, and evidence
|
|
59
|
+
*/
|
|
60
|
+
detect(content: string): LanguageDetectionResult;
|
|
61
|
+
/**
|
|
62
|
+
* Detect language from shebang line
|
|
63
|
+
*/
|
|
64
|
+
detectByShebang(content: string): LanguageDetectionResult;
|
|
65
|
+
/**
|
|
66
|
+
* Detect language from content patterns
|
|
67
|
+
*/
|
|
68
|
+
detectByPatterns(content: string): LanguageDetectionResult;
|
|
69
|
+
/**
|
|
70
|
+
* Detect language by statistical keyword analysis
|
|
71
|
+
*/
|
|
72
|
+
detectByStatistics(content: string): LanguageDetectionResult;
|
|
73
|
+
/**
|
|
74
|
+
* Get confidence threshold
|
|
75
|
+
*/
|
|
76
|
+
getMinConfidence(): number;
|
|
77
|
+
/**
|
|
78
|
+
* Set confidence threshold
|
|
79
|
+
*/
|
|
80
|
+
setMinConfidence(threshold: number): void;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Convenience function to detect language
|
|
84
|
+
*
|
|
85
|
+
* @param content - File content to analyze
|
|
86
|
+
* @param options - Detection options
|
|
87
|
+
* @returns Detection result
|
|
88
|
+
*/
|
|
89
|
+
export declare function detectLanguage(content: string, options?: {
|
|
90
|
+
minConfidence?: number;
|
|
91
|
+
}): LanguageDetectionResult;
|
|
92
|
+
//# sourceMappingURL=language-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-detector.d.ts","sourceRoot":"","sources":["../../../src/analysis/language-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAClC,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,sCAAsC;IACtC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,CAAA;IAChE,iCAAiC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAyaD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,gBAAgB;IAC3B,iDAAiD;IACjD,OAAO,CAAC,aAAa,CAAQ;gBAEjB,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAO;IAIpD;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IA4BhD;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IAqBzD;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IA6C1D;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IA0D5D;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAG1C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC,uBAAuB,CAGzB"}
|