vibe-guard 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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -0
  3. package/dist/bin/vibe-guard.d.ts +3 -0
  4. package/dist/bin/vibe-guard.d.ts.map +1 -0
  5. package/dist/bin/vibe-guard.js +119 -0
  6. package/dist/bin/vibe-guard.js.map +1 -0
  7. package/dist/index.d.ts +19 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +128 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/reporter.d.ts +13 -0
  12. package/dist/reporter.d.ts.map +1 -0
  13. package/dist/reporter.js +116 -0
  14. package/dist/reporter.js.map +1 -0
  15. package/dist/rules/directory-traversal.d.ts +14 -0
  16. package/dist/rules/directory-traversal.d.ts.map +1 -0
  17. package/dist/rules/directory-traversal.js +142 -0
  18. package/dist/rules/directory-traversal.js.map +1 -0
  19. package/dist/rules/exposed-secrets.d.ts +13 -0
  20. package/dist/rules/exposed-secrets.d.ts.map +1 -0
  21. package/dist/rules/exposed-secrets.js +137 -0
  22. package/dist/rules/exposed-secrets.js.map +1 -0
  23. package/dist/rules/hardcoded-sensitive-data.d.ts +13 -0
  24. package/dist/rules/hardcoded-sensitive-data.d.ts.map +1 -0
  25. package/dist/rules/hardcoded-sensitive-data.js +104 -0
  26. package/dist/rules/hardcoded-sensitive-data.js.map +1 -0
  27. package/dist/rules/index.d.ts +15 -0
  28. package/dist/rules/index.d.ts.map +1 -0
  29. package/dist/rules/index.js +54 -0
  30. package/dist/rules/index.js.map +1 -0
  31. package/dist/rules/insecure-dependencies.d.ts +16 -0
  32. package/dist/rules/insecure-dependencies.d.ts.map +1 -0
  33. package/dist/rules/insecure-dependencies.js +152 -0
  34. package/dist/rules/insecure-dependencies.js.map +1 -0
  35. package/dist/rules/insecure-http.d.ts +13 -0
  36. package/dist/rules/insecure-http.d.ts.map +1 -0
  37. package/dist/rules/insecure-http.js +91 -0
  38. package/dist/rules/insecure-http.js.map +1 -0
  39. package/dist/rules/missing-authentication.d.ts +14 -0
  40. package/dist/rules/missing-authentication.d.ts.map +1 -0
  41. package/dist/rules/missing-authentication.js +98 -0
  42. package/dist/rules/missing-authentication.js.map +1 -0
  43. package/dist/rules/missing-security-headers.d.ts +16 -0
  44. package/dist/rules/missing-security-headers.d.ts.map +1 -0
  45. package/dist/rules/missing-security-headers.js +158 -0
  46. package/dist/rules/missing-security-headers.js.map +1 -0
  47. package/dist/rules/open-cors.d.ts +11 -0
  48. package/dist/rules/open-cors.d.ts.map +1 -0
  49. package/dist/rules/open-cors.js +61 -0
  50. package/dist/rules/open-cors.js.map +1 -0
  51. package/dist/rules/sql-injection.d.ts +12 -0
  52. package/dist/rules/sql-injection.d.ts.map +1 -0
  53. package/dist/rules/sql-injection.js +95 -0
  54. package/dist/rules/sql-injection.js.map +1 -0
  55. package/dist/rules/unvalidated-input.d.ts +13 -0
  56. package/dist/rules/unvalidated-input.d.ts.map +1 -0
  57. package/dist/rules/unvalidated-input.js +128 -0
  58. package/dist/rules/unvalidated-input.js.map +1 -0
  59. package/dist/scanner.d.ts +15 -0
  60. package/dist/scanner.d.ts.map +1 -0
  61. package/dist/scanner.js +240 -0
  62. package/dist/scanner.js.map +1 -0
  63. package/dist/types/index.d.ts +66 -0
  64. package/dist/types/index.d.ts.map +1 -0
  65. package/dist/types/index.js +38 -0
  66. package/dist/types/index.js.map +1 -0
  67. package/package.json +72 -0
