codeslick-cli 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 (455) hide show
  1. package/README.md +458 -0
  2. package/__tests__/cli-reporter.test.ts +86 -0
  3. package/__tests__/config-loader.test.ts +247 -0
  4. package/__tests__/local-scanner.test.ts +245 -0
  5. package/bin/codeslick.cjs +153 -0
  6. package/dist/packages/cli/src/commands/auth.d.ts +36 -0
  7. package/dist/packages/cli/src/commands/auth.d.ts.map +1 -0
  8. package/dist/packages/cli/src/commands/auth.js +226 -0
  9. package/dist/packages/cli/src/commands/auth.js.map +1 -0
  10. package/dist/packages/cli/src/commands/config.d.ts +37 -0
  11. package/dist/packages/cli/src/commands/config.d.ts.map +1 -0
  12. package/dist/packages/cli/src/commands/config.js +196 -0
  13. package/dist/packages/cli/src/commands/config.js.map +1 -0
  14. package/dist/packages/cli/src/commands/init.d.ts +32 -0
  15. package/dist/packages/cli/src/commands/init.d.ts.map +1 -0
  16. package/dist/packages/cli/src/commands/init.js +171 -0
  17. package/dist/packages/cli/src/commands/init.js.map +1 -0
  18. package/dist/packages/cli/src/commands/scan.d.ts +40 -0
  19. package/dist/packages/cli/src/commands/scan.d.ts.map +1 -0
  20. package/dist/packages/cli/src/commands/scan.js +204 -0
  21. package/dist/packages/cli/src/commands/scan.js.map +1 -0
  22. package/dist/packages/cli/src/config/config-loader.d.ts +67 -0
  23. package/dist/packages/cli/src/config/config-loader.d.ts.map +1 -0
  24. package/dist/packages/cli/src/config/config-loader.js +146 -0
  25. package/dist/packages/cli/src/config/config-loader.js.map +1 -0
  26. package/dist/packages/cli/src/reporters/cli-reporter.d.ts +69 -0
  27. package/dist/packages/cli/src/reporters/cli-reporter.d.ts.map +1 -0
  28. package/dist/packages/cli/src/reporters/cli-reporter.js +244 -0
  29. package/dist/packages/cli/src/reporters/cli-reporter.js.map +1 -0
  30. package/dist/packages/cli/src/scanner/local-scanner.d.ts +92 -0
  31. package/dist/packages/cli/src/scanner/local-scanner.d.ts.map +1 -0
  32. package/dist/packages/cli/src/scanner/local-scanner.js +221 -0
  33. package/dist/packages/cli/src/scanner/local-scanner.js.map +1 -0
  34. package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.d.ts +88 -0
  35. package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.d.ts.map +1 -0
  36. package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.js +371 -0
  37. package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.js.map +1 -0
  38. package/dist/src/lib/analyzers/helpers/jsx-helpers.d.ts +63 -0
  39. package/dist/src/lib/analyzers/helpers/jsx-helpers.d.ts.map +1 -0
  40. package/dist/src/lib/analyzers/helpers/jsx-helpers.js +95 -0
  41. package/dist/src/lib/analyzers/helpers/jsx-helpers.js.map +1 -0
  42. package/dist/src/lib/analyzers/helpers/variable-tracker.d.ts +59 -0
  43. package/dist/src/lib/analyzers/helpers/variable-tracker.d.ts.map +1 -0
  44. package/dist/src/lib/analyzers/helpers/variable-tracker.js +231 -0
  45. package/dist/src/lib/analyzers/helpers/variable-tracker.js.map +1 -0
  46. package/dist/src/lib/analyzers/java/security-checks/access-control.d.ts +20 -0
  47. package/dist/src/lib/analyzers/java/security-checks/access-control.d.ts.map +1 -0
  48. package/dist/src/lib/analyzers/java/security-checks/access-control.js +129 -0
  49. package/dist/src/lib/analyzers/java/security-checks/access-control.js.map +1 -0
  50. package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.d.ts +25 -0
  51. package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.d.ts.map +1 -0
  52. package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.js +221 -0
  53. package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.js.map +1 -0
  54. package/dist/src/lib/analyzers/java/security-checks/code-quality.d.ts +18 -0
  55. package/dist/src/lib/analyzers/java/security-checks/code-quality.d.ts.map +1 -0
  56. package/dist/src/lib/analyzers/java/security-checks/code-quality.js +84 -0
  57. package/dist/src/lib/analyzers/java/security-checks/code-quality.js.map +1 -0
  58. package/dist/src/lib/analyzers/java/security-checks/crypto-validation.d.ts +18 -0
  59. package/dist/src/lib/analyzers/java/security-checks/crypto-validation.d.ts.map +1 -0
  60. package/dist/src/lib/analyzers/java/security-checks/crypto-validation.js +161 -0
  61. package/dist/src/lib/analyzers/java/security-checks/crypto-validation.js.map +1 -0
  62. package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.d.ts +20 -0
  63. package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.d.ts.map +1 -0
  64. package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.js +163 -0
  65. package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.js.map +1 -0
  66. package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.d.ts +24 -0
  67. package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.d.ts.map +1 -0
  68. package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.js +178 -0
  69. package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.js.map +1 -0
  70. package/dist/src/lib/analyzers/java/security-checks/exception-handling.d.ts +25 -0
  71. package/dist/src/lib/analyzers/java/security-checks/exception-handling.d.ts.map +1 -0
  72. package/dist/src/lib/analyzers/java/security-checks/exception-handling.js +179 -0
  73. package/dist/src/lib/analyzers/java/security-checks/exception-handling.js.map +1 -0
  74. package/dist/src/lib/analyzers/java/security-checks/file-operations.d.ts +17 -0
  75. package/dist/src/lib/analyzers/java/security-checks/file-operations.d.ts.map +1 -0
  76. package/dist/src/lib/analyzers/java/security-checks/file-operations.js +67 -0
  77. package/dist/src/lib/analyzers/java/security-checks/file-operations.js.map +1 -0
  78. package/dist/src/lib/analyzers/java/security-checks/framework-security.d.ts +25 -0
  79. package/dist/src/lib/analyzers/java/security-checks/framework-security.d.ts.map +1 -0
  80. package/dist/src/lib/analyzers/java/security-checks/framework-security.js +396 -0
  81. package/dist/src/lib/analyzers/java/security-checks/framework-security.js.map +1 -0
  82. package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.d.ts +20 -0
  83. package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.d.ts.map +1 -0
  84. package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.js +123 -0
  85. package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.js.map +1 -0
  86. package/dist/src/lib/analyzers/java/security-checks/injection-attacks.d.ts +23 -0
  87. package/dist/src/lib/analyzers/java/security-checks/injection-attacks.d.ts.map +1 -0
  88. package/dist/src/lib/analyzers/java/security-checks/injection-attacks.js +201 -0
  89. package/dist/src/lib/analyzers/java/security-checks/injection-attacks.js.map +1 -0
  90. package/dist/src/lib/analyzers/java/security-checks/insecure-design.d.ts +20 -0
  91. package/dist/src/lib/analyzers/java/security-checks/insecure-design.d.ts.map +1 -0
  92. package/dist/src/lib/analyzers/java/security-checks/insecure-design.js +121 -0
  93. package/dist/src/lib/analyzers/java/security-checks/insecure-design.js.map +1 -0
  94. package/dist/src/lib/analyzers/java/security-checks/logging-failures.d.ts +20 -0
  95. package/dist/src/lib/analyzers/java/security-checks/logging-failures.d.ts.map +1 -0
  96. package/dist/src/lib/analyzers/java/security-checks/logging-failures.js +89 -0
  97. package/dist/src/lib/analyzers/java/security-checks/logging-failures.js.map +1 -0
  98. package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.d.ts +26 -0
  99. package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.d.ts.map +1 -0
  100. package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.js +309 -0
  101. package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.js.map +1 -0
  102. package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.d.ts +18 -0
  103. package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.d.ts.map +1 -0
  104. package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.js +114 -0
  105. package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.js.map +1 -0
  106. package/dist/src/lib/analyzers/java/utils/createVulnerability.d.ts +58 -0
  107. package/dist/src/lib/analyzers/java/utils/createVulnerability.d.ts.map +1 -0
  108. package/dist/src/lib/analyzers/java/utils/createVulnerability.js +71 -0
  109. package/dist/src/lib/analyzers/java/utils/createVulnerability.js.map +1 -0
  110. package/dist/src/lib/analyzers/java-analyzer.d.ts +209 -0
  111. package/dist/src/lib/analyzers/java-analyzer.d.ts.map +1 -0
  112. package/dist/src/lib/analyzers/java-analyzer.js +1720 -0
  113. package/dist/src/lib/analyzers/java-analyzer.js.map +1 -0
  114. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts +27 -0
  115. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts.map +1 -0
  116. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js +123 -0
  117. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js.map +1 -0
  118. package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.d.ts +44 -0
  119. package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.d.ts.map +1 -0
  120. package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.js +224 -0
  121. package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.js.map +1 -0
  122. package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.d.ts +50 -0
  123. package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.d.ts.map +1 -0
  124. package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.js +284 -0
  125. package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.js.map +1 -0
  126. package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.d.ts +27 -0
  127. package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.d.ts.map +1 -0
  128. package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.js +86 -0
  129. package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.js.map +1 -0
  130. package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.d.ts +32 -0
  131. package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.d.ts.map +1 -0
  132. package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js +44 -0
  133. package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js.map +1 -0
  134. package/dist/src/lib/analyzers/javascript/security-checks/access-control.d.ts +22 -0
  135. package/dist/src/lib/analyzers/javascript/security-checks/access-control.d.ts.map +1 -0
  136. package/dist/src/lib/analyzers/javascript/security-checks/access-control.js +168 -0
  137. package/dist/src/lib/analyzers/javascript/security-checks/access-control.js.map +1 -0
  138. package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.d.ts +25 -0
  139. package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.d.ts.map +1 -0
  140. package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.js +232 -0
  141. package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.js.map +1 -0
  142. package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.d.ts +27 -0
  143. package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.d.ts.map +1 -0
  144. package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.js +222 -0
  145. package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.js.map +1 -0
  146. package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.d.ts +28 -0
  147. package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.d.ts.map +1 -0
  148. package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.js +176 -0
  149. package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.js.map +1 -0
  150. package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.d.ts +23 -0
  151. package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.d.ts.map +1 -0
  152. package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.js +113 -0
  153. package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.js.map +1 -0
  154. package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.d.ts +28 -0
  155. package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.d.ts.map +1 -0
  156. package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.js +227 -0
  157. package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.js.map +1 -0
  158. package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.d.ts +32 -0
  159. package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.d.ts.map +1 -0
  160. package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.js +260 -0
  161. package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.js.map +1 -0
  162. package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.d.ts +26 -0
  163. package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.d.ts.map +1 -0
  164. package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.js +164 -0
  165. package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.js.map +1 -0
  166. package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.d.ts +26 -0
  167. package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.d.ts.map +1 -0
  168. package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.js +775 -0
  169. package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.js.map +1 -0
  170. package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.d.ts +25 -0
  171. package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.d.ts.map +1 -0
  172. package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.js +168 -0
  173. package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.js.map +1 -0
  174. package/dist/src/lib/analyzers/javascript/security-checks/storage-security.d.ts +27 -0
  175. package/dist/src/lib/analyzers/javascript/security-checks/storage-security.d.ts.map +1 -0
  176. package/dist/src/lib/analyzers/javascript/security-checks/storage-security.js +108 -0
  177. package/dist/src/lib/analyzers/javascript/security-checks/storage-security.js.map +1 -0
  178. package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.d.ts +28 -0
  179. package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.d.ts.map +1 -0
  180. package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.js +143 -0
  181. package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.js.map +1 -0
  182. package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.d.ts +53 -0
  183. package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.d.ts.map +1 -0
  184. package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.js +144 -0
  185. package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.js.map +1 -0
  186. package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.d.ts +72 -0
  187. package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.d.ts.map +1 -0
  188. package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.js +314 -0
  189. package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.js.map +1 -0
  190. package/dist/src/lib/analyzers/javascript/utils/createVulnerability.d.ts +58 -0
  191. package/dist/src/lib/analyzers/javascript/utils/createVulnerability.d.ts.map +1 -0
  192. package/dist/src/lib/analyzers/javascript/utils/createVulnerability.js +71 -0
  193. package/dist/src/lib/analyzers/javascript/utils/createVulnerability.js.map +1 -0
  194. package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.d.ts +36 -0
  195. package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.d.ts.map +1 -0
  196. package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.js +70 -0
  197. package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.js.map +1 -0
  198. package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.d.ts +29 -0
  199. package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.d.ts.map +1 -0
  200. package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.js +55 -0
  201. package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.js.map +1 -0
  202. package/dist/src/lib/analyzers/javascript-analyzer.d.ts +95 -0
  203. package/dist/src/lib/analyzers/javascript-analyzer.d.ts.map +1 -0
  204. package/dist/src/lib/analyzers/javascript-analyzer.js +2141 -0
  205. package/dist/src/lib/analyzers/javascript-analyzer.js.map +1 -0
  206. package/dist/src/lib/analyzers/python/security-checks/access-control.d.ts +21 -0
  207. package/dist/src/lib/analyzers/python/security-checks/access-control.d.ts.map +1 -0
  208. package/dist/src/lib/analyzers/python/security-checks/access-control.js +305 -0
  209. package/dist/src/lib/analyzers/python/security-checks/access-control.js.map +1 -0
  210. package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.d.ts +25 -0
  211. package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.d.ts.map +1 -0
  212. package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.js +242 -0
  213. package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.js.map +1 -0
  214. package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.d.ts +24 -0
  215. package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.d.ts.map +1 -0
  216. package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.js +207 -0
  217. package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.js.map +1 -0
  218. package/dist/src/lib/analyzers/python/security-checks/code-quality.d.ts +27 -0
  219. package/dist/src/lib/analyzers/python/security-checks/code-quality.d.ts.map +1 -0
  220. package/dist/src/lib/analyzers/python/security-checks/code-quality.js +206 -0
  221. package/dist/src/lib/analyzers/python/security-checks/code-quality.js.map +1 -0
  222. package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.d.ts +24 -0
  223. package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.d.ts.map +1 -0
  224. package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.js +113 -0
  225. package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.js.map +1 -0
  226. package/dist/src/lib/analyzers/python/security-checks/crypto-failures.d.ts +20 -0
  227. package/dist/src/lib/analyzers/python/security-checks/crypto-failures.d.ts.map +1 -0
  228. package/dist/src/lib/analyzers/python/security-checks/crypto-failures.js +129 -0
  229. package/dist/src/lib/analyzers/python/security-checks/crypto-failures.js.map +1 -0
  230. package/dist/src/lib/analyzers/python/security-checks/data-integrity.d.ts +19 -0
  231. package/dist/src/lib/analyzers/python/security-checks/data-integrity.d.ts.map +1 -0
  232. package/dist/src/lib/analyzers/python/security-checks/data-integrity.js +90 -0
  233. package/dist/src/lib/analyzers/python/security-checks/data-integrity.js.map +1 -0
  234. package/dist/src/lib/analyzers/python/security-checks/deserialization.d.ts +20 -0
  235. package/dist/src/lib/analyzers/python/security-checks/deserialization.d.ts.map +1 -0
  236. package/dist/src/lib/analyzers/python/security-checks/deserialization.js +68 -0
  237. package/dist/src/lib/analyzers/python/security-checks/deserialization.js.map +1 -0
  238. package/dist/src/lib/analyzers/python/security-checks/django-security.d.ts +25 -0
  239. package/dist/src/lib/analyzers/python/security-checks/django-security.d.ts.map +1 -0
  240. package/dist/src/lib/analyzers/python/security-checks/django-security.js +180 -0
  241. package/dist/src/lib/analyzers/python/security-checks/django-security.js.map +1 -0
  242. package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.d.ts +23 -0
  243. package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.d.ts.map +1 -0
  244. package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.js +127 -0
  245. package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.js.map +1 -0
  246. package/dist/src/lib/analyzers/python/security-checks/exception-handling.d.ts +23 -0
  247. package/dist/src/lib/analyzers/python/security-checks/exception-handling.d.ts.map +1 -0
  248. package/dist/src/lib/analyzers/python/security-checks/exception-handling.js +120 -0
  249. package/dist/src/lib/analyzers/python/security-checks/exception-handling.js.map +1 -0
  250. package/dist/src/lib/analyzers/python/security-checks/flask-security.d.ts +24 -0
  251. package/dist/src/lib/analyzers/python/security-checks/flask-security.d.ts.map +1 -0
  252. package/dist/src/lib/analyzers/python/security-checks/flask-security.js +143 -0
  253. package/dist/src/lib/analyzers/python/security-checks/flask-security.js.map +1 -0
  254. package/dist/src/lib/analyzers/python/security-checks/injection-attacks.d.ts +28 -0
  255. package/dist/src/lib/analyzers/python/security-checks/injection-attacks.d.ts.map +1 -0
  256. package/dist/src/lib/analyzers/python/security-checks/injection-attacks.js +174 -0
  257. package/dist/src/lib/analyzers/python/security-checks/injection-attacks.js.map +1 -0
  258. package/dist/src/lib/analyzers/python/security-checks/insecure-design.d.ts +20 -0
  259. package/dist/src/lib/analyzers/python/security-checks/insecure-design.d.ts.map +1 -0
  260. package/dist/src/lib/analyzers/python/security-checks/insecure-design.js +160 -0
  261. package/dist/src/lib/analyzers/python/security-checks/insecure-design.js.map +1 -0
  262. package/dist/src/lib/analyzers/python/security-checks/logging-failures.d.ts +20 -0
  263. package/dist/src/lib/analyzers/python/security-checks/logging-failures.d.ts.map +1 -0
  264. package/dist/src/lib/analyzers/python/security-checks/logging-failures.js +121 -0
  265. package/dist/src/lib/analyzers/python/security-checks/logging-failures.js.map +1 -0
  266. package/dist/src/lib/analyzers/python/security-checks/nosql-injection.d.ts +26 -0
  267. package/dist/src/lib/analyzers/python/security-checks/nosql-injection.d.ts.map +1 -0
  268. package/dist/src/lib/analyzers/python/security-checks/nosql-injection.js +248 -0
  269. package/dist/src/lib/analyzers/python/security-checks/nosql-injection.js.map +1 -0
  270. package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.d.ts +26 -0
  271. package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.d.ts.map +1 -0
  272. package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.js +375 -0
  273. package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.js.map +1 -0
  274. package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.d.ts +26 -0
  275. package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.d.ts.map +1 -0
  276. package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.js +160 -0
  277. package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.js.map +1 -0
  278. package/dist/src/lib/analyzers/python/security-checks/web-security.d.ts +23 -0
  279. package/dist/src/lib/analyzers/python/security-checks/web-security.d.ts.map +1 -0
  280. package/dist/src/lib/analyzers/python/security-checks/web-security.js +117 -0
  281. package/dist/src/lib/analyzers/python/security-checks/web-security.js.map +1 -0
  282. package/dist/src/lib/analyzers/python/utils/createVulnerability.d.ts +58 -0
  283. package/dist/src/lib/analyzers/python/utils/createVulnerability.d.ts.map +1 -0
  284. package/dist/src/lib/analyzers/python/utils/createVulnerability.js +71 -0
  285. package/dist/src/lib/analyzers/python/utils/createVulnerability.js.map +1 -0
  286. package/dist/src/lib/analyzers/python-analyzer.d.ts +111 -0
  287. package/dist/src/lib/analyzers/python-analyzer.d.ts.map +1 -0
  288. package/dist/src/lib/analyzers/python-analyzer.js +1600 -0
  289. package/dist/src/lib/analyzers/python-analyzer.js.map +1 -0
  290. package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts +14 -0
  291. package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts.map +1 -0
  292. package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.js +47 -0
  293. package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.js.map +1 -0
  294. package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts +13 -0
  295. package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts.map +1 -0
  296. package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.js +36 -0
  297. package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.js.map +1 -0
  298. package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts +15 -0
  299. package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts.map +1 -0
  300. package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.js +68 -0
  301. package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.js.map +1 -0
  302. package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts +15 -0
  303. package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts.map +1 -0
  304. package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.js +68 -0
  305. package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.js.map +1 -0
  306. package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts +12 -0
  307. package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts.map +1 -0
  308. package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.js +45 -0
  309. package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.js.map +1 -0
  310. package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts +14 -0
  311. package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts.map +1 -0
  312. package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.js +47 -0
  313. package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.js.map +1 -0
  314. package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts +13 -0
  315. package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts.map +1 -0
  316. package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.js +36 -0
  317. package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.js.map +1 -0
  318. package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts +15 -0
  319. package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts.map +1 -0
  320. package/dist/src/lib/analyzers/secrets/patterns/api-keys.js +32 -0
  321. package/dist/src/lib/analyzers/secrets/patterns/api-keys.js.map +1 -0
  322. package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts +15 -0
  323. package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts.map +1 -0
  324. package/dist/src/lib/analyzers/secrets/patterns/credentials.js +68 -0
  325. package/dist/src/lib/analyzers/secrets/patterns/credentials.js.map +1 -0
  326. package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts +16 -0
  327. package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts.map +1 -0
  328. package/dist/src/lib/analyzers/secrets/patterns/private-keys.js +79 -0
  329. package/dist/src/lib/analyzers/secrets/patterns/private-keys.js.map +1 -0
  330. package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts +15 -0
  331. package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts.map +1 -0
  332. package/dist/src/lib/analyzers/secrets/patterns/tokens.js +58 -0
  333. package/dist/src/lib/analyzers/secrets/patterns/tokens.js.map +1 -0
  334. package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts +88 -0
  335. package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts.map +1 -0
  336. package/dist/src/lib/analyzers/secrets/secrets-analyzer.js +162 -0
  337. package/dist/src/lib/analyzers/secrets/secrets-analyzer.js.map +1 -0
  338. package/dist/src/lib/analyzers/secrets/validators/context-checker.d.ts +56 -0
  339. package/dist/src/lib/analyzers/secrets/validators/context-checker.d.ts.map +1 -0
  340. package/dist/src/lib/analyzers/secrets/validators/context-checker.js +199 -0
  341. package/dist/src/lib/analyzers/secrets/validators/context-checker.js.map +1 -0
  342. package/dist/src/lib/analyzers/secrets/validators/entropy-checker.d.ts +56 -0
  343. package/dist/src/lib/analyzers/secrets/validators/entropy-checker.d.ts.map +1 -0
  344. package/dist/src/lib/analyzers/secrets/validators/entropy-checker.js +102 -0
  345. package/dist/src/lib/analyzers/secrets/validators/entropy-checker.js.map +1 -0
  346. package/dist/src/lib/analyzers/security-checks/es6-security.d.ts +38 -0
  347. package/dist/src/lib/analyzers/security-checks/es6-security.d.ts.map +1 -0
  348. package/dist/src/lib/analyzers/security-checks/es6-security.js +125 -0
  349. package/dist/src/lib/analyzers/security-checks/es6-security.js.map +1 -0
  350. package/dist/src/lib/analyzers/security-checks/python-async-security.d.ts +46 -0
  351. package/dist/src/lib/analyzers/security-checks/python-async-security.d.ts.map +1 -0
  352. package/dist/src/lib/analyzers/security-checks/python-async-security.js +92 -0
  353. package/dist/src/lib/analyzers/security-checks/python-async-security.js.map +1 -0
  354. package/dist/src/lib/analyzers/security-checks/react-security.d.ts +49 -0
  355. package/dist/src/lib/analyzers/security-checks/react-security.d.ts.map +1 -0
  356. package/dist/src/lib/analyzers/security-checks/react-security.js +125 -0
  357. package/dist/src/lib/analyzers/security-checks/react-security.js.map +1 -0
  358. package/dist/src/lib/analyzers/types.d.ts +92 -0
  359. package/dist/src/lib/analyzers/types.d.ts.map +1 -0
  360. package/dist/src/lib/analyzers/types.js +3 -0
  361. package/dist/src/lib/analyzers/types.js.map +1 -0
  362. package/dist/src/lib/analyzers/typescript/security-checks/access-control.d.ts +19 -0
  363. package/dist/src/lib/analyzers/typescript/security-checks/access-control.d.ts.map +1 -0
  364. package/dist/src/lib/analyzers/typescript/security-checks/access-control.js +210 -0
  365. package/dist/src/lib/analyzers/typescript/security-checks/access-control.js.map +1 -0
  366. package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.d.ts +25 -0
  367. package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.d.ts.map +1 -0
  368. package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.js +242 -0
  369. package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.js.map +1 -0
  370. package/dist/src/lib/analyzers/typescript/security-checks/authentication.d.ts +28 -0
  371. package/dist/src/lib/analyzers/typescript/security-checks/authentication.d.ts.map +1 -0
  372. package/dist/src/lib/analyzers/typescript/security-checks/authentication.js +357 -0
  373. package/dist/src/lib/analyzers/typescript/security-checks/authentication.js.map +1 -0
  374. package/dist/src/lib/analyzers/typescript/security-checks/code-injection.d.ts +26 -0
  375. package/dist/src/lib/analyzers/typescript/security-checks/code-injection.d.ts.map +1 -0
  376. package/dist/src/lib/analyzers/typescript/security-checks/code-injection.js +380 -0
  377. package/dist/src/lib/analyzers/typescript/security-checks/code-injection.js.map +1 -0
  378. package/dist/src/lib/analyzers/typescript/security-checks/code-quality.d.ts +23 -0
  379. package/dist/src/lib/analyzers/typescript/security-checks/code-quality.d.ts.map +1 -0
  380. package/dist/src/lib/analyzers/typescript/security-checks/code-quality.js +109 -0
  381. package/dist/src/lib/analyzers/typescript/security-checks/code-quality.js.map +1 -0
  382. package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.d.ts +21 -0
  383. package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.d.ts.map +1 -0
  384. package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.js +153 -0
  385. package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.js.map +1 -0
  386. package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.d.ts +23 -0
  387. package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.d.ts.map +1 -0
  388. package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.js +146 -0
  389. package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.js.map +1 -0
  390. package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.d.ts +23 -0
  391. package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.d.ts.map +1 -0
  392. package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.js +187 -0
  393. package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.js.map +1 -0
  394. package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.d.ts +19 -0
  395. package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.d.ts.map +1 -0
  396. package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.js +97 -0
  397. package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.js.map +1 -0
  398. package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.d.ts +29 -0
  399. package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.d.ts.map +1 -0
  400. package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.js +319 -0
  401. package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.js.map +1 -0
  402. package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.d.ts +21 -0
  403. package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.d.ts.map +1 -0
  404. package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.js +121 -0
  405. package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.js.map +1 -0
  406. package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.d.ts +27 -0
  407. package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.d.ts.map +1 -0
  408. package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.js +213 -0
  409. package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.js.map +1 -0
  410. package/dist/src/lib/analyzers/typescript/security-checks/type-security.d.ts +19 -0
  411. package/dist/src/lib/analyzers/typescript/security-checks/type-security.d.ts.map +1 -0
  412. package/dist/src/lib/analyzers/typescript/security-checks/type-security.js +59 -0
  413. package/dist/src/lib/analyzers/typescript/security-checks/type-security.js.map +1 -0
  414. package/dist/src/lib/analyzers/typescript/type-checker.d.ts +17 -0
  415. package/dist/src/lib/analyzers/typescript/type-checker.d.ts.map +1 -0
  416. package/dist/src/lib/analyzers/typescript/type-checker.js +515 -0
  417. package/dist/src/lib/analyzers/typescript/type-checker.js.map +1 -0
  418. package/dist/src/lib/analyzers/typescript/utils/createVulnerability.d.ts +58 -0
  419. package/dist/src/lib/analyzers/typescript/utils/createVulnerability.d.ts.map +1 -0
  420. package/dist/src/lib/analyzers/typescript/utils/createVulnerability.js +71 -0
  421. package/dist/src/lib/analyzers/typescript/utils/createVulnerability.js.map +1 -0
  422. package/dist/src/lib/analyzers/typescript-analyzer.d.ts +116 -0
  423. package/dist/src/lib/analyzers/typescript-analyzer.d.ts.map +1 -0
  424. package/dist/src/lib/analyzers/typescript-analyzer.js +1660 -0
  425. package/dist/src/lib/analyzers/typescript-analyzer.js.map +1 -0
  426. package/dist/src/lib/security/compliance-mapping.d.ts +29 -0
  427. package/dist/src/lib/security/compliance-mapping.d.ts.map +1 -0
  428. package/dist/src/lib/security/compliance-mapping.js +1342 -0
  429. package/dist/src/lib/security/compliance-mapping.js.map +1 -0
  430. package/dist/src/lib/security/severity-scoring.d.ts +47 -0
  431. package/dist/src/lib/security/severity-scoring.d.ts.map +1 -0
  432. package/dist/src/lib/security/severity-scoring.js +965 -0
  433. package/dist/src/lib/security/severity-scoring.js.map +1 -0
  434. package/dist/src/lib/standards/references.d.ts +16 -0
  435. package/dist/src/lib/standards/references.d.ts.map +1 -0
  436. package/dist/src/lib/standards/references.js +1161 -0
  437. package/dist/src/lib/standards/references.js.map +1 -0
  438. package/dist/src/lib/types/index.d.ts +167 -0
  439. package/dist/src/lib/types/index.d.ts.map +1 -0
  440. package/dist/src/lib/types/index.js +3 -0
  441. package/dist/src/lib/types/index.js.map +1 -0
  442. package/dist/src/lib/utils/code-cleaner.d.ts +59 -0
  443. package/dist/src/lib/utils/code-cleaner.d.ts.map +1 -0
  444. package/dist/src/lib/utils/code-cleaner.js +283 -0
  445. package/dist/src/lib/utils/code-cleaner.js.map +1 -0
  446. package/package.json +51 -0
  447. package/src/commands/auth.ts +308 -0
  448. package/src/commands/config.ts +226 -0
  449. package/src/commands/init.ts +202 -0
  450. package/src/commands/scan.ts +238 -0
  451. package/src/config/config-loader.ts +175 -0
  452. package/src/reporters/cli-reporter.ts +282 -0
  453. package/src/scanner/local-scanner.ts +250 -0
  454. package/tsconfig.json +24 -0
  455. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Init Command - Repository Initialization
