codesift-mcp 0.2.18 → 0.4.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 (461) hide show
  1. package/README.md +143 -20
  2. package/dist/cache/hono-cache.d.ts +50 -0
  3. package/dist/cache/hono-cache.d.ts.map +1 -0
  4. package/dist/cache/hono-cache.js +132 -0
  5. package/dist/cache/hono-cache.js.map +1 -0
  6. package/dist/cli/setup.d.ts.map +1 -1
  7. package/dist/cli/setup.js +17 -2
  8. package/dist/cli/setup.js.map +1 -1
  9. package/dist/formatters-shortening.d.ts +13 -0
  10. package/dist/formatters-shortening.d.ts.map +1 -1
  11. package/dist/formatters-shortening.js +131 -0
  12. package/dist/formatters-shortening.js.map +1 -1
  13. package/dist/formatters.d.ts +38 -0
  14. package/dist/formatters.d.ts.map +1 -1
  15. package/dist/formatters.js +498 -0
  16. package/dist/formatters.js.map +1 -1
  17. package/dist/instructions.d.ts +1 -1
  18. package/dist/instructions.d.ts.map +1 -1
  19. package/dist/instructions.js +27 -26
  20. package/dist/instructions.js.map +1 -1
  21. package/dist/lsp/lsp-servers.d.ts.map +1 -1
  22. package/dist/lsp/lsp-servers.js +5 -0
  23. package/dist/lsp/lsp-servers.js.map +1 -1
  24. package/dist/lsp/lsp-tools.d.ts.map +1 -1
  25. package/dist/lsp/lsp-tools.js +1 -0
  26. package/dist/lsp/lsp-tools.js.map +1 -1
  27. package/dist/parser/astro-template.d.ts +47 -0
  28. package/dist/parser/astro-template.d.ts.map +1 -0
  29. package/dist/parser/astro-template.js +171 -0
  30. package/dist/parser/astro-template.js.map +1 -0
  31. package/dist/parser/extractors/_shared.d.ts +4 -0
  32. package/dist/parser/extractors/_shared.d.ts.map +1 -1
  33. package/dist/parser/extractors/_shared.js +8 -0
  34. package/dist/parser/extractors/_shared.js.map +1 -1
  35. package/dist/parser/extractors/astro.d.ts +4 -5
  36. package/dist/parser/extractors/astro.d.ts.map +1 -1
  37. package/dist/parser/extractors/astro.js +102 -26
  38. package/dist/parser/extractors/astro.js.map +1 -1
  39. package/dist/parser/extractors/gradle-kts.d.ts +4 -0
  40. package/dist/parser/extractors/gradle-kts.d.ts.map +1 -0
  41. package/dist/parser/extractors/gradle-kts.js +246 -0
  42. package/dist/parser/extractors/gradle-kts.js.map +1 -0
  43. package/dist/parser/extractors/hono-inline-analyzer.d.ts +34 -0
  44. package/dist/parser/extractors/hono-inline-analyzer.d.ts.map +1 -0
  45. package/dist/parser/extractors/hono-inline-analyzer.js +465 -0
  46. package/dist/parser/extractors/hono-inline-analyzer.js.map +1 -0
  47. package/dist/parser/extractors/hono-model.d.ts +196 -0
  48. package/dist/parser/extractors/hono-model.d.ts.map +1 -0
  49. package/dist/parser/extractors/hono-model.js +10 -0
  50. package/dist/parser/extractors/hono-model.js.map +1 -0
  51. package/dist/parser/extractors/hono.d.ts +118 -0
  52. package/dist/parser/extractors/hono.d.ts.map +1 -0
  53. package/dist/parser/extractors/hono.js +1527 -0
  54. package/dist/parser/extractors/hono.js.map +1 -0
  55. package/dist/parser/extractors/kotlin.d.ts +4 -0
  56. package/dist/parser/extractors/kotlin.d.ts.map +1 -0
  57. package/dist/parser/extractors/kotlin.js +521 -0
  58. package/dist/parser/extractors/kotlin.js.map +1 -0
  59. package/dist/parser/extractors/php.d.ts +22 -0
  60. package/dist/parser/extractors/php.d.ts.map +1 -0
  61. package/dist/parser/extractors/php.js +326 -0
  62. package/dist/parser/extractors/php.js.map +1 -0
  63. package/dist/parser/extractors/python.d.ts.map +1 -1
  64. package/dist/parser/extractors/python.js +234 -11
  65. package/dist/parser/extractors/python.js.map +1 -1
  66. package/dist/parser/extractors/sql.d.ts +33 -0
  67. package/dist/parser/extractors/sql.d.ts.map +1 -0
  68. package/dist/parser/extractors/sql.js +506 -0
  69. package/dist/parser/extractors/sql.js.map +1 -0
  70. package/dist/parser/extractors/typescript.d.ts.map +1 -1
  71. package/dist/parser/extractors/typescript.js +166 -3
  72. package/dist/parser/extractors/typescript.js.map +1 -1
  73. package/dist/parser/languages/tree-sitter-javascript.wasm +0 -0
  74. package/dist/parser/languages/tree-sitter-kotlin.wasm +0 -0
  75. package/dist/parser/languages/tree-sitter-php.wasm +0 -0
  76. package/dist/parser/languages/tree-sitter-php_only.wasm +0 -0
  77. package/dist/parser/languages/tree-sitter-python.wasm +0 -0
  78. package/dist/parser/parser-manager.d.ts +32 -0
  79. package/dist/parser/parser-manager.d.ts.map +1 -1
  80. package/dist/parser/parser-manager.js +82 -3
  81. package/dist/parser/parser-manager.js.map +1 -1
  82. package/dist/parser/symbol-extractor.d.ts.map +1 -1
  83. package/dist/parser/symbol-extractor.js +16 -0
  84. package/dist/parser/symbol-extractor.js.map +1 -1
  85. package/dist/register-tools.d.ts +37 -1
  86. package/dist/register-tools.d.ts.map +1 -1
  87. package/dist/register-tools.js +2657 -191
  88. package/dist/register-tools.js.map +1 -1
  89. package/dist/search/reranker.js +1 -1
  90. package/dist/search/reranker.js.map +1 -1
  91. package/dist/server-helpers.d.ts.map +1 -1
  92. package/dist/server-helpers.js +11 -0
  93. package/dist/server-helpers.js.map +1 -1
  94. package/dist/server.js +28 -1
  95. package/dist/server.js.map +1 -1
  96. package/dist/storage/index-store.d.ts +15 -1
  97. package/dist/storage/index-store.d.ts.map +1 -1
  98. package/dist/storage/index-store.js +27 -1
  99. package/dist/storage/index-store.js.map +1 -1
  100. package/dist/storage/session-state.d.ts +1 -1
  101. package/dist/storage/session-state.d.ts.map +1 -1
  102. package/dist/storage/session-state.js +6 -4
  103. package/dist/storage/session-state.js.map +1 -1
  104. package/dist/tools/agent-config-tools.d.ts +24 -0
  105. package/dist/tools/agent-config-tools.d.ts.map +1 -0
  106. package/dist/tools/agent-config-tools.js +119 -0
  107. package/dist/tools/agent-config-tools.js.map +1 -0
  108. package/dist/tools/architecture-tools.d.ts +23 -0
  109. package/dist/tools/architecture-tools.d.ts.map +1 -0
  110. package/dist/tools/architecture-tools.js +140 -0
  111. package/dist/tools/architecture-tools.js.map +1 -0
  112. package/dist/tools/astro-config.d.ts +33 -0
  113. package/dist/tools/astro-config.d.ts.map +1 -0
  114. package/dist/tools/astro-config.js +260 -0
  115. package/dist/tools/astro-config.js.map +1 -0
  116. package/dist/tools/astro-islands.d.ts +61 -0
  117. package/dist/tools/astro-islands.d.ts.map +1 -0
  118. package/dist/tools/astro-islands.js +240 -0
  119. package/dist/tools/astro-islands.js.map +1 -0
  120. package/dist/tools/astro-routes.d.ts +49 -0
  121. package/dist/tools/astro-routes.d.ts.map +1 -0
  122. package/dist/tools/astro-routes.js +119 -0
  123. package/dist/tools/astro-routes.js.map +1 -0
  124. package/dist/tools/audit-tools.d.ts +38 -0
  125. package/dist/tools/audit-tools.d.ts.map +1 -0
  126. package/dist/tools/audit-tools.js +248 -0
  127. package/dist/tools/audit-tools.js.map +1 -0
  128. package/dist/tools/celery-tools.d.ts +38 -0
  129. package/dist/tools/celery-tools.d.ts.map +1 -0
  130. package/dist/tools/celery-tools.js +154 -0
  131. package/dist/tools/celery-tools.js.map +1 -0
  132. package/dist/tools/clone-tools.js +1 -1
  133. package/dist/tools/clone-tools.js.map +1 -1
  134. package/dist/tools/complexity-tools.d.ts +4 -0
  135. package/dist/tools/complexity-tools.d.ts.map +1 -1
  136. package/dist/tools/complexity-tools.js +78 -4
  137. package/dist/tools/complexity-tools.js.map +1 -1
  138. package/dist/tools/compose-tools.d.ts +60 -0
  139. package/dist/tools/compose-tools.d.ts.map +1 -0
  140. package/dist/tools/compose-tools.js +203 -0
  141. package/dist/tools/compose-tools.js.map +1 -0
  142. package/dist/tools/coupling-tools.d.ts +50 -0
  143. package/dist/tools/coupling-tools.d.ts.map +1 -0
  144. package/dist/tools/coupling-tools.js +262 -0
  145. package/dist/tools/coupling-tools.js.map +1 -0
  146. package/dist/tools/dependency-audit-tools.d.ts +65 -0
  147. package/dist/tools/dependency-audit-tools.d.ts.map +1 -0
  148. package/dist/tools/dependency-audit-tools.js +553 -0
  149. package/dist/tools/dependency-audit-tools.js.map +1 -0
  150. package/dist/tools/django-settings.d.ts +22 -0
  151. package/dist/tools/django-settings.d.ts.map +1 -0
  152. package/dist/tools/django-settings.js +301 -0
  153. package/dist/tools/django-settings.js.map +1 -0
  154. package/dist/tools/frequency-tools.js +1 -1
  155. package/dist/tools/frequency-tools.js.map +1 -1
  156. package/dist/tools/graph-tools.d.ts +8 -2
  157. package/dist/tools/graph-tools.d.ts.map +1 -1
  158. package/dist/tools/graph-tools.js +44 -3
  159. package/dist/tools/graph-tools.js.map +1 -1
  160. package/dist/tools/hilt-tools.d.ts +55 -0
  161. package/dist/tools/hilt-tools.d.ts.map +1 -0
  162. package/dist/tools/hilt-tools.js +258 -0
  163. package/dist/tools/hilt-tools.js.map +1 -0
  164. package/dist/tools/hono-analyze-app.d.ts +48 -0
  165. package/dist/tools/hono-analyze-app.d.ts.map +1 -0
  166. package/dist/tools/hono-analyze-app.js +102 -0
  167. package/dist/tools/hono-analyze-app.js.map +1 -0
  168. package/dist/tools/hono-api-contract.d.ts +22 -0
  169. package/dist/tools/hono-api-contract.d.ts.map +1 -0
  170. package/dist/tools/hono-api-contract.js +80 -0
  171. package/dist/tools/hono-api-contract.js.map +1 -0
  172. package/dist/tools/hono-conditional-middleware.d.ts +27 -0
  173. package/dist/tools/hono-conditional-middleware.d.ts.map +1 -0
  174. package/dist/tools/hono-conditional-middleware.js +62 -0
  175. package/dist/tools/hono-conditional-middleware.js.map +1 -0
  176. package/dist/tools/hono-context-flow.d.ts +24 -0
  177. package/dist/tools/hono-context-flow.d.ts.map +1 -0
  178. package/dist/tools/hono-context-flow.js +78 -0
  179. package/dist/tools/hono-context-flow.js.map +1 -0
  180. package/dist/tools/hono-dead-routes.d.ts +26 -0
  181. package/dist/tools/hono-dead-routes.d.ts.map +1 -0
  182. package/dist/tools/hono-dead-routes.js +109 -0
  183. package/dist/tools/hono-dead-routes.js.map +1 -0
  184. package/dist/tools/hono-env-regression.d.ts +29 -0
  185. package/dist/tools/hono-env-regression.d.ts.map +1 -0
  186. package/dist/tools/hono-env-regression.js +157 -0
  187. package/dist/tools/hono-env-regression.js.map +1 -0
  188. package/dist/tools/hono-inline-analyze.d.ts +31 -0
  189. package/dist/tools/hono-inline-analyze.d.ts.map +1 -0
  190. package/dist/tools/hono-inline-analyze.js +67 -0
  191. package/dist/tools/hono-inline-analyze.js.map +1 -0
  192. package/dist/tools/hono-middleware-chain.d.ts +22 -0
  193. package/dist/tools/hono-middleware-chain.d.ts.map +1 -0
  194. package/dist/tools/hono-middleware-chain.js +84 -0
  195. package/dist/tools/hono-middleware-chain.js.map +1 -0
  196. package/dist/tools/hono-modules.d.ts +22 -0
  197. package/dist/tools/hono-modules.d.ts.map +1 -0
  198. package/dist/tools/hono-modules.js +126 -0
  199. package/dist/tools/hono-modules.js.map +1 -0
  200. package/dist/tools/hono-response-types.d.ts +37 -0
  201. package/dist/tools/hono-response-types.d.ts.map +1 -0
  202. package/dist/tools/hono-response-types.js +84 -0
  203. package/dist/tools/hono-response-types.js.map +1 -0
  204. package/dist/tools/hono-rpc-types.d.ts +21 -0
  205. package/dist/tools/hono-rpc-types.d.ts.map +1 -0
  206. package/dist/tools/hono-rpc-types.js +57 -0
  207. package/dist/tools/hono-rpc-types.js.map +1 -0
  208. package/dist/tools/hono-security.d.ts +21 -0
  209. package/dist/tools/hono-security.d.ts.map +1 -0
  210. package/dist/tools/hono-security.js +98 -0
  211. package/dist/tools/hono-security.js.map +1 -0
  212. package/dist/tools/hono-visualize.d.ts +13 -0
  213. package/dist/tools/hono-visualize.d.ts.map +1 -0
  214. package/dist/tools/hono-visualize.js +72 -0
  215. package/dist/tools/hono-visualize.js.map +1 -0
  216. package/dist/tools/hotspot-tools.d.ts.map +1 -1
  217. package/dist/tools/hotspot-tools.js +9 -7
  218. package/dist/tools/hotspot-tools.js.map +1 -1
  219. package/dist/tools/index-tools.d.ts +17 -0
  220. package/dist/tools/index-tools.d.ts.map +1 -1
  221. package/dist/tools/index-tools.js +210 -10
  222. package/dist/tools/index-tools.js.map +1 -1
  223. package/dist/tools/kotlin-tools.d.ts +142 -0
  224. package/dist/tools/kotlin-tools.d.ts.map +1 -0
  225. package/dist/tools/kotlin-tools.js +572 -0
  226. package/dist/tools/kotlin-tools.js.map +1 -0
  227. package/dist/tools/legacy-hono-conventions.d.ts +14 -0
  228. package/dist/tools/legacy-hono-conventions.d.ts.map +1 -0
  229. package/dist/tools/legacy-hono-conventions.js +152 -0
  230. package/dist/tools/legacy-hono-conventions.js.map +1 -0
  231. package/dist/tools/migration-lint-tools.d.ts +26 -0
  232. package/dist/tools/migration-lint-tools.d.ts.map +1 -0
  233. package/dist/tools/migration-lint-tools.js +247 -0
  234. package/dist/tools/migration-lint-tools.js.map +1 -0
  235. package/dist/tools/model-tools.d.ts +30 -0
  236. package/dist/tools/model-tools.d.ts.map +1 -0
  237. package/dist/tools/model-tools.js +145 -0
  238. package/dist/tools/model-tools.js.map +1 -0
  239. package/dist/tools/nest-ext-tools.d.ts +92 -0
  240. package/dist/tools/nest-ext-tools.d.ts.map +1 -0
  241. package/dist/tools/nest-ext-tools.js +359 -0
  242. package/dist/tools/nest-ext-tools.js.map +1 -0
  243. package/dist/tools/nest-tools.d.ts +171 -0
  244. package/dist/tools/nest-tools.d.ts.map +1 -0
  245. package/dist/tools/nest-tools.js +1042 -0
  246. package/dist/tools/nest-tools.js.map +1 -0
  247. package/dist/tools/nextjs-api-contract-readers.d.ts +14 -0
  248. package/dist/tools/nextjs-api-contract-readers.d.ts.map +1 -0
  249. package/dist/tools/nextjs-api-contract-readers.js +204 -0
  250. package/dist/tools/nextjs-api-contract-readers.js.map +1 -0
  251. package/dist/tools/nextjs-api-contract-tools.d.ts +57 -0
  252. package/dist/tools/nextjs-api-contract-tools.d.ts.map +1 -0
  253. package/dist/tools/nextjs-api-contract-tools.js +144 -0
  254. package/dist/tools/nextjs-api-contract-tools.js.map +1 -0
  255. package/dist/tools/nextjs-boundary-tools.d.ts +39 -0
  256. package/dist/tools/nextjs-boundary-tools.d.ts.map +1 -0
  257. package/dist/tools/nextjs-boundary-tools.js +152 -0
  258. package/dist/tools/nextjs-boundary-tools.js.map +1 -0
  259. package/dist/tools/nextjs-component-tools.d.ts +121 -0
  260. package/dist/tools/nextjs-component-tools.d.ts.map +1 -0
  261. package/dist/tools/nextjs-component-tools.js +460 -0
  262. package/dist/tools/nextjs-component-tools.js.map +1 -0
  263. package/dist/tools/nextjs-data-flow-tools.d.ts +42 -0
  264. package/dist/tools/nextjs-data-flow-tools.d.ts.map +1 -0
  265. package/dist/tools/nextjs-data-flow-tools.js +158 -0
  266. package/dist/tools/nextjs-data-flow-tools.js.map +1 -0
  267. package/dist/tools/nextjs-framework-audit-tools.d.ts +37 -0
  268. package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -0
  269. package/dist/tools/nextjs-framework-audit-tools.js +211 -0
  270. package/dist/tools/nextjs-framework-audit-tools.js.map +1 -0
  271. package/dist/tools/nextjs-link-tools.d.ts +41 -0
  272. package/dist/tools/nextjs-link-tools.d.ts.map +1 -0
  273. package/dist/tools/nextjs-link-tools.js +157 -0
  274. package/dist/tools/nextjs-link-tools.js.map +1 -0
  275. package/dist/tools/nextjs-metadata-tools.d.ts +74 -0
  276. package/dist/tools/nextjs-metadata-tools.d.ts.map +1 -0
  277. package/dist/tools/nextjs-metadata-tools.js +252 -0
  278. package/dist/tools/nextjs-metadata-tools.js.map +1 -0
  279. package/dist/tools/nextjs-middleware-coverage-tools.d.ts +41 -0
  280. package/dist/tools/nextjs-middleware-coverage-tools.d.ts.map +1 -0
  281. package/dist/tools/nextjs-middleware-coverage-tools.js +88 -0
  282. package/dist/tools/nextjs-middleware-coverage-tools.js.map +1 -0
  283. package/dist/tools/nextjs-route-tools.d.ts +100 -0
  284. package/dist/tools/nextjs-route-tools.d.ts.map +1 -0
  285. package/dist/tools/nextjs-route-tools.js +493 -0
  286. package/dist/tools/nextjs-route-tools.js.map +1 -0
  287. package/dist/tools/nextjs-security-readers.d.ts +22 -0
  288. package/dist/tools/nextjs-security-readers.d.ts.map +1 -0
  289. package/dist/tools/nextjs-security-readers.js +318 -0
  290. package/dist/tools/nextjs-security-readers.js.map +1 -0
  291. package/dist/tools/nextjs-security-scoring.d.ts +15 -0
  292. package/dist/tools/nextjs-security-scoring.d.ts.map +1 -0
  293. package/dist/tools/nextjs-security-scoring.js +65 -0
  294. package/dist/tools/nextjs-security-scoring.js.map +1 -0
  295. package/dist/tools/nextjs-security-tools.d.ts +75 -0
  296. package/dist/tools/nextjs-security-tools.d.ts.map +1 -0
  297. package/dist/tools/nextjs-security-tools.js +153 -0
  298. package/dist/tools/nextjs-security-tools.js.map +1 -0
  299. package/dist/tools/nextjs-tools.d.ts +15 -0
  300. package/dist/tools/nextjs-tools.d.ts.map +1 -0
  301. package/dist/tools/nextjs-tools.js +15 -0
  302. package/dist/tools/nextjs-tools.js.map +1 -0
  303. package/dist/tools/outline-tools.d.ts.map +1 -1
  304. package/dist/tools/outline-tools.js +20 -0
  305. package/dist/tools/outline-tools.js.map +1 -1
  306. package/dist/tools/pattern-tools.d.ts +8 -0
  307. package/dist/tools/pattern-tools.d.ts.map +1 -1
  308. package/dist/tools/pattern-tools.js +561 -3
  309. package/dist/tools/pattern-tools.js.map +1 -1
  310. package/dist/tools/perf-tools.d.ts +32 -0
  311. package/dist/tools/perf-tools.d.ts.map +1 -0
  312. package/dist/tools/perf-tools.js +227 -0
  313. package/dist/tools/perf-tools.js.map +1 -0
  314. package/dist/tools/php-tools.d.ts +176 -0
  315. package/dist/tools/php-tools.d.ts.map +1 -0
  316. package/dist/tools/php-tools.js +543 -0
  317. package/dist/tools/php-tools.js.map +1 -0
  318. package/dist/tools/prisma-schema-tools.d.ts +44 -0
  319. package/dist/tools/prisma-schema-tools.d.ts.map +1 -0
  320. package/dist/tools/prisma-schema-tools.js +358 -0
  321. package/dist/tools/prisma-schema-tools.js.map +1 -0
  322. package/dist/tools/project-tools.d.ts +115 -6
  323. package/dist/tools/project-tools.d.ts.map +1 -1
  324. package/dist/tools/project-tools.js +594 -217
  325. package/dist/tools/project-tools.js.map +1 -1
  326. package/dist/tools/pyproject-tools.d.ts +23 -0
  327. package/dist/tools/pyproject-tools.d.ts.map +1 -0
  328. package/dist/tools/pyproject-tools.js +133 -0
  329. package/dist/tools/pyproject-tools.js.map +1 -0
  330. package/dist/tools/pytest-tools.d.ts +20 -0
  331. package/dist/tools/pytest-tools.d.ts.map +1 -0
  332. package/dist/tools/pytest-tools.js +106 -0
  333. package/dist/tools/pytest-tools.js.map +1 -0
  334. package/dist/tools/python-callers.d.ts +28 -0
  335. package/dist/tools/python-callers.d.ts.map +1 -0
  336. package/dist/tools/python-callers.js +110 -0
  337. package/dist/tools/python-callers.js.map +1 -0
  338. package/dist/tools/python-circular-imports.d.ts +19 -0
  339. package/dist/tools/python-circular-imports.d.ts.map +1 -0
  340. package/dist/tools/python-circular-imports.js +126 -0
  341. package/dist/tools/python-circular-imports.js.map +1 -0
  342. package/dist/tools/python-deps-analyzer.d.ts +46 -0
  343. package/dist/tools/python-deps-analyzer.d.ts.map +1 -0
  344. package/dist/tools/python-deps-analyzer.js +227 -0
  345. package/dist/tools/python-deps-analyzer.js.map +1 -0
  346. package/dist/tools/query-tools.d.ts +23 -0
  347. package/dist/tools/query-tools.d.ts.map +1 -0
  348. package/dist/tools/query-tools.js +256 -0
  349. package/dist/tools/query-tools.js.map +1 -0
  350. package/dist/tools/react-tools.d.ts +218 -0
  351. package/dist/tools/react-tools.d.ts.map +1 -0
  352. package/dist/tools/react-tools.js +714 -0
  353. package/dist/tools/react-tools.js.map +1 -0
  354. package/dist/tools/report-tools.js +47 -0
  355. package/dist/tools/report-tools.js.map +1 -1
  356. package/dist/tools/review-diff-tools.d.ts +2 -6
  357. package/dist/tools/review-diff-tools.d.ts.map +1 -1
  358. package/dist/tools/review-diff-tools.js +51 -66
  359. package/dist/tools/review-diff-tools.js.map +1 -1
  360. package/dist/tools/room-tools.d.ts +36 -0
  361. package/dist/tools/room-tools.d.ts.map +1 -0
  362. package/dist/tools/room-tools.js +147 -0
  363. package/dist/tools/room-tools.js.map +1 -0
  364. package/dist/tools/route-tools.d.ts +27 -1
  365. package/dist/tools/route-tools.d.ts.map +1 -1
  366. package/dist/tools/route-tools.js +744 -18
  367. package/dist/tools/route-tools.js.map +1 -1
  368. package/dist/tools/ruff-tools.d.ts +32 -0
  369. package/dist/tools/ruff-tools.d.ts.map +1 -0
  370. package/dist/tools/ruff-tools.js +114 -0
  371. package/dist/tools/ruff-tools.js.map +1 -0
  372. package/dist/tools/search-ranker.d.ts.map +1 -1
  373. package/dist/tools/search-ranker.js +7 -0
  374. package/dist/tools/search-ranker.js.map +1 -1
  375. package/dist/tools/serialization-tools.d.ts +24 -0
  376. package/dist/tools/serialization-tools.d.ts.map +1 -0
  377. package/dist/tools/serialization-tools.js +156 -0
  378. package/dist/tools/serialization-tools.js.map +1 -0
  379. package/dist/tools/sql-tools.d.ts +234 -0
  380. package/dist/tools/sql-tools.d.ts.map +1 -0
  381. package/dist/tools/sql-tools.js +1037 -0
  382. package/dist/tools/sql-tools.js.map +1 -0
  383. package/dist/tools/status-tools.d.ts +10 -0
  384. package/dist/tools/status-tools.d.ts.map +1 -0
  385. package/dist/tools/status-tools.js +32 -0
  386. package/dist/tools/status-tools.js.map +1 -0
  387. package/dist/tools/symbol-tools.d.ts +19 -0
  388. package/dist/tools/symbol-tools.d.ts.map +1 -1
  389. package/dist/tools/symbol-tools.js +78 -4
  390. package/dist/tools/symbol-tools.js.map +1 -1
  391. package/dist/tools/test-impact-tools.d.ts +29 -0
  392. package/dist/tools/test-impact-tools.d.ts.map +1 -0
  393. package/dist/tools/test-impact-tools.js +156 -0
  394. package/dist/tools/test-impact-tools.js.map +1 -0
  395. package/dist/tools/typecheck-tools.d.ts +39 -0
  396. package/dist/tools/typecheck-tools.d.ts.map +1 -0
  397. package/dist/tools/typecheck-tools.js +191 -0
  398. package/dist/tools/typecheck-tools.js.map +1 -0
  399. package/dist/tools/wiring-tools.d.ts +19 -0
  400. package/dist/tools/wiring-tools.d.ts.map +1 -0
  401. package/dist/tools/wiring-tools.js +147 -0
  402. package/dist/tools/wiring-tools.js.map +1 -0
  403. package/dist/types.d.ts +9 -1
  404. package/dist/types.d.ts.map +1 -1
  405. package/dist/utils/framework-detect.d.ts +18 -2
  406. package/dist/utils/framework-detect.d.ts.map +1 -1
  407. package/dist/utils/framework-detect.js +150 -3
  408. package/dist/utils/framework-detect.js.map +1 -1
  409. package/dist/utils/import-graph.d.ts +36 -0
  410. package/dist/utils/import-graph.d.ts.map +1 -1
  411. package/dist/utils/import-graph.js +212 -9
  412. package/dist/utils/import-graph.js.map +1 -1
  413. package/dist/utils/language-detect.d.ts +21 -0
  414. package/dist/utils/language-detect.d.ts.map +1 -0
  415. package/dist/utils/language-detect.js +183 -0
  416. package/dist/utils/language-detect.js.map +1 -0
  417. package/dist/utils/nextjs-ast-readers.d.ts +44 -0
  418. package/dist/utils/nextjs-ast-readers.d.ts.map +1 -0
  419. package/dist/utils/nextjs-ast-readers.js +341 -0
  420. package/dist/utils/nextjs-ast-readers.js.map +1 -0
  421. package/dist/utils/nextjs-audit-cache.d.ts +51 -0
  422. package/dist/utils/nextjs-audit-cache.d.ts.map +1 -0
  423. package/dist/utils/nextjs-audit-cache.js +116 -0
  424. package/dist/utils/nextjs-audit-cache.js.map +1 -0
  425. package/dist/utils/nextjs-metadata-readers.d.ts +65 -0
  426. package/dist/utils/nextjs-metadata-readers.d.ts.map +1 -0
  427. package/dist/utils/nextjs-metadata-readers.js +447 -0
  428. package/dist/utils/nextjs-metadata-readers.js.map +1 -0
  429. package/dist/utils/nextjs.d.ts +42 -0
  430. package/dist/utils/nextjs.d.ts.map +1 -0
  431. package/dist/utils/nextjs.js +284 -0
  432. package/dist/utils/nextjs.js.map +1 -0
  433. package/dist/utils/python-import-resolver.d.ts +42 -0
  434. package/dist/utils/python-import-resolver.d.ts.map +1 -0
  435. package/dist/utils/python-import-resolver.js +101 -0
  436. package/dist/utils/python-import-resolver.js.map +1 -0
  437. package/dist/utils/python-imports.d.ts +28 -0
  438. package/dist/utils/python-imports.d.ts.map +1 -0
  439. package/dist/utils/python-imports.js +117 -0
  440. package/dist/utils/python-imports.js.map +1 -0
  441. package/dist/utils/react-alias.d.ts +15 -0
  442. package/dist/utils/react-alias.d.ts.map +1 -0
  443. package/dist/utils/react-alias.js +31 -0
  444. package/dist/utils/react-alias.js.map +1 -0
  445. package/dist/utils/test-file.d.ts.map +1 -1
  446. package/dist/utils/test-file.js +7 -0
  447. package/dist/utils/test-file.js.map +1 -1
  448. package/dist/utils/walk.d.ts +22 -0
  449. package/dist/utils/walk.d.ts.map +1 -1
  450. package/dist/utils/walk.js +70 -2
  451. package/dist/utils/walk.js.map +1 -1
  452. package/package.json +3 -2
  453. package/rules/codesift.md +34 -5
  454. package/rules/codesift.mdc +34 -5
  455. package/rules/codex.md +34 -5
  456. package/rules/gemini.md +34 -5
  457. package/src/parser/languages/tree-sitter-javascript.wasm +0 -0
  458. package/src/parser/languages/tree-sitter-kotlin.wasm +0 -0
  459. package/src/parser/languages/tree-sitter-php.wasm +0 -0
  460. package/src/parser/languages/tree-sitter-php_only.wasm +0 -0
  461. package/src/parser/languages/tree-sitter-python.wasm +0 -0
