@reliabilityworks/core 0.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 (50) hide show
  1. package/dist/builtinRules.d.ts +3 -0
  2. package/dist/builtinRules.d.ts.map +1 -0
  3. package/dist/builtinRules.js +41 -0
  4. package/dist/builtinRules.js.map +1 -0
  5. package/dist/frameworks.d.ts +5 -0
  6. package/dist/frameworks.d.ts.map +1 -0
  7. package/dist/frameworks.js +169 -0
  8. package/dist/frameworks.js.map +1 -0
  9. package/dist/index.d.ts +6 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +22 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/reporters/html.d.ts +3 -0
  14. package/dist/reporters/html.d.ts.map +1 -0
  15. package/dist/reporters/html.js +64 -0
  16. package/dist/reporters/html.js.map +1 -0
  17. package/dist/reporters/sarif.d.ts +52 -0
  18. package/dist/reporters/sarif.d.ts.map +1 -0
  19. package/dist/reporters/sarif.js +76 -0
  20. package/dist/reporters/sarif.js.map +1 -0
  21. package/dist/scan.d.ts +5 -0
  22. package/dist/scan.d.ts.map +1 -0
  23. package/dist/scan.js +315 -0
  24. package/dist/scan.js.map +1 -0
  25. package/dist/types.d.ts +77 -0
  26. package/dist/types.d.ts.map +1 -0
  27. package/dist/types.js +3 -0
  28. package/dist/types.js.map +1 -0
  29. package/package.json +18 -0
  30. package/src/builtinRules.ts +39 -0
  31. package/src/frameworks.ts +202 -0
  32. package/src/index.ts +5 -0
  33. package/src/picomatch.d.ts +10 -0
  34. package/src/reporters/html.ts +65 -0
  35. package/src/reporters/sarif.ts +115 -0
  36. package/src/scan.ts +379 -0
  37. package/src/types.ts +90 -0
  38. package/test/fixtures/monorepo/apps/api/next.config.js +3 -0
  39. package/test/fixtures/monorepo/apps/api/package.json +7 -0
  40. package/test/fixtures/monorepo/apps/kit/package.json +7 -0
  41. package/test/fixtures/monorepo/apps/kit/svelte.config.js +9 -0
  42. package/test/fixtures/monorepo/apps/web/next-env.d.ts +1 -0
  43. package/test/fixtures/monorepo/apps/web/next.config.js +3 -0
  44. package/test/fixtures/monorepo/apps/web/package.json +7 -0
  45. package/test/fixtures/sample-repo/.env +2 -0
  46. package/test/fixtures/sample-repo/keys.txt +3 -0
  47. package/test/fixtures/sample-repo/src/index.ts +1 -0
  48. package/test/frameworksWorkspace.test.js +15 -0
  49. package/test/scanProject.test.js +15 -0
  50. package/tsconfig.json +8 -0