@@ -0,0 +1,66 @@
1
+ export type SeverityLevel = 'critical' | 'high' | 'medium' | 'low';
2
+ export interface SecurityIssue {
3
+ rule: string;
4
+ severity: SeverityLevel;
5
+ message: string;
6
+ file: string;
7
+ line: number;
8
+ column: number;
9
+ code: string;
10
+ suggestion: string;
11
+ }
12
+ export interface ScanOptions {
13
+ target: string;
14
+ format: 'table' | 'json';
15
+ verbose: boolean;
16
+ exclude?: string[];
17
+ include?: string[];
18
+ }
19
+ export interface RuleMatch {
20
+ pattern: RegExp;
21
+ message: string;
22
+ severity: SeverityLevel;
23
+ suggestion: string;
24
+ }
25
+ export interface FileContent {
26
+ path: string;
27
+ content: string;
28
+ lines: string[];
29
+ }
30
+ export interface ScanResult {
31
+ issues: SecurityIssue[];
32
+ filesScanned: number;
33
+ issuesFound: number;
34
+ summary: {
35
+ critical: number;
36
+ high: number;
37
+ medium: number;
38
+ low: number;
39
+ };
40
+ }
41
+ export interface RuleConfig {
42
+ enabled: boolean;
43
+ severity?: SeverityLevel;
44
+ patterns?: string[];
45
+ excludePatterns?: string[];
46
+ }
47
+ export interface VibeGuardConfig {
48
+ rules: Record<string, RuleConfig>;
49
+ exclude: string[];
50
+ include: string[];
51
+ outputFormat: 'table' | 'json';
52
+ }
53
+ export declare abstract class BaseRule {
54
+ abstract readonly name: string;
55
+ abstract readonly description: string;
56
+ abstract readonly severity: SeverityLevel;
57
+ abstract check(fileContent: FileContent): SecurityIssue[];
58
+ protected createIssue(file: string, line: number, column: number, code: string, message: string, suggestion: string, severity?: SeverityLevel): SecurityIssue;
59
+ protected findMatches(content: string, pattern: RegExp): Array<{
60
+ match: RegExpMatchArray;
61
+ line: number;
62
+ column: number;
63
+ lineContent: string;
64
+ }>;
65
+ }
66
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,OAAO,GAAG,MAAM,CAAC;CAChC;AAED,8BAAsB,QAAQ;IAC5B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IAE1C,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,aAAa,EAAE;IAEzD,SAAS,CAAC,WAAW,CACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,aAAa,GACvB,aAAa;IAahB,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QAC7D,KAAK,EAAE,gBAAgB,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CA2BH"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseRule = void 0;
4
+ class BaseRule {
5
+ createIssue(file, line, column, code, message, suggestion, severity) {
6
+ return {
7
+ rule: this.name,
8
+ severity: severity || this.severity,
9
+ message,
10
+ file,
11
+ line,
12
+ column,
13
+ code: code.trim(),
14
+ suggestion
15
+ };
16
+ }
17
+ findMatches(content, pattern) {
18
+ const lines = content.split('\n');
19
+ const matches = [];
20
+ lines.forEach((lineContent, lineIndex) => {
21
+ let match;
22
+ const globalPattern = new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g');
23
+ while ((match = globalPattern.exec(lineContent)) !== null) {
24
+ matches.push({
25
+ match,
26
+ line: lineIndex + 1,
27
+ column: (match.index ?? 0) + 1,
28
+ lineContent
29
+ });
30
+ if (!pattern.flags.includes('g'))
31
+ break;
32
+ }
33
+ });
34
+ return matches;
35
+ }
36
+ }
37
+ exports.BaseRule = BaseRule;
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;AA4DA,MAAsB,QAAQ;IAOlB,WAAW,CACnB,IAAY,EACZ,IAAY,EACZ,MAAc,EACd,IAAY,EACZ,OAAe,EACf,UAAkB,EAClB,QAAwB;QAExB,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ;YACnC,OAAO;YACP,IAAI;YACJ,IAAI;YACJ,MAAM;YACN,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACjB,UAAU;SACX,CAAC;IACJ,CAAC;IAES,WAAW,CAAC,OAAe,EAAE,OAAe;QAMpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAKR,EAAE,CAAC;QAER,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE;YACvC,IAAI,KAA8B,CAAC;YACnC,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;YAEpH,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK;oBACL,IAAI,EAAE,SAAS,GAAG,CAAC;oBACnB,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;oBAC9B,WAAW;iBACZ,CAAC,CAAC;gBAEH,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,MAAM;YAC1C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AA5DD,4BA4DC"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "vibe-guard",
3
+ "version": "1.0.0",
4
+ "description": "🛡️ Vibe-Guard Security Scanner - Catch security issues before they catch you!",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "vibe-guard": "./dist/bin/vibe-guard.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "ts-node src/bin/vibe-guard.ts",
12
+ "start": "node dist/bin/vibe-guard.js",
13
+ "test": "npm run build && node dist/bin/vibe-guard.js .",
14
+ "clean": "rm -rf dist",
15
+ "prepublishOnly": "npm run clean && npm run build",
16
+ "package": "npm run clean && npm run build && npm run package",
17
+ "package:macos": "npm run build && pkg dist/bin/vibe-guard.js --targets node18-macos-x64 --out-path binaries",
18
+ "package:linux": "npm run build && pkg dist/bin/vibe-guard.js --targets node18-linux-x64 --out-path binaries",
19
+ "package:windows": "npm run build && pkg dist/bin/vibe-guard.js --targets node18-win-x64 --out-path binaries",
20
+ "dist": "npm run clean && npm run build && npm run package"
21
+ },
22
+ "keywords": [
23
+ "security",
24
+ "scanner",
25
+ "vulnerability",
26
+ "cli",
27
+ "typescript",
28
+ "javascript",
29
+ "secrets",
30
+ "authentication"
31
+ ],
32
+ "author": "Devjosef <dev.josef1@gmail.com>",
33
+ "license": "MIT",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/Devjosef/vibe-guard.git"
37
+ },
38
+ "bugs": {
39
+ "url": "https://github.com/Devjosef/vibe-guard/issues"
40
+ },
41
+ "homepage": "https://github.com/Devjosef/vibe-guard#readme",
42
+ "files": [
43
+ "dist/**/*",
44
+ "README.md",
45
+ "LICENSE"
46
+ ],
47
+ "dependencies": {
48
+ "commander": "^11.1.0",
49
+ "glob": "^10.3.10",
50
+ "cli-table3": "^0.6.3",
51
+ "chalk": "^4.1.2"
52
+ },
53
+ "devDependencies": {
54
+ "@types/node": "^20.10.0",
55
+ "@types/glob": "^8.1.0",
56
+ "typescript": "^5.3.0",
57
+ "ts-node": "^10.9.0",
58
+ "pkg": "^5.8.1"
59
+ },
60
+ "engines": {
61
+ "node": ">=16.0.0"
62
+ },
63
+ "pkg": {
64
+ "scripts": [
65
+ "dist/**/*.js"
66
+ ],
67
+ "assets": [
68
+ "package.json"
69
+ ],
70
+ "outputPath": "binaries"
71
+ }
72
+ }