codeguardian-mcp 1.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 (335) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +348 -0
  3. package/dist/agent/agentTools.d.ts +26 -0
  4. package/dist/agent/agentTools.d.ts.map +1 -0
  5. package/dist/agent/agentTools.js +699 -0
  6. package/dist/agent/agentTools.js.map +1 -0
  7. package/dist/agent/autoValidator.d.ts +110 -0
  8. package/dist/agent/autoValidator.d.ts.map +1 -0
  9. package/dist/agent/autoValidator.js +964 -0
  10. package/dist/agent/autoValidator.js.map +1 -0
  11. package/dist/agent/fileWatcher.d.ts +28 -0
  12. package/dist/agent/fileWatcher.d.ts.map +1 -0
  13. package/dist/agent/fileWatcher.js +88 -0
  14. package/dist/agent/fileWatcher.js.map +1 -0
  15. package/dist/agent/guardianPersistence.d.ts +98 -0
  16. package/dist/agent/guardianPersistence.d.ts.map +1 -0
  17. package/dist/agent/guardianPersistence.js +296 -0
  18. package/dist/agent/guardianPersistence.js.map +1 -0
  19. package/dist/agent/mcpNotifications.d.ts +38 -0
  20. package/dist/agent/mcpNotifications.d.ts.map +1 -0
  21. package/dist/agent/mcpNotifications.js +81 -0
  22. package/dist/agent/mcpNotifications.js.map +1 -0
  23. package/dist/analyzers/aiPatterns.d.ts +16 -0
  24. package/dist/analyzers/aiPatterns.d.ts.map +1 -0
  25. package/dist/analyzers/aiPatterns.js +103 -0
  26. package/dist/analyzers/aiPatterns.js.map +1 -0
  27. package/dist/analyzers/antiPatterns.d.ts +60 -0
  28. package/dist/analyzers/antiPatterns.d.ts.map +1 -0
  29. package/dist/analyzers/antiPatterns.js +198 -0
  30. package/dist/analyzers/antiPatterns.js.map +1 -0
  31. package/dist/analyzers/builtinTypes.d.ts +18 -0
  32. package/dist/analyzers/builtinTypes.d.ts.map +1 -0
  33. package/dist/analyzers/builtinTypes.js +1275 -0
  34. package/dist/analyzers/builtinTypes.js.map +1 -0
  35. package/dist/analyzers/complexity.d.ts +14 -0
  36. package/dist/analyzers/complexity.d.ts.map +1 -0
  37. package/dist/analyzers/complexity.js +610 -0
  38. package/dist/analyzers/complexity.js.map +1 -0
  39. package/dist/analyzers/findingVerifier.d.ts +59 -0
  40. package/dist/analyzers/findingVerifier.d.ts.map +1 -0
  41. package/dist/analyzers/findingVerifier.js +1169 -0
  42. package/dist/analyzers/findingVerifier.js.map +1 -0
  43. package/dist/analyzers/impactAnalyzer.d.ts +53 -0
  44. package/dist/analyzers/impactAnalyzer.d.ts.map +1 -0
  45. package/dist/analyzers/impactAnalyzer.js +152 -0
  46. package/dist/analyzers/impactAnalyzer.js.map +1 -0
  47. package/dist/analyzers/languageDetector.d.ts +48 -0
  48. package/dist/analyzers/languageDetector.d.ts.map +1 -0
  49. package/dist/analyzers/languageDetector.js +404 -0
  50. package/dist/analyzers/languageDetector.js.map +1 -0
  51. package/dist/analyzers/parsers/incrementalParser.d.ts +53 -0
  52. package/dist/analyzers/parsers/incrementalParser.d.ts.map +1 -0
  53. package/dist/analyzers/parsers/incrementalParser.js +193 -0
  54. package/dist/analyzers/parsers/incrementalParser.js.map +1 -0
  55. package/dist/analyzers/parsers/scopeResolver.d.ts +92 -0
  56. package/dist/analyzers/parsers/scopeResolver.d.ts.map +1 -0
  57. package/dist/analyzers/parsers/scopeResolver.js +324 -0
  58. package/dist/analyzers/parsers/scopeResolver.js.map +1 -0
  59. package/dist/analyzers/parsers/semanticIndex.d.ts +127 -0
  60. package/dist/analyzers/parsers/semanticIndex.d.ts.map +1 -0
  61. package/dist/analyzers/parsers/semanticIndex.js +429 -0
  62. package/dist/analyzers/parsers/semanticIndex.js.map +1 -0
  63. package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts +42 -0
  64. package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts.map +1 -0
  65. package/dist/analyzers/parsers/sessionDiffAnalyzer.js +233 -0
  66. package/dist/analyzers/parsers/sessionDiffAnalyzer.js.map +1 -0
  67. package/dist/analyzers/parsers/treeSitterParser.d.ts +76 -0
  68. package/dist/analyzers/parsers/treeSitterParser.d.ts.map +1 -0
  69. package/dist/analyzers/parsers/treeSitterParser.js +709 -0
  70. package/dist/analyzers/parsers/treeSitterParser.js.map +1 -0
  71. package/dist/analyzers/relevanceScorer.d.ts +43 -0
  72. package/dist/analyzers/relevanceScorer.d.ts.map +1 -0
  73. package/dist/analyzers/relevanceScorer.js +200 -0
  74. package/dist/analyzers/relevanceScorer.js.map +1 -0
  75. package/dist/analyzers/standardLibrary.d.ts +22 -0
  76. package/dist/analyzers/standardLibrary.d.ts.map +1 -0
  77. package/dist/analyzers/standardLibrary.js +211 -0
  78. package/dist/analyzers/standardLibrary.js.map +1 -0
  79. package/dist/analyzers/symbolGraph.d.ts +30 -0
  80. package/dist/analyzers/symbolGraph.d.ts.map +1 -0
  81. package/dist/analyzers/symbolGraph.js +380 -0
  82. package/dist/analyzers/symbolGraph.js.map +1 -0
  83. package/dist/analyzers/symbolTable.d.ts +18 -0
  84. package/dist/analyzers/symbolTable.d.ts.map +1 -0
  85. package/dist/analyzers/symbolTable.js +176 -0
  86. package/dist/analyzers/symbolTable.js.map +1 -0
  87. package/dist/analyzers/typeChecker.d.ts +13 -0
  88. package/dist/analyzers/typeChecker.d.ts.map +1 -0
  89. package/dist/analyzers/typeChecker.js +580 -0
  90. package/dist/analyzers/typeChecker.js.map +1 -0
  91. package/dist/analyzers/usagePatterns.d.ts +42 -0
  92. package/dist/analyzers/usagePatterns.d.ts.map +1 -0
  93. package/dist/analyzers/usagePatterns.js +75 -0
  94. package/dist/analyzers/usagePatterns.js.map +1 -0
  95. package/dist/api-contract/context/backend.d.ts +19 -0
  96. package/dist/api-contract/context/backend.d.ts.map +1 -0
  97. package/dist/api-contract/context/backend.js +64 -0
  98. package/dist/api-contract/context/backend.js.map +1 -0
  99. package/dist/api-contract/context/contract.d.ts +34 -0
  100. package/dist/api-contract/context/contract.d.ts.map +1 -0
  101. package/dist/api-contract/context/contract.js +306 -0
  102. package/dist/api-contract/context/contract.js.map +1 -0
  103. package/dist/api-contract/context/frontend.d.ts +19 -0
  104. package/dist/api-contract/context/frontend.d.ts.map +1 -0
  105. package/dist/api-contract/context/frontend.js +64 -0
  106. package/dist/api-contract/context/frontend.js.map +1 -0
  107. package/dist/api-contract/detector.d.ts +28 -0
  108. package/dist/api-contract/detector.d.ts.map +1 -0
  109. package/dist/api-contract/detector.js +393 -0
  110. package/dist/api-contract/detector.js.map +1 -0
  111. package/dist/api-contract/extractors/python.d.ts +32 -0
  112. package/dist/api-contract/extractors/python.d.ts.map +1 -0
  113. package/dist/api-contract/extractors/python.js +521 -0
  114. package/dist/api-contract/extractors/python.js.map +1 -0
  115. package/dist/api-contract/extractors/pythonAstUtils.d.ts +44 -0
  116. package/dist/api-contract/extractors/pythonAstUtils.d.ts.map +1 -0
  117. package/dist/api-contract/extractors/pythonAstUtils.js +489 -0
  118. package/dist/api-contract/extractors/pythonAstUtils.js.map +1 -0
  119. package/dist/api-contract/extractors/tsAstUtils.d.ts +47 -0
  120. package/dist/api-contract/extractors/tsAstUtils.d.ts.map +1 -0
  121. package/dist/api-contract/extractors/tsAstUtils.js +173 -0
  122. package/dist/api-contract/extractors/tsAstUtils.js.map +1 -0
  123. package/dist/api-contract/extractors/typescript.d.ts +32 -0
  124. package/dist/api-contract/extractors/typescript.d.ts.map +1 -0
  125. package/dist/api-contract/extractors/typescript.js +666 -0
  126. package/dist/api-contract/extractors/typescript.js.map +1 -0
  127. package/dist/api-contract/index.d.ts +104 -0
  128. package/dist/api-contract/index.d.ts.map +1 -0
  129. package/dist/api-contract/index.js +232 -0
  130. package/dist/api-contract/index.js.map +1 -0
  131. package/dist/api-contract/types.d.ts +151 -0
  132. package/dist/api-contract/types.d.ts.map +1 -0
  133. package/dist/api-contract/types.js +19 -0
  134. package/dist/api-contract/types.js.map +1 -0
  135. package/dist/api-contract/validators/endpoint.d.ts +21 -0
  136. package/dist/api-contract/validators/endpoint.d.ts.map +1 -0
  137. package/dist/api-contract/validators/endpoint.js +224 -0
  138. package/dist/api-contract/validators/endpoint.js.map +1 -0
  139. package/dist/api-contract/validators/index.d.ts +40 -0
  140. package/dist/api-contract/validators/index.d.ts.map +1 -0
  141. package/dist/api-contract/validators/index.js +875 -0
  142. package/dist/api-contract/validators/index.js.map +1 -0
  143. package/dist/api-contract/validators/parameter.d.ts +17 -0
  144. package/dist/api-contract/validators/parameter.d.ts.map +1 -0
  145. package/dist/api-contract/validators/parameter.js +250 -0
  146. package/dist/api-contract/validators/parameter.js.map +1 -0
  147. package/dist/api-contract/validators/type.d.ts +38 -0
  148. package/dist/api-contract/validators/type.d.ts.map +1 -0
  149. package/dist/api-contract/validators/type.js +244 -0
  150. package/dist/api-contract/validators/type.js.map +1 -0
  151. package/dist/context/apiContract/complexTypeSupport.d.ts +83 -0
  152. package/dist/context/apiContract/complexTypeSupport.d.ts.map +1 -0
  153. package/dist/context/apiContract/complexTypeSupport.js +665 -0
  154. package/dist/context/apiContract/complexTypeSupport.js.map +1 -0
  155. package/dist/context/apiContract/graphqlSupport.d.ts +105 -0
  156. package/dist/context/apiContract/graphqlSupport.d.ts.map +1 -0
  157. package/dist/context/apiContract/graphqlSupport.js +671 -0
  158. package/dist/context/apiContract/graphqlSupport.js.map +1 -0
  159. package/dist/context/apiContract/index.d.ts +14 -0
  160. package/dist/context/apiContract/index.d.ts.map +1 -0
  161. package/dist/context/apiContract/index.js +17 -0
  162. package/dist/context/apiContract/index.js.map +1 -0
  163. package/dist/context/apiContract/webSocketSupport.d.ts +104 -0
  164. package/dist/context/apiContract/webSocketSupport.d.ts.map +1 -0
  165. package/dist/context/apiContract/webSocketSupport.js +465 -0
  166. package/dist/context/apiContract/webSocketSupport.js.map +1 -0
  167. package/dist/context/apiContractContext.d.ts +15 -0
  168. package/dist/context/apiContractContext.d.ts.map +1 -0
  169. package/dist/context/apiContractContext.js +979 -0
  170. package/dist/context/apiContractContext.js.map +1 -0
  171. package/dist/context/apiContractExtraction.d.ts +52 -0
  172. package/dist/context/apiContractExtraction.d.ts.map +1 -0
  173. package/dist/context/apiContractExtraction.js +438 -0
  174. package/dist/context/apiContractExtraction.js.map +1 -0
  175. package/dist/context/contextLineage.d.ts +79 -0
  176. package/dist/context/contextLineage.d.ts.map +1 -0
  177. package/dist/context/contextLineage.js +259 -0
  178. package/dist/context/contextLineage.js.map +1 -0
  179. package/dist/context/contextOrchestrator.d.ts +57 -0
  180. package/dist/context/contextOrchestrator.d.ts.map +1 -0
  181. package/dist/context/contextOrchestrator.js +162 -0
  182. package/dist/context/contextOrchestrator.js.map +1 -0
  183. package/dist/context/intentTracker.d.ts +73 -0
  184. package/dist/context/intentTracker.d.ts.map +1 -0
  185. package/dist/context/intentTracker.js +168 -0
  186. package/dist/context/intentTracker.js.map +1 -0
  187. package/dist/context/projectContext.d.ts +219 -0
  188. package/dist/context/projectContext.d.ts.map +1 -0
  189. package/dist/context/projectContext.js +1984 -0
  190. package/dist/context/projectContext.js.map +1 -0
  191. package/dist/prompts/index.d.ts +17 -0
  192. package/dist/prompts/index.d.ts.map +1 -0
  193. package/dist/prompts/index.js +260 -0
  194. package/dist/prompts/index.js.map +1 -0
  195. package/dist/prompts/library.d.ts +51 -0
  196. package/dist/prompts/library.d.ts.map +1 -0
  197. package/dist/prompts/library.js +65 -0
  198. package/dist/prompts/library.js.map +1 -0
  199. package/dist/prompts/templates.d.ts +44 -0
  200. package/dist/prompts/templates.d.ts.map +1 -0
  201. package/dist/prompts/templates.js +97 -0
  202. package/dist/prompts/templates.js.map +1 -0
  203. package/dist/queue/jobPersistence.d.ts +46 -0
  204. package/dist/queue/jobPersistence.d.ts.map +1 -0
  205. package/dist/queue/jobPersistence.js +158 -0
  206. package/dist/queue/jobPersistence.js.map +1 -0
  207. package/dist/queue/jobQueue.d.ts +116 -0
  208. package/dist/queue/jobQueue.d.ts.map +1 -0
  209. package/dist/queue/jobQueue.js +275 -0
  210. package/dist/queue/jobQueue.js.map +1 -0
  211. package/dist/queue/validationJob.d.ts +69 -0
  212. package/dist/queue/validationJob.d.ts.map +1 -0
  213. package/dist/queue/validationJob.js +435 -0
  214. package/dist/queue/validationJob.js.map +1 -0
  215. package/dist/resources/index.d.ts +15 -0
  216. package/dist/resources/index.d.ts.map +1 -0
  217. package/dist/resources/index.js +328 -0
  218. package/dist/resources/index.js.map +1 -0
  219. package/dist/resources/validationReportStore.d.ts +170 -0
  220. package/dist/resources/validationReportStore.d.ts.map +1 -0
  221. package/dist/resources/validationReportStore.js +515 -0
  222. package/dist/resources/validationReportStore.js.map +1 -0
  223. package/dist/server.d.ts +12 -0
  224. package/dist/server.d.ts.map +1 -0
  225. package/dist/server.js +102 -0
  226. package/dist/server.js.map +1 -0
  227. package/dist/tools/asyncValidation.d.ts +19 -0
  228. package/dist/tools/asyncValidation.d.ts.map +1 -0
  229. package/dist/tools/asyncValidation.js +346 -0
  230. package/dist/tools/asyncValidation.js.map +1 -0
  231. package/dist/tools/buildContext.d.ts +17 -0
  232. package/dist/tools/buildContext.d.ts.map +1 -0
  233. package/dist/tools/buildContext.js +188 -0
  234. package/dist/tools/buildContext.js.map +1 -0
  235. package/dist/tools/getDependencyGraph.d.ts +16 -0
  236. package/dist/tools/getDependencyGraph.d.ts.map +1 -0
  237. package/dist/tools/getDependencyGraph.js +436 -0
  238. package/dist/tools/getDependencyGraph.js.map +1 -0
  239. package/dist/tools/incrementalValidation.d.ts +71 -0
  240. package/dist/tools/incrementalValidation.d.ts.map +1 -0
  241. package/dist/tools/incrementalValidation.js +203 -0
  242. package/dist/tools/incrementalValidation.js.map +1 -0
  243. package/dist/tools/index.d.ts +24 -0
  244. package/dist/tools/index.d.ts.map +1 -0
  245. package/dist/tools/index.js +106 -0
  246. package/dist/tools/index.js.map +1 -0
  247. package/dist/tools/validateCode.d.ts +17 -0
  248. package/dist/tools/validateCode.d.ts.map +1 -0
  249. package/dist/tools/validateCode.js +368 -0
  250. package/dist/tools/validateCode.js.map +1 -0
  251. package/dist/tools/validateCodeLite.d.ts +2 -0
  252. package/dist/tools/validateCodeLite.d.ts.map +1 -0
  253. package/dist/tools/validateCodeLite.js +2 -0
  254. package/dist/tools/validateCodeLite.js.map +1 -0
  255. package/dist/tools/validation/builtins.d.ts +92 -0
  256. package/dist/tools/validation/builtins.d.ts.map +1 -0
  257. package/dist/tools/validation/builtins.js +2184 -0
  258. package/dist/tools/validation/builtins.js.map +1 -0
  259. package/dist/tools/validation/contextualNaming.d.ts +99 -0
  260. package/dist/tools/validation/contextualNaming.d.ts.map +1 -0
  261. package/dist/tools/validation/contextualNaming.js +959 -0
  262. package/dist/tools/validation/contextualNaming.js.map +1 -0
  263. package/dist/tools/validation/deadCode.d.ts +115 -0
  264. package/dist/tools/validation/deadCode.d.ts.map +1 -0
  265. package/dist/tools/validation/deadCode.js +861 -0
  266. package/dist/tools/validation/deadCode.js.map +1 -0
  267. package/dist/tools/validation/extractors/index.d.ts +131 -0
  268. package/dist/tools/validation/extractors/index.d.ts.map +1 -0
  269. package/dist/tools/validation/extractors/index.js +233 -0
  270. package/dist/tools/validation/extractors/index.js.map +1 -0
  271. package/dist/tools/validation/extractors/javascript.d.ts +73 -0
  272. package/dist/tools/validation/extractors/javascript.d.ts.map +1 -0
  273. package/dist/tools/validation/extractors/javascript.js +1841 -0
  274. package/dist/tools/validation/extractors/javascript.js.map +1 -0
  275. package/dist/tools/validation/extractors/python.d.ts +93 -0
  276. package/dist/tools/validation/extractors/python.d.ts.map +1 -0
  277. package/dist/tools/validation/extractors/python.js +799 -0
  278. package/dist/tools/validation/extractors/python.js.map +1 -0
  279. package/dist/tools/validation/manifest.d.ts +45 -0
  280. package/dist/tools/validation/manifest.d.ts.map +1 -0
  281. package/dist/tools/validation/manifest.js +719 -0
  282. package/dist/tools/validation/manifest.js.map +1 -0
  283. package/dist/tools/validation/parser.d.ts +58 -0
  284. package/dist/tools/validation/parser.d.ts.map +1 -0
  285. package/dist/tools/validation/parser.js +232 -0
  286. package/dist/tools/validation/parser.js.map +1 -0
  287. package/dist/tools/validation/registry.d.ts +15 -0
  288. package/dist/tools/validation/registry.d.ts.map +1 -0
  289. package/dist/tools/validation/registry.js +169 -0
  290. package/dist/tools/validation/registry.js.map +1 -0
  291. package/dist/tools/validation/scoring.d.ts +54 -0
  292. package/dist/tools/validation/scoring.d.ts.map +1 -0
  293. package/dist/tools/validation/scoring.js +242 -0
  294. package/dist/tools/validation/scoring.js.map +1 -0
  295. package/dist/tools/validation/types.d.ts +120 -0
  296. package/dist/tools/validation/types.d.ts.map +1 -0
  297. package/dist/tools/validation/types.js +11 -0
  298. package/dist/tools/validation/types.js.map +1 -0
  299. package/dist/tools/validation/unusedLocals.d.ts +36 -0
  300. package/dist/tools/validation/unusedLocals.d.ts.map +1 -0
  301. package/dist/tools/validation/unusedLocals.js +333 -0
  302. package/dist/tools/validation/unusedLocals.js.map +1 -0
  303. package/dist/tools/validation/validation.d.ts +98 -0
  304. package/dist/tools/validation/validation.d.ts.map +1 -0
  305. package/dist/tools/validation/validation.js +1837 -0
  306. package/dist/tools/validation/validation.js.map +1 -0
  307. package/dist/types/codeGraph.d.ts +163 -0
  308. package/dist/types/codeGraph.d.ts.map +1 -0
  309. package/dist/types/codeGraph.js +9 -0
  310. package/dist/types/codeGraph.js.map +1 -0
  311. package/dist/types/symbolGraph.d.ts +68 -0
  312. package/dist/types/symbolGraph.d.ts.map +1 -0
  313. package/dist/types/symbolGraph.js +10 -0
  314. package/dist/types/symbolGraph.js.map +1 -0
  315. package/dist/types/tools.d.ts +43 -0
  316. package/dist/types/tools.d.ts.map +1 -0
  317. package/dist/types/tools.js +7 -0
  318. package/dist/types/tools.js.map +1 -0
  319. package/dist/utils/fileFilter.d.ts +37 -0
  320. package/dist/utils/fileFilter.d.ts.map +1 -0
  321. package/dist/utils/fileFilter.js +91 -0
  322. package/dist/utils/fileFilter.js.map +1 -0
  323. package/dist/utils/gitUtils.d.ts +28 -0
  324. package/dist/utils/gitUtils.d.ts.map +1 -0
  325. package/dist/utils/gitUtils.js +81 -0
  326. package/dist/utils/gitUtils.js.map +1 -0
  327. package/dist/utils/logger.d.ts +15 -0
  328. package/dist/utils/logger.d.ts.map +1 -0
  329. package/dist/utils/logger.js +38 -0
  330. package/dist/utils/logger.js.map +1 -0
  331. package/dist/utils/serialization.d.ts +25 -0
  332. package/dist/utils/serialization.d.ts.map +1 -0
  333. package/dist/utils/serialization.js +53 -0
  334. package/dist/utils/serialization.js.map +1 -0
  335. package/package.json +90 -0
