openlore 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.
Files changed (634) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +268 -0
  3. package/dist/api/analyze.d.ts +17 -0
  4. package/dist/api/analyze.d.ts.map +1 -0
  5. package/dist/api/analyze.js +143 -0
  6. package/dist/api/analyze.js.map +1 -0
  7. package/dist/api/audit.d.ts +10 -0
  8. package/dist/api/audit.d.ts.map +1 -0
  9. package/dist/api/audit.js +117 -0
  10. package/dist/api/audit.js.map +1 -0
  11. package/dist/api/decisions.d.ts +55 -0
  12. package/dist/api/decisions.d.ts.map +1 -0
  13. package/dist/api/decisions.js +157 -0
  14. package/dist/api/decisions.js.map +1 -0
  15. package/dist/api/drift.d.ts +21 -0
  16. package/dist/api/drift.d.ts.map +1 -0
  17. package/dist/api/drift.js +152 -0
  18. package/dist/api/drift.js.map +1 -0
  19. package/dist/api/generate.d.ts +18 -0
  20. package/dist/api/generate.d.ts.map +1 -0
  21. package/dist/api/generate.js +259 -0
  22. package/dist/api/generate.js.map +1 -0
  23. package/dist/api/index.d.ts +41 -0
  24. package/dist/api/index.d.ts.map +1 -0
  25. package/dist/api/index.js +34 -0
  26. package/dist/api/index.js.map +1 -0
  27. package/dist/api/init.d.ts +18 -0
  28. package/dist/api/init.d.ts.map +1 -0
  29. package/dist/api/init.js +83 -0
  30. package/dist/api/init.js.map +1 -0
  31. package/dist/api/run.d.ts +19 -0
  32. package/dist/api/run.d.ts.map +1 -0
  33. package/dist/api/run.js +312 -0
  34. package/dist/api/run.js.map +1 -0
  35. package/dist/api/specs.d.ts +49 -0
  36. package/dist/api/specs.d.ts.map +1 -0
  37. package/dist/api/specs.js +137 -0
  38. package/dist/api/specs.js.map +1 -0
  39. package/dist/api/types.d.ts +201 -0
  40. package/dist/api/types.d.ts.map +1 -0
  41. package/dist/api/types.js +9 -0
  42. package/dist/api/types.js.map +1 -0
  43. package/dist/api/verify.d.ts +20 -0
  44. package/dist/api/verify.d.ts.map +1 -0
  45. package/dist/api/verify.js +117 -0
  46. package/dist/api/verify.js.map +1 -0
  47. package/dist/cli/commands/analyze.d.ts +30 -0
  48. package/dist/cli/commands/analyze.d.ts.map +1 -0
  49. package/dist/cli/commands/analyze.js +683 -0
  50. package/dist/cli/commands/analyze.js.map +1 -0
  51. package/dist/cli/commands/audit.d.ts +9 -0
  52. package/dist/cli/commands/audit.d.ts.map +1 -0
  53. package/dist/cli/commands/audit.js +98 -0
  54. package/dist/cli/commands/audit.js.map +1 -0
  55. package/dist/cli/commands/decisions.d.ts +16 -0
  56. package/dist/cli/commands/decisions.d.ts.map +1 -0
  57. package/dist/cli/commands/decisions.js +864 -0
  58. package/dist/cli/commands/decisions.js.map +1 -0
  59. package/dist/cli/commands/digest.d.ts +9 -0
  60. package/dist/cli/commands/digest.d.ts.map +1 -0
  61. package/dist/cli/commands/digest.js +61 -0
  62. package/dist/cli/commands/digest.js.map +1 -0
  63. package/dist/cli/commands/doctor.d.ts +9 -0
  64. package/dist/cli/commands/doctor.d.ts.map +1 -0
  65. package/dist/cli/commands/doctor.js +398 -0
  66. package/dist/cli/commands/doctor.js.map +1 -0
  67. package/dist/cli/commands/drift.d.ts +9 -0
  68. package/dist/cli/commands/drift.d.ts.map +1 -0
  69. package/dist/cli/commands/drift.js +550 -0
  70. package/dist/cli/commands/drift.js.map +1 -0
  71. package/dist/cli/commands/generate.d.ts +9 -0
  72. package/dist/cli/commands/generate.d.ts.map +1 -0
  73. package/dist/cli/commands/generate.js +565 -0
  74. package/dist/cli/commands/generate.js.map +1 -0
  75. package/dist/cli/commands/init.d.ts +9 -0
  76. package/dist/cli/commands/init.d.ts.map +1 -0
  77. package/dist/cli/commands/init.js +173 -0
  78. package/dist/cli/commands/init.js.map +1 -0
  79. package/dist/cli/commands/mcp.d.ts +2235 -0
  80. package/dist/cli/commands/mcp.d.ts.map +1 -0
  81. package/dist/cli/commands/mcp.js +1384 -0
  82. package/dist/cli/commands/mcp.js.map +1 -0
  83. package/dist/cli/commands/refresh-stories.d.ts +10 -0
  84. package/dist/cli/commands/refresh-stories.d.ts.map +1 -0
  85. package/dist/cli/commands/refresh-stories.js +314 -0
  86. package/dist/cli/commands/refresh-stories.js.map +1 -0
  87. package/dist/cli/commands/run.d.ts +9 -0
  88. package/dist/cli/commands/run.d.ts.map +1 -0
  89. package/dist/cli/commands/run.js +459 -0
  90. package/dist/cli/commands/run.js.map +1 -0
  91. package/dist/cli/commands/setup.d.ts +19 -0
  92. package/dist/cli/commands/setup.d.ts.map +1 -0
  93. package/dist/cli/commands/setup.js +355 -0
  94. package/dist/cli/commands/setup.js.map +1 -0
  95. package/dist/cli/commands/test.d.ts +22 -0
  96. package/dist/cli/commands/test.d.ts.map +1 -0
  97. package/dist/cli/commands/test.js +180 -0
  98. package/dist/cli/commands/test.js.map +1 -0
  99. package/dist/cli/commands/verify.d.ts +9 -0
  100. package/dist/cli/commands/verify.d.ts.map +1 -0
  101. package/dist/cli/commands/verify.js +383 -0
  102. package/dist/cli/commands/verify.js.map +1 -0
  103. package/dist/cli/commands/view.d.ts +13 -0
  104. package/dist/cli/commands/view.d.ts.map +1 -0
  105. package/dist/cli/commands/view.js +547 -0
  106. package/dist/cli/commands/view.js.map +1 -0
  107. package/dist/cli/index.d.ts +9 -0
  108. package/dist/cli/index.d.ts.map +1 -0
  109. package/dist/cli/index.js +118 -0
  110. package/dist/cli/index.js.map +1 -0
  111. package/dist/cli/tui-approval.d.ts +11 -0
  112. package/dist/cli/tui-approval.d.ts.map +1 -0
  113. package/dist/cli/tui-approval.js +129 -0
  114. package/dist/cli/tui-approval.js.map +1 -0
  115. package/dist/constants.d.ts +314 -0
  116. package/dist/constants.d.ts.map +1 -0
  117. package/dist/constants.js +382 -0
  118. package/dist/constants.js.map +1 -0
  119. package/dist/core/analyzer/ai-config-generator.d.ts +54 -0
  120. package/dist/core/analyzer/ai-config-generator.d.ts.map +1 -0
  121. package/dist/core/analyzer/ai-config-generator.js +98 -0
  122. package/dist/core/analyzer/ai-config-generator.js.map +1 -0
  123. package/dist/core/analyzer/architecture-writer.d.ts +67 -0
  124. package/dist/core/analyzer/architecture-writer.d.ts.map +1 -0
  125. package/dist/core/analyzer/architecture-writer.js +209 -0
  126. package/dist/core/analyzer/architecture-writer.js.map +1 -0
  127. package/dist/core/analyzer/artifact-generator.d.ts +261 -0
  128. package/dist/core/analyzer/artifact-generator.d.ts.map +1 -0
  129. package/dist/core/analyzer/artifact-generator.js +909 -0
  130. package/dist/core/analyzer/artifact-generator.js.map +1 -0
  131. package/dist/core/analyzer/ast-chunker.d.ts +24 -0
  132. package/dist/core/analyzer/ast-chunker.d.ts.map +1 -0
  133. package/dist/core/analyzer/ast-chunker.js +198 -0
  134. package/dist/core/analyzer/ast-chunker.js.map +1 -0
  135. package/dist/core/analyzer/call-graph.d.ts +162 -0
  136. package/dist/core/analyzer/call-graph.d.ts.map +1 -0
  137. package/dist/core/analyzer/call-graph.js +2040 -0
  138. package/dist/core/analyzer/call-graph.js.map +1 -0
  139. package/dist/core/analyzer/code-shaper.d.ts +33 -0
  140. package/dist/core/analyzer/code-shaper.d.ts.map +1 -0
  141. package/dist/core/analyzer/code-shaper.js +154 -0
  142. package/dist/core/analyzer/code-shaper.js.map +1 -0
  143. package/dist/core/analyzer/codebase-digest.d.ts +40 -0
  144. package/dist/core/analyzer/codebase-digest.d.ts.map +1 -0
  145. package/dist/core/analyzer/codebase-digest.js +195 -0
  146. package/dist/core/analyzer/codebase-digest.js.map +1 -0
  147. package/dist/core/analyzer/cpp-header-resolver.d.ts +30 -0
  148. package/dist/core/analyzer/cpp-header-resolver.d.ts.map +1 -0
  149. package/dist/core/analyzer/cpp-header-resolver.js +71 -0
  150. package/dist/core/analyzer/cpp-header-resolver.js.map +1 -0
  151. package/dist/core/analyzer/dependency-graph.d.ts +230 -0
  152. package/dist/core/analyzer/dependency-graph.d.ts.map +1 -0
  153. package/dist/core/analyzer/dependency-graph.js +752 -0
  154. package/dist/core/analyzer/dependency-graph.js.map +1 -0
  155. package/dist/core/analyzer/duplicate-detector.d.ts +52 -0
  156. package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -0
  157. package/dist/core/analyzer/duplicate-detector.js +289 -0
  158. package/dist/core/analyzer/duplicate-detector.js.map +1 -0
  159. package/dist/core/analyzer/embedding-service.d.ts +56 -0
  160. package/dist/core/analyzer/embedding-service.d.ts.map +1 -0
  161. package/dist/core/analyzer/embedding-service.js +118 -0
  162. package/dist/core/analyzer/embedding-service.js.map +1 -0
  163. package/dist/core/analyzer/env-extractor.d.ts +33 -0
  164. package/dist/core/analyzer/env-extractor.d.ts.map +1 -0
  165. package/dist/core/analyzer/env-extractor.js +196 -0
  166. package/dist/core/analyzer/env-extractor.js.map +1 -0
  167. package/dist/core/analyzer/external-packages.d.ts +20 -0
  168. package/dist/core/analyzer/external-packages.d.ts.map +1 -0
  169. package/dist/core/analyzer/external-packages.js +175 -0
  170. package/dist/core/analyzer/external-packages.js.map +1 -0
  171. package/dist/core/analyzer/file-walker.d.ts +78 -0
  172. package/dist/core/analyzer/file-walker.d.ts.map +1 -0
  173. package/dist/core/analyzer/file-walker.js +532 -0
  174. package/dist/core/analyzer/file-walker.js.map +1 -0
  175. package/dist/core/analyzer/function-registry-trie.d.ts +21 -0
  176. package/dist/core/analyzer/function-registry-trie.d.ts.map +1 -0
  177. package/dist/core/analyzer/function-registry-trie.js +39 -0
  178. package/dist/core/analyzer/function-registry-trie.js.map +1 -0
  179. package/dist/core/analyzer/http-route-parser.d.ts +152 -0
  180. package/dist/core/analyzer/http-route-parser.d.ts.map +1 -0
  181. package/dist/core/analyzer/http-route-parser.js +971 -0
  182. package/dist/core/analyzer/http-route-parser.js.map +1 -0
  183. package/dist/core/analyzer/import-parser.d.ts +100 -0
  184. package/dist/core/analyzer/import-parser.d.ts.map +1 -0
  185. package/dist/core/analyzer/import-parser.js +952 -0
  186. package/dist/core/analyzer/import-parser.js.map +1 -0
  187. package/dist/core/analyzer/import-resolver-bridge.d.ts +25 -0
  188. package/dist/core/analyzer/import-resolver-bridge.d.ts.map +1 -0
  189. package/dist/core/analyzer/import-resolver-bridge.js +99 -0
  190. package/dist/core/analyzer/import-resolver-bridge.js.map +1 -0
  191. package/dist/core/analyzer/index.d.ts +10 -0
  192. package/dist/core/analyzer/index.d.ts.map +1 -0
  193. package/dist/core/analyzer/index.js +10 -0
  194. package/dist/core/analyzer/index.js.map +1 -0
  195. package/dist/core/analyzer/middleware-extractor.d.ts +29 -0
  196. package/dist/core/analyzer/middleware-extractor.d.ts.map +1 -0
  197. package/dist/core/analyzer/middleware-extractor.js +195 -0
  198. package/dist/core/analyzer/middleware-extractor.js.map +1 -0
  199. package/dist/core/analyzer/refactor-analyzer.d.ts +83 -0
  200. package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -0
  201. package/dist/core/analyzer/refactor-analyzer.js +351 -0
  202. package/dist/core/analyzer/refactor-analyzer.js.map +1 -0
  203. package/dist/core/analyzer/repository-mapper.d.ts +150 -0
  204. package/dist/core/analyzer/repository-mapper.d.ts.map +1 -0
  205. package/dist/core/analyzer/repository-mapper.js +740 -0
  206. package/dist/core/analyzer/repository-mapper.js.map +1 -0
  207. package/dist/core/analyzer/schema-extractor.d.ts +41 -0
  208. package/dist/core/analyzer/schema-extractor.d.ts.map +1 -0
  209. package/dist/core/analyzer/schema-extractor.js +229 -0
  210. package/dist/core/analyzer/schema-extractor.js.map +1 -0
  211. package/dist/core/analyzer/signature-extractor.d.ts +31 -0
  212. package/dist/core/analyzer/signature-extractor.d.ts.map +1 -0
  213. package/dist/core/analyzer/signature-extractor.js +675 -0
  214. package/dist/core/analyzer/signature-extractor.js.map +1 -0
  215. package/dist/core/analyzer/significance-scorer.d.ts +79 -0
  216. package/dist/core/analyzer/significance-scorer.d.ts.map +1 -0
  217. package/dist/core/analyzer/significance-scorer.js +407 -0
  218. package/dist/core/analyzer/significance-scorer.js.map +1 -0
  219. package/dist/core/analyzer/spec-snapshot-generator.d.ts +17 -0
  220. package/dist/core/analyzer/spec-snapshot-generator.d.ts.map +1 -0
  221. package/dist/core/analyzer/spec-snapshot-generator.js +201 -0
  222. package/dist/core/analyzer/spec-snapshot-generator.js.map +1 -0
  223. package/dist/core/analyzer/spec-vector-index.d.ts +68 -0
  224. package/dist/core/analyzer/spec-vector-index.d.ts.map +1 -0
  225. package/dist/core/analyzer/spec-vector-index.js +340 -0
  226. package/dist/core/analyzer/spec-vector-index.js.map +1 -0
  227. package/dist/core/analyzer/subgraph-extractor.d.ts +51 -0
  228. package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -0
  229. package/dist/core/analyzer/subgraph-extractor.js +147 -0
  230. package/dist/core/analyzer/subgraph-extractor.js.map +1 -0
  231. package/dist/core/analyzer/type-inference-engine.d.ts +23 -0
  232. package/dist/core/analyzer/type-inference-engine.d.ts.map +1 -0
  233. package/dist/core/analyzer/type-inference-engine.js +130 -0
  234. package/dist/core/analyzer/type-inference-engine.js.map +1 -0
  235. package/dist/core/analyzer/ui-component-extractor.d.ts +43 -0
  236. package/dist/core/analyzer/ui-component-extractor.d.ts.map +1 -0
  237. package/dist/core/analyzer/ui-component-extractor.js +245 -0
  238. package/dist/core/analyzer/ui-component-extractor.js.map +1 -0
  239. package/dist/core/analyzer/unified-search.d.ts +116 -0
  240. package/dist/core/analyzer/unified-search.d.ts.map +1 -0
  241. package/dist/core/analyzer/unified-search.js +231 -0
  242. package/dist/core/analyzer/unified-search.js.map +1 -0
  243. package/dist/core/analyzer/vector-index.d.ts +92 -0
  244. package/dist/core/analyzer/vector-index.d.ts.map +1 -0
  245. package/dist/core/analyzer/vector-index.js +451 -0
  246. package/dist/core/analyzer/vector-index.js.map +1 -0
  247. package/dist/core/decisions/consolidator.d.ts +14 -0
  248. package/dist/core/decisions/consolidator.d.ts.map +1 -0
  249. package/dist/core/decisions/consolidator.js +169 -0
  250. package/dist/core/decisions/consolidator.js.map +1 -0
  251. package/dist/core/decisions/extractor.d.ts +26 -0
  252. package/dist/core/decisions/extractor.d.ts.map +1 -0
  253. package/dist/core/decisions/extractor.js +156 -0
  254. package/dist/core/decisions/extractor.js.map +1 -0
  255. package/dist/core/decisions/index.d.ts +19 -0
  256. package/dist/core/decisions/index.d.ts.map +1 -0
  257. package/dist/core/decisions/index.js +16 -0
  258. package/dist/core/decisions/index.js.map +1 -0
  259. package/dist/core/decisions/store.d.ts +36 -0
  260. package/dist/core/decisions/store.d.ts.map +1 -0
  261. package/dist/core/decisions/store.js +109 -0
  262. package/dist/core/decisions/store.js.map +1 -0
  263. package/dist/core/decisions/syncer.d.ts +27 -0
  264. package/dist/core/decisions/syncer.d.ts.map +1 -0
  265. package/dist/core/decisions/syncer.js +214 -0
  266. package/dist/core/decisions/syncer.js.map +1 -0
  267. package/dist/core/decisions/verifier.d.ts +20 -0
  268. package/dist/core/decisions/verifier.d.ts.map +1 -0
  269. package/dist/core/decisions/verifier.js +115 -0
  270. package/dist/core/decisions/verifier.js.map +1 -0
  271. package/dist/core/digest/digest-generator.d.ts +29 -0
  272. package/dist/core/digest/digest-generator.d.ts.map +1 -0
  273. package/dist/core/digest/digest-generator.js +181 -0
  274. package/dist/core/digest/digest-generator.js.map +1 -0
  275. package/dist/core/drift/drift-detector.d.ts +102 -0
  276. package/dist/core/drift/drift-detector.d.ts.map +1 -0
  277. package/dist/core/drift/drift-detector.js +598 -0
  278. package/dist/core/drift/drift-detector.js.map +1 -0
  279. package/dist/core/drift/git-diff.d.ts +60 -0
  280. package/dist/core/drift/git-diff.d.ts.map +1 -0
  281. package/dist/core/drift/git-diff.js +383 -0
  282. package/dist/core/drift/git-diff.js.map +1 -0
  283. package/dist/core/drift/index.d.ts +12 -0
  284. package/dist/core/drift/index.d.ts.map +1 -0
  285. package/dist/core/drift/index.js +9 -0
  286. package/dist/core/drift/index.js.map +1 -0
  287. package/dist/core/drift/spec-mapper.d.ts +73 -0
  288. package/dist/core/drift/spec-mapper.d.ts.map +1 -0
  289. package/dist/core/drift/spec-mapper.js +353 -0
  290. package/dist/core/drift/spec-mapper.js.map +1 -0
  291. package/dist/core/drift/test-suggester.d.ts +18 -0
  292. package/dist/core/drift/test-suggester.d.ts.map +1 -0
  293. package/dist/core/drift/test-suggester.js +107 -0
  294. package/dist/core/drift/test-suggester.js.map +1 -0
  295. package/dist/core/generator/adr-generator.d.ts +32 -0
  296. package/dist/core/generator/adr-generator.d.ts.map +1 -0
  297. package/dist/core/generator/adr-generator.js +192 -0
  298. package/dist/core/generator/adr-generator.js.map +1 -0
  299. package/dist/core/generator/index.d.ts +9 -0
  300. package/dist/core/generator/index.d.ts.map +1 -0
  301. package/dist/core/generator/index.js +12 -0
  302. package/dist/core/generator/index.js.map +1 -0
  303. package/dist/core/generator/mapping-generator.d.ts +54 -0
  304. package/dist/core/generator/mapping-generator.d.ts.map +1 -0
  305. package/dist/core/generator/mapping-generator.js +240 -0
  306. package/dist/core/generator/mapping-generator.js.map +1 -0
  307. package/dist/core/generator/openspec-compat.d.ts +160 -0
  308. package/dist/core/generator/openspec-compat.d.ts.map +1 -0
  309. package/dist/core/generator/openspec-compat.js +524 -0
  310. package/dist/core/generator/openspec-compat.js.map +1 -0
  311. package/dist/core/generator/openspec-format-generator.d.ts +131 -0
  312. package/dist/core/generator/openspec-format-generator.d.ts.map +1 -0
  313. package/dist/core/generator/openspec-format-generator.js +963 -0
  314. package/dist/core/generator/openspec-format-generator.js.map +1 -0
  315. package/dist/core/generator/openspec-writer.d.ts +130 -0
  316. package/dist/core/generator/openspec-writer.d.ts.map +1 -0
  317. package/dist/core/generator/openspec-writer.js +404 -0
  318. package/dist/core/generator/openspec-writer.js.map +1 -0
  319. package/dist/core/generator/prompts.d.ts +35 -0
  320. package/dist/core/generator/prompts.d.ts.map +1 -0
  321. package/dist/core/generator/prompts.js +212 -0
  322. package/dist/core/generator/prompts.js.map +1 -0
  323. package/dist/core/generator/rag-manifest-generator.d.ts +37 -0
  324. package/dist/core/generator/rag-manifest-generator.d.ts.map +1 -0
  325. package/dist/core/generator/rag-manifest-generator.js +134 -0
  326. package/dist/core/generator/rag-manifest-generator.js.map +1 -0
  327. package/dist/core/generator/schemas.d.ts +365 -0
  328. package/dist/core/generator/schemas.d.ts.map +1 -0
  329. package/dist/core/generator/schemas.js +190 -0
  330. package/dist/core/generator/schemas.js.map +1 -0
  331. package/dist/core/generator/spec-pipeline.d.ts +123 -0
  332. package/dist/core/generator/spec-pipeline.d.ts.map +1 -0
  333. package/dist/core/generator/spec-pipeline.js +699 -0
  334. package/dist/core/generator/spec-pipeline.js.map +1 -0
  335. package/dist/core/generator/stages/stage1-survey.d.ts +19 -0
  336. package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -0
  337. package/dist/core/generator/stages/stage1-survey.js +171 -0
  338. package/dist/core/generator/stages/stage1-survey.js.map +1 -0
  339. package/dist/core/generator/stages/stage2-entities.d.ts +11 -0
  340. package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -0
  341. package/dist/core/generator/stages/stage2-entities.js +74 -0
  342. package/dist/core/generator/stages/stage2-entities.js.map +1 -0
  343. package/dist/core/generator/stages/stage3-services.d.ts +11 -0
  344. package/dist/core/generator/stages/stage3-services.d.ts.map +1 -0
  345. package/dist/core/generator/stages/stage3-services.js +85 -0
  346. package/dist/core/generator/stages/stage3-services.js.map +1 -0
  347. package/dist/core/generator/stages/stage4-api.d.ts +11 -0
  348. package/dist/core/generator/stages/stage4-api.d.ts.map +1 -0
  349. package/dist/core/generator/stages/stage4-api.js +72 -0
  350. package/dist/core/generator/stages/stage4-api.js.map +1 -0
  351. package/dist/core/generator/stages/stage5-architecture.d.ts +11 -0
  352. package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -0
  353. package/dist/core/generator/stages/stage5-architecture.js +75 -0
  354. package/dist/core/generator/stages/stage5-architecture.js.map +1 -0
  355. package/dist/core/generator/stages/stage6-adr.d.ts +8 -0
  356. package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -0
  357. package/dist/core/generator/stages/stage6-adr.js +47 -0
  358. package/dist/core/generator/stages/stage6-adr.js.map +1 -0
  359. package/dist/core/services/chat-agent.d.ts +50 -0
  360. package/dist/core/services/chat-agent.d.ts.map +1 -0
  361. package/dist/core/services/chat-agent.js +369 -0
  362. package/dist/core/services/chat-agent.js.map +1 -0
  363. package/dist/core/services/chat-tools.d.ts +32 -0
  364. package/dist/core/services/chat-tools.d.ts.map +1 -0
  365. package/dist/core/services/chat-tools.js +494 -0
  366. package/dist/core/services/chat-tools.js.map +1 -0
  367. package/dist/core/services/config-manager.d.ts +61 -0
  368. package/dist/core/services/config-manager.d.ts.map +1 -0
  369. package/dist/core/services/config-manager.js +149 -0
  370. package/dist/core/services/config-manager.js.map +1 -0
  371. package/dist/core/services/edge-store.d.ts +57 -0
  372. package/dist/core/services/edge-store.d.ts.map +1 -0
  373. package/dist/core/services/edge-store.js +419 -0
  374. package/dist/core/services/edge-store.js.map +1 -0
  375. package/dist/core/services/gitignore-manager.d.ts +29 -0
  376. package/dist/core/services/gitignore-manager.d.ts.map +1 -0
  377. package/dist/core/services/gitignore-manager.js +95 -0
  378. package/dist/core/services/gitignore-manager.js.map +1 -0
  379. package/dist/core/services/index.d.ts +8 -0
  380. package/dist/core/services/index.d.ts.map +1 -0
  381. package/dist/core/services/index.js +8 -0
  382. package/dist/core/services/index.js.map +1 -0
  383. package/dist/core/services/llm-service.d.ts +379 -0
  384. package/dist/core/services/llm-service.d.ts.map +1 -0
  385. package/dist/core/services/llm-service.js +1553 -0
  386. package/dist/core/services/llm-service.js.map +1 -0
  387. package/dist/core/services/mcp-handlers/analysis.d.ts +127 -0
  388. package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -0
  389. package/dist/core/services/mcp-handlers/analysis.js +1185 -0
  390. package/dist/core/services/mcp-handlers/analysis.js.map +1 -0
  391. package/dist/core/services/mcp-handlers/change.d.ts +14 -0
  392. package/dist/core/services/mcp-handlers/change.d.ts.map +1 -0
  393. package/dist/core/services/mcp-handlers/change.js +416 -0
  394. package/dist/core/services/mcp-handlers/change.js.map +1 -0
  395. package/dist/core/services/mcp-handlers/decisions.d.ts +16 -0
  396. package/dist/core/services/mcp-handlers/decisions.d.ts.map +1 -0
  397. package/dist/core/services/mcp-handlers/decisions.js +239 -0
  398. package/dist/core/services/mcp-handlers/decisions.js.map +1 -0
  399. package/dist/core/services/mcp-handlers/graph.d.ts +94 -0
  400. package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -0
  401. package/dist/core/services/mcp-handlers/graph.js +693 -0
  402. package/dist/core/services/mcp-handlers/graph.js.map +1 -0
  403. package/dist/core/services/mcp-handlers/orient.d.ts +17 -0
  404. package/dist/core/services/mcp-handlers/orient.d.ts.map +1 -0
  405. package/dist/core/services/mcp-handlers/orient.js +357 -0
  406. package/dist/core/services/mcp-handlers/orient.js.map +1 -0
  407. package/dist/core/services/mcp-handlers/semantic.d.ts +66 -0
  408. package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -0
  409. package/dist/core/services/mcp-handlers/semantic.js +432 -0
  410. package/dist/core/services/mcp-handlers/semantic.js.map +1 -0
  411. package/dist/core/services/mcp-handlers/utils.d.ts +85 -0
  412. package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -0
  413. package/dist/core/services/mcp-handlers/utils.js +262 -0
  414. package/dist/core/services/mcp-handlers/utils.js.map +1 -0
  415. package/dist/core/services/mcp-watcher.d.ts +41 -0
  416. package/dist/core/services/mcp-watcher.d.ts.map +1 -0
  417. package/dist/core/services/mcp-watcher.js +254 -0
  418. package/dist/core/services/mcp-watcher.js.map +1 -0
  419. package/dist/core/services/project-detector.d.ts +32 -0
  420. package/dist/core/services/project-detector.d.ts.map +1 -0
  421. package/dist/core/services/project-detector.js +100 -0
  422. package/dist/core/services/project-detector.js.map +1 -0
  423. package/dist/core/test-generator/coverage-analyzer.d.ts +27 -0
  424. package/dist/core/test-generator/coverage-analyzer.d.ts.map +1 -0
  425. package/dist/core/test-generator/coverage-analyzer.js +285 -0
  426. package/dist/core/test-generator/coverage-analyzer.js.map +1 -0
  427. package/dist/core/test-generator/framework-detector.d.ts +17 -0
  428. package/dist/core/test-generator/framework-detector.d.ts.map +1 -0
  429. package/dist/core/test-generator/framework-detector.js +65 -0
  430. package/dist/core/test-generator/framework-detector.js.map +1 -0
  431. package/dist/core/test-generator/index.d.ts +14 -0
  432. package/dist/core/test-generator/index.d.ts.map +1 -0
  433. package/dist/core/test-generator/index.js +11 -0
  434. package/dist/core/test-generator/index.js.map +1 -0
  435. package/dist/core/test-generator/renderers/catch2.d.ts +8 -0
  436. package/dist/core/test-generator/renderers/catch2.d.ts.map +1 -0
  437. package/dist/core/test-generator/renderers/catch2.js +47 -0
  438. package/dist/core/test-generator/renderers/catch2.js.map +1 -0
  439. package/dist/core/test-generator/renderers/gtest.d.ts +8 -0
  440. package/dist/core/test-generator/renderers/gtest.d.ts.map +1 -0
  441. package/dist/core/test-generator/renderers/gtest.js +45 -0
  442. package/dist/core/test-generator/renderers/gtest.js.map +1 -0
  443. package/dist/core/test-generator/renderers/index.d.ts +20 -0
  444. package/dist/core/test-generator/renderers/index.d.ts.map +1 -0
  445. package/dist/core/test-generator/renderers/index.js +35 -0
  446. package/dist/core/test-generator/renderers/index.js.map +1 -0
  447. package/dist/core/test-generator/renderers/playwright.d.ts +8 -0
  448. package/dist/core/test-generator/renderers/playwright.d.ts.map +1 -0
  449. package/dist/core/test-generator/renderers/playwright.js +44 -0
  450. package/dist/core/test-generator/renderers/playwright.js.map +1 -0
  451. package/dist/core/test-generator/renderers/pytest.d.ts +8 -0
  452. package/dist/core/test-generator/renderers/pytest.d.ts.map +1 -0
  453. package/dist/core/test-generator/renderers/pytest.js +44 -0
  454. package/dist/core/test-generator/renderers/pytest.js.map +1 -0
  455. package/dist/core/test-generator/renderers/shared.d.ts +21 -0
  456. package/dist/core/test-generator/renderers/shared.d.ts.map +1 -0
  457. package/dist/core/test-generator/renderers/shared.js +56 -0
  458. package/dist/core/test-generator/renderers/shared.js.map +1 -0
  459. package/dist/core/test-generator/renderers/vitest.d.ts +8 -0
  460. package/dist/core/test-generator/renderers/vitest.d.ts.map +1 -0
  461. package/dist/core/test-generator/renderers/vitest.js +52 -0
  462. package/dist/core/test-generator/renderers/vitest.js.map +1 -0
  463. package/dist/core/test-generator/scenario-parser.d.ts +33 -0
  464. package/dist/core/test-generator/scenario-parser.d.ts.map +1 -0
  465. package/dist/core/test-generator/scenario-parser.js +244 -0
  466. package/dist/core/test-generator/scenario-parser.js.map +1 -0
  467. package/dist/core/test-generator/test-generator.d.ts +30 -0
  468. package/dist/core/test-generator/test-generator.d.ts.map +1 -0
  469. package/dist/core/test-generator/test-generator.js +174 -0
  470. package/dist/core/test-generator/test-generator.js.map +1 -0
  471. package/dist/core/test-generator/test-writer.d.ts +25 -0
  472. package/dist/core/test-generator/test-writer.d.ts.map +1 -0
  473. package/dist/core/test-generator/test-writer.js +128 -0
  474. package/dist/core/test-generator/test-writer.js.map +1 -0
  475. package/dist/core/test-generator/then-matchers.d.ts +35 -0
  476. package/dist/core/test-generator/then-matchers.d.ts.map +1 -0
  477. package/dist/core/test-generator/then-matchers.js +211 -0
  478. package/dist/core/test-generator/then-matchers.js.map +1 -0
  479. package/dist/core/verifier/index.d.ts +5 -0
  480. package/dist/core/verifier/index.d.ts.map +1 -0
  481. package/dist/core/verifier/index.js +5 -0
  482. package/dist/core/verifier/index.js.map +1 -0
  483. package/dist/core/verifier/verification-engine.d.ts +293 -0
  484. package/dist/core/verifier/verification-engine.d.ts.map +1 -0
  485. package/dist/core/verifier/verification-engine.js +919 -0
  486. package/dist/core/verifier/verification-engine.js.map +1 -0
  487. package/dist/types/index.d.ts +368 -0
  488. package/dist/types/index.d.ts.map +1 -0
  489. package/dist/types/index.js +5 -0
  490. package/dist/types/index.js.map +1 -0
  491. package/dist/types/pipeline.d.ts +167 -0
  492. package/dist/types/pipeline.d.ts.map +1 -0
  493. package/dist/types/pipeline.js +5 -0
  494. package/dist/types/pipeline.js.map +1 -0
  495. package/dist/types/test-generator.d.ts +103 -0
  496. package/dist/types/test-generator.d.ts.map +1 -0
  497. package/dist/types/test-generator.js +17 -0
  498. package/dist/types/test-generator.js.map +1 -0
  499. package/dist/utils/command-helpers.d.ts +68 -0
  500. package/dist/utils/command-helpers.d.ts.map +1 -0
  501. package/dist/utils/command-helpers.js +150 -0
  502. package/dist/utils/command-helpers.js.map +1 -0
  503. package/dist/utils/errors.d.ts +51 -0
  504. package/dist/utils/errors.d.ts.map +1 -0
  505. package/dist/utils/errors.js +129 -0
  506. package/dist/utils/errors.js.map +1 -0
  507. package/dist/utils/logger.d.ts +149 -0
  508. package/dist/utils/logger.d.ts.map +1 -0
  509. package/dist/utils/logger.js +342 -0
  510. package/dist/utils/logger.js.map +1 -0
  511. package/dist/utils/misc.d.ts +10 -0
  512. package/dist/utils/misc.d.ts.map +1 -0
  513. package/dist/utils/misc.js +21 -0
  514. package/dist/utils/misc.js.map +1 -0
  515. package/dist/utils/progress.d.ts +142 -0
  516. package/dist/utils/progress.d.ts.map +1 -0
  517. package/dist/utils/progress.js +283 -0
  518. package/dist/utils/progress.js.map +1 -0
  519. package/dist/utils/prompts.d.ts +53 -0
  520. package/dist/utils/prompts.d.ts.map +1 -0
  521. package/dist/utils/prompts.js +199 -0
  522. package/dist/utils/prompts.js.map +1 -0
  523. package/dist/utils/shutdown.d.ts +89 -0
  524. package/dist/utils/shutdown.d.ts.map +1 -0
  525. package/dist/utils/shutdown.js +238 -0
  526. package/dist/utils/shutdown.js.map +1 -0
  527. package/examples/bmad/README.md +113 -0
  528. package/examples/bmad/agents/architect.md +226 -0
  529. package/examples/bmad/agents/dev-brownfield.md +69 -0
  530. package/examples/bmad/setup/architect.customize.yaml +14 -0
  531. package/examples/bmad/tasks/implement-story.md +254 -0
  532. package/examples/bmad/tasks/onboarding.md +169 -0
  533. package/examples/bmad/tasks/refactor.md +178 -0
  534. package/examples/bmad/tasks/sprint-planning.md +168 -0
  535. package/examples/bmad/templates/story.md +108 -0
  536. package/examples/cline-workflows/openlore-analyze-codebase.md +101 -0
  537. package/examples/cline-workflows/openlore-check-spec-drift.md +102 -0
  538. package/examples/cline-workflows/openlore-execute-refactor.md +212 -0
  539. package/examples/cline-workflows/openlore-implement-feature.md +266 -0
  540. package/examples/cline-workflows/openlore-plan-refactor.md +279 -0
  541. package/examples/cline-workflows/openlore-refactor-codebase.md +16 -0
  542. package/examples/cline-workflows/openlore-write-tests.md +177 -0
  543. package/examples/drift-demo/openspec/config.yaml +14 -0
  544. package/examples/drift-demo/openspec/specs/architecture/spec.md +30 -0
  545. package/examples/drift-demo/openspec/specs/auth/spec.md +71 -0
  546. package/examples/drift-demo/openspec/specs/database/spec.md +33 -0
  547. package/examples/drift-demo/openspec/specs/overview/spec.md +20 -0
  548. package/examples/drift-demo/openspec/specs/projects/spec.md +55 -0
  549. package/examples/drift-demo/openspec/specs/tasks/spec.md +78 -0
  550. package/examples/drift-demo/package.json +21 -0
  551. package/examples/drift-demo/src/auth/auth-middleware.ts +30 -0
  552. package/examples/drift-demo/src/auth/auth-routes.ts +29 -0
  553. package/examples/drift-demo/src/auth/auth-service.ts +45 -0
  554. package/examples/drift-demo/src/database/connection.ts +27 -0
  555. package/examples/drift-demo/src/index.ts +16 -0
  556. package/examples/drift-demo/src/projects/project-model.ts +15 -0
  557. package/examples/drift-demo/src/projects/project-service.ts +34 -0
  558. package/examples/drift-demo/src/tasks/task-model.ts +37 -0
  559. package/examples/drift-demo/src/tasks/task-routes.ts +53 -0
  560. package/examples/drift-demo/src/tasks/task-service.ts +60 -0
  561. package/examples/drift-demo/src/utils/validation.ts +11 -0
  562. package/examples/drift-demo/tests/auth.test.ts +4 -0
  563. package/examples/drift-demo/tests/tasks.test.ts +4 -0
  564. package/examples/drift-demo/tsconfig.json +10 -0
  565. package/examples/drift-test/run-drift-test.sh +1087 -0
  566. package/examples/gsd/README.md +119 -0
  567. package/examples/gsd/commands/gsd/openlore-drift.md +111 -0
  568. package/examples/gsd/commands/gsd/openlore-orient.md +191 -0
  569. package/examples/mistral-vibe/README.md +101 -0
  570. package/examples/mistral-vibe/antipatterns-template.md +18 -0
  571. package/examples/mistral-vibe/skills/openlore-analyze-codebase/SKILL.md +124 -0
  572. package/examples/mistral-vibe/skills/openlore-brainstorm/SKILL.md +379 -0
  573. package/examples/mistral-vibe/skills/openlore-debug/SKILL.md +330 -0
  574. package/examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md +291 -0
  575. package/examples/mistral-vibe/skills/openlore-generate/SKILL.md +245 -0
  576. package/examples/mistral-vibe/skills/openlore-implement-story/SKILL.md +326 -0
  577. package/examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md +365 -0
  578. package/examples/mistral-vibe/skills/openlore-review-changes/SKILL.md +128 -0
  579. package/examples/mistral-vibe/skills/openlore-write-tests/SKILL.md +261 -0
  580. package/examples/opencode/agent-guard.ts +170 -0
  581. package/examples/opencode/plugins/anti-laziness.ts +202 -0
  582. package/examples/opencode/plugins/lib/openlore-context-injector-helpers.ts +116 -0
  583. package/examples/opencode/plugins/lib/openlore-decision-extractor-helpers.ts +65 -0
  584. package/examples/opencode/plugins/openlore-context-injector.test.ts +211 -0
  585. package/examples/opencode/plugins/openlore-context-injector.ts +165 -0
  586. package/examples/opencode/plugins/openlore-decision-extractor.test.ts +131 -0
  587. package/examples/opencode/plugins/openlore-decision-extractor.ts +322 -0
  588. package/examples/opencode/plugins/openlore-enforcer.ts +227 -0
  589. package/examples/opencode/prompts/sisyphus-sdd.md +150 -0
  590. package/examples/opencode-skills/openlore-analyze-codebase/SKILL.md +101 -0
  591. package/examples/opencode-skills/openlore-brainstorm/SKILL.md +354 -0
  592. package/examples/opencode-skills/openlore-debug/SKILL.md +291 -0
  593. package/examples/opencode-skills/openlore-execute-refactor/SKILL.md +241 -0
  594. package/examples/opencode-skills/openlore-generate/SKILL.md +236 -0
  595. package/examples/opencode-skills/openlore-implement-story/SKILL.md +251 -0
  596. package/examples/opencode-skills/openlore-plan-refactor/SKILL.md +298 -0
  597. package/examples/opencode-skills/openlore-review-changes/SKILL.md +134 -0
  598. package/examples/opencode-skills/openlore-write-tests/SKILL.md +230 -0
  599. package/examples/openspec-analysis/README.md +59 -0
  600. package/examples/openspec-analysis/SUMMARY.md +72 -0
  601. package/examples/openspec-analysis/config.json +16 -0
  602. package/examples/openspec-analysis/dependencies.mermaid +35 -0
  603. package/examples/openspec-analysis/dependency-graph.json +12116 -0
  604. package/examples/openspec-analysis/llm-context.json +119 -0
  605. package/examples/openspec-analysis/repo-structure.json +871 -0
  606. package/examples/openspec-cli/README.md +67 -0
  607. package/examples/openspec-cli/openspec/config.yaml +26 -0
  608. package/examples/openspec-cli/openspec/specs/architecture/spec.md +178 -0
  609. package/examples/openspec-cli/openspec/specs/artifact-graph/spec.md +143 -0
  610. package/examples/openspec-cli/openspec/specs/cli/spec.md +138 -0
  611. package/examples/openspec-cli/openspec/specs/overview/spec.md +60 -0
  612. package/examples/openspec-cli/openspec/specs/parsing/spec.md +123 -0
  613. package/examples/openspec-cli/openspec/specs/validation/spec.md +108 -0
  614. package/examples/spec-kit/README.md +104 -0
  615. package/examples/spec-kit/commands/drift.md +87 -0
  616. package/examples/spec-kit/commands/orient.md +138 -0
  617. package/examples/spec-kit/extension.yml +54 -0
  618. package/package.json +125 -0
  619. package/src/viewer/InteractiveGraphViewer.jsx +1600 -0
  620. package/src/viewer/app/index.html +17 -0
  621. package/src/viewer/app/main.jsx +13 -0
  622. package/src/viewer/components/ArchitectureView.jsx +177 -0
  623. package/src/viewer/components/ChatPanel.jsx +450 -0
  624. package/src/viewer/components/ClassGraph.jsx +782 -0
  625. package/src/viewer/components/ClusterGraph.jsx +469 -0
  626. package/src/viewer/components/FilterBar.jsx +179 -0
  627. package/src/viewer/components/FlatGraph.jsx +282 -0
  628. package/src/viewer/components/MicroComponents.jsx +85 -0
  629. package/src/viewer/hooks/usePanZoom.js +79 -0
  630. package/src/viewer/utils/constants.js +64 -0
  631. package/src/viewer/utils/graph-helpers.js +303 -0
  632. package/src/viewer/utils/graph-helpers.test.ts +39 -0
  633. package/src/viewer/utils/themes.js +206 -0
  634. package/stubs/tree-sitter-cli-stub/package.json +6 -0
