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.
- package/README.md +458 -0
- package/__tests__/cli-reporter.test.ts +86 -0
- package/__tests__/config-loader.test.ts +247 -0
- package/__tests__/local-scanner.test.ts +245 -0
- package/bin/codeslick.cjs +153 -0
- package/dist/packages/cli/src/commands/auth.d.ts +36 -0
- package/dist/packages/cli/src/commands/auth.d.ts.map +1 -0
- package/dist/packages/cli/src/commands/auth.js +226 -0
- package/dist/packages/cli/src/commands/auth.js.map +1 -0
- package/dist/packages/cli/src/commands/config.d.ts +37 -0
- package/dist/packages/cli/src/commands/config.d.ts.map +1 -0
- package/dist/packages/cli/src/commands/config.js +196 -0
- package/dist/packages/cli/src/commands/config.js.map +1 -0
- package/dist/packages/cli/src/commands/init.d.ts +32 -0
- package/dist/packages/cli/src/commands/init.d.ts.map +1 -0
- package/dist/packages/cli/src/commands/init.js +171 -0
- package/dist/packages/cli/src/commands/init.js.map +1 -0
- package/dist/packages/cli/src/commands/scan.d.ts +40 -0
- package/dist/packages/cli/src/commands/scan.d.ts.map +1 -0
- package/dist/packages/cli/src/commands/scan.js +204 -0
- package/dist/packages/cli/src/commands/scan.js.map +1 -0
- package/dist/packages/cli/src/config/config-loader.d.ts +67 -0
- package/dist/packages/cli/src/config/config-loader.d.ts.map +1 -0
- package/dist/packages/cli/src/config/config-loader.js +146 -0
- package/dist/packages/cli/src/config/config-loader.js.map +1 -0
- package/dist/packages/cli/src/reporters/cli-reporter.d.ts +69 -0
- package/dist/packages/cli/src/reporters/cli-reporter.d.ts.map +1 -0
- package/dist/packages/cli/src/reporters/cli-reporter.js +244 -0
- package/dist/packages/cli/src/reporters/cli-reporter.js.map +1 -0
- package/dist/packages/cli/src/scanner/local-scanner.d.ts +92 -0
- package/dist/packages/cli/src/scanner/local-scanner.d.ts.map +1 -0
- package/dist/packages/cli/src/scanner/local-scanner.js +221 -0
- package/dist/packages/cli/src/scanner/local-scanner.js.map +1 -0
- package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.d.ts +88 -0
- package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.d.ts.map +1 -0
- package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.js +371 -0
- package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.js.map +1 -0
- package/dist/src/lib/analyzers/helpers/jsx-helpers.d.ts +63 -0
- package/dist/src/lib/analyzers/helpers/jsx-helpers.d.ts.map +1 -0
- package/dist/src/lib/analyzers/helpers/jsx-helpers.js +95 -0
- package/dist/src/lib/analyzers/helpers/jsx-helpers.js.map +1 -0
- package/dist/src/lib/analyzers/helpers/variable-tracker.d.ts +59 -0
- package/dist/src/lib/analyzers/helpers/variable-tracker.d.ts.map +1 -0
- package/dist/src/lib/analyzers/helpers/variable-tracker.js +231 -0
- package/dist/src/lib/analyzers/helpers/variable-tracker.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/access-control.d.ts +20 -0
- package/dist/src/lib/analyzers/java/security-checks/access-control.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/access-control.js +129 -0
- package/dist/src/lib/analyzers/java/security-checks/access-control.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.d.ts +25 -0
- package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.js +221 -0
- package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/code-quality.d.ts +18 -0
- package/dist/src/lib/analyzers/java/security-checks/code-quality.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/code-quality.js +84 -0
- package/dist/src/lib/analyzers/java/security-checks/code-quality.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/crypto-validation.d.ts +18 -0
- package/dist/src/lib/analyzers/java/security-checks/crypto-validation.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/crypto-validation.js +161 -0
- package/dist/src/lib/analyzers/java/security-checks/crypto-validation.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.d.ts +20 -0
- package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.js +163 -0
- package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.d.ts +24 -0
- package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.js +178 -0
- package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/exception-handling.d.ts +25 -0
- package/dist/src/lib/analyzers/java/security-checks/exception-handling.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/exception-handling.js +179 -0
- package/dist/src/lib/analyzers/java/security-checks/exception-handling.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/file-operations.d.ts +17 -0
- package/dist/src/lib/analyzers/java/security-checks/file-operations.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/file-operations.js +67 -0
- package/dist/src/lib/analyzers/java/security-checks/file-operations.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/framework-security.d.ts +25 -0
- package/dist/src/lib/analyzers/java/security-checks/framework-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/framework-security.js +396 -0
- package/dist/src/lib/analyzers/java/security-checks/framework-security.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.d.ts +20 -0
- package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.js +123 -0
- package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/injection-attacks.d.ts +23 -0
- package/dist/src/lib/analyzers/java/security-checks/injection-attacks.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/injection-attacks.js +201 -0
- package/dist/src/lib/analyzers/java/security-checks/injection-attacks.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/insecure-design.d.ts +20 -0
- package/dist/src/lib/analyzers/java/security-checks/insecure-design.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/insecure-design.js +121 -0
- package/dist/src/lib/analyzers/java/security-checks/insecure-design.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/logging-failures.d.ts +20 -0
- package/dist/src/lib/analyzers/java/security-checks/logging-failures.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/logging-failures.js +89 -0
- package/dist/src/lib/analyzers/java/security-checks/logging-failures.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.d.ts +26 -0
- package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.js +309 -0
- package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.d.ts +18 -0
- package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.js +114 -0
- package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.js.map +1 -0
- package/dist/src/lib/analyzers/java/utils/createVulnerability.d.ts +58 -0
- package/dist/src/lib/analyzers/java/utils/createVulnerability.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/utils/createVulnerability.js +71 -0
- package/dist/src/lib/analyzers/java/utils/createVulnerability.js.map +1 -0
- package/dist/src/lib/analyzers/java-analyzer.d.ts +209 -0
- package/dist/src/lib/analyzers/java-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java-analyzer.js +1720 -0
- package/dist/src/lib/analyzers/java-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts +27 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js +123 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.d.ts +44 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.js +224 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.d.ts +50 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.js +284 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.d.ts +27 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.js +86 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.d.ts +32 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js +44 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/access-control.d.ts +22 -0
- package/dist/src/lib/analyzers/javascript/security-checks/access-control.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/access-control.js +168 -0
- package/dist/src/lib/analyzers/javascript/security-checks/access-control.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.d.ts +25 -0
- package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.js +232 -0
- package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.d.ts +27 -0
- package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.js +222 -0
- package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.d.ts +28 -0
- package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.js +176 -0
- package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.d.ts +23 -0
- package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.js +113 -0
- package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.d.ts +28 -0
- package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.js +227 -0
- package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.d.ts +32 -0
- package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.js +260 -0
- package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.d.ts +26 -0
- package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.js +164 -0
- package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.d.ts +26 -0
- package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.js +775 -0
- package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.d.ts +25 -0
- package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.js +168 -0
- package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/storage-security.d.ts +27 -0
- package/dist/src/lib/analyzers/javascript/security-checks/storage-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/storage-security.js +108 -0
- package/dist/src/lib/analyzers/javascript/security-checks/storage-security.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.d.ts +28 -0
- package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.js +143 -0
- package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.d.ts +53 -0
- package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.js +144 -0
- package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.d.ts +72 -0
- package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.js +314 -0
- package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/createVulnerability.d.ts +58 -0
- package/dist/src/lib/analyzers/javascript/utils/createVulnerability.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/createVulnerability.js +71 -0
- package/dist/src/lib/analyzers/javascript/utils/createVulnerability.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.d.ts +36 -0
- package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.js +70 -0
- package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.d.ts +29 -0
- package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.js +55 -0
- package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/javascript-analyzer.d.ts +95 -0
- package/dist/src/lib/analyzers/javascript-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript-analyzer.js +2141 -0
- package/dist/src/lib/analyzers/javascript-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/access-control.d.ts +21 -0
- package/dist/src/lib/analyzers/python/security-checks/access-control.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/access-control.js +305 -0
- package/dist/src/lib/analyzers/python/security-checks/access-control.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.d.ts +25 -0
- package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.js +242 -0
- package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.d.ts +24 -0
- package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.js +207 -0
- package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/code-quality.d.ts +27 -0
- package/dist/src/lib/analyzers/python/security-checks/code-quality.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/code-quality.js +206 -0
- package/dist/src/lib/analyzers/python/security-checks/code-quality.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.d.ts +24 -0
- package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.js +113 -0
- package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/crypto-failures.d.ts +20 -0
- package/dist/src/lib/analyzers/python/security-checks/crypto-failures.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/crypto-failures.js +129 -0
- package/dist/src/lib/analyzers/python/security-checks/crypto-failures.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/data-integrity.d.ts +19 -0
- package/dist/src/lib/analyzers/python/security-checks/data-integrity.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/data-integrity.js +90 -0
- package/dist/src/lib/analyzers/python/security-checks/data-integrity.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/deserialization.d.ts +20 -0
- package/dist/src/lib/analyzers/python/security-checks/deserialization.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/deserialization.js +68 -0
- package/dist/src/lib/analyzers/python/security-checks/deserialization.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/django-security.d.ts +25 -0
- package/dist/src/lib/analyzers/python/security-checks/django-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/django-security.js +180 -0
- package/dist/src/lib/analyzers/python/security-checks/django-security.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.d.ts +23 -0
- package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.js +127 -0
- package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/exception-handling.d.ts +23 -0
- package/dist/src/lib/analyzers/python/security-checks/exception-handling.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/exception-handling.js +120 -0
- package/dist/src/lib/analyzers/python/security-checks/exception-handling.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/flask-security.d.ts +24 -0
- package/dist/src/lib/analyzers/python/security-checks/flask-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/flask-security.js +143 -0
- package/dist/src/lib/analyzers/python/security-checks/flask-security.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/injection-attacks.d.ts +28 -0
- package/dist/src/lib/analyzers/python/security-checks/injection-attacks.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/injection-attacks.js +174 -0
- package/dist/src/lib/analyzers/python/security-checks/injection-attacks.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/insecure-design.d.ts +20 -0
- package/dist/src/lib/analyzers/python/security-checks/insecure-design.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/insecure-design.js +160 -0
- package/dist/src/lib/analyzers/python/security-checks/insecure-design.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/logging-failures.d.ts +20 -0
- package/dist/src/lib/analyzers/python/security-checks/logging-failures.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/logging-failures.js +121 -0
- package/dist/src/lib/analyzers/python/security-checks/logging-failures.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/nosql-injection.d.ts +26 -0
- package/dist/src/lib/analyzers/python/security-checks/nosql-injection.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/nosql-injection.js +248 -0
- package/dist/src/lib/analyzers/python/security-checks/nosql-injection.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.d.ts +26 -0
- package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.js +375 -0
- package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.d.ts +26 -0
- package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.js +160 -0
- package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/web-security.d.ts +23 -0
- package/dist/src/lib/analyzers/python/security-checks/web-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/web-security.js +117 -0
- package/dist/src/lib/analyzers/python/security-checks/web-security.js.map +1 -0
- package/dist/src/lib/analyzers/python/utils/createVulnerability.d.ts +58 -0
- package/dist/src/lib/analyzers/python/utils/createVulnerability.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/utils/createVulnerability.js +71 -0
- package/dist/src/lib/analyzers/python/utils/createVulnerability.js.map +1 -0
- package/dist/src/lib/analyzers/python-analyzer.d.ts +111 -0
- package/dist/src/lib/analyzers/python-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python-analyzer.js +1600 -0
- package/dist/src/lib/analyzers/python-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts +14 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.js +47 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts +13 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.js +36 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts +15 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.js +68 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts +15 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.js +68 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts +12 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.js +45 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts +14 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.js +47 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts +13 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.js +36 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts +15 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.js +32 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts +15 -0
- package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/credentials.js +68 -0
- package/dist/src/lib/analyzers/secrets/patterns/credentials.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts +16 -0
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.js +79 -0
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts +15 -0
- package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/tokens.js +58 -0
- package/dist/src/lib/analyzers/secrets/patterns/tokens.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts +88 -0
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.js +162 -0
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/validators/context-checker.d.ts +56 -0
- package/dist/src/lib/analyzers/secrets/validators/context-checker.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/validators/context-checker.js +199 -0
- package/dist/src/lib/analyzers/secrets/validators/context-checker.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/validators/entropy-checker.d.ts +56 -0
- package/dist/src/lib/analyzers/secrets/validators/entropy-checker.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/validators/entropy-checker.js +102 -0
- package/dist/src/lib/analyzers/secrets/validators/entropy-checker.js.map +1 -0
- package/dist/src/lib/analyzers/security-checks/es6-security.d.ts +38 -0
- package/dist/src/lib/analyzers/security-checks/es6-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/security-checks/es6-security.js +125 -0
- package/dist/src/lib/analyzers/security-checks/es6-security.js.map +1 -0
- package/dist/src/lib/analyzers/security-checks/python-async-security.d.ts +46 -0
- package/dist/src/lib/analyzers/security-checks/python-async-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/security-checks/python-async-security.js +92 -0
- package/dist/src/lib/analyzers/security-checks/python-async-security.js.map +1 -0
- package/dist/src/lib/analyzers/security-checks/react-security.d.ts +49 -0
- package/dist/src/lib/analyzers/security-checks/react-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/security-checks/react-security.js +125 -0
- package/dist/src/lib/analyzers/security-checks/react-security.js.map +1 -0
- package/dist/src/lib/analyzers/types.d.ts +92 -0
- package/dist/src/lib/analyzers/types.d.ts.map +1 -0
- package/dist/src/lib/analyzers/types.js +3 -0
- package/dist/src/lib/analyzers/types.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/access-control.d.ts +19 -0
- package/dist/src/lib/analyzers/typescript/security-checks/access-control.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/access-control.js +210 -0
- package/dist/src/lib/analyzers/typescript/security-checks/access-control.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.d.ts +25 -0
- package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.js +242 -0
- package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/authentication.d.ts +28 -0
- package/dist/src/lib/analyzers/typescript/security-checks/authentication.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/authentication.js +357 -0
- package/dist/src/lib/analyzers/typescript/security-checks/authentication.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-injection.d.ts +26 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-injection.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-injection.js +380 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-injection.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-quality.d.ts +23 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-quality.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-quality.js +109 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-quality.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.d.ts +21 -0
- package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.js +153 -0
- package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.d.ts +23 -0
- package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.js +146 -0
- package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.d.ts +23 -0
- package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.js +187 -0
- package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.d.ts +19 -0
- package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.js +97 -0
- package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.d.ts +29 -0
- package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.js +319 -0
- package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.d.ts +21 -0
- package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.js +121 -0
- package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.d.ts +27 -0
- package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.js +213 -0
- package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.d.ts +19 -0
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.js +59 -0
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/type-checker.d.ts +17 -0
- package/dist/src/lib/analyzers/typescript/type-checker.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/type-checker.js +515 -0
- package/dist/src/lib/analyzers/typescript/type-checker.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/utils/createVulnerability.d.ts +58 -0
- package/dist/src/lib/analyzers/typescript/utils/createVulnerability.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/utils/createVulnerability.js +71 -0
- package/dist/src/lib/analyzers/typescript/utils/createVulnerability.js.map +1 -0
- package/dist/src/lib/analyzers/typescript-analyzer.d.ts +116 -0
- package/dist/src/lib/analyzers/typescript-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript-analyzer.js +1660 -0
- package/dist/src/lib/analyzers/typescript-analyzer.js.map +1 -0
- package/dist/src/lib/security/compliance-mapping.d.ts +29 -0
- package/dist/src/lib/security/compliance-mapping.d.ts.map +1 -0
- package/dist/src/lib/security/compliance-mapping.js +1342 -0
- package/dist/src/lib/security/compliance-mapping.js.map +1 -0
- package/dist/src/lib/security/severity-scoring.d.ts +47 -0
- package/dist/src/lib/security/severity-scoring.d.ts.map +1 -0
- package/dist/src/lib/security/severity-scoring.js +965 -0
- package/dist/src/lib/security/severity-scoring.js.map +1 -0
- package/dist/src/lib/standards/references.d.ts +16 -0
- package/dist/src/lib/standards/references.d.ts.map +1 -0
- package/dist/src/lib/standards/references.js +1161 -0
- package/dist/src/lib/standards/references.js.map +1 -0
- package/dist/src/lib/types/index.d.ts +167 -0
- package/dist/src/lib/types/index.d.ts.map +1 -0
- package/dist/src/lib/types/index.js +3 -0
- package/dist/src/lib/types/index.js.map +1 -0
- package/dist/src/lib/utils/code-cleaner.d.ts +59 -0
- package/dist/src/lib/utils/code-cleaner.d.ts.map +1 -0
- package/dist/src/lib/utils/code-cleaner.js +283 -0
- package/dist/src/lib/utils/code-cleaner.js.map +1 -0
- package/package.json +51 -0
- package/src/commands/auth.ts +308 -0
- package/src/commands/config.ts +226 -0
- package/src/commands/init.ts +202 -0
- package/src/commands/scan.ts +238 -0
- package/src/config/config-loader.ts +175 -0
- package/src/reporters/cli-reporter.ts +282 -0
- package/src/scanner/local-scanner.ts +250 -0
- package/tsconfig.json +24 -0
- 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
|
+
}
|