3
+ *
4
+ * This command initializes CodeSlick in a git repository by:
5
+ * 1. Creating a .codeslick.json configuration file
6
+ * 2. Installing the pre-commit hook
7
+ * 3. Making the hook executable
8
+ *
9
+ * After running this command, CodeSlick will automatically scan
10
+ * staged files before each commit.
11
+ *
12
+ * @module packages/cli/src/commands/init
13
+ */
14
+
15
+ import { existsSync } from 'fs';
16
+ import { writeFile, mkdir, chmod } from 'fs/promises';
17
+ import { resolve } from 'path';
18
+ import ora from 'ora';
19
+ import {
20
+ DEFAULT_CONFIG,
21
+ configExists,
22
+ saveConfig,
23
+ type CodeSlickConfig,
24
+ } from '../config/config-loader';
25
+ import { printSuccess, printError, printWarning } from '../reporters/cli-reporter';
26
+
27
+ /**
28
+ * Command arguments type
29
+ */
30
+ interface InitArgs {
31
+ force?: boolean;
32
+ severity?: 'critical' | 'high' | 'medium' | 'low';
33
+ }
34
+
35
+ /**
36
+ * Pre-commit hook template
37
+ */
38
+ const PRE_COMMIT_HOOK = `#!/bin/sh
39
+ # CodeSlick pre-commit hook
40
+ # Automatically scans staged files for security vulnerabilities
41
+ #
42
+ # To skip this hook temporarily, use: git commit --no-verify
43
+
44
+ # Run CodeSlick scan on staged files
45
+ codeslick scan --staged
46
+
47
+ # Exit with the scan status
48
+ exit $?
49
+ `;
50
+
51
+ /**
52
+ * Check if we're in a git repository
53
+ */
54
+ function isGitRepository(cwd: string = process.cwd()): boolean {
55
+ return existsSync(resolve(cwd, '.git'));
56
+ }
57
+
58
+ /**
59
+ * Get git hooks directory path
60
+ */
61
+ function getHooksPath(cwd: string = process.cwd()): string {
62
+ return resolve(cwd, '.git', 'hooks');
63
+ }
64
+
65
+ /**
66
+ * Get pre-commit hook file path
67
+ */
68
+ function getPreCommitPath(cwd: string = process.cwd()): string {
69
+ return resolve(getHooksPath(cwd), 'pre-commit');
70
+ }
71
+
72
+ /**
73
+ * Check if pre-commit hook already exists
74
+ */
75
+ function preCommitExists(cwd: string = process.cwd()): boolean {
76
+ return existsSync(getPreCommitPath(cwd));
77
+ }
78
+
79
+ /**
80
+ * Create .codeslick.json configuration file
81
+ */
82
+ async function createConfigFile(
83
+ args: InitArgs,
84
+ cwd: string = process.cwd()
85
+ ): Promise<void> {
86
+ const spinner = ora('Creating .codeslick.json').start();
87
+
88
+ try {
89
+ const config: CodeSlickConfig = {
90
+ ...DEFAULT_CONFIG,
91
+ severity: args.severity || DEFAULT_CONFIG.severity,
92
+ };
93
+
94
+ await saveConfig(config, cwd);
95
+
96
+ spinner.succeed('.codeslick.json created');
97
+ } catch (error) {
98
+ spinner.fail('Failed to create .codeslick.json');
99
+ throw error;
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Install pre-commit hook
105
+ */
106
+ async function installPreCommitHook(cwd: string = process.cwd()): Promise<void> {
107
+ const spinner = ora('Installing pre-commit hook').start();
108
+
109
+ try {
110
+ const hooksPath = getHooksPath(cwd);
111
+ const preCommitPath = getPreCommitPath(cwd);
112
+
113
+ // Create hooks directory if it doesn't exist
114
+ if (!existsSync(hooksPath)) {
115
+ await mkdir(hooksPath, { recursive: true });
116
+ }
117
+
118
+ // Write pre-commit hook
119
+ await writeFile(preCommitPath, PRE_COMMIT_HOOK, 'utf-8');
120
+
121
+ // Make hook executable (Unix)
122
+ if (process.platform !== 'win32') {
123
+ await chmod(preCommitPath, 0o755);
124
+ }
125
+
126
+ spinner.succeed('Pre-commit hook installed');
127
+ } catch (error) {
128
+ spinner.fail('Failed to install pre-commit hook');
129
+ throw error;
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Init Command Handler
135
+ *
136
+ * This function:
137
+ * 1. Checks if we're in a git repository
138
+ * 2. Creates .codeslick.json (or overwrites with --force)
139
+ * 3. Installs pre-commit hook (or overwrites with --force)
140
+ * 4. Displays success message with usage instructions
141
+ */
142
+ export async function initCommand(args: InitArgs): Promise<void> {
143
+ try {
144
+ const cwd = process.cwd();
145
+
146
+ // Check if we're in a git repository
147
+ if (!isGitRepository(cwd)) {
148
+ printError('Not a git repository. Initialize git first with: git init');
149
+ process.exit(1);
150
+ }
151
+
152
+ console.log('');
153
+ console.log('Initializing CodeSlick...');
154
+ console.log('');
155
+
156
+ // Check if config already exists
157
+ if (configExists(cwd) && !args.force) {
158
+ printWarning(
159
+ '.codeslick.json already exists. Use --force to overwrite.'
160
+ );
161
+ } else {
162
+ await createConfigFile(args, cwd);
163
+ }
164
+
165
+ // Check if pre-commit hook already exists
166
+ if (preCommitExists(cwd) && !args.force) {
167
+ printWarning(
168
+ 'Pre-commit hook already exists. Use --force to overwrite.'
169
+ );
170
+ } else {
171
+ await installPreCommitHook(cwd);
172
+ }
173
+
174
+ // Print success message
175
+ printSuccess('CodeSlick initialized successfully!');
176
+
177
+ console.log('Next steps:');
178
+ console.log(' 1. Review .codeslick.json configuration');
179
+ console.log(' 2. Stage files: git add <files>');
180
+ console.log(' 3. Commit: git commit -m "message"');
181
+ console.log('');
182
+ console.log('CodeSlick will automatically scan staged files before each commit.');
183
+ console.log('');
184
+ console.log('To scan files manually:');
185
+ console.log(' codeslick scan # Scan all files');
186
+ console.log(' codeslick scan --staged # Scan staged files only');
187
+ console.log(' codeslick scan src/**/*.js # Scan specific files');
188
+ console.log('');
189
+ console.log('To skip the pre-commit hook temporarily:');
190
+ console.log(' git commit --no-verify');
191
+ console.log('');
192
+
193
+ process.exit(0);
194
+ } catch (error) {
195
+ if (error instanceof Error) {
196
+ printError(error.message);
197
+ } else {
198
+ printError('An unknown error occurred');
199
+ }
200
+ process.exit(1);
201
+ }
202
+ }
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Scan Command - Security Vulnerability Scanner
3
+ *
4
+ * This command scans files for security vulnerabilities using CodeSlick's
5
+ * analysis engine. It can scan staged files (for pre-commit hooks) or
6
+ * specific files/patterns.
7
+ *
8
+ * Features:
9
+ * - Scan staged files only (--staged)
10
+ * - Scan specific files or patterns
11
+ * - Configurable severity thresholds
12
+ * - Beautiful terminal output
13
+ * - JSON output mode for CI/CD
14
+ * - Exit codes for automation (0 = pass, 1 = fail)
15
+ *
16
+ * @module packages/cli/src/commands/scan
17
+ */
18
+
19
+ import { exec } from 'child_process';
20
+ import { promisify } from 'util';
21
+ import { resolve } from 'path';
22
+ import { glob } from 'glob';
23
+ import ora from 'ora';
24
+ import chalk from 'chalk';
25
+ import { scanFiles, exceedsThreshold, type ScannerConfig } from '../scanner/local-scanner';
26
+ import {
27
+ printScanStart,
28
+ printScanComplete,
29
+ printDetailedResults,
30
+ printSummaryTable,
31
+ printCommitBlocked,
32
+ printCommitAllowed,
33
+ printError,
34
+ printJSONResults,
35
+ } from '../reporters/cli-reporter';
36
+ import { loadConfig } from '../config/config-loader';
37
+
38
+ const execAsync = promisify(exec);
39
+
40
+ /**
41
+ * Command arguments type
42
+ */
43
+ interface ScanArgs {
44
+ files?: string[];
45
+ staged?: boolean;
46
+ severity?: 'critical' | 'high' | 'medium' | 'low';
47
+ fix?: boolean;
48
+ json?: boolean;
49
+ }
50
+
51
+ /**
52
+ * Get list of staged files from git
53
+ */
54
+ async function getStagedFiles(): Promise<string[]> {
55
+ try {
56
+ const { stdout } = await execAsync('git diff --cached --name-only --diff-filter=ACM');
57
+ return stdout
58
+ .trim()
59
+ .split('\n')
60
+ .filter((f) => f.length > 0)
61
+ .map((f) => resolve(process.cwd(), f));
62
+ } catch (error) {
63
+ throw new Error('Failed to get staged files. Are you in a git repository?');
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Expand glob patterns to file paths
69
+ */
70
+ async function expandGlobPatterns(patterns: string[]): Promise<string[]> {
71
+ const allFiles: string[] = [];
72
+
73
+ for (const pattern of patterns) {
74
+ const files = await glob(pattern, {
75
+ cwd: process.cwd(),
76
+ absolute: true,
77
+ nodir: true,
78
+ });
79
+ allFiles.push(...files);
80
+ }
81
+
82
+ // Remove duplicates
83
+ return [...new Set(allFiles)];
84
+ }
85
+
86
+ /**
87
+ * Scan Command Handler
88
+ *
89
+ * This function:
90
+ * 1. Determines which files to scan (staged, specific, or all)
91
+ * 2. Loads configuration from .codeslick.json
92
+ * 3. Scans files using local scanner
93
+ * 4. Displays results
94
+ * 5. Exits with appropriate code
95
+ */
96
+ export async function scanCommand(args: ScanArgs): Promise<void> {
97
+ const startTime = Date.now();
98
+
99
+ try {
100
+ // Load configuration
101
+ const config = await loadConfig();
102
+
103
+ // Merge command-line args with config
104
+ const scannerConfig: ScannerConfig = {
105
+ severityThreshold: args.severity || config.severity || 'critical',
106
+ exclude: config.exclude || [],
107
+ autofix: args.fix || config.autofix || false,
108
+ };
109
+
110
+ // Determine which files to scan
111
+ let filePaths: string[] = [];
112
+
113
+ if (args.staged) {
114
+ // Scan staged files
115
+ filePaths = await getStagedFiles();
116
+
117
+ if (filePaths.length === 0) {
118
+ printError('No staged files found. Stage files with: git add <files>');
119
+ process.exit(0);
120
+ }
121
+ } else if (args.files && args.files.length > 0) {
122
+ // Scan specific files/patterns
123
+ filePaths = await expandGlobPatterns(args.files);
124
+
125
+ if (filePaths.length === 0) {
126
+ printError(`No files matched patterns: ${args.files.join(', ')}`);
127
+ process.exit(1);
128
+ }
129
+ } else {
130
+ // Scan all files (default patterns from config)
131
+ const defaultPatterns = config.languages?.map((lang) => {
132
+ switch (lang) {
133
+ case 'javascript':
134
+ return '**/*.{js,jsx}';
135
+ case 'typescript':
136
+ return '**/*.{ts,tsx}';
137
+ case 'python':
138
+ return '**/*.py';
139
+ case 'java':
140
+ return '**/*.java';
141
+ default:
142
+ return '';
143
+ }
144
+ }).filter(Boolean) || ['**/*.{js,jsx,ts,tsx,py,java}'];
145
+
146
+ filePaths = await expandGlobPatterns(defaultPatterns);
147
+
148
+ if (filePaths.length === 0) {
149
+ printError('No files found to scan.');
150
+ process.exit(0);
151
+ }
152
+ }
153
+
154
+ // Print scan start
155
+ if (!args.json) {
156
+ printScanStart(filePaths.length);
157
+ }
158
+
159
+ // Show progress spinner
160
+ const spinner = !args.json ? ora('Scanning files...').start() : null;
161
+
162
+ // Scan all files
163
+ const results = await scanFiles(filePaths, scannerConfig);
164
+
165
+ // Stop spinner
166
+ if (spinner) {
167
+ spinner.stop();
168
+ }
169
+
170
+ const duration = Date.now() - startTime;
171
+
172
+ // Output results
173
+ if (args.json) {
174
+ // JSON output mode (for CI/CD)
175
+ printJSONResults(results);
176
+ } else {
177
+ // Human-readable output
178
+ printScanComplete(duration);
179
+ printDetailedResults(results);
180
+ printSummaryTable(results);
181
+ }
182
+
183
+ // Show AI-Fix availability message if --fix flag was used
184
+ if (args.fix && !args.json) {
185
+ const totalVulns = results.reduce((sum, r) => sum + r.critical + r.high + r.medium + r.low, 0);
186
+
187
+ if (totalVulns > 0) {
188
+ console.log('');
189
+ console.log(chalk.cyan.bold('🤖 AI-Powered Auto-Fix Available'));
190
+ console.log(chalk.gray('─'.repeat(50)));
191
+ console.log('');
192
+ console.log(chalk.white(`Found ${totalVulns} ${totalVulns === 1 ? 'vulnerability' : 'vulnerabilities'} that can be fixed with AI.`));
193
+ console.log('');
194
+ console.log(chalk.yellow('Auto-fix is available through:'));
195
+ console.log('');
196
+ console.log(chalk.green(' 1. WebTool:') + chalk.gray(' https://codeslick.dev/analyze'));
197
+ console.log(chalk.gray(' → Paste your code and click "Generate Fix"'));
198
+ console.log('');
199
+ console.log(chalk.green(' 2. GitHub App:') + chalk.gray(' Automated PR fixes'));
200
+ console.log(chalk.gray(' → Install: https://github.com/settings/apps/codeslick-security-scanner'));
201
+ console.log('');
202
+ console.log(chalk.gray('CLI auto-fix coming soon'));
203
+ console.log('');
204
+ }
205
+ }
206
+
207
+ // Check if results exceed threshold
208
+ const threshold = scannerConfig.severityThreshold || 'critical';
209
+ const shouldBlock = exceedsThreshold(results, threshold);
210
+
211
+ if (shouldBlock) {
212
+ // Calculate totals for display
213
+ const totalCritical = results.reduce((sum, r) => sum + r.critical, 0);
214
+ const totalHigh = results.reduce((sum, r) => sum + r.high, 0);
215
+ const totalMedium = results.reduce((sum, r) => sum + r.medium, 0);
216
+ const totalLow = results.reduce((sum, r) => sum + r.low, 0);
217
+
218
+ if (!args.json) {
219
+ printCommitBlocked(threshold, totalCritical, totalHigh, totalMedium, totalLow);
220
+ }
221
+
222
+ process.exit(1); // Exit with failure
223
+ } else {
224
+ if (!args.json) {
225
+ printCommitAllowed();
226
+ }
227
+
228
+ process.exit(0); // Exit with success
229
+ }
230
+ } catch (error) {
231
+ if (error instanceof Error) {
232
+ printError(error.message);
233
+ } else {
234
+ printError('An unknown error occurred');
235
+ }
236
+ process.exit(1);
237
+ }
238
+ }
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Configuration Loader - .codeslick.json Parser
3
+ *
4
+ * This module loads and validates the .codeslick.json configuration file.
5
+ * It provides sensible defaults if the file doesn't exist.
6
+ *
7
+ * Configuration Structure:
8
+ * ```json
9
+ * {
10
+ * "version": "1.0",
11
+ * "severity": "critical",
12
+ * "autofix": false,
13
+ * "exclude": ["node_modules/**", "dist/**"],
14
+ * "languages": ["javascript", "typescript", "python", "java"]
15
+ * }
16
+ * ```
17
+ *
18
+ * @module packages/cli/src/config/config-loader
19
+ */
20
+
21
+ import { readFile, writeFile } from 'fs/promises';
22
+ import { resolve } from 'path';
23
+ import { existsSync } from 'fs';
24
+
25
+ /**
26
+ * CodeSlick configuration interface
27
+ */
28
+ export interface CodeSlickConfig {
29
+ version: string;
30
+ severity: 'critical' | 'high' | 'medium' | 'low';
31
+ autofix: boolean;
32
+ exclude: string[];
33
+ languages: ('javascript' | 'typescript' | 'python' | 'java')[];
34
+ }
35
+
36
+ /**
37
+ * Default configuration
38
+ */
39
+ export const DEFAULT_CONFIG: CodeSlickConfig = {
40
+ version: '1.0',
41
+ severity: 'critical',
42
+ autofix: false,
43
+ exclude: [
44
+ 'node_modules/**',
45
+ 'dist/**',
46
+ 'build/**',
47
+ 'coverage/**',
48
+ '**/*.test.{js,ts}',
49
+ '**/*.spec.{js,ts}',
50
+ '**/test/**',
51
+ '**/tests/**',
52
+ ],
53
+ languages: ['javascript', 'typescript', 'python', 'java'],
54
+ };
55
+
56
+ /**
57
+ * Get configuration file path
58
+ */
59
+ export function getConfigPath(cwd: string = process.cwd()): string {
60
+ return resolve(cwd, '.codeslick.json');
61
+ }
62
+
63
+ /**
64
+ * Check if configuration file exists
65
+ */
66
+ export function configExists(cwd: string = process.cwd()): boolean {
67
+ return existsSync(getConfigPath(cwd));
68
+ }
69
+
70
+ /**
71
+ * Load configuration from .codeslick.json
72
+ *
73
+ * If the file doesn't exist, returns default configuration.
74
+ * If the file exists but is invalid, throws an error.
75
+ *
76
+ * @param cwd - Current working directory (default: process.cwd())
77
+ * @returns Parsed configuration
78
+ */
79
+ export async function loadConfig(cwd: string = process.cwd()): Promise<CodeSlickConfig> {
80
+ const configPath = getConfigPath(cwd);
81
+
82
+ if (!existsSync(configPath)) {
83
+ // Return default config if file doesn't exist
84
+ return DEFAULT_CONFIG;
85
+ }
86
+
87
+ try {
88
+ const content = await readFile(configPath, 'utf-8');
89
+ const parsed = JSON.parse(content);
90
+
91
+ // Merge with defaults to handle missing fields
92
+ return {
93
+ ...DEFAULT_CONFIG,
94
+ ...parsed,
95
+ };
96
+ } catch (error) {
97
+ throw new Error(`Failed to parse .codeslick.json: ${error instanceof Error ? error.message : 'Unknown error'}`);
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Save configuration to .codeslick.json
103
+ *
104
+ * @param config - Configuration to save
105
+ * @param cwd - Current working directory (default: process.cwd())
106
+ */
107
+ export async function saveConfig(
108
+ config: CodeSlickConfig,
109
+ cwd: string = process.cwd()
110
+ ): Promise<void> {
111
+ const configPath = getConfigPath(cwd);
112
+ const content = JSON.stringify(config, null, 2);
113
+
114
+ await writeFile(configPath, content, 'utf-8');
115
+ }
116
+
117
+ /**
118
+ * Update a specific configuration value
119
+ *
120
+ * @param key - Configuration key
121
+ * @param value - Configuration value
122
+ * @param cwd - Current working directory (default: process.cwd())
123
+ */
124
+ export async function updateConfig(
125
+ key: keyof CodeSlickConfig,
126
+ value: unknown,
127
+ cwd: string = process.cwd()
128
+ ): Promise<void> {
129
+ const config = await loadConfig(cwd);
130
+
131
+ // Validate and update based on key
132
+ switch (key) {
133
+ case 'severity':
134
+ if (!['critical', 'high', 'medium', 'low'].includes(value as string)) {
135
+ throw new Error(
136
+ `Invalid severity value: ${value}. Must be one of: critical, high, medium, low`
137
+ );
138
+ }
139
+ config.severity = value as 'critical' | 'high' | 'medium' | 'low';
140
+ break;
141
+
142
+ case 'autofix':
143
+ if (typeof value !== 'boolean') {
144
+ throw new Error(`Invalid autofix value: ${value}. Must be true or false`);
145
+ }
146
+ config.autofix = value;
147
+ break;
148
+
149
+ case 'exclude':
150
+ if (!Array.isArray(value)) {
151
+ throw new Error(`Invalid exclude value: ${value}. Must be an array of patterns`);
152
+ }
153
+ config.exclude = value;
154
+ break;
155
+
156
+ case 'languages':
157
+ if (!Array.isArray(value)) {
158
+ throw new Error(`Invalid languages value: ${value}. Must be an array`);
159
+ }
160
+ const validLanguages = ['javascript', 'typescript', 'python', 'java'];
161
+ const invalid = (value as string[]).filter((lang) => !validLanguages.includes(lang));
162
+ if (invalid.length > 0) {
163
+ throw new Error(
164
+ `Invalid language(s): ${invalid.join(', ')}. Must be one of: ${validLanguages.join(', ')}`
165
+ );
166
+ }
167
+ config.languages = value as ('javascript' | 'typescript' | 'python' | 'java')[];
168
+ break;
169
+
170
+ default:
171
+ throw new Error(`Unknown configuration key: ${key}`);
172
+ }
173
+
174
+ await saveConfig(config, cwd);
175
+ }