@liendev/core 0.19.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/README.md +336 -0
  2. package/dist/config/loader.d.ts +12 -0
  3. package/dist/config/loader.d.ts.map +1 -0
  4. package/dist/config/loader.js +46 -0
  5. package/dist/config/loader.js.map +1 -0
  6. package/dist/config/merge.d.ts +20 -0
  7. package/dist/config/merge.d.ts.map +1 -0
  8. package/dist/config/merge.js +71 -0
  9. package/dist/config/merge.js.map +1 -0
  10. package/dist/config/migration-manager.d.ts +46 -0
  11. package/dist/config/migration-manager.d.ts.map +1 -0
  12. package/dist/config/migration-manager.js +119 -0
  13. package/dist/config/migration-manager.js.map +1 -0
  14. package/dist/config/migration.d.ts +20 -0
  15. package/dist/config/migration.d.ts.map +1 -0
  16. package/dist/config/migration.js +155 -0
  17. package/dist/config/migration.js.map +1 -0
  18. package/dist/config/schema.d.ts +101 -0
  19. package/dist/config/schema.d.ts.map +1 -0
  20. package/dist/config/schema.js +58 -0
  21. package/dist/config/schema.js.map +1 -0
  22. package/dist/config/service.d.ts +122 -0
  23. package/dist/config/service.d.ts.map +1 -0
  24. package/dist/config/service.js +477 -0
  25. package/dist/config/service.js.map +1 -0
  26. package/dist/constants.d.ts +20 -0
  27. package/dist/constants.d.ts.map +1 -0
  28. package/dist/constants.js +43 -0
  29. package/dist/constants.js.map +1 -0
  30. package/dist/embeddings/cache.d.ts +45 -0
  31. package/dist/embeddings/cache.d.ts.map +1 -0
  32. package/dist/embeddings/cache.js +109 -0
  33. package/dist/embeddings/cache.js.map +1 -0
  34. package/dist/embeddings/local.d.ts +10 -0
  35. package/dist/embeddings/local.d.ts.map +1 -0
  36. package/dist/embeddings/local.js +63 -0
  37. package/dist/embeddings/local.js.map +1 -0
  38. package/dist/embeddings/types.d.ts +9 -0
  39. package/dist/embeddings/types.d.ts.map +1 -0
  40. package/dist/embeddings/types.js +5 -0
  41. package/dist/embeddings/types.js.map +1 -0
  42. package/dist/errors/codes.d.ts +18 -0
  43. package/dist/errors/codes.d.ts.map +1 -0
  44. package/dist/errors/codes.js +25 -0
  45. package/dist/errors/codes.js.map +1 -0
  46. package/dist/errors/index.d.ts +85 -0
  47. package/dist/errors/index.d.ts.map +1 -0
  48. package/dist/errors/index.js +134 -0
  49. package/dist/errors/index.js.map +1 -0
  50. package/dist/frameworks/detector-service.d.ts +59 -0
  51. package/dist/frameworks/detector-service.d.ts.map +1 -0
  52. package/dist/frameworks/detector-service.js +219 -0
  53. package/dist/frameworks/detector-service.js.map +1 -0
  54. package/dist/frameworks/laravel/config.d.ts +6 -0
  55. package/dist/frameworks/laravel/config.d.ts.map +1 -0
  56. package/dist/frameworks/laravel/config.js +68 -0
  57. package/dist/frameworks/laravel/config.js.map +1 -0
  58. package/dist/frameworks/laravel/detector.d.ts +6 -0
  59. package/dist/frameworks/laravel/detector.d.ts.map +1 -0
  60. package/dist/frameworks/laravel/detector.js +96 -0
  61. package/dist/frameworks/laravel/detector.js.map +1 -0
  62. package/dist/frameworks/nodejs/config.d.ts +6 -0
  63. package/dist/frameworks/nodejs/config.d.ts.map +1 -0
  64. package/dist/frameworks/nodejs/config.js +57 -0
  65. package/dist/frameworks/nodejs/config.js.map +1 -0
  66. package/dist/frameworks/nodejs/detector.d.ts +6 -0
  67. package/dist/frameworks/nodejs/detector.d.ts.map +1 -0
  68. package/dist/frameworks/nodejs/detector.js +77 -0
  69. package/dist/frameworks/nodejs/detector.js.map +1 -0
  70. package/dist/frameworks/php/config.d.ts +6 -0
  71. package/dist/frameworks/php/config.d.ts.map +1 -0
  72. package/dist/frameworks/php/config.js +53 -0
  73. package/dist/frameworks/php/config.js.map +1 -0
  74. package/dist/frameworks/php/detector.d.ts +7 -0
  75. package/dist/frameworks/php/detector.d.ts.map +1 -0
  76. package/dist/frameworks/php/detector.js +101 -0
  77. package/dist/frameworks/php/detector.js.map +1 -0
  78. package/dist/frameworks/registry.d.ts +20 -0
  79. package/dist/frameworks/registry.d.ts.map +1 -0
  80. package/dist/frameworks/registry.js +38 -0
  81. package/dist/frameworks/registry.js.map +1 -0
  82. package/dist/frameworks/shopify/config.d.ts +6 -0
  83. package/dist/frameworks/shopify/config.d.ts.map +1 -0
  84. package/dist/frameworks/shopify/config.js +50 -0
  85. package/dist/frameworks/shopify/config.js.map +1 -0
  86. package/dist/frameworks/shopify/detector.d.ts +6 -0
  87. package/dist/frameworks/shopify/detector.d.ts.map +1 -0
  88. package/dist/frameworks/shopify/detector.js +103 -0
  89. package/dist/frameworks/shopify/detector.js.map +1 -0
  90. package/dist/frameworks/types.d.ts +51 -0
  91. package/dist/frameworks/types.d.ts.map +1 -0
  92. package/dist/frameworks/types.js +21 -0
  93. package/dist/frameworks/types.js.map +1 -0
  94. package/dist/git/tracker.d.ts +56 -0
  95. package/dist/git/tracker.d.ts.map +1 -0
  96. package/dist/git/tracker.js +189 -0
  97. package/dist/git/tracker.js.map +1 -0
  98. package/dist/git/utils.d.ts +60 -0
  99. package/dist/git/utils.d.ts.map +1 -0
  100. package/dist/git/utils.js +152 -0
  101. package/dist/git/utils.js.map +1 -0
  102. package/dist/index.d.ts +77 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +95 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/indexer/ast/chunker.d.ts +28 -0
  107. package/dist/indexer/ast/chunker.d.ts.map +1 -0
  108. package/dist/indexer/ast/chunker.js +268 -0
  109. package/dist/indexer/ast/chunker.js.map +1 -0
  110. package/dist/indexer/ast/complexity/cognitive.d.ts +16 -0
  111. package/dist/indexer/ast/complexity/cognitive.d.ts.map +1 -0
  112. package/dist/indexer/ast/complexity/cognitive.js +106 -0
  113. package/dist/indexer/ast/complexity/cognitive.js.map +1 -0
  114. package/dist/indexer/ast/complexity/cyclomatic.d.ts +12 -0
  115. package/dist/indexer/ast/complexity/cyclomatic.d.ts.map +1 -0
  116. package/dist/indexer/ast/complexity/cyclomatic.js +61 -0
  117. package/dist/indexer/ast/complexity/cyclomatic.js.map +1 -0
  118. package/dist/indexer/ast/complexity/halstead.d.ts +55 -0
  119. package/dist/indexer/ast/complexity/halstead.d.ts.map +1 -0
  120. package/dist/indexer/ast/complexity/halstead.js +290 -0
  121. package/dist/indexer/ast/complexity/halstead.js.map +1 -0
  122. package/dist/indexer/ast/complexity/index.d.ts +13 -0
  123. package/dist/indexer/ast/complexity/index.d.ts.map +1 -0
  124. package/dist/indexer/ast/complexity/index.js +12 -0
  125. package/dist/indexer/ast/complexity/index.js.map +1 -0
  126. package/dist/indexer/ast/parser.d.ts +27 -0
  127. package/dist/indexer/ast/parser.d.ts.map +1 -0
  128. package/dist/indexer/ast/parser.js +103 -0
  129. package/dist/indexer/ast/parser.js.map +1 -0
  130. package/dist/indexer/ast/symbols.d.ts +17 -0
  131. package/dist/indexer/ast/symbols.d.ts.map +1 -0
  132. package/dist/indexer/ast/symbols.js +265 -0
  133. package/dist/indexer/ast/symbols.js.map +1 -0
  134. package/dist/indexer/ast/traversers/index.d.ts +19 -0
  135. package/dist/indexer/ast/traversers/index.d.ts.map +1 -0
  136. package/dist/indexer/ast/traversers/index.js +42 -0
  137. package/dist/indexer/ast/traversers/index.js.map +1 -0
  138. package/dist/indexer/ast/traversers/php.d.ts +21 -0
  139. package/dist/indexer/ast/traversers/php.d.ts.map +1 -0
  140. package/dist/indexer/ast/traversers/php.js +67 -0
  141. package/dist/indexer/ast/traversers/php.js.map +1 -0
  142. package/dist/indexer/ast/traversers/python.d.ts +28 -0
  143. package/dist/indexer/ast/traversers/python.d.ts.map +1 -0
  144. package/dist/indexer/ast/traversers/python.js +67 -0
  145. package/dist/indexer/ast/traversers/python.js.map +1 -0
  146. package/dist/indexer/ast/traversers/types.d.ts +98 -0
  147. package/dist/indexer/ast/traversers/types.d.ts.map +1 -0
  148. package/dist/indexer/ast/traversers/types.js +2 -0
  149. package/dist/indexer/ast/traversers/types.js.map +1 -0
  150. package/dist/indexer/ast/traversers/typescript.d.ts +29 -0
  151. package/dist/indexer/ast/traversers/typescript.d.ts.map +1 -0
  152. package/dist/indexer/ast/traversers/typescript.js +88 -0
  153. package/dist/indexer/ast/traversers/typescript.js.map +1 -0
  154. package/dist/indexer/ast/types.d.ts +59 -0
  155. package/dist/indexer/ast/types.d.ts.map +1 -0
  156. package/dist/indexer/ast/types.js +2 -0
  157. package/dist/indexer/ast/types.js.map +1 -0
  158. package/dist/indexer/change-detector.d.ts +17 -0
  159. package/dist/indexer/change-detector.d.ts.map +1 -0
  160. package/dist/indexer/change-detector.js +207 -0
  161. package/dist/indexer/change-detector.js.map +1 -0
  162. package/dist/indexer/chunk-batch-processor.d.ts +103 -0
  163. package/dist/indexer/chunk-batch-processor.d.ts.map +1 -0
  164. package/dist/indexer/chunk-batch-processor.js +179 -0
  165. package/dist/indexer/chunk-batch-processor.js.map +1 -0
  166. package/dist/indexer/chunker.d.ts +10 -0
  167. package/dist/indexer/chunker.d.ts.map +1 -0
  168. package/dist/indexer/chunker.js +96 -0
  169. package/dist/indexer/chunker.js.map +1 -0
  170. package/dist/indexer/dependency-analyzer.d.ts +60 -0
  171. package/dist/indexer/dependency-analyzer.d.ts.map +1 -0
  172. package/dist/indexer/dependency-analyzer.js +261 -0
  173. package/dist/indexer/dependency-analyzer.js.map +1 -0
  174. package/dist/indexer/incremental.d.ts +47 -0
  175. package/dist/indexer/incremental.d.ts.map +1 -0
  176. package/dist/indexer/incremental.js +284 -0
  177. package/dist/indexer/incremental.js.map +1 -0
  178. package/dist/indexer/index.d.ts +80 -0
  179. package/dist/indexer/index.d.ts.map +1 -0
  180. package/dist/indexer/index.js +364 -0
  181. package/dist/indexer/index.js.map +1 -0
  182. package/dist/indexer/json-template-chunker.d.ts +9 -0
  183. package/dist/indexer/json-template-chunker.d.ts.map +1 -0
  184. package/dist/indexer/json-template-chunker.js +83 -0
  185. package/dist/indexer/json-template-chunker.js.map +1 -0
  186. package/dist/indexer/liquid-chunker.d.ts +13 -0
  187. package/dist/indexer/liquid-chunker.d.ts.map +1 -0
  188. package/dist/indexer/liquid-chunker.js +272 -0
  189. package/dist/indexer/liquid-chunker.js.map +1 -0
  190. package/dist/indexer/manifest.d.ts +122 -0
  191. package/dist/indexer/manifest.d.ts.map +1 -0
  192. package/dist/indexer/manifest.js +262 -0
  193. package/dist/indexer/manifest.js.map +1 -0
  194. package/dist/indexer/progress-tracker.d.ts +35 -0
  195. package/dist/indexer/progress-tracker.d.ts.map +1 -0
  196. package/dist/indexer/progress-tracker.js +33 -0
  197. package/dist/indexer/progress-tracker.js.map +1 -0
  198. package/dist/indexer/scanner.d.ts +16 -0
  199. package/dist/indexer/scanner.d.ts.map +1 -0
  200. package/dist/indexer/scanner.js +159 -0
  201. package/dist/indexer/scanner.js.map +1 -0
  202. package/dist/indexer/symbol-extractor.d.ts +18 -0
  203. package/dist/indexer/symbol-extractor.d.ts.map +1 -0
  204. package/dist/indexer/symbol-extractor.js +351 -0
  205. package/dist/indexer/symbol-extractor.js.map +1 -0
  206. package/dist/indexer/types.d.ts +34 -0
  207. package/dist/indexer/types.d.ts.map +1 -0
  208. package/dist/indexer/types.js +2 -0
  209. package/dist/indexer/types.js.map +1 -0
  210. package/dist/insights/complexity-analyzer.d.ts +82 -0
  211. package/dist/insights/complexity-analyzer.d.ts.map +1 -0
  212. package/dist/insights/complexity-analyzer.js +356 -0
  213. package/dist/insights/complexity-analyzer.js.map +1 -0
  214. package/dist/insights/formatters/index.d.ts +11 -0
  215. package/dist/insights/formatters/index.d.ts.map +1 -0
  216. package/dist/insights/formatters/index.js +20 -0
  217. package/dist/insights/formatters/index.js.map +1 -0
  218. package/dist/insights/formatters/json.d.ts +7 -0
  219. package/dist/insights/formatters/json.d.ts.map +1 -0
  220. package/dist/insights/formatters/json.js +14 -0
  221. package/dist/insights/formatters/json.js.map +1 -0
  222. package/dist/insights/formatters/sarif.d.ts +6 -0
  223. package/dist/insights/formatters/sarif.d.ts.map +1 -0
  224. package/dist/insights/formatters/sarif.js +113 -0
  225. package/dist/insights/formatters/sarif.js.map +1 -0
  226. package/dist/insights/formatters/text.d.ts +6 -0
  227. package/dist/insights/formatters/text.d.ts.map +1 -0
  228. package/dist/insights/formatters/text.js +154 -0
  229. package/dist/insights/formatters/text.js.map +1 -0
  230. package/dist/insights/types.d.ts +73 -0
  231. package/dist/insights/types.d.ts.map +1 -0
  232. package/dist/insights/types.js +9 -0
  233. package/dist/insights/types.js.map +1 -0
  234. package/dist/types/index.d.ts +14 -0
  235. package/dist/types/index.d.ts.map +1 -0
  236. package/dist/types/index.js +8 -0
  237. package/dist/types/index.js.map +1 -0
  238. package/dist/utils/path-matching.d.ts +69 -0
  239. package/dist/utils/path-matching.d.ts.map +1 -0
  240. package/dist/utils/path-matching.js +123 -0
  241. package/dist/utils/path-matching.js.map +1 -0
  242. package/dist/utils/result.d.ts +65 -0
  243. package/dist/utils/result.d.ts.map +1 -0
  244. package/dist/utils/result.js +67 -0
  245. package/dist/utils/result.js.map +1 -0
  246. package/dist/utils/version.d.ts +22 -0
  247. package/dist/utils/version.d.ts.map +1 -0
  248. package/dist/utils/version.js +28 -0
  249. package/dist/utils/version.js.map +1 -0
  250. package/dist/vectordb/batch-insert.d.ts +14 -0
  251. package/dist/vectordb/batch-insert.d.ts.map +1 -0
  252. package/dist/vectordb/batch-insert.js +185 -0
  253. package/dist/vectordb/batch-insert.js.map +1 -0
  254. package/dist/vectordb/boosting/composer.d.ts +51 -0
  255. package/dist/vectordb/boosting/composer.d.ts.map +1 -0
  256. package/dist/vectordb/boosting/composer.js +65 -0
  257. package/dist/vectordb/boosting/composer.js.map +1 -0
  258. package/dist/vectordb/boosting/index.d.ts +22 -0
  259. package/dist/vectordb/boosting/index.d.ts.map +1 -0
  260. package/dist/vectordb/boosting/index.js +22 -0
  261. package/dist/vectordb/boosting/index.js.map +1 -0
  262. package/dist/vectordb/boosting/strategies.d.ts +40 -0
  263. package/dist/vectordb/boosting/strategies.d.ts.map +1 -0
  264. package/dist/vectordb/boosting/strategies.js +174 -0
  265. package/dist/vectordb/boosting/strategies.js.map +1 -0
  266. package/dist/vectordb/boosting/types.d.ts +20 -0
  267. package/dist/vectordb/boosting/types.d.ts.map +1 -0
  268. package/dist/vectordb/boosting/types.js +2 -0
  269. package/dist/vectordb/boosting/types.js.map +1 -0
  270. package/dist/vectordb/intent-classifier.d.ts +99 -0
  271. package/dist/vectordb/intent-classifier.d.ts.map +1 -0
  272. package/dist/vectordb/intent-classifier.js +193 -0
  273. package/dist/vectordb/intent-classifier.js.map +1 -0
  274. package/dist/vectordb/lancedb.d.ts +45 -0
  275. package/dist/vectordb/lancedb.d.ts.map +1 -0
  276. package/dist/vectordb/lancedb.js +203 -0
  277. package/dist/vectordb/lancedb.js.map +1 -0
  278. package/dist/vectordb/maintenance.d.ts +18 -0
  279. package/dist/vectordb/maintenance.d.ts.map +1 -0
  280. package/dist/vectordb/maintenance.js +87 -0
  281. package/dist/vectordb/maintenance.js.map +1 -0
  282. package/dist/vectordb/query.d.ts +34 -0
  283. package/dist/vectordb/query.d.ts.map +1 -0
  284. package/dist/vectordb/query.js +303 -0
  285. package/dist/vectordb/query.js.map +1 -0
  286. package/dist/vectordb/relevance.d.ts +15 -0
  287. package/dist/vectordb/relevance.d.ts.map +1 -0
  288. package/dist/vectordb/relevance.js +19 -0
  289. package/dist/vectordb/relevance.js.map +1 -0
  290. package/dist/vectordb/types.d.ts +29 -0
  291. package/dist/vectordb/types.d.ts.map +1 -0
  292. package/dist/vectordb/types.js +2 -0
  293. package/dist/vectordb/types.js.map +1 -0
  294. package/dist/vectordb/version.d.ts +16 -0
  295. package/dist/vectordb/version.d.ts.map +1 -0
  296. package/dist/vectordb/version.js +40 -0
  297. package/dist/vectordb/version.js.map +1 -0
  298. package/package.json +66 -0