@@ -0,0 +1,333 @@
1
+ /**
2
+ * AST-Based Unused Local Detection
3
+ *
4
+ * This module provides superior dead code detection using AST parsing instead of regex.
5
+ * It properly handles:
6
+ * - All naming conventions (camelCase, PascalCase, UPPER_SNAKE_CASE)
7
+ * - Both JavaScript/TypeScript AND Python
8
+ * - Exported vs non-exported symbols
9
+ * - Local function declarations, const/let/var, and Python def
10
+ * - React hooks and framework patterns
11
+ *
12
+ * @format
13
+ */
14
+ import { extractSymbolsAST, extractUsagesAST, extractImportsAST, collectLocalDefinitionsAST, } from "./extractors/index.js";
15
+ import { getParser } from "./parser.js";
16
+ import { logger } from "../../utils/logger.js";
17
+ /**
18
+ * Detect unused local functions and variables within a single file using AST parsing.
19
+ * This is the AST-based replacement for the regex-based detectUnusedLocals.
20
+ *
21
+ * Advantages over regex approach:
22
+ * - Handles all naming conventions (camelCase, PascalCase, UPPER_SNAKE_CASE)
23
+ * - Properly distinguishes exported vs non-exported symbols
24
+ * - Accurate line numbers from AST
25
+ * - Works for both JS/TS and Python with proper language support
26
+ * - Understands scope (won't flag parameters as unused when they're used in function body)
27
+ *
28
+ * @param code - The source code string to analyze
29
+ * @param filePath - Path to the file (used to determine language from extension)
30
+ * @returns Array of dead code issues found
31
+ */
32
+ export function detectUnusedLocalsAST(code, filePath) {
33
+ const issues = [];
34
+ // Detect language from file extension
35
+ const language = detectFileLanguage(filePath);
36
+ if (language === "unknown") {
37
+ logger.debug(`Unknown language for file: ${filePath}`);
38
+ return issues;
39
+ }
40
+ try {
41
+ // Step 1: Extract all symbol definitions from the file
42
+ const symbols = extractSymbolsAST(code, filePath, language);
43
+ // Step 2: Extract all imports (to identify external symbols)
44
+ const imports = extractImportsAST(code, language);
45
+ const importedNames = new Set();
46
+ for (const imp of imports) {
47
+ for (const name of imp.names) {
48
+ importedNames.add(name.local);
49
+ // For Python dotted imports, also add base module
50
+ if (language === "python" && name.local.includes(".")) {
51
+ importedNames.add(name.local.split(".")[0]);
52
+ }
53
+ }
54
+ }
55
+ // Step 3: Collect all locally-defined names (params, destructured vars, etc.)
56
+ // This prevents false positives on function parameters
57
+ const localDefinitions = collectLocalDefinitionsAST(code, language);
58
+ // Step 4: Extract all symbol usages (cross-file focused)
59
+ const usages = extractUsagesAST(code, language, imports);
60
+ const usedNames = new Set();
61
+ for (const usage of usages) {
62
+ usedNames.add(usage.name);
63
+ }
64
+ // Step 4b: Build a comprehensive set of ALL identifier references in the file.
65
+ // extractUsagesAST only tracks cross-file symbol usages (for hallucination detection),
66
+ // so we need our own set that includes local references like `resolve` in
67
+ // `new Promise(resolve => setTimeout(resolve, ms))` and `ProtectedComponent` in
68
+ // `return function ProtectedComponent(props) {...}`.
69
+ if (language === "typescript" || language === "javascript") {
70
+ try {
71
+ const parser = getParser(language);
72
+ const tree = parser.parse(code);
73
+ const collectRefs = (node) => {
74
+ if (!node)
75
+ return;
76
+ if (node.type === "identifier" || node.type === "property_identifier" || node.type === "type_identifier") {
77
+ const parentType = node.parent?.type;
78
+ // Skip declaration positions (variable_declarator name, function declaration name)
79
+ const isDecl = (parentType === "variable_declarator" && node.parent?.childForFieldName?.("name")?.id === node.id) ||
80
+ ((parentType === "function_declaration" || parentType === "method_definition") &&
81
+ node.parent?.childForFieldName?.("name")?.id === node.id);
82
+ if (!isDecl) {
83
+ const text = node.text || code.slice(node.startIndex, node.endIndex);
84
+ if (text)
85
+ usedNames.add(text);
86
+ }
87
+ }
88
+ if (node.children) {
89
+ for (const child of node.children)
90
+ collectRefs(child);
91
+ }
92
+ };
93
+ collectRefs(tree.rootNode);
94
+ }
95
+ catch {
96
+ // Best-effort
97
+ }
98
+ }
99
+ // Step 5: Check each local symbol to see if it's used
100
+ for (const sym of symbols) {
101
+ // Skip exported symbols - they may be used by other files
102
+ if (sym.isExported)
103
+ continue;
104
+ // Skip class/object methods and properties — they are NOT locals.
105
+ // They are accessed via their parent instance (e.g., spoonacularService.getRecipeDetails())
106
+ // and their usage is cross-file, not detectable by single-file analysis.
107
+ // Also skip ALL method-type symbols regardless of scope — they are always properties
108
+ // of an object literal (e.g., { queryFn: async () => {...} } inside useQuery()),
109
+ // consumed by the parent object, not standalone locals.
110
+ if (sym.scope || sym.type === "method")
111
+ continue;
112
+ // Python: Skip ALL module-level functions and classes.
113
+ // In Python, there is no `export` keyword — all module-level functions and classes
114
+ // are implicitly part of the module's public API and can be imported by other modules.
115
+ // Single-file analysis cannot determine if they're used elsewhere.
116
+ // Additionally, decorated functions (FastAPI routes, event handlers, etc.) are consumed
117
+ // by the framework at runtime and won't appear as local references.
118
+ // This is fundamentally different from JS/TS where `export` is explicit.
119
+ if (language === "python" && (sym.type === "function" || sym.type === "class"))
120
+ continue;
121
+ // Skip imported symbols
122
+ if (importedNames.has(sym.name))
123
+ continue;
124
+ // Skip React hooks and common framework patterns
125
+ if (shouldSkipFrameworkPattern(sym.name))
126
+ continue;
127
+ // Skip variable-type symbols that are local definitions (function params,
128
+ // destructured vars, catch clause vars, etc.) — these are inner-scope
129
+ // variables, not top-level locals worth flagging. We only skip "variable"
130
+ // types to preserve detection of unused function declarations.
131
+ if (sym.type === "variable" && localDefinitions.has(sym.name))
132
+ continue;
133
+ if (isParameterSymbol(sym, code, language))
134
+ continue;
135
+ // Check if the symbol is used
136
+ const isUsed = usedNames.has(sym.name);
137
+ if (!isUsed) {
138
+ const issueType = sym.type === "function" ? "unusedFunction" : "unusedExport";
139
+ const displayType = sym.type === "function" ? "Function" : "Variable";
140
+ issues.push({
141
+ type: issueType,
142
+ severity: "medium",
143
+ name: sym.name,
144
+ file: filePath,
145
+ line: sym.line,
146
+ message: `${displayType} '${sym.name}' is defined but never used in this file`,
147
+ });
148
+ }
149
+ }
150
+ // Step 6: Check for unused local definitions (const/let/var that aren't in symbols)
151
+ // This catches variables that might not be detected as symbols
152
+ const unusedLocals = findUnusedLocalDefinitions(code, filePath, language, usedNames, importedNames);
153
+ issues.push(...unusedLocals);
154
+ }
155
+ catch (error) {
156
+ logger.warn(`Error analyzing unused locals in ${filePath}:`, error);
157
+ }
158
+ return issues;
159
+ }
160
+ /**
161
+ * Detect file language from extension
162
+ */
163
+ function detectFileLanguage(filePath) {
164
+ const ext = filePath.toLowerCase().split(".").pop();
165
+ switch (ext) {
166
+ case "ts":
167
+ case "tsx":
168
+ return "typescript";
169
+ case "js":
170
+ case "jsx":
171
+ case "mjs":
172
+ case "cjs":
173
+ return "javascript";
174
+ case "py":
175
+ return "python";
176
+ default:
177
+ return "unknown";
178
+ }
179
+ }
180
+ /**
181
+ * Check if a symbol should be skipped due to framework patterns
182
+ */
183
+ function shouldSkipFrameworkPattern(name) {
184
+ // React hooks
185
+ if (name.startsWith("use") && name.length > 3 && /[A-Z]/.test(name[3])) {
186
+ return false; // Actually check these - they might be custom hooks
187
+ }
188
+ // Common framework patterns that are often auto-used
189
+ const skipPatterns = [
190
+ "default",
191
+ "constructor",
192
+ "render",
193
+ "componentDidMount",
194
+ "componentWillUnmount",
195
+ "getStaticProps",
196
+ "getServerSideProps",
197
+ ];
198
+ return skipPatterns.includes(name);
199
+ }
200
+ /**
201
+ * Check if a symbol is a function parameter (not a top-level definition)
202
+ */
203
+ function isParameterSymbol(sym, code, language) {
204
+ // This is a heuristic - if the symbol type suggests it's a parameter, skip it
205
+ // The extractSymbolsAST should handle this, but we double-check here
206
+ return false; // Let the extractor handle this
207
+ }
208
+ /**
209
+ * Find unused local variable definitions that might not be in the symbol table
210
+ * This catches const/let/var declarations using AST parsing
211
+ */
212
+ function findUnusedLocalDefinitions(code, filePath, language, usedNames, importedNames) {
213
+ const issues = [];
214
+ if (language !== "typescript" && language !== "javascript") {
215
+ return issues; // Python is handled by extractSymbolsAST
216
+ }
217
+ try {
218
+ const parser = getParser(language);
219
+ const tree = parser.parse(code);
220
+ // Build a comprehensive set of ALL identifier references in the file.
221
+ // extractUsagesAST only tracks cross-file symbol usages (for hallucination detection),
222
+ // so we need our own set that includes local references like `validAisles.includes(...)`.
223
+ const allReferences = new Set();
224
+ function collectReferences(node) {
225
+ if (!node)
226
+ return;
227
+ // Collect identifiers that are NOT in declaration positions
228
+ if (node.type === "identifier" || node.type === "property_identifier" || node.type === "type_identifier") {
229
+ const parentType = node.parent?.type;
230
+ // Skip if this is the NAME side of a variable_declarator (declaration, not usage)
231
+ const isDeclarationName = parentType === "variable_declarator" && node.parent?.childForFieldName?.("name")?.id === node.id;
232
+ // Skip if this is a function/method declaration name
233
+ const isFuncDeclName = (parentType === "function_declaration" || parentType === "method_definition") &&
234
+ node.parent?.childForFieldName?.("name")?.id === node.id;
235
+ if (!isDeclarationName && !isFuncDeclName) {
236
+ const text = node.text || getNodeText(node, code);
237
+ if (text)
238
+ allReferences.add(text);
239
+ }
240
+ }
241
+ if (node.children) {
242
+ for (const child of node.children) {
243
+ collectReferences(child);
244
+ }
245
+ }
246
+ }
247
+ collectReferences(tree.rootNode);
248
+ // Merge with usedNames from extractUsagesAST
249
+ const combinedUsed = new Set([...usedNames, ...allReferences]);
250
+ // Only check MODULE-LEVEL variable declarations (direct children of program).
251
+ // Variables inside function/method bodies are local to that scope and their
252
+ // usage is NOT tracked by extractUsagesAST (which focuses on cross-file symbols).
253
+ // Recursing into function bodies would produce massive false positives
254
+ // (e.g., `const where = {}` inside an Express handler).
255
+ const root = tree.rootNode;
256
+ for (const topNode of root.children) {
257
+ // Handle both direct declarations and export_statement wrappers
258
+ const declNode = (topNode.type === "lexical_declaration" || topNode.type === "variable_declaration")
259
+ ? topNode
260
+ : (topNode.type === "export_statement"
261
+ ? topNode.children?.find((c) => c.type === "lexical_declaration" || c.type === "variable_declaration")
262
+ : null);
263
+ if (!declNode)
264
+ continue;
265
+ const isExported = declNode.parent?.type === "export_statement";
266
+ for (const child of declNode.children) {
267
+ if (child.type === "variable_declarator") {
268
+ const nameNode = child.childForFieldName?.("name");
269
+ if (nameNode && nameNode.type === "identifier") {
270
+ const name = nameNode.text || getNodeText(nameNode, code);
271
+ const line = nameNode.startPosition?.row + 1 || 1;
272
+ // Skip if exported
273
+ if (isExported)
274
+ continue;
275
+ // Skip if used (check both cross-file usages and local references)
276
+ if (combinedUsed.has(name))
277
+ continue;
278
+ // Skip if imported
279
+ if (importedNames.has(name))
280
+ continue;
281
+ // Skip if it starts with _ (intentionally unused)
282
+ if (name.startsWith("_"))
283
+ continue;
284
+ // Skip React hooks (useXxx)
285
+ if (name.startsWith("use") && name.length > 3 && /[A-Z]/.test(name[3]))
286
+ continue;
287
+ // Check if this is a function assignment (already handled by extractSymbolsAST)
288
+ const valueNode = child.childForFieldName?.("value");
289
+ if (valueNode && (valueNode.type === "arrow_function" ||
290
+ valueNode.type === "function" ||
291
+ valueNode.type === "function_expression")) {
292
+ // Already handled by extractSymbolsAST
293
+ continue;
294
+ }
295
+ // This is an unused variable
296
+ issues.push({
297
+ type: "unusedExport",
298
+ severity: "medium",
299
+ name,
300
+ file: filePath,
301
+ line,
302
+ message: `Variable '${name}' is defined but never used in this file`,
303
+ });
304
+ }
305
+ }
306
+ }
307
+ }
308
+ }
309
+ catch (error) {
310
+ logger.debug(`Error in findUnusedLocalDefinitions for ${filePath}:`, error);
311
+ }
312
+ return issues;
313
+ }
314
+ /**
315
+ * Get text from an AST node
316
+ */
317
+ function getNodeText(node, code) {
318
+ if (node.text)
319
+ return node.text;
320
+ if (node.startIndex !== undefined && node.endIndex !== undefined) {
321
+ return code.slice(node.startIndex, node.endIndex);
322
+ }
323
+ return "";
324
+ }
325
+ /**
326
+ * Backwards-compatible wrapper that uses AST-based detection
327
+ * This replaces the old regex-based detectUnusedLocals
328
+ */
329
+ export function detectUnusedLocals(code, filePath) {
330
+ // Use the new AST-based implementation
331
+ return detectUnusedLocalsAST(code, filePath);
332
+ }
333
+ //# sourceMappingURL=unusedLocals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unusedLocals.js","sourceRoot":"","sources":["../../../src/tools/validation/unusedLocals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Core Validation Logic Module
3
+ *
4
+ * This module contains the core validation algorithms for detecting hallucinations
5
+ * and validating symbols against the project context.
6
+ *
7
+ * Responsibilities:
8
+ * - Validate that imported packages exist in manifest files
9
+ * - Validate that used symbols exist in the project symbol table
10
+ * - Check parameter counts for function calls
11
+ * - Calculate confidence scores for validation issues
12
+ * - Generate reasoning explanations for each issue
13
+ * - Build symbol lookup tables from project context
14
+ * - Handle strict mode vs. non-strict mode validation
15
+ *
16
+ * @format
17
+ */
18
+ import type { ProjectContext } from "../../context/projectContext.js";
19
+ import type { ValidationIssue, ProjectSymbol, ManifestDependencies, ASTUsage, ASTImport, ASTTypeReference } from "./types.js";
20
+ /**
21
+ * Validate that all imported packages exist in manifest files.
22
+ * Checks package.json for JavaScript/TypeScript and requirements.txt/pyproject.toml for Python.
23
+ *
24
+ * @param imports - Array of import statements extracted from code
25
+ * @param manifest - Manifest dependencies loaded from package files
26
+ * @param newCode - The source code being validated (for extracting line content)
27
+ * @param language - Programming language (default: typescript)
28
+ * @returns Array of validation issues for missing dependencies
29
+ */
30
+ export declare function validateManifest(imports: ASTImport[], manifest: ManifestDependencies, newCode: string, language?: string, filePath?: string): Promise<ValidationIssue[]>;
31
+ /**
32
+ * Extract a specific line from code by line number.
33
+ *
34
+ * @param code - The source code
35
+ * @param lineNum - Line number (1-indexed)
36
+ * @returns The trimmed line content
37
+ */
38
+ export declare function getLineFromCode(code: string, lineNum: number): string;
39
+ /**
40
+ * Build a symbol table from project context for validation.
41
+ * Converts the project context symbol index into a flat array of ProjectSymbol objects.
42
+ *
43
+ * @param context - The project context containing all symbols
44
+ * @param relevantSymbols - Optional list of symbol names to include (for smart context filtering)
45
+ * @returns Array of project symbols for validation
46
+ */
47
+ export declare function buildSymbolTable(context: ProjectContext, relevantSymbols?: string[]): ProjectSymbol[];
48
+ /**
49
+ * Calculate confidence score for a validation issue.
50
+ * Based on multiple factors: similarity to existing symbols, context, etc.
51
+ *
52
+ * @param options - Configuration for confidence calculation
53
+ * @returns Object containing confidence score (0-100) and reasoning explanation
54
+ */
55
+ export declare function calculateConfidence(options: {
56
+ issueType: ValidationIssue["type"];
57
+ symbolName: string;
58
+ similarSymbols: string[];
59
+ existsInProject: boolean;
60
+ strictMode: boolean;
61
+ }): {
62
+ confidence: number;
63
+ reasoning: string;
64
+ };
65
+ /**
66
+ * Validate that all used symbols exist in the project symbol table.
67
+ * Performs comprehensive validation including:
68
+ * - Function calls
69
+ * - Method calls
70
+ * - Class instantiations
71
+ * - Parameter count checking
72
+ * - Import validation
73
+ * - Python __all__ export validation
74
+ *
75
+ * @param usedSymbols - Array of symbol usages extracted from code
76
+ * @param symbolTable - Array of project symbols for validation
77
+ * @param newCode - The source code being validated
78
+ * @param language - Programming language ('python', 'javascript', 'typescript')
79
+ * @param strictMode - If true, requires explicit imports for all symbols
80
+ * @param imports - Array of import statements (for internal import validation)
81
+ * @param pythonExports - Map of Python module exports (for __all__ validation)
82
+ * @param typeReferences - Optional array of type references (for unused import detection)
83
+ * @returns Array of validation issues
84
+ */
85
+ export declare function validateSymbols(usedSymbols: ASTUsage[], symbolTable: ProjectSymbol[], newCode: string, language: string, strictMode: boolean, imports?: ASTImport[], pythonExports?: Map<string, Set<string>>, context?: ProjectContext | null, // Added context
86
+ filePath?: string, // Added file path
87
+ missingPackages?: Set<string>, // Added missing packages for smart validation
88
+ typeReferences?: ASTTypeReference[]): ValidationIssue[];
89
+ /**
90
+ * Validate that usage of symbols follows established project patterns (Secret #5).
91
+ * Detects "ritual" deviations such as missing co-occurring calls.
92
+ *
93
+ * @param usedSymbols - Symbols used in the new code
94
+ * @param projectContext - Project context with symbol graph and patterns
95
+ * @returns Array of pattern deviation issues
96
+ */
97
+ export declare function validateUsagePatterns(usedSymbols: ASTUsage[], projectContext: ProjectContext, filePath?: string): ValidationIssue[];
98
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/tools/validation/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACR,SAAS,EACT,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAyBpB;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,SAAS,EAAE,EACpB,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAqB,EAC/B,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC,eAAe,EAAE,CAAC,CA0F5B;AA4BD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrE;AAMD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,EACvB,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,aAAa,EAAE,CAwBjB;AA+BD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAiE5C;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,QAAQ,EAAE,EACvB,WAAW,EAAE,aAAa,EAAE,EAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,SAAS,EAAO,EACzB,aAAa,GAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa,EACnD,OAAO,GAAE,cAAc,GAAG,IAAW,EAAE,gBAAgB;AACvD,QAAQ,GAAE,MAAW,EAAE,kBAAkB;AACzC,eAAe,GAAE,GAAG,CAAC,MAAM,CAAa,EAAE,8CAA8C;AACxF,cAAc,GAAE,gBAAgB,EAAO,GACtC,eAAe,EAAE,CA0jDnB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,QAAQ,EAAE,EACvB,cAAc,EAAE,cAAc,EAC9B,QAAQ,GAAE,MAAW,GACpB,eAAe,EAAE,CAkCnB"}