vibe-guard 1.2.0 → 2.1.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 (49) hide show
  1. package/README.md +38 -74
  2. package/dist/bin/vibe-guard.js +93 -264
  3. package/dist/bin/vibe-guard.js.map +1 -1
  4. package/dist/index.d.ts +4 -9
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +36 -69
  7. package/dist/index.js.map +1 -1
  8. package/dist/reporter.d.ts +4 -11
  9. package/dist/reporter.d.ts.map +1 -1
  10. package/dist/reporter.js +125 -461
  11. package/dist/reporter.js.map +1 -1
  12. package/dist/rules/exposed-secrets.d.ts.map +1 -1
  13. package/dist/rules/exposed-secrets.js +27 -8
  14. package/dist/rules/exposed-secrets.js.map +1 -1
  15. package/dist/rules/hardcoded-sensitive-data.js +1 -1
  16. package/dist/rules/hardcoded-sensitive-data.js.map +1 -1
  17. package/dist/rules/index.d.ts +3 -1
  18. package/dist/rules/index.d.ts.map +1 -1
  19. package/dist/rules/index.js +7 -1
  20. package/dist/rules/index.js.map +1 -1
  21. package/dist/rules/insecure-deserialization.js +1 -1
  22. package/dist/rules/insecure-deserialization.js.map +1 -1
  23. package/dist/rules/insecure-error-handling.js +1 -1
  24. package/dist/rules/insecure-error-handling.js.map +1 -1
  25. package/dist/rules/insecure-file-upload.js +1 -1
  26. package/dist/rules/insecure-file-upload.js.map +1 -1
  27. package/dist/rules/insecure-http.js +1 -1
  28. package/dist/rules/insecure-http.js.map +1 -1
  29. package/dist/rules/insecure-logging.js +1 -1
  30. package/dist/rules/insecure-logging.js.map +1 -1
  31. package/dist/rules/kubernetes-security.js +3 -3
  32. package/dist/rules/kubernetes-security.js.map +1 -1
  33. package/dist/rules/unpinned-supply-chain-dependencies.d.ts +12 -0
  34. package/dist/rules/unpinned-supply-chain-dependencies.d.ts.map +1 -0
  35. package/dist/rules/unpinned-supply-chain-dependencies.js +56 -0
  36. package/dist/rules/unpinned-supply-chain-dependencies.js.map +1 -0
  37. package/dist/rules/unsafe-llm-prompt-construction.d.ts +9 -0
  38. package/dist/rules/unsafe-llm-prompt-construction.d.ts.map +1 -0
  39. package/dist/rules/unsafe-llm-prompt-construction.js +31 -0
  40. package/dist/rules/unsafe-llm-prompt-construction.js.map +1 -0
  41. package/dist/rules/xss-detection.js +1 -1
  42. package/dist/rules/xss-detection.js.map +1 -1
  43. package/dist/scanner.d.ts +1 -2
  44. package/dist/scanner.d.ts.map +1 -1
  45. package/dist/scanner.js +43 -116
  46. package/dist/scanner.js.map +1 -1
  47. package/dist/types/version.d.ts +1 -1
  48. package/dist/types/version.js +1 -1
  49. package/package.json +20 -18