@@ -0,0 +1,219 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { defaultDetectionOptions } from './types.js';
4
+ import { frameworkDetectors } from './registry.js';
5
+ /**
6
+ * Strip the internal priority property from a detection result.
7
+ */
8
+ function stripPriority(detection) {
9
+ const { priority, ...result } = detection;
10
+ return result;
11
+ }
12
+ /**
13
+ * Log skipped frameworks when lower confidence detections are ignored.
14
+ */
15
+ function logSkippedFrameworks(skipped, context) {
16
+ if (skipped.length === 0)
17
+ return;
18
+ const names = skipped.map(d => d.name).join(', ');
19
+ if (context) {
20
+ console.log(` → Skipping ${names} at ${context.relativePath} (${context.winnerName} takes precedence)`);
21
+ }
22
+ else {
23
+ console.log(` → Skipping lower confidence detections: ${names}`);
24
+ }
25
+ }
26
+ /**
27
+ * Group detections by confidence level.
28
+ */
29
+ export function groupByConfidence(detections) {
30
+ return {
31
+ high: detections.filter(d => d.confidence === 'high'),
32
+ medium: detections.filter(d => d.confidence === 'medium'),
33
+ low: detections.filter(d => d.confidence === 'low'),
34
+ };
35
+ }
36
+ /**
37
+ * Select the winner from a list using priority (highest priority wins).
38
+ * Returns the winner and the remaining (skipped) detections.
39
+ *
40
+ * @throws Error if detections array is empty
41
+ */
42
+ export function selectByPriority(detections) {
43
+ if (detections.length === 0) {
44
+ throw new Error('selectByPriority requires at least one detection');
45
+ }
46
+ const sorted = [...detections].sort((a, b) => b.priority - a.priority);
47
+ return {
48
+ winner: sorted[0],
49
+ skipped: sorted.slice(1),
50
+ };
51
+ }
52
+ /**
53
+ * Resolve conflicts when multiple frameworks are detected at the same path.
54
+ *
55
+ * Resolution rules (applied in order):
56
+ * 1. Multiple HIGH confidence → keep ALL (hybrid project support)
57
+ * 2. Single HIGH confidence → keep it, skip lower confidence
58
+ * 3. No HIGH but have MEDIUM → use priority to select winner
59
+ * 4. Only LOW confidence → use priority to select winner
60
+ *
61
+ * @param detections - All detected frameworks with their priorities
62
+ * @param relativePath - Path being analyzed (for logging)
63
+ * @returns Array of resolved detection results
64
+ */
65
+ export function resolveFrameworkConflicts(detections, relativePath) {
66
+ // No detections
67
+ if (detections.length === 0) {
68
+ return [];
69
+ }
70
+ // Single detection - no conflict
71
+ if (detections.length === 1) {
72
+ return [stripPriority(detections[0])];
73
+ }
74
+ // Multiple detections - apply resolution rules
75
+ const grouped = groupByConfidence(detections);
76
+ // Rule 1: Multiple HIGH confidence → hybrid project (keep all)
77
+ if (grouped.high.length > 1) {
78
+ const names = grouped.high.map(d => d.name).join(' + ');
79
+ console.log(` → Detected hybrid project: ${names}`);
80
+ logSkippedFrameworks([...grouped.medium, ...grouped.low]);
81
+ return grouped.high.map(stripPriority);
82
+ }
83
+ // Rule 2: Single HIGH confidence → keep it
84
+ if (grouped.high.length === 1) {
85
+ logSkippedFrameworks([...grouped.medium, ...grouped.low]);
86
+ return [stripPriority(grouped.high[0])];
87
+ }
88
+ // Rule 3: No HIGH but have MEDIUM → use priority
89
+ if (grouped.medium.length > 0) {
90
+ const { winner, skipped } = selectByPriority(grouped.medium);
91
+ logSkippedFrameworks([...skipped, ...grouped.low], {
92
+ relativePath,
93
+ winnerName: winner.name,
94
+ });
95
+ return [stripPriority(winner)];
96
+ }
97
+ // Rule 4: Only LOW confidence → use priority
98
+ const { winner, skipped } = selectByPriority(grouped.low);
99
+ if (skipped.length > 0) {
100
+ logSkippedFrameworks(skipped, { relativePath, winnerName: winner.name });
101
+ }
102
+ return [stripPriority(winner)];
103
+ }
104
+ /**
105
+ * Run all framework detectors at a path and collect results.
106
+ *
107
+ * @param rootDir - Project root directory
108
+ * @param relativePath - Path relative to root being scanned
109
+ * @returns Array of detection results with priorities
110
+ */
111
+ export async function runAllDetectors(rootDir, relativePath) {
112
+ const results = [];
113
+ for (const detector of frameworkDetectors) {
114
+ try {
115
+ const result = await detector.detect(rootDir, relativePath);
116
+ if (result.detected) {
117
+ results.push({
118
+ ...result,
119
+ priority: detector.priority ?? 0,
120
+ });
121
+ }
122
+ }
123
+ catch (error) {
124
+ console.error(`Error running detector '${detector.name}' at ${relativePath}:`, error);
125
+ }
126
+ }
127
+ return results;
128
+ }
129
+ /**
130
+ * Detect all frameworks in a monorepo by recursively scanning subdirectories
131
+ * @param rootDir - Absolute path to project root
132
+ * @param options - Detection options (max depth, skip dirs)
133
+ * @returns Array of detected frameworks with their paths
134
+ */
135
+ export async function detectAllFrameworks(rootDir, options = {}) {
136
+ const opts = { ...defaultDetectionOptions, ...options };
137
+ const results = [];
138
+ const visited = new Set();
139
+ // Detect at root first
140
+ await detectAtPath(rootDir, '.', results, visited);
141
+ // Recursively scan subdirectories
142
+ await scanSubdirectories(rootDir, '.', results, visited, 0, opts);
143
+ return results;
144
+ }
145
+ /**
146
+ * Detect frameworks at a specific path.
147
+ *
148
+ * Runs all detectors and resolves conflicts using confidence-based rules.
149
+ * Now delegates to focused helper functions for better testability.
150
+ */
151
+ async function detectAtPath(rootDir, relativePath, results, visited) {
152
+ // Guard: already visited
153
+ const fullPath = path.join(rootDir, relativePath);
154
+ if (visited.has(fullPath)) {
155
+ return;
156
+ }
157
+ visited.add(fullPath);
158
+ // Run detectors
159
+ const detections = await runAllDetectors(rootDir, relativePath);
160
+ // Resolve conflicts and add to results
161
+ const resolved = resolveFrameworkConflicts(detections, relativePath);
162
+ results.push(...resolved);
163
+ }
164
+ /**
165
+ * Recursively scan subdirectories for frameworks
166
+ */
167
+ async function scanSubdirectories(rootDir, relativePath, results, visited, depth, options) {
168
+ // Check depth limit
169
+ if (depth >= options.maxDepth) {
170
+ return;
171
+ }
172
+ const fullPath = path.join(rootDir, relativePath);
173
+ try {
174
+ const entries = await fs.readdir(fullPath, { withFileTypes: true });
175
+ // Process only directories
176
+ const dirs = entries.filter(e => e.isDirectory());
177
+ for (const dir of dirs) {
178
+ // Skip directories in the skip list
179
+ if (options.skipDirs.includes(dir.name)) {
180
+ continue;
181
+ }
182
+ // Skip hidden directories (except .git, .github which are already in skipDirs)
183
+ if (dir.name.startsWith('.')) {
184
+ continue;
185
+ }
186
+ const subPath = relativePath === '.'
187
+ ? dir.name
188
+ : path.join(relativePath, dir.name);
189
+ // Detect at this subdirectory
190
+ await detectAtPath(rootDir, subPath, results, visited);
191
+ // Recurse deeper
192
+ await scanSubdirectories(rootDir, subPath, results, visited, depth + 1, options);
193
+ }
194
+ }
195
+ catch (error) {
196
+ // Silently skip directories we can't read (permission errors, etc.)
197
+ return;
198
+ }
199
+ }
200
+ /**
201
+ * Get a human-readable summary of detected frameworks
202
+ */
203
+ export function getDetectionSummary(results) {
204
+ if (results.length === 0) {
205
+ return 'No frameworks detected';
206
+ }
207
+ const lines = [];
208
+ for (const result of results) {
209
+ const pathDisplay = result.path === '.' ? 'root' : result.path;
210
+ lines.push(`${result.name} at ${pathDisplay} (${result.confidence} confidence)`);
211
+ if (result.evidence.length > 0) {
212
+ result.evidence.forEach(e => {
213
+ lines.push(` - ${e}`);
214
+ });
215
+ }
216
+ }
217
+ return lines.join('\n');
218
+ }
219
+ //# sourceMappingURL=detector-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector-service.js","sourceRoot":"","sources":["../../src/frameworks/detector-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { FrameworkConfig } from '../../config/schema.js';
2
+ /**
3
+ * Generate Laravel framework configuration
4
+ */
5
+ export declare function generateLaravelConfig(_rootDir: string, _relativePath: string): Promise<FrameworkConfig>;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/frameworks/laravel/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,eAAe,CAAC,CAuE1B"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Generate Laravel framework configuration
3
+ */
4
+ export async function generateLaravelConfig(_rootDir, _relativePath) {
5
+ return {
6
+ include: [
7
+ // PHP backend
8
+ 'app/**/*.php',
9
+ 'routes/**/*.php',
10
+ 'config/**/*.php',
11
+ 'database/**/*.php',
12
+ 'resources/**/*.php',
13
+ 'tests/**/*.php',
14
+ '*.php',
15
+ // Frontend assets (Vue/React/Inertia) - Scoped to resources/ to avoid build output
16
+ 'resources/**/*.js',
17
+ 'resources/**/*.ts',
18
+ 'resources/**/*.jsx',
19
+ 'resources/**/*.tsx',
20
+ 'resources/**/*.vue',
21
+ // Blade templates
22
+ 'resources/views/**/*.blade.php',
23
+ // Documentation
24
+ 'docs/**/*.md',
25
+ 'README.md',
26
+ 'CHANGELOG.md',
27
+ ],
28
+ exclude: [
29
+ // Composer dependencies (CRITICAL: exclude before any include patterns)
30
+ '**/vendor/**',
31
+ 'vendor/**',
32
+ // Build outputs (Vite/Mix compiled assets)
33
+ '**/public/build/**',
34
+ 'public/build/**',
35
+ 'public/hot',
36
+ '**/dist/**',
37
+ 'dist/**',
38
+ '**/build/**',
39
+ 'build/**',
40
+ // Laravel system directories
41
+ 'storage/**',
42
+ 'bootstrap/cache/**',
43
+ 'public/**/*.js', // Compiled JS in public
44
+ 'public/**/*.css', // Compiled CSS in public
45
+ // Database boilerplate (not useful for semantic search)
46
+ 'database/migrations/**',
47
+ 'database/seeders/**',
48
+ 'database/factories/**',
49
+ // Node.js dependencies
50
+ '**/node_modules/**',
51
+ 'node_modules/**',
52
+ // Test artifacts
53
+ 'playwright-report/**',
54
+ 'test-results/**',
55
+ 'coverage/**',
56
+ // Build/generated artifacts
57
+ '__generated__/**',
58
+ // Frontend build outputs
59
+ '.vite/**',
60
+ '.nuxt/**',
61
+ '.next/**',
62
+ // Minified files
63
+ '**/*.min.js',
64
+ '**/*.min.css',
65
+ ],
66
+ };
67
+ }
68
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/frameworks/laravel/config.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,aAAqB;IAErB,OAAO;QACL,OAAO,EAAE;YACP,cAAc;YACd,cAAc;YACd,iBAAiB;YACjB,iBAAiB;YACjB,mBAAmB;YACnB,oBAAoB;YACpB,gBAAgB;YAChB,OAAO;YACP,mFAAmF;YACnF,mBAAmB;YACnB,mBAAmB;YACnB,oBAAoB;YACpB,oBAAoB;YACpB,oBAAoB;YACpB,kBAAkB;YAClB,gCAAgC;YAChC,gBAAgB;YAChB,cAAc;YACd,WAAW;YACX,cAAc;SACf;QACD,OAAO,EAAE;YACP,wEAAwE;YACxE,cAAc;YACd,WAAW;YAEX,2CAA2C;YAC3C,oBAAoB;YACpB,iBAAiB;YACjB,YAAY;YACZ,YAAY;YACZ,SAAS;YACT,aAAa;YACb,UAAU;YAEV,6BAA6B;YAC7B,YAAY;YACZ,oBAAoB;YACpB,gBAAgB,EAAG,wBAAwB;YAC3C,iBAAiB,EAAE,yBAAyB;YAE5C,wDAAwD;YACxD,wBAAwB;YACxB,qBAAqB;YACrB,uBAAuB;YAEvB,uBAAuB;YACvB,oBAAoB;YACpB,iBAAiB;YAEjB,iBAAiB;YACjB,sBAAsB;YACtB,iBAAiB;YACjB,aAAa;YAEb,4BAA4B;YAC5B,kBAAkB;YAElB,yBAAyB;YACzB,UAAU;YACV,UAAU;YACV,UAAU;YAEV,iBAAiB;YACjB,aAAa;YACb,cAAc;SACf;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { FrameworkDetector } from '../types.js';
2
+ /**
3
+ * Laravel/PHP framework detector
4
+ */
5
+ export declare const laravelDetector: FrameworkDetector;
6
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../../src/frameworks/laravel/detector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAmB,MAAM,aAAa,CAAC;AAGjE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,iBAoG7B,CAAC"}
@@ -0,0 +1,96 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { generateLaravelConfig } from './config.js';
4
+ /**
5
+ * Laravel/PHP framework detector
6
+ */
7
+ export const laravelDetector = {
8
+ name: 'laravel',
9
+ priority: 100, // Laravel takes precedence over Node.js
10
+ async detect(rootDir, relativePath) {
11
+ const fullPath = path.join(rootDir, relativePath);
12
+ const result = {
13
+ detected: false,
14
+ name: 'laravel',
15
+ path: relativePath,
16
+ confidence: 'low',
17
+ evidence: [],
18
+ };
19
+ // Check for composer.json with Laravel
20
+ const composerJsonPath = path.join(fullPath, 'composer.json');
21
+ let composerJson = null;
22
+ try {
23
+ const content = await fs.readFile(composerJsonPath, 'utf-8');
24
+ composerJson = JSON.parse(content);
25
+ result.evidence.push('Found composer.json');
26
+ }
27
+ catch {
28
+ // No composer.json, not a Laravel project
29
+ return result;
30
+ }
31
+ // Check if Laravel framework is in dependencies
32
+ const hasLaravel = composerJson.require?.['laravel/framework'] ||
33
+ composerJson['require-dev']?.['laravel/framework'];
34
+ if (!hasLaravel) {
35
+ // Has composer.json but not Laravel
36
+ return result;
37
+ }
38
+ result.evidence.push('Laravel framework detected in composer.json');
39
+ // Check for artisan file (strong indicator of Laravel)
40
+ const artisanPath = path.join(fullPath, 'artisan');
41
+ try {
42
+ await fs.access(artisanPath);
43
+ result.evidence.push('Found artisan file');
44
+ result.confidence = 'high';
45
+ }
46
+ catch {
47
+ result.confidence = 'medium';
48
+ }
49
+ // Check for typical Laravel directory structure
50
+ const laravelDirs = ['app', 'routes', 'config', 'database'];
51
+ let foundDirs = 0;
52
+ for (const dir of laravelDirs) {
53
+ try {
54
+ const dirPath = path.join(fullPath, dir);
55
+ const stats = await fs.stat(dirPath);
56
+ if (stats.isDirectory()) {
57
+ foundDirs++;
58
+ }
59
+ }
60
+ catch {
61
+ // Directory doesn't exist
62
+ }
63
+ }
64
+ if (foundDirs >= 2) {
65
+ result.evidence.push(`Laravel directory structure detected (${foundDirs}/${laravelDirs.length} dirs)`);
66
+ result.confidence = 'high';
67
+ }
68
+ // Check for test directories
69
+ const testDirsToCheck = [
70
+ path.join(fullPath, 'tests', 'Feature'),
71
+ path.join(fullPath, 'tests', 'Unit'),
72
+ ];
73
+ for (const testDir of testDirsToCheck) {
74
+ try {
75
+ const stats = await fs.stat(testDir);
76
+ if (stats.isDirectory()) {
77
+ const dirName = path.basename(path.dirname(testDir)) + '/' + path.basename(testDir);
78
+ result.evidence.push(`Found ${dirName} test directory`);
79
+ }
80
+ }
81
+ catch {
82
+ // Test directory doesn't exist
83
+ }
84
+ }
85
+ // Extract Laravel version if available
86
+ if (composerJson.require?.['laravel/framework']) {
87
+ result.version = composerJson.require['laravel/framework'];
88
+ }
89
+ result.detected = true;
90
+ return result;
91
+ },
92
+ async generateConfig(rootDir, relativePath) {
93
+ return generateLaravelConfig(rootDir, relativePath);
94
+ },
95
+ };
96
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../src/frameworks/laravel/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { FrameworkConfig } from '../../config/schema.js';
2
+ /**
3
+ * Generate Node.js framework configuration
4
+ */
5
+ export declare function generateNodeJsConfig(_rootDir: string, _relativePath: string): Promise<FrameworkConfig>;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/frameworks/nodejs/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,eAAe,CAAC,CA2D1B"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Generate Node.js framework configuration
3
+ */
4
+ export async function generateNodeJsConfig(_rootDir, _relativePath) {
5
+ return {
6
+ include: [
7
+ // Broader patterns to catch all common project structures
8
+ // (frontend/, src/, lib/, app/, components/, etc.)
9
+ '**/*.ts',
10
+ '**/*.tsx',
11
+ '**/*.js',
12
+ '**/*.jsx',
13
+ '**/*.vue',
14
+ '**/*.mjs',
15
+ '**/*.cjs',
16
+ '**/*.md',
17
+ '**/*.mdx',
18
+ ],
19
+ exclude: [
20
+ // Node.js dependencies (with ** prefix for nested projects)
21
+ '**/node_modules/**',
22
+ 'node_modules/**',
23
+ // PHP/Composer dependencies (for monorepos with PHP)
24
+ '**/vendor/**',
25
+ 'vendor/**',
26
+ // Build outputs
27
+ '**/dist/**',
28
+ 'dist/**',
29
+ '**/build/**',
30
+ 'build/**',
31
+ '**/public/build/**',
32
+ 'public/build/**',
33
+ 'out/**',
34
+ // Framework build caches
35
+ '.next/**',
36
+ '.nuxt/**',
37
+ '.vite/**',
38
+ '.lien/**',
39
+ // Test artifacts
40
+ 'coverage/**',
41
+ 'playwright-report/**',
42
+ 'test-results/**',
43
+ // Build/generated artifacts
44
+ '__generated__/**',
45
+ // Common build/cache directories
46
+ '.cache/**',
47
+ '.turbo/**',
48
+ '.vercel/**',
49
+ '.netlify/**',
50
+ // Minified/bundled files
51
+ '**/*.min.js',
52
+ '**/*.min.css',
53
+ '**/*.bundle.js',
54
+ ],
55
+ };
56
+ }
57
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/frameworks/nodejs/config.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAgB,EAChB,aAAqB;IAErB,OAAO;QACL,OAAO,EAAE;YACP,0DAA0D;YAC1D,mDAAmD;YACnD,SAAS;YACT,UAAU;YACV,SAAS;YACT,UAAU;YACV,UAAU;YACV,UAAU;YACV,UAAU;YACV,SAAS;YACT,UAAU;SACX;QACD,OAAO,EAAE;YACP,4DAA4D;YAC5D,oBAAoB;YACpB,iBAAiB;YAEjB,qDAAqD;YACrD,cAAc;YACd,WAAW;YAEX,gBAAgB;YAChB,YAAY;YACZ,SAAS;YACT,aAAa;YACb,UAAU;YACV,oBAAoB;YACpB,iBAAiB;YACjB,QAAQ;YAER,yBAAyB;YACzB,UAAU;YACV,UAAU;YACV,UAAU;YACV,UAAU;YAEV,iBAAiB;YACjB,aAAa;YACb,sBAAsB;YACtB,iBAAiB;YAEjB,4BAA4B;YAC5B,kBAAkB;YAElB,iCAAiC;YACjC,WAAW;YACX,WAAW;YACX,YAAY;YACZ,aAAa;YAEb,yBAAyB;YACzB,aAAa;YACb,cAAc;YACd,gBAAgB;SACjB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { FrameworkDetector } from '../types.js';
2
+ /**
3
+ * Node.js/TypeScript/JavaScript framework detector
4
+ */
5
+ export declare const nodejsDetector: FrameworkDetector;
6
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../../src/frameworks/nodejs/detector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAmB,MAAM,aAAa,CAAC;AAGjE;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,iBAkF5B,CAAC"}
@@ -0,0 +1,77 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { generateNodeJsConfig } from './config.js';
4
+ /**
5
+ * Node.js/TypeScript/JavaScript framework detector
6
+ */
7
+ export const nodejsDetector = {
8
+ name: 'nodejs',
9
+ priority: 50, // Generic, yields to specific frameworks like Laravel
10
+ async detect(rootDir, relativePath) {
11
+ const fullPath = path.join(rootDir, relativePath);
12
+ const result = {
13
+ detected: false,
14
+ name: 'nodejs',
15
+ path: relativePath,
16
+ confidence: 'low',
17
+ evidence: [],
18
+ };
19
+ // Check for package.json
20
+ const packageJsonPath = path.join(fullPath, 'package.json');
21
+ let packageJson = null;
22
+ try {
23
+ const content = await fs.readFile(packageJsonPath, 'utf-8');
24
+ packageJson = JSON.parse(content);
25
+ result.evidence.push('Found package.json');
26
+ }
27
+ catch {
28
+ // No package.json, not a Node.js project
29
+ return result;
30
+ }
31
+ // At this point, we know it's a Node.js project
32
+ result.detected = true;
33
+ result.confidence = 'high';
34
+ // Check for TypeScript
35
+ if (packageJson.devDependencies?.typescript || packageJson.dependencies?.typescript) {
36
+ result.evidence.push('TypeScript detected');
37
+ }
38
+ // Check for testing frameworks
39
+ const testFrameworks = [
40
+ { name: 'jest', display: 'Jest' },
41
+ { name: 'vitest', display: 'Vitest' },
42
+ { name: 'mocha', display: 'Mocha' },
43
+ { name: 'ava', display: 'AVA' },
44
+ { name: '@playwright/test', display: 'Playwright' },
45
+ ];
46
+ for (const framework of testFrameworks) {
47
+ if (packageJson.devDependencies?.[framework.name] ||
48
+ packageJson.dependencies?.[framework.name]) {
49
+ result.evidence.push(`${framework.display} test framework detected`);
50
+ break; // Only mention first test framework found
51
+ }
52
+ }
53
+ // Check for common frameworks/libraries
54
+ const frameworks = [
55
+ { name: 'next', display: 'Next.js' },
56
+ { name: 'react', display: 'React' },
57
+ { name: 'vue', display: 'Vue' },
58
+ { name: 'express', display: 'Express' },
59
+ { name: '@nestjs/core', display: 'NestJS' },
60
+ ];
61
+ for (const fw of frameworks) {
62
+ if (packageJson.dependencies?.[fw.name]) {
63
+ result.evidence.push(`${fw.display} detected`);
64
+ break; // Only mention first framework found
65
+ }
66
+ }
67
+ // Try to detect version from package.json engines or node version
68
+ if (packageJson.engines?.node) {
69
+ result.version = packageJson.engines.node;
70
+ }
71
+ return result;
72
+ },
73
+ async generateConfig(rootDir, relativePath) {
74
+ return generateNodeJsConfig(rootDir, relativePath);
75
+ },
76
+ };
77
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../src/frameworks/nodejs/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { FrameworkConfig } from '../../config/schema.js';
2
+ /**
3
+ * Generate generic PHP framework configuration
4
+ */
5
+ export declare function generatePhpConfig(_rootDir: string, _relativePath: string): Promise<FrameworkConfig>;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/frameworks/php/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,eAAe,CAAC,CAwD1B"}