package/dist/scan.js ADDED
@@ -0,0 +1,315 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.severityFromString = severityFromString;
7
+ exports.scanProject = scanProject;
8
+ const node_crypto_1 = __importDefault(require("node:crypto"));
9
+ const promises_1 = __importDefault(require("node:fs/promises"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const fast_glob_1 = __importDefault(require("fast-glob"));
12
+ const picomatch_1 = __importDefault(require("picomatch"));
13
+ const zod_1 = require("zod");
14
+ const yaml_1 = __importDefault(require("yaml"));
15
+ const builtinRules_1 = require("./builtinRules");
16
+ const frameworks_1 = require("./frameworks");
17
+ const DEFAULT_IGNORES = [
18
+ '**/.git/**',
19
+ '**/node_modules/**',
20
+ '**/dist/**',
21
+ '**/build/**',
22
+ '**/coverage/**',
23
+ '**/.next/**',
24
+ '**/.turbo/**',
25
+ '**/.cache/**',
26
+ '**/.yarn/**',
27
+ '**/.pnpm/**',
28
+ ];
29
+ const DEFAULT_MAX_FILE_SIZE_BYTES = 1024 * 1024;
30
+ function severityFromString(name) {
31
+ switch (name) {
32
+ case 'critical':
33
+ return { name, rank: 0 };
34
+ case 'high':
35
+ return { name, rank: 1 };
36
+ case 'medium':
37
+ return { name, rank: 2 };
38
+ case 'low':
39
+ return { name, rank: 3 };
40
+ }
41
+ }
42
+ function fileExists(p) {
43
+ return promises_1.default
44
+ .stat(p)
45
+ .then(() => true)
46
+ .catch(() => false);
47
+ }
48
+ function sha256Hex(input) {
49
+ return node_crypto_1.default.createHash('sha256').update(input).digest('hex');
50
+ }
51
+ function isLikelyBinary(buffer) {
52
+ for (const b of buffer) {
53
+ if (b === 0)
54
+ return true;
55
+ }
56
+ return false;
57
+ }
58
+ function computeLineInfo(text, matchIndex) {
59
+ const upToMatch = text.slice(0, matchIndex);
60
+ const lines = upToMatch.split('\n');
61
+ const lineNumber = lines.length;
62
+ const columnNumber = lines[lines.length - 1]?.length ?? 0;
63
+ const fullLines = text.split('\n');
64
+ const lineText = fullLines[lineNumber - 1] ?? '';
65
+ return {
66
+ lineNumber,
67
+ columnNumber: columnNumber + 1,
68
+ lineText,
69
+ };
70
+ }
71
+ function fingerprintForMatch(args) {
72
+ const material = [
73
+ `rule:${args.ruleId}`,
74
+ `path:${args.relativePath}`,
75
+ args.matchText ? `match:${args.matchText}` : undefined,
76
+ args.lineText ? `line:${args.lineText.trim()}` : undefined,
77
+ ]
78
+ .filter(Boolean)
79
+ .join('\n');
80
+ return sha256Hex(material);
81
+ }
82
+ const ignoreEntrySchema = zod_1.z.union([
83
+ zod_1.z.object({
84
+ rule: zod_1.z.string().min(1),
85
+ reason: zod_1.z.string().min(1),
86
+ paths: zod_1.z.array(zod_1.z.string().min(1)).optional(),
87
+ }),
88
+ zod_1.z.object({
89
+ finding: zod_1.z.string().min(1),
90
+ reason: zod_1.z.string().min(1),
91
+ }),
92
+ ]);
93
+ const configSchema = zod_1.z.object({
94
+ ignore: zod_1.z.array(ignoreEntrySchema).optional(),
95
+ });
96
+ function loadConfig(configRootDir, configPath) {
97
+ const candidates = configPath
98
+ ? [configPath]
99
+ : [node_path_1.default.join(configRootDir, '.vibesec.yaml'), node_path_1.default.join(configRootDir, '.vibesec.yml')];
100
+ return (async () => {
101
+ for (const candidate of candidates) {
102
+ if (!(await fileExists(candidate)))
103
+ continue;
104
+ const raw = await promises_1.default.readFile(candidate, 'utf8');
105
+ const parsed = yaml_1.default.parse(raw);
106
+ const validated = configSchema.safeParse(parsed);
107
+ if (!validated.success) {
108
+ throw new Error(`Invalid config at ${candidate}`);
109
+ }
110
+ return validated.data;
111
+ }
112
+ return {};
113
+ })();
114
+ }
115
+ const ruleSchema = zod_1.z.object({
116
+ id: zod_1.z.string().min(1),
117
+ severity: zod_1.z.union([
118
+ zod_1.z.literal('critical'),
119
+ zod_1.z.literal('high'),
120
+ zod_1.z.literal('medium'),
121
+ zod_1.z.literal('low'),
122
+ ]),
123
+ title: zod_1.z.string().min(1),
124
+ description: zod_1.z.string().optional(),
125
+ matcher: zod_1.z.union([
126
+ zod_1.z.object({
127
+ type: zod_1.z.literal('file_presence'),
128
+ paths: zod_1.z.array(zod_1.z.string().min(1)).min(1),
129
+ message: zod_1.z.string().min(1),
130
+ }),
131
+ zod_1.z.object({
132
+ type: zod_1.z.literal('regex'),
133
+ fileGlobs: zod_1.z.array(zod_1.z.string().min(1)).min(1),
134
+ pattern: zod_1.z.string().min(1),
135
+ flags: zod_1.z.string().optional(),
136
+ message: zod_1.z.string().min(1),
137
+ }),
138
+ ]),
139
+ });
140
+ async function loadCustomRules(configRootDir, customRulesDir) {
141
+ const rulesDir = customRulesDir ?? node_path_1.default.join(configRootDir, '.vibesec', 'rules');
142
+ if (!(await fileExists(rulesDir)))
143
+ return [];
144
+ const entries = await promises_1.default.readdir(rulesDir, { withFileTypes: true });
145
+ const ruleFiles = entries
146
+ .filter((e) => e.isFile())
147
+ .map((e) => e.name)
148
+ .filter((name) => name.endsWith('.yml') || name.endsWith('.yaml') || name.endsWith('.json'));
149
+ const rules = [];
150
+ for (const fileName of ruleFiles) {
151
+ const fullPath = node_path_1.default.join(rulesDir, fileName);
152
+ const raw = await promises_1.default.readFile(fullPath, 'utf8');
153
+ const parsed = fileName.endsWith('.json') ? JSON.parse(raw) : yaml_1.default.parse(raw);
154
+ const items = Array.isArray(parsed) ? parsed : [parsed];
155
+ for (const item of items) {
156
+ const validated = ruleSchema.safeParse(item);
157
+ if (!validated.success) {
158
+ throw new Error(`Invalid custom rule in ${fullPath}`);
159
+ }
160
+ rules.push(validated.data);
161
+ }
162
+ }
163
+ return rules;
164
+ }
165
+ function isIgnored(config, finding) {
166
+ const ignores = config.ignore ?? [];
167
+ for (const entry of ignores) {
168
+ if ('finding' in entry) {
169
+ if (entry.finding === finding.fingerprint)
170
+ return true;
171
+ continue;
172
+ }
173
+ if (entry.rule !== finding.ruleId)
174
+ continue;
175
+ if (!entry.paths || entry.paths.length === 0)
176
+ return true;
177
+ const matchesPath = (0, picomatch_1.default)(entry.paths, { dot: true });
178
+ if (matchesPath(finding.location.path))
179
+ return true;
180
+ }
181
+ return false;
182
+ }
183
+ async function listProjectFiles(rootDir) {
184
+ return (0, fast_glob_1.default)('**/*', {
185
+ cwd: rootDir,
186
+ dot: true,
187
+ onlyFiles: true,
188
+ followSymbolicLinks: false,
189
+ ignore: DEFAULT_IGNORES,
190
+ });
191
+ }
192
+ async function readTextFileIfSafe(fullPath, maxBytes) {
193
+ const stat = await promises_1.default.stat(fullPath);
194
+ if (stat.size > maxBytes)
195
+ return null;
196
+ const handle = await promises_1.default.open(fullPath, 'r');
197
+ try {
198
+ const probeSize = Math.min(stat.size, 4096);
199
+ const probe = Buffer.alloc(probeSize);
200
+ await handle.read(probe, 0, probeSize, 0);
201
+ if (isLikelyBinary(probe))
202
+ return null;
203
+ return await handle.readFile({ encoding: 'utf8' });
204
+ }
205
+ finally {
206
+ await handle.close();
207
+ }
208
+ }
209
+ function makeFinding(args) {
210
+ const severity = severityFromString(args.rule.severity);
211
+ const fingerprint = fingerprintForMatch({
212
+ ruleId: args.rule.id,
213
+ relativePath: args.location.path,
214
+ matchText: args.matchText,
215
+ lineText: args.lineText,
216
+ });
217
+ return {
218
+ ruleId: args.rule.id,
219
+ ruleTitle: args.rule.title,
220
+ ruleDescription: args.rule.description,
221
+ severity: args.rule.severity,
222
+ severityRank: severity.rank,
223
+ message: args.message,
224
+ location: args.location,
225
+ fingerprint,
226
+ excerpt: args.excerpt,
227
+ };
228
+ }
229
+ async function scanProject(options) {
230
+ const scanDir = node_path_1.default.resolve(options.rootDir);
231
+ const configRootDir = node_path_1.default.resolve(options.configRootDir ?? scanDir);
232
+ const pathBaseDir = node_path_1.default.resolve(options.pathBaseDir ?? scanDir);
233
+ const maxFileSizeBytes = options.maxFileSizeBytes ?? DEFAULT_MAX_FILE_SIZE_BYTES;
234
+ const config = await loadConfig(configRootDir, options.configPath);
235
+ const additionalRules = options.additionalRules ?? [];
236
+ const rules = [
237
+ ...builtinRules_1.BUILTIN_RULES,
238
+ ...(await loadCustomRules(configRootDir, options.customRulesDir)),
239
+ ...additionalRules,
240
+ ];
241
+ const frameworks = options.frameworks ?? (await (0, frameworks_1.detectFrameworks)(scanDir));
242
+ const files = await listProjectFiles(scanDir);
243
+ const toBasePath = (scanRelativePath) => {
244
+ const absolutePath = node_path_1.default.join(scanDir, scanRelativePath);
245
+ const rel = node_path_1.default.relative(pathBaseDir, absolutePath);
246
+ return (rel || scanRelativePath).split(node_path_1.default.sep).join('/');
247
+ };
248
+ const findings = [];
249
+ let ignoredFindings = 0;
250
+ for (const rule of rules) {
251
+ if (rule.matcher.type === 'file_presence') {
252
+ const matches = files.filter((0, picomatch_1.default)(rule.matcher.paths, { dot: true }));
253
+ for (const relativePath of matches) {
254
+ const finding = makeFinding({
255
+ rule,
256
+ location: { path: toBasePath(relativePath), startLine: 1, startColumn: 1 },
257
+ message: rule.matcher.message,
258
+ });
259
+ if (isIgnored(config, finding)) {
260
+ ignoredFindings += 1;
261
+ continue;
262
+ }
263
+ findings.push(finding);
264
+ }
265
+ continue;
266
+ }
267
+ const compiled = new RegExp(rule.matcher.pattern, rule.matcher.flags);
268
+ const matchesFile = (0, picomatch_1.default)(rule.matcher.fileGlobs, { dot: true });
269
+ for (const relativePath of files) {
270
+ if (!matchesFile(relativePath))
271
+ continue;
272
+ const fullPath = node_path_1.default.join(scanDir, relativePath);
273
+ let text;
274
+ try {
275
+ text = await readTextFileIfSafe(fullPath, maxFileSizeBytes);
276
+ }
277
+ catch {
278
+ continue;
279
+ }
280
+ if (!text)
281
+ continue;
282
+ const match = compiled.exec(text);
283
+ if (!match || match.index == null)
284
+ continue;
285
+ const { lineNumber, columnNumber, lineText } = computeLineInfo(text, match.index);
286
+ const excerpt = lineText.trim().slice(0, 300);
287
+ const finding = makeFinding({
288
+ rule,
289
+ location: {
290
+ path: toBasePath(relativePath),
291
+ startLine: lineNumber,
292
+ startColumn: columnNumber,
293
+ },
294
+ message: rule.matcher.message,
295
+ excerpt,
296
+ matchText: match[0],
297
+ lineText,
298
+ });
299
+ if (isIgnored(config, finding)) {
300
+ ignoredFindings += 1;
301
+ continue;
302
+ }
303
+ findings.push(finding);
304
+ }
305
+ }
306
+ findings.sort((a, b) => a.severityRank - b.severityRank);
307
+ return {
308
+ rootDir: scanDir,
309
+ frameworks,
310
+ scannedFiles: files.length,
311
+ ignoredFindings,
312
+ findings,
313
+ };
314
+ }
315
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ export type SeverityName = 'critical' | 'high' | 'medium' | 'low';
2
+ export type Severity = {
3
+ name: SeverityName;
4
+ rank: number;
5
+ };
6
+ export type FindingLocation = {
7
+ path: string;
8
+ startLine: number;
9
+ startColumn: number;
10
+ };
11
+ export type Finding = {
12
+ ruleId: string;
13
+ ruleTitle: string;
14
+ ruleDescription?: string;
15
+ severity: SeverityName;
16
+ severityRank: number;
17
+ message: string;
18
+ location: FindingLocation;
19
+ fingerprint: string;
20
+ excerpt?: string;
21
+ };
22
+ export type FrameworkId = 'nextjs' | 'react-native' | 'expo' | 'express' | 'sveltekit';
23
+ export type FrameworkDetection = {
24
+ id: FrameworkId;
25
+ confidence: 'high' | 'medium' | 'low';
26
+ evidence: string[];
27
+ };
28
+ export type ScanResult = {
29
+ rootDir: string;
30
+ frameworks: FrameworkDetection[];
31
+ scannedFiles: number;
32
+ ignoredFindings: number;
33
+ findings: Finding[];
34
+ };
35
+ export type ScanOptions = {
36
+ rootDir: string;
37
+ pathBaseDir?: string;
38
+ configRootDir?: string;
39
+ configPath?: string;
40
+ customRulesDir?: string;
41
+ frameworks?: FrameworkDetection[];
42
+ additionalRules?: Rule[];
43
+ maxFileSizeBytes?: number;
44
+ };
45
+ export type IgnoreByRule = {
46
+ rule: string;
47
+ reason: string;
48
+ paths?: string[];
49
+ };
50
+ export type IgnoreByFinding = {
51
+ finding: string;
52
+ reason: string;
53
+ };
54
+ export type VibeSecConfig = {
55
+ ignore?: Array<IgnoreByRule | IgnoreByFinding>;
56
+ };
57
+ export type FilePresenceMatcher = {
58
+ type: 'file_presence';
59
+ paths: string[];
60
+ message: string;
61
+ };
62
+ export type RegexMatcher = {
63
+ type: 'regex';
64
+ fileGlobs: string[];
65
+ pattern: string;
66
+ flags?: string;
67
+ message: string;
68
+ };
69
+ export type RuleMatcher = FilePresenceMatcher | RegexMatcher;
70
+ export type Rule = {
71
+ id: string;
72
+ severity: SeverityName;
73
+ title: string;
74
+ description?: string;
75
+ matcher: RuleMatcher;
76
+ };
77
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@reliabilityworks/core",
3
+ "version": "0.1.0",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "scripts": {
7
+ "build": "tsc -p tsconfig.json",
8
+ "lint": "eslint .",
9
+ "test": "pnpm build && node --test test/*.test.js",
10
+ "typecheck": "tsc -p tsconfig.json --noEmit"
11
+ },
12
+ "dependencies": {
13
+ "fast-glob": "^3.0.0",
14
+ "picomatch": "^4.0.0",
15
+ "yaml": "^2.0.0",
16
+ "zod": "^3.0.0"
17
+ }
18
+ }
@@ -0,0 +1,39 @@
1
+ import type { Rule } from './types'
2
+
3
+ export const BUILTIN_RULES: Rule[] = [
4
+ {
5
+ id: 'core/env-file-committed',
6
+ severity: 'critical',
7
+ title: '.env file committed',
8
+ description: 'Environment files often contain secrets and should not be committed.',
9
+ matcher: {
10
+ type: 'file_presence',
11
+ paths: ['.env', '.env.*'],
12
+ message: 'Environment file present in repository',
13
+ },
14
+ },
15
+ {
16
+ id: 'core/private-key-committed',
17
+ severity: 'critical',
18
+ title: 'Private key committed',
19
+ description: 'Private keys should never be stored in repositories.',
20
+ matcher: {
21
+ type: 'regex',
22
+ fileGlobs: ['**/*'],
23
+ pattern: '-----BEGIN (?:RSA|EC|OPENSSH|DSA) PRIVATE KEY-----',
24
+ message: 'Private key material detected',
25
+ },
26
+ },
27
+ {
28
+ id: 'core/hardcoded-aws-access-key-id',
29
+ severity: 'high',
30
+ title: 'Hardcoded AWS access key ID',
31
+ description: 'AWS access key IDs should not be embedded in source code.',
32
+ matcher: {
33
+ type: 'regex',
34
+ fileGlobs: ['**/*.{js,jsx,ts,tsx,json,yaml,yml,env,txt,md}'],
35
+ pattern: '\\bAKIA[0-9A-Z]{16}\\b',
36
+ message: 'Potential AWS access key ID detected',
37
+ },
38
+ },
39
+ ]