package/dist/scanner.d.ts CHANGED
@@ -4,8 +4,7 @@ export declare class FileScanner {
4
4
  private readonly excludePatterns;
5
5
  private readonly maxFileSize;
6
6
  private readonly binaryExtensions;
7
- scanDirectory(targetPath: string, rules: BaseRule[]): Promise<ScanResult>;
8
- scanFile(filePath: string, rules: BaseRule[]): Promise<ScanResult>;
7
+ scan(targetPath: string, rules: BaseRule[]): Promise<ScanResult>;
9
8
  private findFiles;
10
9
  private isSupportedFile;
11
10
  private readFile;
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG3E,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAOlC;IAGF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAc9B;IAGF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAG/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAW/B;IAGI,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAiCzE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;YAwB1D,SAAS;IAsBvB,OAAO,CAAC,eAAe;YAWT,QAAQ;YAgCR,YAAY;IAkC1B,OAAO,CAAC,gBAAgB;CAmBzB"}
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE3E,qBAAa,WAAW;IAEtB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAOlC;IAGF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAK9B;IAGF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAG/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAI/B;IAGI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;YA6BxD,SAAS;IAcvB,OAAO,CAAC,eAAe;YAMT,QAAQ;YAmBT,YAAY;IA0BzB,OAAO,CAAC,gBAAgB;CAWzB"}
package/dist/scanner.js CHANGED
@@ -37,9 +37,9 @@ exports.FileScanner = void 0;
37
37
  const fs = __importStar(require("fs"));
38
38
  const path = __importStar(require("path"));
39
39
  const glob_1 = require("glob");
40
- // Class for scanning the files for security issues
41
40
  class FileScanner {
42
41
  constructor() {
42
+ // Supported langs/configs, ADD MORE IF NEEDED
43
43
  this.supportedExtensions = [
44
44
  '.js', '.jsx', '.ts', '.tsx', '.vue', '.svelte',
45
45
  '.py', '.php', '.rb', '.go', '.java', '.cs',
@@ -48,185 +48,112 @@ class FileScanner {
48
48
  '.json', '.yaml', '.yml', '.xml', '.env',
49
49
  '.config', '.conf', '.ini', '.toml'
50
50
  ];
51
- // The patterns to exclude from the scan
51
+ // Common build/dependency exclusions
52
52
  this.excludePatterns = [
53
- '**/node_modules/**',
54
- '**/dist/**',
55
- '**/build/**',
56
- '**/.git/**',
57
- '**/coverage/**',
58
- '**/*.min.js',
59
- '**/*.bundle.js',
60
- '**/vendor/**',
61
- '**/__pycache__/**',
62
- '**/*.pyc',
63
- '**/target/**',
64
- '**/bin/**',
65
- '**/obj/**'
53
+ '**/node_modules/**', '**/dist/**', '**/build/**',
54
+ '**/.git/**', '**/coverage/**', '**/*.min.js',
55
+ '**/*.bundle.js', '**/vendor/**', '**/__pycache__/**',
56
+ '**/*.pyc', '**/target/**', '**/bin/**', '**/obj/**'
66
57
  ];
67
- // The maximum file size to scan
58
+ // 5MB limit, can be adjusted. example: 10mb dockerfile = 10 * 1024 * 1024
68
59
  this.maxFileSize = 5 * 1024 * 1024;
69
- // The binary extensions to exclude
60
+ // Heuristics exclude binaries
70
61
  this.binaryExtensions = [
71
- '.exe', '.dll', '.so', '.dylib', '.bin', '.dat',
72
- '.img', '.iso', '.dmg', '.pkg', '.deb', '.rpm',
73
- '.zip', '.tar', '.gz', '.bz2', '.7z', '.rar',
74
- '.jpg', '.jpeg', '.png', '.gif', '.bmp', '.ico',
75
- '.mp3', '.mp4', '.avi', '.mov', '.wmv', '.flv',
76
- '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt',
77
- '.sqlite', '.db', '.mdb', '.accdb',
78
- '.ttf', '.otf', '.woff', '.woff2', '.eot',
79
- '.class', '.jar', '.war', '.ear',
80
- '.o', '.obj', '.lib', '.a'
62
+ '.exe', '.dll', '.so', '.dylib', '.bin',
63
+ '.jpg', '.png', '.gif', '.pdf', '.zip',
64
+ '.mp3', '.mp4', '.sqlite', '.db', '.ttf'
81
65
  ];
82
66
  }
83
- // Scans a directory for security issues
84
- async scanDirectory(targetPath, rules) {
67
+ // Unified scan file or directory
68
+ async scan(targetPath, rules) {
85
69
  const files = await this.findFiles(targetPath);
86
70
  const issues = [];
87
71
  let filesScanned = 0;
88
- let filesSkipped = 0;
72
+ let _filesSkipped = 0;
89
73
  for (const filePath of files) {
90
74
  try {
91
75
  const fileContent = await this.readFile(filePath);
92
76
  if (fileContent) {
93
77
  filesScanned++;
94
78
  for (const rule of rules) {
95
- const ruleIssues = rule.check(fileContent);
96
- issues.push(...ruleIssues);
79
+ issues.push(...rule.check(fileContent));
97
80
  }
98
81
  }
99
82
  else {
100
- filesSkipped++;
83
+ _filesSkipped++;
101
84
  }
102
85
  }
103
- catch (error) {
104
- console.warn(`Warning: Could not scan file ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`);
105
- filesSkipped++;
86
+ catch (_error) {
87
+ _filesSkipped++;
106
88
  }
107
89
  }
108
- if (filesSkipped > 0) {
109
- console.log(`📋 Skipped ${filesSkipped} files (binary, too large, or unreadable)`);
110
- }
90
+ // intentionally reference _filesSkipped to avoid unused variable lint warnings
91
+ void _filesSkipped;
111
92
  return this.createScanResult(issues, filesScanned);
112
93
  }
113
- // Scans a file for security issues
114
- async scanFile(filePath, rules) {
115
- const issues = [];
116
- let filesScanned = 0;
117
- try {
118
- const fileContent = await this.readFile(filePath);
119
- if (fileContent) {
120
- filesScanned = 1;
121
- for (const rule of rules) {
122
- const ruleIssues = rule.check(fileContent);
123
- issues.push(...ruleIssues);
124
- }
125
- }
126
- else {
127
- console.log(`📋 Skipped file: ${filePath} (binary, too large, or unreadable)`);
128
- }
129
- }
130
- catch (error) {
131
- throw new Error(`Could not scan file ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`);
132
- }
133
- return this.createScanResult(issues, filesScanned);
134
- }
135
- // Finds the files to scan
136
94
  async findFiles(targetPath) {
137
95
  const stats = await fs.promises.stat(targetPath);
138
- if (stats.isFile()) {
96
+ if (stats.isFile())
139
97
  return [targetPath];
140
- }
141
- if (!stats.isDirectory()) {
142
- throw new Error(`Target path is neither a file nor a directory: ${targetPath}`);
143
- }
98
+ if (!stats.isDirectory())
99
+ throw new Error(`Not file/dir: ${targetPath}`);
144
100
  const pattern = path.join(targetPath, '**/*');
145
- const allFiles = glob_1.glob.sync(pattern, {
101
+ return glob_1.glob.sync(pattern, {
146
102
  ignore: this.excludePatterns,
147
103
  nodir: true,
148
104
  absolute: true
149
- });
150
- return allFiles.filter((file) => this.isSupportedFile(file));
105
+ }).filter(file => this.isSupportedFile(file));
151
106
  }
152
- // Checks if the file is supported
153
107
  isSupportedFile(filePath) {
154
108
  const ext = path.extname(filePath).toLowerCase();
155
- if (this.binaryExtensions.includes(ext)) {
156
- return false;
157
- }
158
- return this.supportedExtensions.includes(ext);
109
+ return this.supportedExtensions.includes(ext) &&
110
+ !this.binaryExtensions.includes(ext);
159
111
  }
160
- // Reads the file content
161
112
  async readFile(filePath) {
162
113
  try {
163
114
  const stats = await fs.promises.stat(filePath);
164
- if (stats.size > this.maxFileSize) {
165
- console.warn(`Skipping large file: ${filePath} (${Math.round(stats.size / 1024 / 1024)}MB > 5MB limit)`);
166
- return null;
167
- }
168
- if (await this.isBinaryFile(filePath)) {
115
+ if (stats.size > this.maxFileSize || await this.isBinaryFile(filePath)) {
169
116
  return null;
170
117
  }
171
118
  const content = await fs.promises.readFile(filePath, 'utf-8');
172
- const lines = content.split('\n');
173
119
  return {
174
120
  path: filePath,
175
121
  content,
176
- lines
122
+ lines: content.split('\n')
177
123
  };
178
124
  }
179
- catch (error) {
180
- if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
181
- return null;
182
- }
183
- if (error instanceof Error && error.message.includes('invalid')) {
184
- return null;
185
- }
186
- throw error;
125
+ catch {
126
+ return null;
187
127
  }
188
128
  }
189
- // Checks if the file is a binary file
129
+ // Null bytes or non-printable = binary exact threshhold >30%
190
130
  async isBinaryFile(filePath) {
191
131
  try {
192
132
  const fd = await fs.promises.open(filePath, 'r');
193
133
  const buffer = Buffer.alloc(512);
194
134
  const { bytesRead } = await fd.read(buffer, 0, 512, 0);
195
135
  await fd.close();
196
- if (bytesRead === 0) {
136
+ if (bytesRead === 0)
197
137
  return false;
198
- }
199
- for (let i = 0; i < bytesRead; i++) {
200
- if (buffer[i] === 0) {
201
- return true;
202
- }
203
- }
138
+ // Typed array to guarantee numbers
139
+ const data = new Uint8Array(buffer.buffer, buffer.byteOffset, bytesRead);
204
140
  let nonPrintable = 0;
205
- for (let i = 0; i < bytesRead; i++) {
206
- const byte = buffer[i];
207
- if (byte !== undefined) {
208
- if (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) {
209
- nonPrintable++;
210
- }
141
+ for (const byte of data) {
142
+ if (byte === 0)
143
+ return true;
144
+ if (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) {
145
+ nonPrintable++;
211
146
  }
212
147
  }
213
- return (nonPrintable / bytesRead) > 0.3;
148
+ return nonPrintable / data.length > 0.3;
214
149
  }
215
150
  catch {
216
151
  return false;
217
152
  }
218
153
  }
219
- // Creates the scan result
220
154
  createScanResult(issues, filesScanned) {
221
- const summary = {
222
- critical: 0,
223
- high: 0,
224
- medium: 0,
225
- low: 0
226
- };
227
- issues.forEach(issue => {
228
- summary[issue.severity]++;
229
- });
155
+ const summary = { critical: 0, high: 0, medium: 0, low: 0 };
156
+ issues.forEach(issue => summary[issue.severity]++);
230
157
  return {
231
158
  issues,
232
159
  filesScanned,
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "1.2.0";
1
+ export declare const VERSION = "2.1.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = '1.2.0';
4
+ exports.VERSION = '2.1.0';
5
5
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vibe-guard",
3
- "version": "1.2.0",
4
- "description": "██ Vibe-Guard Security Scanner - 28 essential security rules to catch vulnerabilities before they catch you! Zero dependencies, instant setup, works everywhere, optimized performance. Detects SQL injection, XSS, exposed secrets, CSRF, CORS issues, container security, and more.",
3
+ "version": "2.1.0",
4
+ "description": "Vibe-Guard Security Scanner - 30 security rules for code, AI integrations, dependencies, and containers.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
@@ -19,20 +19,17 @@
19
19
  "prepublishOnly": "npm run clean && npm run build",
20
20
  "package": "npm run clean && npm run build && npm run package:all",
21
21
  "package:all": "npm run package:macos && npm run package:linux && npm run package:windows",
22
- "package:macos": "npm run build && pkg dist/bin/vibe-guard.js --target node18-macos-x64 --output binaries/vibe-guard-macos-x64 && pkg dist/bin/vibe-guard.js --target node18-macos-arm64 --output binaries/vibe-guard-macos-arm64",
23
- "package:linux": "npm run build && pkg dist/bin/vibe-guard.js --target node18-linux-x64 --output binaries/vibe-guard-linux-x64 && pkg dist/bin/vibe-guard.js --target node18-linux-arm64 --output binaries/vibe-guard-linux-arm64",
24
- "package:windows": "npm run build && pkg dist/bin/vibe-guard.js --target node18-win-x64 --output binaries/vibe-guard-windows-x64.exe",
22
+ "package:macos": "npm run build && pkg dist/bin/vibe-guard.js --target node22-macos-x64 --output binaries/vibe-guard-macos-x64 && pkg dist/bin/vibe-guard.js --target node22-macos-arm64 --output binaries/vibe-guard-macos-arm64",
23
+ "package:linux": "npm run build && pkg dist/bin/vibe-guard.js --target node22-linux-x64 --output binaries/vibe-guard-linux-x64 && pkg dist/bin/vibe-guard.js --target node22-linux-arm64 --output binaries/vibe-guard-linux-arm64",
24
+ "package:windows": "npm run build && pkg dist/bin/vibe-guard.js --target node22-win-x64 --output binaries/vibe-guard-windows-x64.exe",
25
25
  "dist": "npm run clean && npm run build && npm run package:all",
26
- "maintenance:check": "node scripts/maintenance.js check",
27
- "maintenance:update": "node scripts/maintenance.js update",
28
- "maintenance:full": "node scripts/maintenance.js full",
29
26
  "preversion": "npm test",
30
27
  "version": "git add -A src",
31
28
  "postversion": "git push && git push --tags",
32
- "docs:dev": "vite documents --port 3000",
29
+ "docs:dev": "vite --port 3000",
33
30
  "docs:build": "vite build",
34
31
  "docs:preview": "vite preview --port 3000",
35
- "benchmark": "node scripts/benchmark.js"
32
+ "lint": "eslint 'src/**/*.{ts,js}' --ext .ts,.js"
36
33
  },
37
34
  "keywords": [
38
35
  "security",
@@ -87,28 +84,33 @@
87
84
  "files": [
88
85
  "dist/**/*",
89
86
  "README.md",
90
- "LICENSE",
91
- "CHANGELOG.md"
87
+ "LICENSE"
92
88
  ],
93
89
  "dependencies": {
94
90
  "chalk": "^4.1.2",
95
91
  "cli-table3": "^0.6.3",
96
92
  "commander": "^14.0.0",
97
- "glob": "^8.1.0"
93
+ "glob": "^13.0.0",
94
+ "memfs": "^4.51.1"
98
95
  },
99
96
  "devDependencies": {
100
- "@types/glob": "^8.1.0",
101
97
  "@types/jest": "^29.5.0",
102
98
  "@types/node": "^20.0.0",
99
+ "@typescript-eslint/eslint-plugin": "^8.56.1",
100
+ "@typescript-eslint/parser": "^8.56.1",
101
+ "@typescript-eslint/typescript-estree": "^8.56.1",
102
+ "@yao-pkg/pkg": "^6.25.0",
103
+ "eslint": "^8.45.0",
104
+ "eslint-config-prettier": "^9.1.0",
103
105
  "jest": "^29.5.0",
104
- "pkg": "^5.8.1",
106
+ "minimatch": "^10.1.1",
105
107
  "ts-jest": "^29.1.0",
106
108
  "ts-node": "^10.9.0",
107
- "typescript": "^5.0.0",
108
- "vite": "^5.0.0"
109
+ "typescript": "^5.3.3",
110
+ "vite": "^7.1.11"
109
111
  },
110
112
  "engines": {
111
- "node": ">=16.0.0"
113
+ "node": ">=20.0.0"
112
114
  },
113
115
  "os": [
114
116
  "darwin",