@@ -0,0 +1,952 @@
1
+ /**
2
+ * Import/Export Parser
3
+ *
4
+ * Parses source files to extract imports and exports.
5
+ * Uses regex-based parsing for speed and simplicity.
6
+ * Supports JavaScript/TypeScript, Python, and Java.
7
+ */
8
+ import { readFile } from 'node:fs/promises';
9
+ import { dirname, join, resolve, extname } from 'node:path';
10
+ // ============================================================================
11
+ // NODE.JS BUILTINS
12
+ // ============================================================================
13
+ const NODE_BUILTINS = new Set([
14
+ 'assert', 'async_hooks', 'buffer', 'child_process', 'cluster', 'console',
15
+ 'constants', 'crypto', 'dgram', 'diagnostics_channel', 'dns', 'domain',
16
+ 'events', 'fs', 'http', 'http2', 'https', 'inspector', 'module', 'net',
17
+ 'os', 'path', 'perf_hooks', 'process', 'punycode', 'querystring', 'readline',
18
+ 'repl', 'stream', 'string_decoder', 'timers', 'tls', 'trace_events', 'tty',
19
+ 'url', 'util', 'v8', 'vm', 'wasi', 'worker_threads', 'zlib',
20
+ // Node.js prefixed versions
21
+ 'node:assert', 'node:async_hooks', 'node:buffer', 'node:child_process',
22
+ 'node:cluster', 'node:console', 'node:constants', 'node:crypto', 'node:dgram',
23
+ 'node:diagnostics_channel', 'node:dns', 'node:domain', 'node:events',
24
+ 'node:fs', 'node:http', 'node:http2', 'node:https', 'node:inspector',
25
+ 'node:module', 'node:net', 'node:os', 'node:path', 'node:perf_hooks',
26
+ 'node:process', 'node:punycode', 'node:querystring', 'node:readline',
27
+ 'node:repl', 'node:stream', 'node:string_decoder', 'node:timers', 'node:tls',
28
+ 'node:trace_events', 'node:tty', 'node:url', 'node:util', 'node:v8',
29
+ 'node:vm', 'node:wasi', 'node:worker_threads', 'node:zlib',
30
+ // fs/promises and other submodules
31
+ 'fs/promises', 'node:fs/promises', 'stream/promises', 'node:stream/promises',
32
+ 'timers/promises', 'node:timers/promises', 'util/types', 'node:util/types',
33
+ ]);
34
+ // ============================================================================
35
+ // HELPER FUNCTIONS
36
+ // ============================================================================
37
+ /**
38
+ * Check if a module path is a relative import
39
+ */
40
+ function isRelativeImport(source) {
41
+ return source.startsWith('.') || source.startsWith('/');
42
+ }
43
+ /**
44
+ * Check if a module is a Node.js builtin
45
+ */
46
+ function isBuiltinModule(source) {
47
+ return NODE_BUILTINS.has(source) || NODE_BUILTINS.has(source.split('/')[0]);
48
+ }
49
+ /**
50
+ * Get line number for a match position in content
51
+ */
52
+ function getLineNumber(content, position) {
53
+ return content.substring(0, position).split('\n').length;
54
+ }
55
+ /**
56
+ * Parse named imports from a string like "X, Y as Z, W"
57
+ */
58
+ function parseNamedImports(namesStr) {
59
+ return namesStr
60
+ .split(',')
61
+ .map(name => {
62
+ const trimmed = name.trim();
63
+ // Handle "X as Y" - we want the local name Y
64
+ const asMatch = trimmed.match(/(\w+)\s+as\s+(\w+)/);
65
+ if (asMatch) {
66
+ return asMatch[2];
67
+ }
68
+ // Handle type imports like "type X"
69
+ if (trimmed.startsWith('type ')) {
70
+ return trimmed.slice(5).trim();
71
+ }
72
+ return trimmed;
73
+ })
74
+ .filter(name => name && !name.includes(' '));
75
+ }
76
+ // ============================================================================
77
+ // JAVASCRIPT/TYPESCRIPT PARSER
78
+ // ============================================================================
79
+ /**
80
+ * Parse imports from JavaScript/TypeScript content
81
+ */
82
+ function parseJSImports(content) {
83
+ const imports = [];
84
+ // Remove comments to avoid false matches
85
+ const cleanContent = content
86
+ .replace(/\/\*[\s\S]*?\*\//g, '') // Block comments
87
+ .replace(/\/\/.*$/gm, ''); // Line comments
88
+ // ES Module: import X from 'module'
89
+ let match;
90
+ const defaultImportRegex = /import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g;
91
+ while ((match = defaultImportRegex.exec(cleanContent)) !== null) {
92
+ const source = match[2];
93
+ imports.push({
94
+ source,
95
+ isRelative: isRelativeImport(source),
96
+ isPackage: !isRelativeImport(source) && !isBuiltinModule(source),
97
+ isBuiltin: isBuiltinModule(source),
98
+ importedNames: [match[1]],
99
+ hasDefault: true,
100
+ hasNamespace: false,
101
+ isTypeOnly: false,
102
+ isDynamic: false,
103
+ line: getLineNumber(content, match.index),
104
+ });
105
+ }
106
+ // ES Module: import X, { Y, Z } from 'module' (mixed import - default + named)
107
+ const mixedImportRegex = /import\s+(\w+)\s*,\s*\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/g;
108
+ while ((match = mixedImportRegex.exec(cleanContent)) !== null) {
109
+ const source = match[3];
110
+ const names = [match[1], ...parseNamedImports(match[2])];
111
+ imports.push({
112
+ source,
113
+ isRelative: isRelativeImport(source),
114
+ isPackage: !isRelativeImport(source) && !isBuiltinModule(source),
115
+ isBuiltin: isBuiltinModule(source),
116
+ importedNames: names,
117
+ hasDefault: true,
118
+ hasNamespace: false,
119
+ isTypeOnly: false,
120
+ isDynamic: false,
121
+ line: getLineNumber(content, match.index),
122
+ });
123
+ }
124
+ // ES Module: import { X, Y } from 'module'
125
+ const namedImportRegex = /import\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/g;
126
+ while ((match = namedImportRegex.exec(cleanContent)) !== null) {
127
+ const source = match[2];
128
+ const names = parseNamedImports(match[1]);
129
+ imports.push({
130
+ source,
131
+ isRelative: isRelativeImport(source),
132
+ isPackage: !isRelativeImport(source) && !isBuiltinModule(source),
133
+ isBuiltin: isBuiltinModule(source),
134
+ importedNames: names,
135
+ hasDefault: false,
136
+ hasNamespace: false,
137
+ isTypeOnly: false,
138
+ isDynamic: false,
139
+ line: getLineNumber(content, match.index),
140
+ });
141
+ }
142
+ // ES Module: import * as X from 'module'
143
+ const namespaceImportRegex = /import\s+\*\s+as\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g;
144
+ while ((match = namespaceImportRegex.exec(cleanContent)) !== null) {
145
+ const source = match[2];
146
+ imports.push({
147
+ source,
148
+ isRelative: isRelativeImport(source),
149
+ isPackage: !isRelativeImport(source) && !isBuiltinModule(source),
150
+ isBuiltin: isBuiltinModule(source),
151
+ importedNames: [match[1]],
152
+ hasDefault: false,
153
+ hasNamespace: true,
154
+ isTypeOnly: false,
155
+ isDynamic: false,
156
+ line: getLineNumber(content, match.index),
157
+ });
158
+ }
159
+ // ES Module: import 'module' (side effect)
160
+ const sideEffectRegex = /import\s+['"]([^'"]+)['"](?!\s*from)/g;
161
+ while ((match = sideEffectRegex.exec(cleanContent)) !== null) {
162
+ const source = match[1];
163
+ imports.push({
164
+ source,
165
+ isRelative: isRelativeImport(source),
166
+ isPackage: !isRelativeImport(source) && !isBuiltinModule(source),
167
+ isBuiltin: isBuiltinModule(source),
168
+ importedNames: [],
169
+ hasDefault: false,
170
+ hasNamespace: false,
171
+ isTypeOnly: false,
172
+ isDynamic: false,
173
+ line: getLineNumber(content, match.index),
174
+ });
175
+ }
176
+ // Type-only imports: import type { X } from 'module'
177
+ const typeImportRegex = /import\s+type\s+(?:\{([^}]+)\}|(\w+))\s+from\s+['"]([^'"]+)['"]/g;
178
+ while ((match = typeImportRegex.exec(cleanContent)) !== null) {
179
+ const source = match[3];
180
+ const names = match[1] ? parseNamedImports(match[1]) : [match[2]];
181
+ imports.push({
182
+ source,
183
+ isRelative: isRelativeImport(source),
184
+ isPackage: !isRelativeImport(source) && !isBuiltinModule(source),
185
+ isBuiltin: isBuiltinModule(source),
186
+ importedNames: names,
187
+ hasDefault: !!match[2],
188
+ hasNamespace: false,
189
+ isTypeOnly: true,
190
+ isDynamic: false,
191
+ line: getLineNumber(content, match.index),
192
+ });
193
+ }
194
+ // CommonJS: require('module')
195
+ const requireRegex = /(?:const|let|var)\s+(?:(\w+)|\{([^}]+)\})\s*=\s*require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
196
+ while ((match = requireRegex.exec(cleanContent)) !== null) {
197
+ const source = match[3];
198
+ const names = match[1] ? [match[1]] : parseNamedImports(match[2]);
199
+ imports.push({
200
+ source,
201
+ isRelative: isRelativeImport(source),
202
+ isPackage: !isRelativeImport(source) && !isBuiltinModule(source),
203
+ isBuiltin: isBuiltinModule(source),
204
+ importedNames: names,
205
+ hasDefault: !!match[1],
206
+ hasNamespace: false,
207
+ isTypeOnly: false,
208
+ isDynamic: false,
209
+ line: getLineNumber(content, match.index),
210
+ });
211
+ }
212
+ // Dynamic import: import('module')
213
+ const dynamicImportRegex = /(?:await\s+)?import\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
214
+ while ((match = dynamicImportRegex.exec(cleanContent)) !== null) {
215
+ const source = match[1];
216
+ imports.push({
217
+ source,
218
+ isRelative: isRelativeImport(source),
219
+ isPackage: !isRelativeImport(source) && !isBuiltinModule(source),
220
+ isBuiltin: isBuiltinModule(source),
221
+ importedNames: [],
222
+ hasDefault: false,
223
+ hasNamespace: false,
224
+ isTypeOnly: false,
225
+ isDynamic: true,
226
+ line: getLineNumber(content, match.index),
227
+ });
228
+ }
229
+ return imports;
230
+ }
231
+ /**
232
+ * Parse exports from JavaScript/TypeScript content
233
+ */
234
+ function parseJSExports(content) {
235
+ const exports = [];
236
+ // Remove comments
237
+ const cleanContent = content
238
+ .replace(/\/\*[\s\S]*?\*\//g, '')
239
+ .replace(/\/\/.*$/gm, '');
240
+ let match;
241
+ // export default
242
+ const defaultExportRegex = /export\s+default\s+(?:(class|function)\s+(\w+)|(\w+))/g;
243
+ while ((match = defaultExportRegex.exec(cleanContent)) !== null) {
244
+ const kind = match[1];
245
+ const name = match[2] || match[3] || 'default';
246
+ exports.push({
247
+ name,
248
+ isDefault: true,
249
+ isType: false,
250
+ isReExport: false,
251
+ kind: kind || 'unknown',
252
+ line: getLineNumber(content, match.index),
253
+ });
254
+ }
255
+ // export { X, Y } or export { X } from 'module'
256
+ const namedExportRegex = /export\s+\{([^}]+)\}(?:\s+from\s+['"]([^'"]+)['"])?/g;
257
+ while ((match = namedExportRegex.exec(cleanContent)) !== null) {
258
+ const names = parseNamedImports(match[1]);
259
+ const reExportSource = match[2];
260
+ for (const name of names) {
261
+ exports.push({
262
+ name,
263
+ isDefault: false,
264
+ isType: false,
265
+ isReExport: !!reExportSource,
266
+ reExportSource,
267
+ kind: 'unknown',
268
+ line: getLineNumber(content, match.index),
269
+ });
270
+ }
271
+ }
272
+ // export const/let/var
273
+ const varExportRegex = /export\s+(?:const|let|var)\s+(\w+)/g;
274
+ while ((match = varExportRegex.exec(cleanContent)) !== null) {
275
+ exports.push({
276
+ name: match[1],
277
+ isDefault: false,
278
+ isType: false,
279
+ isReExport: false,
280
+ kind: 'variable',
281
+ line: getLineNumber(content, match.index),
282
+ });
283
+ }
284
+ // export function
285
+ const funcExportRegex = /export\s+function\s+(\w+)/g;
286
+ while ((match = funcExportRegex.exec(cleanContent)) !== null) {
287
+ exports.push({
288
+ name: match[1],
289
+ isDefault: false,
290
+ isType: false,
291
+ isReExport: false,
292
+ kind: 'function',
293
+ line: getLineNumber(content, match.index),
294
+ });
295
+ }
296
+ // export class
297
+ const classExportRegex = /export\s+class\s+(\w+)/g;
298
+ while ((match = classExportRegex.exec(cleanContent)) !== null) {
299
+ exports.push({
300
+ name: match[1],
301
+ isDefault: false,
302
+ isType: false,
303
+ isReExport: false,
304
+ kind: 'class',
305
+ line: getLineNumber(content, match.index),
306
+ });
307
+ }
308
+ // export type
309
+ const typeExportRegex = /export\s+type\s+(\w+)/g;
310
+ while ((match = typeExportRegex.exec(cleanContent)) !== null) {
311
+ exports.push({
312
+ name: match[1],
313
+ isDefault: false,
314
+ isType: true,
315
+ isReExport: false,
316
+ kind: 'type',
317
+ line: getLineNumber(content, match.index),
318
+ });
319
+ }
320
+ // export interface
321
+ const interfaceExportRegex = /export\s+interface\s+(\w+)/g;
322
+ while ((match = interfaceExportRegex.exec(cleanContent)) !== null) {
323
+ exports.push({
324
+ name: match[1],
325
+ isDefault: false,
326
+ isType: true,
327
+ isReExport: false,
328
+ kind: 'interface',
329
+ line: getLineNumber(content, match.index),
330
+ });
331
+ }
332
+ // export enum
333
+ const enumExportRegex = /export\s+enum\s+(\w+)/g;
334
+ while ((match = enumExportRegex.exec(cleanContent)) !== null) {
335
+ exports.push({
336
+ name: match[1],
337
+ isDefault: false,
338
+ isType: false,
339
+ isReExport: false,
340
+ kind: 'enum',
341
+ line: getLineNumber(content, match.index),
342
+ });
343
+ }
344
+ // export * from 'module'
345
+ const reExportAllRegex = /export\s+\*\s+(?:as\s+(\w+)\s+)?from\s+['"]([^'"]+)['"]/g;
346
+ while ((match = reExportAllRegex.exec(cleanContent)) !== null) {
347
+ exports.push({
348
+ name: match[1] || '*',
349
+ isDefault: false,
350
+ isType: false,
351
+ isReExport: true,
352
+ reExportSource: match[2],
353
+ kind: 'unknown',
354
+ line: getLineNumber(content, match.index),
355
+ });
356
+ }
357
+ // module.exports
358
+ const moduleExportsRegex = /module\.exports\s*=\s*(\w+)/g;
359
+ while ((match = moduleExportsRegex.exec(cleanContent)) !== null) {
360
+ exports.push({
361
+ name: match[1],
362
+ isDefault: true,
363
+ isType: false,
364
+ isReExport: false,
365
+ kind: 'unknown',
366
+ line: getLineNumber(content, match.index),
367
+ });
368
+ }
369
+ // exports.X
370
+ const exportsRegex = /exports\.(\w+)\s*=/g;
371
+ while ((match = exportsRegex.exec(cleanContent)) !== null) {
372
+ exports.push({
373
+ name: match[1],
374
+ isDefault: false,
375
+ isType: false,
376
+ isReExport: false,
377
+ kind: 'unknown',
378
+ line: getLineNumber(content, match.index),
379
+ });
380
+ }
381
+ return exports;
382
+ }
383
+ // ============================================================================
384
+ // PYTHON PARSER
385
+ // ============================================================================
386
+ const PYTHON_BUILTINS = new Set([
387
+ // stdlib modules (Python 3)
388
+ 'abc', 'argparse', 'ast', 'asyncio', 'base64', 'builtins', 'cgi', 'cmath',
389
+ 'cmd', 'code', 'codecs', 'collections', 'concurrent', 'configparser',
390
+ 'contextlib', 'copy', 'csv', 'dataclasses', 'datetime', 'decimal',
391
+ 'difflib', 'dis', 'email', 'enum', 'errno', 'fileinput', 'fnmatch',
392
+ 'fractions', 'ftplib', 'functools', 'gc', 'getpass', 'gettext', 'glob',
393
+ 'gzip', 'hashlib', 'heapq', 'hmac', 'html', 'http', 'imaplib', 'importlib',
394
+ 'inspect', 'io', 'ipaddress', 'itertools', 'json', 'keyword', 'linecache',
395
+ 'locale', 'logging', 'lzma', 'math', 'mimetypes', 'multiprocessing',
396
+ 'numbers', 'operator', 'os', 'pathlib', 'pickle', 'platform', 'pprint',
397
+ 'queue', 'random', 're', 'shlex', 'shutil', 'signal', 'smtplib', 'socket',
398
+ 'socketserver', 'sqlite3', 'ssl', 'stat', 'statistics', 'string',
399
+ 'struct', 'subprocess', 'sys', 'tarfile', 'tempfile', 'textwrap',
400
+ 'threading', 'time', 'timeit', 'tkinter', 'token', 'tokenize', 'traceback',
401
+ 'types', 'typing', 'unicodedata', 'unittest', 'urllib', 'uuid', 'warnings',
402
+ 'weakref', 'xml', 'xmlrpc', 'zipfile', 'zipimport', 'zlib',
403
+ '__future__',
404
+ ]);
405
+ /**
406
+ * Parse imports from Python content
407
+ */
408
+ function parsePythonImports(content) {
409
+ const imports = [];
410
+ // Remove comments and collapse multi-line parenthesized imports onto one line
411
+ // e.g. "from x import (\n A,\n B\n)" → "from x import A, B"
412
+ const cleanContent = content
413
+ .replace(/#.*$/gm, '')
414
+ .replace(/\(\s*([\s\S]*?)\s*\)/g, (_, inner) => inner.replace(/\s*\n\s*/g, ', '));
415
+ let match;
416
+ // import X or import X, Y or import X.Y.Z
417
+ const importRegex = /^import[ \t]+([^\n\r]+)$/gm;
418
+ while ((match = importRegex.exec(cleanContent)) !== null) {
419
+ const modules = match[1].split(',').map(m => m.trim()).filter(Boolean);
420
+ for (const mod of modules) {
421
+ const source = mod.split(/\s+as\s+/)[0].trim();
422
+ imports.push({
423
+ source,
424
+ isRelative: source.startsWith('.'),
425
+ isPackage: !source.startsWith('.'),
426
+ isBuiltin: PYTHON_BUILTINS.has(source.split('.')[0]),
427
+ importedNames: [mod.includes(' as ') ? mod.split(/\s+as\s+/)[1].trim() : source.split('.').pop()],
428
+ hasDefault: false,
429
+ hasNamespace: true,
430
+ isTypeOnly: false,
431
+ isDynamic: false,
432
+ line: getLineNumber(content, match.index),
433
+ });
434
+ }
435
+ }
436
+ // from X import Y or from X import Y, Z (including multi-line after collapsing)
437
+ const fromImportRegex = /^from\s+([\w.]+)\s+import\s+(.+)$/gm;
438
+ while ((match = fromImportRegex.exec(cleanContent)) !== null) {
439
+ const source = match[1];
440
+ const importsPart = match[2].trim().replace(/[()]/g, '');
441
+ if (importsPart === '*') {
442
+ imports.push({
443
+ source,
444
+ isRelative: source.startsWith('.'),
445
+ isPackage: !source.startsWith('.'),
446
+ isBuiltin: PYTHON_BUILTINS.has(source.split('.')[0]),
447
+ importedNames: ['*'],
448
+ hasDefault: false,
449
+ hasNamespace: true,
450
+ isTypeOnly: false,
451
+ isDynamic: false,
452
+ line: getLineNumber(content, match.index),
453
+ });
454
+ }
455
+ else {
456
+ const names = importsPart.split(',').map(n => {
457
+ const trimmed = n.trim();
458
+ return trimmed.includes(' as ') ? trimmed.split(/\s+as\s+/)[1].trim() : trimmed;
459
+ }).filter(Boolean);
460
+ imports.push({
461
+ source,
462
+ isRelative: source.startsWith('.'),
463
+ isPackage: !source.startsWith('.'),
464
+ isBuiltin: PYTHON_BUILTINS.has(source.split('.')[0]),
465
+ importedNames: names,
466
+ hasDefault: false,
467
+ hasNamespace: false,
468
+ isTypeOnly: false,
469
+ isDynamic: false,
470
+ line: getLineNumber(content, match.index),
471
+ });
472
+ }
473
+ }
474
+ return imports;
475
+ }
476
+ /**
477
+ * Parse exports from Python content (module-level definitions)
478
+ */
479
+ function parsePythonExports(content) {
480
+ const exports = [];
481
+ // Remove comments
482
+ const cleanContent = content.replace(/#.*$/gm, '');
483
+ let match;
484
+ // Check for __all__ definition
485
+ const allMatch = cleanContent.match(/__all__\s*=\s*\[([^\]]+)\]/);
486
+ if (allMatch) {
487
+ const names = allMatch[1].match(/['"](\w+)['"]/g);
488
+ if (names) {
489
+ for (const name of names) {
490
+ const cleanName = name.replace(/['"]/g, '');
491
+ exports.push({
492
+ name: cleanName,
493
+ isDefault: false,
494
+ isType: false,
495
+ isReExport: false,
496
+ kind: 'unknown',
497
+ line: getLineNumber(content, allMatch.index ?? 0),
498
+ });
499
+ }
500
+ }
501
+ }
502
+ // Class definitions at module level (no indentation)
503
+ const classRegex = /^class\s+(\w+)/gm;
504
+ while ((match = classRegex.exec(cleanContent)) !== null) {
505
+ exports.push({
506
+ name: match[1],
507
+ isDefault: false,
508
+ isType: false,
509
+ isReExport: false,
510
+ kind: 'class',
511
+ line: getLineNumber(content, match.index),
512
+ });
513
+ }
514
+ // Function definitions at module level (no indentation)
515
+ const funcRegex = /^def\s+(\w+)/gm;
516
+ while ((match = funcRegex.exec(cleanContent)) !== null) {
517
+ // Skip private functions
518
+ if (!match[1].startsWith('_')) {
519
+ exports.push({
520
+ name: match[1],
521
+ isDefault: false,
522
+ isType: false,
523
+ isReExport: false,
524
+ kind: 'function',
525
+ line: getLineNumber(content, match.index),
526
+ });
527
+ }
528
+ }
529
+ // Module-level variables (UPPER_CASE constants)
530
+ const constRegex = /^([A-Z][A-Z0-9_]*)\s*=/gm;
531
+ while ((match = constRegex.exec(cleanContent)) !== null) {
532
+ exports.push({
533
+ name: match[1],
534
+ isDefault: false,
535
+ isType: false,
536
+ isReExport: false,
537
+ kind: 'variable',
538
+ line: getLineNumber(content, match.index),
539
+ });
540
+ }
541
+ return exports;
542
+ }
543
+ // ============================================================================
544
+ // JAVA PARSER
545
+ // ============================================================================
546
+ /** Package prefixes considered JDK/standard-library imports (not project code) */
547
+ const JAVA_BUILTIN_PREFIXES = [
548
+ 'java.',
549
+ 'javax.',
550
+ 'jakarta.',
551
+ 'sun.',
552
+ 'com.sun.',
553
+ 'jdk.',
554
+ 'org.w3c.',
555
+ 'org.xml.',
556
+ ];
557
+ function isJavaBuiltin(source) {
558
+ return JAVA_BUILTIN_PREFIXES.some(p => source.startsWith(p));
559
+ }
560
+ /**
561
+ * Extract the package declaration from Java source content.
562
+ * Returns undefined for files without a package declaration (default package).
563
+ */
564
+ export function parseJavaPackage(content) {
565
+ // Strip block comments so we don't match inside them.
566
+ const clean = content.replace(/\/\*[\s\S]*?\*\//g, '');
567
+ const match = clean.match(/^\s*package\s+([\w.]+)\s*;/m);
568
+ return match ? match[1] : undefined;
569
+ }
570
+ /**
571
+ * Parse imports from Java source content.
572
+ *
573
+ * Handles:
574
+ * import com.foo.Bar;
575
+ * import com.foo.*; (wildcard — hasNamespace=true)
576
+ * import static com.foo.Bar.baz; (static member import — class is com.foo.Bar)
577
+ * import static com.foo.Bar.*; (static wildcard — class is com.foo.Bar)
578
+ */
579
+ function parseJavaImports(content) {
580
+ const imports = [];
581
+ // Strip comments to avoid false matches
582
+ const clean = content
583
+ .replace(/\/\*[\s\S]*?\*\//g, '')
584
+ .replace(/\/\/.*$/gm, '');
585
+ const importRegex = /^\s*import\s+(static\s+)?([\w.]+(?:\.\*)?)\s*;/gm;
586
+ let match;
587
+ while ((match = importRegex.exec(clean)) !== null) {
588
+ const isStatic = !!match[1];
589
+ let source = match[2];
590
+ const isWildcard = source.endsWith('.*');
591
+ // For `import static com.foo.Bar.baz;` the member `baz` is not a class —
592
+ // the class we want to link to is `com.foo.Bar`. Strip the trailing
593
+ // lowercase identifier (Java convention: classes start uppercase).
594
+ if (isStatic && !isWildcard) {
595
+ const lastDot = source.lastIndexOf('.');
596
+ if (lastDot > 0) {
597
+ const last = source.slice(lastDot + 1);
598
+ if (/^[a-z_$]/.test(last)) {
599
+ source = source.slice(0, lastDot);
600
+ }
601
+ }
602
+ }
603
+ // For `import static com.foo.Bar.*;` strip the `.*` — we still want to
604
+ // resolve `com.foo.Bar` (the class), not `com.foo` (the package).
605
+ if (isStatic && isWildcard) {
606
+ source = source.slice(0, -2);
607
+ }
608
+ const cleanSource = isWildcard && !isStatic ? source.slice(0, -2) : source;
609
+ const isBuiltin = isJavaBuiltin(cleanSource);
610
+ const displayName = isWildcard && !isStatic
611
+ ? '*'
612
+ : cleanSource.slice(cleanSource.lastIndexOf('.') + 1);
613
+ imports.push({
614
+ source,
615
+ isRelative: false,
616
+ isPackage: !isBuiltin,
617
+ isBuiltin,
618
+ importedNames: [displayName],
619
+ hasDefault: false,
620
+ hasNamespace: isWildcard && !isStatic,
621
+ isTypeOnly: false,
622
+ isDynamic: false,
623
+ line: getLineNumber(content, match.index),
624
+ });
625
+ }
626
+ return imports;
627
+ }
628
+ /**
629
+ * Parse exports from Java source content.
630
+ *
631
+ * "Exports" in Java are public top-level types: classes, interfaces,
632
+ * enums, records, and annotations. Also includes public static methods
633
+ * and public fields on those types since downstream mapping uses
634
+ * function-level exports to connect requirements to code.
635
+ */
636
+ function parseJavaExports(content) {
637
+ const exports = [];
638
+ const clean = content
639
+ .replace(/\/\*[\s\S]*?\*\//g, '')
640
+ .replace(/\/\/.*$/gm, '');
641
+ let match;
642
+ // public class|interface|enum|record|@interface Name
643
+ const typeRegex = /\bpublic\s+(?:static\s+|final\s+|abstract\s+|sealed\s+|non-sealed\s+)*(class|interface|enum|record|@interface)\s+(\w+)/g;
644
+ while ((match = typeRegex.exec(clean)) !== null) {
645
+ const keyword = match[1];
646
+ const name = match[2];
647
+ const kind = keyword === 'interface' || keyword === '@interface' ? 'interface'
648
+ : keyword === 'enum' ? 'enum'
649
+ : 'class';
650
+ exports.push({
651
+ name,
652
+ isDefault: false,
653
+ isType: false,
654
+ isReExport: false,
655
+ kind,
656
+ line: getLineNumber(content, match.index),
657
+ });
658
+ }
659
+ // Public methods: `public [static] [final] ReturnType name(`
660
+ // We keep this conservative: only methods with an explicit `public` modifier.
661
+ // The return-type capture is non-greedy and excludes keywords that start
662
+ // type declarations (class/interface/enum/record) to avoid false matches.
663
+ const methodRegex = /\bpublic\s+(?:static\s+|final\s+|abstract\s+|synchronized\s+|default\s+|native\s+)*(?!class\b|interface\b|enum\b|record\b|@interface\b)(?:<[^>]+>\s+)?[\w<>[\], ?.]+?\s+(\w+)\s*\(/g;
664
+ while ((match = methodRegex.exec(clean)) !== null) {
665
+ const name = match[1];
666
+ // Filter obvious non-methods (the regex can match some constructors or
667
+ // edge cases; keep common false-positives out).
668
+ if (['class', 'interface', 'enum', 'record', 'new', 'return', 'if', 'for', 'while'].includes(name))
669
+ continue;
670
+ exports.push({
671
+ name,
672
+ isDefault: false,
673
+ isType: false,
674
+ isReExport: false,
675
+ kind: 'function',
676
+ line: getLineNumber(content, match.index),
677
+ });
678
+ }
679
+ return exports;
680
+ }
681
+ // ============================================================================
682
+ // IMPORT RESOLUTION
683
+ // ============================================================================
684
+ /**
685
+ * Resolve a relative import to an absolute file path
686
+ */
687
+ export async function resolveImport(importSource, fromFile, options) {
688
+ const fromExt = extname(fromFile).toLowerCase();
689
+ const isPython = fromExt === '.py' || fromExt === '.pyw';
690
+ const isJava = fromExt === '.java';
691
+ // Java imports are always absolute class FQNs (com.foo.Bar), never relative.
692
+ // Resolve them against the computed source root (dir minus packagePath).
693
+ if (isJava) {
694
+ return resolveJavaImport(importSource, fromFile, options);
695
+ }
696
+ // For non-Python files, external packages can never resolve to a local file.
697
+ // For Python files we must NOT bail out here: `from services.retriever import X`
698
+ // looks like a package import but may well be a local module under rootDir.
699
+ if (!isRelativeImport(importSource) && !isPython) {
700
+ return null;
701
+ }
702
+ const fromDir = dirname(fromFile);
703
+ // Default extensions depend on the source file type
704
+ const extensions = options.extensions ?? (isPython
705
+ ? ['.py', '.pyw']
706
+ : ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']);
707
+ // Python relative imports use dot-prefix notation:
708
+ // from .utils import foo → source = ".utils" → resolve as "./utils"
709
+ // from ..models import X → source = "..models" → resolve as "../models"
710
+ // from ...pkg import Y → source = "...pkg" → resolve as "../../pkg"
711
+ // N dots = (N-1) levels up from fromDir. Also handles dotted paths: .db.models → ./db/models
712
+ let normalizedSource = importSource;
713
+ if (isPython && importSource.startsWith('.')) {
714
+ let dots = 0;
715
+ while (dots < importSource.length && importSource[dots] === '.')
716
+ dots++;
717
+ const rest = importSource.slice(dots).replace(/\./g, '/');
718
+ // dots=1 → './', dots=2 → '../', dots=3 → '../../', etc.
719
+ const prefix = dots === 1 ? './' : '../'.repeat(dots - 1);
720
+ normalizedSource = rest ? prefix + rest : prefix.replace(/\/$/, '') || '.';
721
+ }
722
+ else if (isPython && !importSource.startsWith('.')) {
723
+ // Absolute-style intra-project import: "services.retriever" or "services.retriever.utils"
724
+ // Convert dotted module path to a filesystem path relative to rootDir.
725
+ // e.g. "services.retriever" → "<rootDir>/services/retriever.py"
726
+ normalizedSource = './' + importSource.replace(/\./g, '/');
727
+ }
728
+ // For Python absolute imports resolve from rootDir, not fromDir,
729
+ // because Python's module system uses sys.path (typically the project root).
730
+ // Fall back to fromDir if baseDir is empty to avoid resolving against cwd.
731
+ const resolveBase = (isPython && !importSource.startsWith('.'))
732
+ ? (options.baseDir || fromDir)
733
+ : fromDir;
734
+ const basePath = resolve(resolveBase, normalizedSource);
735
+ // Strip any existing extension from the import source.
736
+ // This handles the TypeScript NodeNext convention where imports are written
737
+ // as `./foo.js` but the actual file on disk is `./foo.ts`.
738
+ // Without this, we'd try `foo.js.ts`, `foo.js.tsx`, etc. and find nothing.
739
+ const existingExt = extname(basePath); // e.g. ".js", ".ts", ""
740
+ const baseWithoutExt = existingExt
741
+ ? basePath.slice(0, -existingExt.length)
742
+ : basePath;
743
+ // Build candidate list (order matters: most specific first):
744
+ // 1. Exact path as-is (the import may already point to the real file)
745
+ // 2. Strip the extension, try every known extension (handles .js -> .ts)
746
+ // 3. Directory index files (handles `./components` -> `./components/index.ts`)
747
+ // 4. Python packages: module/__init__.py
748
+ const candidates = [
749
+ basePath,
750
+ ...extensions.map(ext => baseWithoutExt + ext),
751
+ ...extensions.map(ext => join(basePath, `index${ext}`)),
752
+ ...extensions.map(ext => join(baseWithoutExt, `index${ext}`)),
753
+ ...(isPython ? extensions.map(ext => join(basePath, `__init__${ext}`)) : []),
754
+ ];
755
+ // Deduplicate while preserving order
756
+ const seen = new Set();
757
+ for (const candidate of candidates) {
758
+ if (seen.has(candidate))
759
+ continue;
760
+ seen.add(candidate);
761
+ try {
762
+ await readFile(candidate);
763
+ return candidate;
764
+ }
765
+ catch {
766
+ // Not found, try next
767
+ }
768
+ }
769
+ return null;
770
+ }
771
+ /**
772
+ * Resolve a Java import (fully-qualified class name) to an absolute file path.
773
+ *
774
+ * Java imports are always absolute: `import com.example.foo.Bar;`
775
+ * To find `com/example/foo/Bar.java`, we compute the "source root" by
776
+ * stripping the file's package path from its directory. E.g. for
777
+ * /repo/src/main/java/com/example/service/UserService.java
778
+ * package com.example.service;
779
+ * the source root is /repo/src/main/java.
780
+ *
781
+ * If the package declaration is missing or doesn't match the directory
782
+ * structure, fall back to walking the file's ancestors looking for a
783
+ * conventional source root (src/main/java, src/test/java, src, app).
784
+ */
785
+ async function resolveJavaImport(importSource, fromFile, options) {
786
+ if (isJavaBuiltin(importSource))
787
+ return null;
788
+ // Wildcard non-static import (`import com.foo.*;`) cannot be resolved to a
789
+ // specific file.
790
+ if (importSource.endsWith('.*'))
791
+ return null;
792
+ const fromDir = dirname(fromFile);
793
+ const candidateRoots = [];
794
+ // Primary strategy: strip the package path from fromDir.
795
+ if (options.sourcePackage) {
796
+ const pkgPath = options.sourcePackage.replace(/\./g, '/');
797
+ // Normalize separators for comparison (Windows may have backslashes).
798
+ const normalizedDir = fromDir.replace(/\\/g, '/');
799
+ if (normalizedDir.endsWith('/' + pkgPath)) {
800
+ candidateRoots.push(fromDir.slice(0, fromDir.length - pkgPath.length - 1));
801
+ }
802
+ else if (normalizedDir === pkgPath || normalizedDir.endsWith(pkgPath)) {
803
+ candidateRoots.push(fromDir.slice(0, fromDir.length - pkgPath.length));
804
+ }
805
+ }
806
+ // Fallback: walk up the directory tree looking for conventional Java source
807
+ // roots. Covers default-package files and inconsistent package declarations.
808
+ const conventional = ['src/main/java', 'src/test/java', 'src/main/kotlin', 'src/test/kotlin', 'src', 'app'];
809
+ for (const marker of conventional) {
810
+ const normalizedFrom = fromFile.replace(/\\/g, '/');
811
+ const idx = normalizedFrom.lastIndexOf('/' + marker + '/');
812
+ if (idx >= 0) {
813
+ candidateRoots.push(fromFile.slice(0, idx + 1 + marker.length));
814
+ }
815
+ }
816
+ // Last resort: baseDir (project root).
817
+ if (options.baseDir) {
818
+ candidateRoots.push(options.baseDir);
819
+ }
820
+ // Deduplicate while preserving order.
821
+ const seen = new Set();
822
+ const relPath = importSource.replace(/\./g, '/') + '.java';
823
+ for (const root of candidateRoots) {
824
+ if (!root || seen.has(root))
825
+ continue;
826
+ seen.add(root);
827
+ const candidate = join(root, relPath);
828
+ try {
829
+ await readFile(candidate);
830
+ return candidate;
831
+ }
832
+ catch {
833
+ // try next root
834
+ }
835
+ }
836
+ return null;
837
+ }
838
+ // ============================================================================
839
+ // MAIN PARSER CLASS
840
+ // ============================================================================
841
+ /**
842
+ * Import/Export Parser
843
+ */
844
+ export class ImportExportParser {
845
+ cache = new Map();
846
+ /**
847
+ * Clear the parse cache
848
+ */
849
+ clearCache() {
850
+ this.cache.clear();
851
+ }
852
+ /**
853
+ * Get file extension type
854
+ */
855
+ getFileType(filePath) {
856
+ const ext = extname(filePath).toLowerCase();
857
+ if (['.ts', '.tsx', '.mts', '.cts'].includes(ext))
858
+ return 'ts';
859
+ if (['.js', '.jsx', '.mjs', '.cjs'].includes(ext))
860
+ return 'js';
861
+ if (['.py', '.pyw'].includes(ext))
862
+ return 'python';
863
+ if (ext === '.java')
864
+ return 'java';
865
+ return 'unknown';
866
+ }
867
+ /**
868
+ * Parse a file and extract imports/exports
869
+ */
870
+ async parseFile(filePath) {
871
+ // Check cache
872
+ const cached = this.cache.get(filePath);
873
+ if (cached) {
874
+ return cached;
875
+ }
876
+ const analysis = {
877
+ filePath,
878
+ imports: [],
879
+ exports: [],
880
+ localImports: [],
881
+ externalImports: [],
882
+ parseErrors: [],
883
+ };
884
+ try {
885
+ const content = await readFile(filePath, 'utf-8');
886
+ const fileType = this.getFileType(filePath);
887
+ if (fileType === 'js' || fileType === 'ts') {
888
+ analysis.imports = parseJSImports(content);
889
+ analysis.exports = parseJSExports(content);
890
+ }
891
+ else if (fileType === 'python') {
892
+ analysis.imports = parsePythonImports(content);
893
+ analysis.exports = parsePythonExports(content);
894
+ }
895
+ else if (fileType === 'java') {
896
+ analysis.imports = parseJavaImports(content);
897
+ analysis.exports = parseJavaExports(content);
898
+ analysis.javaPackage = parseJavaPackage(content);
899
+ }
900
+ else {
901
+ analysis.parseErrors.push(`Unsupported file type: ${extname(filePath)}`);
902
+ }
903
+ // Categorize imports
904
+ for (const imp of analysis.imports) {
905
+ if (imp.isRelative) {
906
+ analysis.localImports.push(imp.source);
907
+ }
908
+ else if (imp.isPackage) {
909
+ // Extract package name (first part of path)
910
+ const pkgName = imp.source.startsWith('@')
911
+ ? imp.source.split('/').slice(0, 2).join('/')
912
+ : imp.source.split('/')[0];
913
+ if (!analysis.externalImports.includes(pkgName)) {
914
+ analysis.externalImports.push(pkgName);
915
+ }
916
+ }
917
+ }
918
+ }
919
+ catch (error) {
920
+ analysis.parseErrors.push(`Failed to read file: ${error.message}`);
921
+ }
922
+ // Cache the result
923
+ this.cache.set(filePath, analysis);
924
+ return analysis;
925
+ }
926
+ /**
927
+ * Parse multiple files
928
+ */
929
+ async parseFiles(filePaths) {
930
+ const results = new Map();
931
+ for (const filePath of filePaths) {
932
+ const analysis = await this.parseFile(filePath);
933
+ results.set(filePath, analysis);
934
+ }
935
+ return results;
936
+ }
937
+ }
938
+ /**
939
+ * Convenience function to parse a single file
940
+ */
941
+ export async function parseFile(filePath) {
942
+ const parser = new ImportExportParser();
943
+ return parser.parseFile(filePath);
944
+ }
945
+ /**
946
+ * Convenience function to parse multiple files
947
+ */
948
+ export async function parseFiles(filePaths) {
949
+ const parser = new ImportExportParser();
950
+ return parser.parseFiles(filePaths);
951
+ }
952
+ //# sourceMappingURL=import-parser.js.map