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.
- package/LICENSE +21 -0
- package/README.md +200 -0
- package/dist/bin/vibe-guard.d.ts +3 -0
- package/dist/bin/vibe-guard.d.ts.map +1 -0
- package/dist/bin/vibe-guard.js +119 -0
- package/dist/bin/vibe-guard.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -0
- package/dist/reporter.d.ts +13 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +116 -0
- package/dist/reporter.js.map +1 -0
- package/dist/rules/directory-traversal.d.ts +14 -0
- package/dist/rules/directory-traversal.d.ts.map +1 -0
- package/dist/rules/directory-traversal.js +142 -0
- package/dist/rules/directory-traversal.js.map +1 -0
- package/dist/rules/exposed-secrets.d.ts +13 -0
- package/dist/rules/exposed-secrets.d.ts.map +1 -0
- package/dist/rules/exposed-secrets.js +137 -0
- package/dist/rules/exposed-secrets.js.map +1 -0
- package/dist/rules/hardcoded-sensitive-data.d.ts +13 -0
- package/dist/rules/hardcoded-sensitive-data.d.ts.map +1 -0
- package/dist/rules/hardcoded-sensitive-data.js +104 -0
- package/dist/rules/hardcoded-sensitive-data.js.map +1 -0
- package/dist/rules/index.d.ts +15 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +54 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/insecure-dependencies.d.ts +16 -0
- package/dist/rules/insecure-dependencies.d.ts.map +1 -0
- package/dist/rules/insecure-dependencies.js +152 -0
- package/dist/rules/insecure-dependencies.js.map +1 -0
- package/dist/rules/insecure-http.d.ts +13 -0
- package/dist/rules/insecure-http.d.ts.map +1 -0
- package/dist/rules/insecure-http.js +91 -0
- package/dist/rules/insecure-http.js.map +1 -0
- package/dist/rules/missing-authentication.d.ts +14 -0
- package/dist/rules/missing-authentication.d.ts.map +1 -0
- package/dist/rules/missing-authentication.js +98 -0
- package/dist/rules/missing-authentication.js.map +1 -0
- package/dist/rules/missing-security-headers.d.ts +16 -0
- package/dist/rules/missing-security-headers.d.ts.map +1 -0
- package/dist/rules/missing-security-headers.js +158 -0
- package/dist/rules/missing-security-headers.js.map +1 -0
- package/dist/rules/open-cors.d.ts +11 -0
- package/dist/rules/open-cors.d.ts.map +1 -0
- package/dist/rules/open-cors.js +61 -0
- package/dist/rules/open-cors.js.map +1 -0
- package/dist/rules/sql-injection.d.ts +12 -0
- package/dist/rules/sql-injection.d.ts.map +1 -0
- package/dist/rules/sql-injection.js +95 -0
- package/dist/rules/sql-injection.js.map +1 -0
- package/dist/rules/unvalidated-input.d.ts +13 -0
- package/dist/rules/unvalidated-input.d.ts.map +1 -0
- package/dist/rules/unvalidated-input.js +128 -0
- package/dist/rules/unvalidated-input.js.map +1 -0
- package/dist/scanner.d.ts +15 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +240 -0
- package/dist/scanner.js.map +1 -0
- package/dist/types/index.d.ts +66 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +38 -0
- package/dist/types/index.js.map +1 -0
- 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
|
+
}
|