@@ -0,0 +1,318 @@
1
+ /**
2
+ * AST readers for Next.js Server Actions security audit (T2).
3
+ *
4
+ * Each reader is a focused, pure function that extracts a specific signal
5
+ * from a parsed tree-sitter Tree. The orchestrator in `nextjs-security-tools.ts`
6
+ * composes them into a per-action audit.
7
+ */
8
+ import { extractZodSchema } from "../utils/nextjs.js";
9
+ /** Determine if a tree-sitter program has a file-scope `"use server"` directive. */
10
+ function hasFileScopeUseServer(tree) {
11
+ const root = tree.rootNode;
12
+ const first = root.namedChildren[0];
13
+ if (!first)
14
+ return false;
15
+ if (first.type !== "expression_statement")
16
+ return false;
17
+ const inner = first.namedChildren[0];
18
+ if (!inner)
19
+ return false;
20
+ if (inner.type !== "string")
21
+ return false;
22
+ const text = inner.text.length >= 2 ? inner.text.slice(1, -1) : inner.text;
23
+ return text === "use server";
24
+ }
25
+ /** Returns true if the function body's first statement is `"use server"` directive. */
26
+ function hasInlineUseServer(body) {
27
+ if (body.type !== "statement_block")
28
+ return false;
29
+ const first = body.namedChildren[0];
30
+ if (!first)
31
+ return false;
32
+ if (first.type !== "expression_statement")
33
+ return false;
34
+ const inner = first.namedChildren[0];
35
+ if (!inner || inner.type !== "string")
36
+ return false;
37
+ const text = inner.text.length >= 2 ? inner.text.slice(1, -1) : inner.text;
38
+ return text === "use server";
39
+ }
40
+ export function extractServerActionFunctions(tree, _source, file) {
41
+ const out = [];
42
+ const root = tree.rootNode;
43
+ const fileScope = hasFileScopeUseServer(tree);
44
+ if (fileScope) {
45
+ // All exported functions in this file are server actions.
46
+ for (const exp of root.descendantsOfType("export_statement")) {
47
+ // function_declaration form
48
+ for (const fn of exp.descendantsOfType("function_declaration")) {
49
+ // Skip nested function declarations
50
+ if (fn.parent?.id !== exp.id && fn.parent?.parent?.id !== exp.id)
51
+ continue;
52
+ const name = fn.childForFieldName("name")?.text ?? "<anon>";
53
+ const isAsync = /\basync\b/.test(exp.text.split("function")[0] ?? "");
54
+ const body = fn.childForFieldName("body");
55
+ out.push({
56
+ name,
57
+ file,
58
+ line: fn.startPosition.row + 1,
59
+ isAsync,
60
+ bodyNode: body ?? null,
61
+ fnNode: fn,
62
+ });
63
+ }
64
+ // const x = async () => { ... } OR const x = wrap(async () => { ... })
65
+ for (const decl of exp.descendantsOfType("variable_declarator")) {
66
+ const name = decl.childForFieldName("name")?.text;
67
+ const value = decl.childForFieldName("value");
68
+ if (!name || !value)
69
+ continue;
70
+ // Direct arrow / function_expression
71
+ if (value.type === "arrow_function" || value.type === "function_expression") {
72
+ const isAsync = /^\s*async\b/.test(value.text);
73
+ const body = value.childForFieldName("body");
74
+ out.push({
75
+ name,
76
+ file,
77
+ line: decl.startPosition.row + 1,
78
+ isAsync,
79
+ bodyNode: body ?? null,
80
+ fnNode: value,
81
+ });
82
+ }
83
+ else if (value.type === "call_expression") {
84
+ // HOC wrapper: find the inner arrow/function expression argument.
85
+ const args = value.childForFieldName("arguments") ?? value.namedChild(1);
86
+ if (!args)
87
+ continue;
88
+ for (const arg of args.namedChildren) {
89
+ if (arg.type === "arrow_function" || arg.type === "function_expression") {
90
+ const isAsync = /^\s*async\b/.test(arg.text);
91
+ const body = arg.childForFieldName("body");
92
+ out.push({
93
+ name,
94
+ file,
95
+ line: decl.startPosition.row + 1,
96
+ isAsync,
97
+ bodyNode: body && body.type === "statement_block" ? body : null,
98
+ fnNode: arg,
99
+ });
100
+ break;
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ return out;
107
+ }
108
+ // No file-scope directive: walk all functions and find inline `"use server"`.
109
+ const allFns = [
110
+ ...root.descendantsOfType("function_declaration"),
111
+ ...root.descendantsOfType("arrow_function"),
112
+ ...root.descendantsOfType("function_expression"),
113
+ ];
114
+ for (const fn of allFns) {
115
+ const body = fn.childForFieldName("body");
116
+ if (!body || body.type !== "statement_block")
117
+ continue;
118
+ if (!hasInlineUseServer(body))
119
+ continue;
120
+ let name = "<anon>";
121
+ if (fn.type === "function_declaration") {
122
+ name = fn.childForFieldName("name")?.text ?? "<anon>";
123
+ }
124
+ else {
125
+ // Try to find enclosing variable_declarator for name
126
+ let p = fn.parent;
127
+ while (p) {
128
+ if (p.type === "variable_declarator") {
129
+ name = p.childForFieldName("name")?.text ?? "<anon>";
130
+ break;
131
+ }
132
+ p = p.parent;
133
+ }
134
+ }
135
+ const isAsync = /^\s*async\b/.test(fn.text);
136
+ out.push({
137
+ name,
138
+ file,
139
+ line: fn.startPosition.row + 1,
140
+ isAsync,
141
+ bodyNode: body,
142
+ fnNode: fn,
143
+ });
144
+ }
145
+ return out;
146
+ }
147
+ // ---------------------------------------------------------------------------
148
+ // Auth guard detection (Task 15)
149
+ // ---------------------------------------------------------------------------
150
+ /** Default identifier set for auth detection. */
151
+ const AUTH_CALL_NAMES = new Set([
152
+ "auth",
153
+ "getSession",
154
+ "getServerSession",
155
+ "currentUser",
156
+ "validateRequest",
157
+ "getAuth",
158
+ "getUser",
159
+ ]);
160
+ const AUTH_HOC_NAMES = new Set(["withAuth", "requireAuth", "withSession"]);
161
+ export function detectAuthGuard(fn) {
162
+ const body = fn.bodyNode;
163
+ // 0) HOC wrapper detection — if the function node is the argument of a known HOC wrapper.
164
+ let p = fn.fnNode.parent;
165
+ while (p) {
166
+ if (p.type === "call_expression") {
167
+ const callee = p.childForFieldName("function") ?? p.namedChild(0);
168
+ if (callee?.type === "identifier" && AUTH_HOC_NAMES.has(callee.text)) {
169
+ return { confidence: "medium", pattern: "hoc" };
170
+ }
171
+ }
172
+ p = p.parent;
173
+ }
174
+ if (!body) {
175
+ return { confidence: "none", pattern: "none" };
176
+ }
177
+ // 1) Look for direct auth call expressions inside body.
178
+ let firstAuthCall = null;
179
+ for (const call of body.descendantsOfType("call_expression")) {
180
+ const callee = call.childForFieldName("function") ?? call.namedChild(0);
181
+ if (callee?.type === "identifier" && AUTH_CALL_NAMES.has(callee.text)) {
182
+ firstAuthCall = { name: callee.text, line: call.startPosition.row + 1, node: call };
183
+ break;
184
+ }
185
+ // Member access like auth.protect()
186
+ if (callee?.type === "member_expression") {
187
+ const obj = callee.childForFieldName("object") ?? callee.namedChild(0);
188
+ const prop = callee.childForFieldName("property") ?? callee.namedChild(1);
189
+ if (obj?.type === "identifier" && AUTH_CALL_NAMES.has(obj.text)) {
190
+ firstAuthCall = {
191
+ name: `${obj.text}.${prop?.text ?? ""}`,
192
+ line: call.startPosition.row + 1,
193
+ node: call,
194
+ };
195
+ break;
196
+ }
197
+ }
198
+ }
199
+ if (firstAuthCall) {
200
+ // Walk forward in body looking for if(!result)/throw/return within the next 5 statements.
201
+ const callLine = firstAuthCall.line;
202
+ const callIndex = firstAuthCall.node.endIndex;
203
+ let resultChecked = false;
204
+ for (const ifStmt of body.descendantsOfType("if_statement")) {
205
+ if (ifStmt.startIndex >= callIndex && ifStmt.startPosition.row <= callLine + 5) {
206
+ // Heuristic: any if-throw/return after the auth call counts as "checked"
207
+ const inner = ifStmt.text;
208
+ if (/throw|return\s|redirect/.test(inner)) {
209
+ resultChecked = true;
210
+ break;
211
+ }
212
+ }
213
+ }
214
+ // Also handle assignment + checked condition: if (!session) { ... }
215
+ if (!resultChecked) {
216
+ // Look for any assignment storing the call result, then a usage in if-condition
217
+ for (const decl of body.descendantsOfType("variable_declarator")) {
218
+ const value = decl.childForFieldName("value");
219
+ if (!value)
220
+ continue;
221
+ // Skip assignments before the auth call
222
+ if (decl.startIndex < firstAuthCall.node.startIndex)
223
+ continue;
224
+ const varName = decl.childForFieldName("name")?.text;
225
+ if (!varName)
226
+ continue;
227
+ // Check for usage in subsequent if condition
228
+ for (const ifStmt of body.descendantsOfType("if_statement")) {
229
+ if (ifStmt.startIndex < decl.endIndex)
230
+ continue;
231
+ const cond = ifStmt.childForFieldName("condition") ?? ifStmt.namedChild(0);
232
+ if (cond && new RegExp(`\\b${varName}\\b`).test(cond.text)) {
233
+ const inner = ifStmt.text;
234
+ if (/throw|return\s|redirect/.test(inner)) {
235
+ resultChecked = true;
236
+ break;
237
+ }
238
+ }
239
+ }
240
+ if (resultChecked)
241
+ break;
242
+ }
243
+ }
244
+ return {
245
+ confidence: resultChecked ? "high" : "medium",
246
+ pattern: "direct",
247
+ callsite: { name: firstAuthCall.name, line: firstAuthCall.line },
248
+ };
249
+ }
250
+ // 2) Comment-only mention as fallback (low).
251
+ const bodyText = body.text;
252
+ if (/(?:\/\/|\/\*)\s*[^*]*\b(auth|session|user|permission)/i.test(bodyText)) {
253
+ return { confidence: "low", pattern: "none" };
254
+ }
255
+ return { confidence: "none", pattern: "none" };
256
+ }
257
+ // ---------------------------------------------------------------------------
258
+ // Input validation detection (Task 16)
259
+ // ---------------------------------------------------------------------------
260
+ export function detectInputValidation(fn, tree, source) {
261
+ const body = fn.bodyNode;
262
+ if (!body)
263
+ return { lib: "none", confidence: "high" };
264
+ // 1) Look for `.parse()` or `.safeParse()` call expressions on a Zod schema.
265
+ for (const call of body.descendantsOfType("call_expression")) {
266
+ const callee = call.childForFieldName("function") ?? call.namedChild(0);
267
+ if (callee?.type !== "member_expression")
268
+ continue;
269
+ const prop = callee.childForFieldName("property") ?? callee.namedChild(1);
270
+ if (prop?.type !== "property_identifier")
271
+ continue;
272
+ if (prop.text !== "parse" && prop.text !== "safeParse")
273
+ continue;
274
+ // Disambiguate Zod from other libs by inspecting the file for a Zod schema.
275
+ const zodShape = extractZodSchema(tree, source);
276
+ if (zodShape) {
277
+ return { lib: "zod", confidence: "high" };
278
+ }
279
+ // Fallback: at least the .parse() call indicates structured validation.
280
+ return { lib: "manual", confidence: "medium" };
281
+ }
282
+ // 2) Manual validation: count if-throw statements in the first 5 statements.
283
+ let manualCount = 0;
284
+ const stmts = body.namedChildren.slice(0, 5);
285
+ for (const s of stmts) {
286
+ if (s.type !== "if_statement")
287
+ continue;
288
+ if (/throw\b/.test(s.text))
289
+ manualCount++;
290
+ }
291
+ if (manualCount >= 1) {
292
+ return { lib: "manual", confidence: "medium" };
293
+ }
294
+ return { lib: "none", confidence: "high" };
295
+ }
296
+ // ---------------------------------------------------------------------------
297
+ // Rate limiting detection (Task 16)
298
+ // ---------------------------------------------------------------------------
299
+ const RATE_LIMIT_PATTERNS = [
300
+ { regex: /\bratelimit\.limit\s*\(/, lib: "upstash" },
301
+ { regex: /\@upstash\/ratelimit/, lib: "upstash" },
302
+ { regex: /\bcreateRateLimiter\s*\(/, lib: "manual" },
303
+ { regex: /\brateLimit\s*\(/, lib: "manual" },
304
+ { regex: /\bnext\/rate-limit/, lib: "vercel" },
305
+ ];
306
+ export function detectRateLimiting(fn, _tree, _source) {
307
+ const body = fn.bodyNode;
308
+ if (!body)
309
+ return { lib: "none", confidence: "high" };
310
+ const text = body.text;
311
+ for (const { regex, lib } of RATE_LIMIT_PATTERNS) {
312
+ if (regex.test(text)) {
313
+ return { lib, confidence: "high" };
314
+ }
315
+ }
316
+ return { lib: "none", confidence: "high" };
317
+ }
318
+ //# sourceMappingURL=nextjs-security-readers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-security-readers.js","sourceRoot":"","sources":["../../src/tools/nextjs-security-readers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Pure scoring helpers for Server Actions security audit (T2).
3
+ *
4
+ * Takes per-check info objects (auth, validation, rate, error) and produces
5
+ * a numeric score 0-100, a grade bucket, and a list of top missing checks.
6
+ */
7
+ import type { AuthGuardInfo, InputValidationInfo, RateLimitingInfo, ErrorHandlingInfo, SecurityScore } from "./nextjs-security-tools.js";
8
+ export interface ServerActionAuditInput {
9
+ auth: AuthGuardInfo;
10
+ input_validation: InputValidationInfo;
11
+ rate_limiting: RateLimitingInfo;
12
+ error_handling: ErrorHandlingInfo;
13
+ }
14
+ export declare function scoreServerAction(audit: ServerActionAuditInput): SecurityScore;
15
+ //# sourceMappingURL=nextjs-security-scoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-security-scoring.d.ts","sourceRoot":"","sources":["../../src/tools/nextjs-security-scoring.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACd,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,aAAa,CAAC;IACpB,gBAAgB,EAAE,mBAAmB,CAAC;IACtC,aAAa,EAAE,gBAAgB,CAAC;IAChC,cAAc,EAAE,iBAAiB,CAAC;CACnC;AAuBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,aAAa,CAsC9E"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Pure scoring helpers for Server Actions security audit (T2).
3
+ *
4
+ * Takes per-check info objects (auth, validation, rate, error) and produces
5
+ * a numeric score 0-100, a grade bucket, and a list of top missing checks.
6
+ */
7
+ const WEIGHTS = {
8
+ auth: 40,
9
+ input_validation: 30,
10
+ rate_limiting: 20,
11
+ error_handling: 10,
12
+ };
13
+ const CONFIDENCE_MULTIPLIER = {
14
+ high: 1.0,
15
+ medium: 0.5,
16
+ low: 0.2,
17
+ none: 0,
18
+ };
19
+ function gradeFor(score) {
20
+ if (score >= 90)
21
+ return "excellent";
22
+ if (score >= 70)
23
+ return "good";
24
+ if (score >= 40)
25
+ return "needs_work";
26
+ return "poor";
27
+ }
28
+ export function scoreServerAction(audit) {
29
+ // Auth: score from confidence multiplier
30
+ const authMult = CONFIDENCE_MULTIPLIER[audit.auth.confidence] ?? 0;
31
+ const authPoints = Math.round(WEIGHTS.auth * authMult);
32
+ // Input validation: zero unless lib != none
33
+ let validationMult = 0;
34
+ if (audit.input_validation.lib !== "none") {
35
+ validationMult = CONFIDENCE_MULTIPLIER[audit.input_validation.confidence] ?? 0;
36
+ }
37
+ const validationPoints = Math.round(WEIGHTS.input_validation * validationMult);
38
+ // Rate limiting: zero unless lib != none
39
+ let rateMult = 0;
40
+ if (audit.rate_limiting.lib !== "none") {
41
+ rateMult = CONFIDENCE_MULTIPLIER[audit.rate_limiting.confidence] ?? 0;
42
+ }
43
+ const ratePoints = Math.round(WEIGHTS.rate_limiting * rateMult);
44
+ // Error handling: try/catch present?
45
+ const errorPoints = audit.error_handling.has_try_catch
46
+ ? Math.round(WEIGHTS.error_handling * (CONFIDENCE_MULTIPLIER[audit.error_handling.confidence] ?? 0))
47
+ : 0;
48
+ const score = authPoints + validationPoints + ratePoints + errorPoints;
49
+ // Top missing list (highest weight first)
50
+ const top_missing = [];
51
+ if (authPoints < WEIGHTS.auth)
52
+ top_missing.push("auth");
53
+ if (validationPoints < WEIGHTS.input_validation)
54
+ top_missing.push("input_validation");
55
+ if (ratePoints < WEIGHTS.rate_limiting)
56
+ top_missing.push("rate_limiting");
57
+ if (errorPoints < WEIGHTS.error_handling)
58
+ top_missing.push("error_handling");
59
+ return {
60
+ score,
61
+ grade: gradeFor(score),
62
+ top_missing,
63
+ };
64
+ }
65
+ //# sourceMappingURL=nextjs-security-scoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-security-scoring.js","sourceRoot":"","sources":["../../src/tools/nextjs-security-scoring.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,MAAM,OAAO,GAAG;IACd,IAAI,EAAE,EAAE;IACR,gBAAgB,EAAE,EAAE;IACpB,aAAa,EAAE,EAAE;IACjB,cAAc,EAAE,EAAE;CACV,CAAC;AAEX,MAAM,qBAAqB,GAA2B;IACpD,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,SAAS,QAAQ,CAAC,KAAa;IAC7B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,WAAW,CAAC;IACpC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,YAAY,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAA6B;IAC7D,yCAAyC;IACzC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;IAEvD,4CAA4C;IAC5C,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,KAAK,CAAC,gBAAgB,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1C,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,GAAG,cAAc,CAAC,CAAC;IAE/E,yCAAyC;IACzC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;QACvC,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,GAAG,QAAQ,CAAC,CAAC;IAEhE,qCAAqC;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,aAAa;QACpD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACpG,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,KAAK,GAAG,UAAU,GAAG,gBAAgB,GAAG,UAAU,GAAG,WAAW,CAAC;IAEvE,0CAA0C;IAC1C,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,UAAU,GAAG,OAAO,CAAC,IAAI;QAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,gBAAgB,GAAG,OAAO,CAAC,gBAAgB;QAAE,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACtF,IAAI,UAAU,GAAG,OAAO,CAAC,aAAa;QAAE,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1E,IAAI,WAAW,GAAG,OAAO,CAAC,cAAc;QAAE,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAE7E,OAAO;QACL,KAAK;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;QACtB,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Next.js Server Actions security audit (T2).
3
+ *
4
+ * Walks files containing `"use server"` (file-scope or inline) and audits each
5
+ * exported server action against four checks: authorization guards, input
6
+ * validation, rate limiting, and structured error handling. Per-action scoring
7
+ * follows a weighted formula (auth 40, validation 30, rate 20, error 10).
8
+ *
9
+ * This file is the public-facing entry point and types module. The reader and
10
+ * scoring helpers live in their own files (`nextjs-security-readers.ts` and
11
+ * `nextjs-security-scoring.ts`) per the 3-file split (D10).
12
+ */
13
+ export type AuthConfidence = "high" | "medium" | "low" | "none";
14
+ export type ValidationLib = "zod" | "manual" | "none";
15
+ export type RateLimitLib = "upstash" | "vercel" | "express" | "manual" | "none";
16
+ export interface AuthGuardInfo {
17
+ confidence: AuthConfidence;
18
+ pattern: "direct" | "hoc" | "none";
19
+ callsite?: {
20
+ name: string;
21
+ line: number;
22
+ };
23
+ }
24
+ export interface InputValidationInfo {
25
+ lib: ValidationLib;
26
+ confidence: "high" | "medium" | "low";
27
+ }
28
+ export interface RateLimitingInfo {
29
+ lib: RateLimitLib;
30
+ confidence: "high" | "medium" | "low";
31
+ }
32
+ export interface ErrorHandlingInfo {
33
+ has_try_catch: boolean;
34
+ confidence: "high" | "medium" | "low";
35
+ }
36
+ export interface ServerActionAudit {
37
+ name: string;
38
+ file: string;
39
+ line: number;
40
+ is_async: boolean;
41
+ auth: AuthGuardInfo;
42
+ input_validation: InputValidationInfo;
43
+ rate_limiting: RateLimitingInfo;
44
+ error_handling: ErrorHandlingInfo;
45
+ score: number;
46
+ grade: "poor" | "needs_work" | "good" | "excellent";
47
+ top_missing: string[];
48
+ }
49
+ export interface SecurityScore {
50
+ score: number;
51
+ grade: "poor" | "needs_work" | "good" | "excellent";
52
+ top_missing: string[];
53
+ }
54
+ export interface ServerActionsAuditCounts {
55
+ excellent: number;
56
+ good: number;
57
+ needs_work: number;
58
+ poor: number;
59
+ }
60
+ export interface ServerActionsAuditResult {
61
+ total: number;
62
+ actions: ServerActionAudit[];
63
+ counts: ServerActionsAuditCounts;
64
+ violations: string[];
65
+ parse_failures: string[];
66
+ scan_errors: string[];
67
+ workspaces_scanned: string[];
68
+ limitations: string[];
69
+ }
70
+ export interface NextjsAuditServerActionsOptions {
71
+ workspace?: string | undefined;
72
+ max_files?: number | undefined;
73
+ }
74
+ export declare function nextjsAuditServerActions(repo: string, options?: NextjsAuditServerActionsOptions): Promise<ServerActionsAuditResult>;
75
+ //# sourceMappingURL=nextjs-security-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-security-tools.d.ts","sourceRoot":"","sources":["../../src/tools/nextjs-security-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoBH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAEhE,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEtD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEhF,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACnC,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,aAAa,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,YAAY,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;IACpB,gBAAgB,EAAE,mBAAmB,CAAC;IACtC,aAAa,EAAE,gBAAgB,CAAC;IAChC,cAAc,EAAE,iBAAiB,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,WAAW,CAAC;IACpD,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,WAAW,CAAC;IACpD,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,MAAM,EAAE,wBAAwB,CAAC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,+BAA+B;IAC9C,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAiBD,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,wBAAwB,CAAC,CA2HnC"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Next.js Server Actions security audit (T2).
3
+ *
4
+ * Walks files containing `"use server"` (file-scope or inline) and audits each
5
+ * exported server action against four checks: authorization guards, input
6
+ * validation, rate limiting, and structured error handling. Per-action scoring
7
+ * follows a weighted formula (auth 40, validation 30, rate 20, error 10).
8
+ *
9
+ * This file is the public-facing entry point and types module. The reader and
10
+ * scoring helpers live in their own files (`nextjs-security-readers.ts` and
11
+ * `nextjs-security-scoring.ts`) per the 3-file split (D10).
12
+ */
13
+ import { readFile } from "node:fs/promises";
14
+ import { join, relative } from "node:path";
15
+ import { discoverWorkspaces } from "../utils/nextjs.js";
16
+ import { cachedParseFile as parseFile } from "../utils/nextjs-audit-cache.js";
17
+ import { cachedWalkDirectory as walkDirectory } from "../utils/nextjs-audit-cache.js";
18
+ import { getCodeIndex } from "./index-tools.js";
19
+ import { extractServerActionFunctions, detectAuthGuard, detectInputValidation, detectRateLimiting, } from "./nextjs-security-readers.js";
20
+ import { scoreServerAction } from "./nextjs-security-scoring.js";
21
+ // ---------------------------------------------------------------------------
22
+ // Orchestrator (Task 18)
23
+ // ---------------------------------------------------------------------------
24
+ const ACTION_EXTS = new Set([".ts", ".tsx", ".js", ".jsx"]);
25
+ const PARSE_CONCURRENCY = 10;
26
+ const MAX_FILE_SIZE_BYTES = 2_097_152;
27
+ const DEFAULT_MAX_FILES = 2000;
28
+ /** Quick sniff: does the file mention `"use server"` directive at all? */
29
+ function quickHasUseServer(source) {
30
+ // Cheap text check before invoking the parser.
31
+ return source.includes("use server");
32
+ }
33
+ export async function nextjsAuditServerActions(repo, options) {
34
+ if (process.env.CODESIFT_DISABLE_TOOLS?.includes("nextjs_audit_server_actions")) {
35
+ throw new Error("nextjs_audit_server_actions is disabled via CODESIFT_DISABLE_TOOLS");
36
+ }
37
+ const index = await getCodeIndex(repo);
38
+ if (!index) {
39
+ throw new Error(`Repository not found: ${repo}. Run index_folder first.`);
40
+ }
41
+ const projectRoot = index.root;
42
+ let workspaces;
43
+ if (options?.workspace) {
44
+ workspaces = [join(projectRoot, options.workspace)];
45
+ }
46
+ else {
47
+ const discovered = await discoverWorkspaces(projectRoot);
48
+ workspaces = discovered.length > 0 ? discovered.map((w) => w.root) : [projectRoot];
49
+ }
50
+ const maxFiles = options?.max_files ?? DEFAULT_MAX_FILES;
51
+ const actions = [];
52
+ const parse_failures = [];
53
+ const scan_errors = [];
54
+ const workspaces_scanned = [];
55
+ const violations = new Set();
56
+ for (const workspace of workspaces) {
57
+ workspaces_scanned.push(workspace);
58
+ const candidates = [];
59
+ for (const subdir of ["app", "src/app", "lib", "src/lib", "actions", "src/actions"]) {
60
+ const fullDir = join(workspace, subdir);
61
+ try {
62
+ const walked = await walkDirectory(fullDir, {
63
+ followSymlinks: true,
64
+ fileFilter: (ext) => ACTION_EXTS.has(ext),
65
+ maxFileSize: MAX_FILE_SIZE_BYTES,
66
+ });
67
+ candidates.push(...walked);
68
+ }
69
+ catch (err) {
70
+ scan_errors.push(`${fullDir}: ${err instanceof Error ? err.message : String(err)}`);
71
+ }
72
+ }
73
+ const remaining = maxFiles - actions.length;
74
+ const toProcess = candidates.slice(0, Math.max(0, remaining));
75
+ for (let i = 0; i < toProcess.length; i += PARSE_CONCURRENCY) {
76
+ const chunk = toProcess.slice(i, i + PARSE_CONCURRENCY);
77
+ const results = await Promise.all(chunk.map(async (filePath) => {
78
+ const rel = relative(projectRoot, filePath);
79
+ try {
80
+ const source = await readFile(filePath, "utf8");
81
+ if (!quickHasUseServer(source))
82
+ return null;
83
+ const tree = await parseFile(filePath, source);
84
+ if (!tree) {
85
+ parse_failures.push(rel);
86
+ return null;
87
+ }
88
+ const fns = extractServerActionFunctions(tree, source, rel);
89
+ if (fns.length === 0)
90
+ return null;
91
+ return fns.map((fn) => {
92
+ const auth = detectAuthGuard(fn);
93
+ const input_validation = detectInputValidation(fn, tree, source);
94
+ const rate_limiting = detectRateLimiting(fn, tree, source);
95
+ const error_handling = {
96
+ has_try_catch: fn.bodyNode ? /\btry\s*\{/.test(fn.bodyNode.text) : false,
97
+ confidence: "high",
98
+ };
99
+ const score = scoreServerAction({ auth, input_validation, rate_limiting, error_handling });
100
+ const audit = {
101
+ name: fn.name,
102
+ file: fn.file,
103
+ line: fn.line,
104
+ is_async: fn.isAsync,
105
+ auth,
106
+ input_validation,
107
+ rate_limiting,
108
+ error_handling,
109
+ score: score.score,
110
+ grade: score.grade,
111
+ top_missing: score.top_missing,
112
+ };
113
+ for (const m of score.top_missing)
114
+ violations.add(m);
115
+ return audit;
116
+ });
117
+ }
118
+ catch (err) {
119
+ parse_failures.push(`${rel}: ${err instanceof Error ? err.message : String(err)}`);
120
+ return null;
121
+ }
122
+ }));
123
+ for (const r of results) {
124
+ if (!r)
125
+ continue;
126
+ actions.push(...r);
127
+ }
128
+ }
129
+ }
130
+ const counts = {
131
+ excellent: 0,
132
+ good: 0,
133
+ needs_work: 0,
134
+ poor: 0,
135
+ };
136
+ for (const a of actions) {
137
+ counts[a.grade]++;
138
+ }
139
+ return {
140
+ total: actions.length,
141
+ actions,
142
+ counts,
143
+ violations: [...violations],
144
+ parse_failures,
145
+ scan_errors,
146
+ workspaces_scanned,
147
+ limitations: [
148
+ "auth detection limited to default identifier set (auth, getSession, currentUser, etc.)",
149
+ "input validation detection currently Zod-only (Yup/Joi/TypeBox not detected)",
150
+ ],
151
+ };
152
+ }
153
+ //# sourceMappingURL=nextjs-security-tools.js.map