@reliabilityworks/vibesec 1.0.1 → 1.0.3

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/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA0MA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4G1D"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA6SA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+H1D"}
package/dist/cli.js CHANGED
@@ -11,21 +11,91 @@ const node_path_1 = __importDefault(require("node:path"));
11
11
  const commander_1 = require("commander");
12
12
  const analyzer_javascript_1 = require("@reliabilityworks/analyzer-javascript");
13
13
  const core_1 = require("@reliabilityworks/core");
14
- function formatCliOutput(result) {
14
+ function createAnsiTheme(enabled) {
15
+ const wrap = (open, close) => (s) => (enabled ? `${open}${s}${close}` : s);
16
+ const reset = '\x1b[0m';
17
+ const bold = wrap('\x1b[1m', reset);
18
+ const dim = wrap('\x1b[2m', reset);
19
+ const red = wrap('\x1b[31m', reset);
20
+ const yellow = wrap('\x1b[33m', reset);
21
+ const blue = wrap('\x1b[34m', reset);
22
+ const magenta = wrap('\x1b[35m', reset);
23
+ const green = wrap('\x1b[32m', reset);
24
+ const cyan = wrap('\x1b[36m', reset);
25
+ return {
26
+ critical: red,
27
+ high: yellow,
28
+ medium: magenta,
29
+ low: blue,
30
+ info: green,
31
+ ruleId: cyan,
32
+ location: dim,
33
+ muted: dim,
34
+ bold,
35
+ };
36
+ }
37
+ function shouldUseColor(options) {
38
+ if (options.outFile)
39
+ return false;
40
+ if (process.env.NO_COLOR != null)
41
+ return false;
42
+ if (process.env.TERM === 'dumb')
43
+ return false;
44
+ if (!process.stdout.isTTY)
45
+ return false;
46
+ if (typeof options.color === 'boolean')
47
+ return options.color;
48
+ return true;
49
+ }
50
+ function formatCliOutput(result, options = { output: 'cli' }) {
51
+ const theme = createAnsiTheme(shouldUseColor(options));
15
52
  const lines = [];
16
- if (result.frameworks.length > 0) {
17
- const frameworkList = result.frameworks.map((f) => f.id).join(', ');
18
- lines.push(`Frameworks: ${frameworkList}`);
53
+ const divider = theme.muted('────────────────────────────────────────────────────────────');
54
+ if (result.findings.length > 0) {
55
+ lines.push(divider);
19
56
  lines.push('');
20
57
  }
21
58
  for (const finding of result.findings) {
22
- lines.push(`${finding.severity.toUpperCase()} ${finding.ruleId} ${finding.location.path}:${finding.location.startLine}`);
23
- lines.push(` ${finding.message}`);
59
+ const severity = finding.severity.toUpperCase();
60
+ const severityColor = finding.severity === 'critical'
61
+ ? theme.critical
62
+ : finding.severity === 'high'
63
+ ? theme.high
64
+ : finding.severity === 'medium'
65
+ ? theme.medium
66
+ : theme.low;
67
+ const header = `${severityColor('●')} ${severityColor(severity)} ${theme.ruleId(finding.ruleId)}`;
68
+ lines.push(header);
69
+ lines.push(`${theme.bold(finding.message)}`);
70
+ lines.push(theme.location(`${finding.location.path}:${finding.location.startLine}`));
71
+ if (finding.excerpt) {
72
+ lines.push('');
73
+ lines.push(` ${theme.muted(finding.excerpt)}`);
74
+ }
24
75
  lines.push('');
25
76
  }
26
- lines.push(`Scan complete: ${result.findings.length} issue(s) found`);
77
+ if (result.findings.length > 0) {
78
+ lines.push(divider);
79
+ lines.push('');
80
+ }
81
+ const count = result.findings.length;
82
+ const noun = count === 1 ? 'issue' : 'issues';
83
+ lines.push(`Scan complete. ${count} ${noun} found.`);
27
84
  return lines.join('\n') + '\n';
28
85
  }
86
+ function shouldShowInfo(options) {
87
+ if (options.output !== 'cli')
88
+ return false;
89
+ if (options.outFile)
90
+ return false;
91
+ return Boolean(process.stderr.isTTY);
92
+ }
93
+ function logInfo(message, options) {
94
+ if (!shouldShowInfo(options))
95
+ return;
96
+ const theme = createAnsiTheme(shouldUseColor(options));
97
+ process.stderr.write(`${theme.info('[info]')} ${message}\n`);
98
+ }
29
99
  function parseFrameworkIds(input) {
30
100
  if (!input || input === 'auto')
31
101
  return [];
@@ -164,18 +234,35 @@ async function runCli(argv) {
164
234
  .option('--config <path>', 'Config file path (.vibesec.yaml by default)')
165
235
  .option('--write-baseline [path]', 'Write baseline file (defaults to .vibesec.baseline.yaml in scan root)')
166
236
  .option('--rules-dir <path>', 'Custom rules dir (.vibesec/rules by default)')
237
+ .option('--no-color', 'Disable ANSI colors')
167
238
  .action(async (scanPath, options) => {
168
239
  const failOn = (0, core_1.severityFromString)(options.failOn);
169
240
  const absoluteRoot = node_path_1.default.resolve(scanPath);
170
- const detected = await (0, core_1.detectFrameworksInWorkspace)(absoluteRoot);
171
- const frameworks = selectFrameworks(detected, options.framework);
241
+ logInfo('Detecting frameworks...', options);
242
+ const workspaceDetected = await (0, core_1.detectFrameworksInWorkspace)(absoluteRoot);
243
+ let frameworks;
244
+ let frameworkRules;
245
+ if (options.framework === 'auto') {
246
+ if (workspaceDetected.length > 0) {
247
+ frameworks = workspaceDetected;
248
+ frameworkRules = await loadWorkspaceScopedRules(absoluteRoot);
249
+ }
250
+ else {
251
+ const rootDetected = await (0, core_1.detectFrameworks)(absoluteRoot);
252
+ frameworks = rootDetected;
253
+ frameworkRules = await loadRulesForFrameworks(rootDetected);
254
+ }
255
+ }
256
+ else {
257
+ frameworks = selectFrameworks(workspaceDetected, options.framework);
258
+ frameworkRules = await loadRulesForFrameworks(frameworks);
259
+ }
260
+ logInfo('Loading rulesets...', options);
172
261
  const analyzerRules = (0, analyzer_javascript_1.getJavaScriptRules)();
173
- const additionalRules = [
174
- ...analyzerRules,
175
- ...(options.framework === 'auto'
176
- ? await loadWorkspaceScopedRules(absoluteRoot)
177
- : await loadRulesForFrameworks(frameworks)),
178
- ];
262
+ const additionalRules = [...analyzerRules, ...frameworkRules];
263
+ logInfo('Scanning files...', options);
264
+ if (shouldShowInfo(options))
265
+ process.stderr.write('\n');
179
266
  const writeBaselinePath = typeof options.writeBaseline === 'string'
180
267
  ? node_path_1.default.isAbsolute(options.writeBaseline)
181
268
  ? options.writeBaseline
@@ -233,7 +320,7 @@ async function runCli(argv) {
233
320
  }
234
321
  }
235
322
  else {
236
- process.stdout.write(formatCliOutput(result));
323
+ process.stdout.write(formatCliOutput(result, options));
237
324
  }
238
325
  const shouldFail = result.findings.some((finding) => finding.severityRank <= failOn.rank);
239
326
  process.exitCode = shouldFail ? 1 : 0;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reliabilityworks/vibesec",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "bin": {
5
5
  "vibesec": "dist/cli.js"
6
6
  },
@@ -11,14 +11,14 @@
11
11
  "typecheck": "tsc -p tsconfig.json --noEmit"
12
12
  },
13
13
  "dependencies": {
14
- "@reliabilityworks/analyzer-javascript": "1.0.1",
15
- "@reliabilityworks/core": "1.0.1",
16
- "@reliabilityworks/ruleset-astro": "1.0.1",
17
- "@reliabilityworks/ruleset-expo": "1.0.1",
18
- "@reliabilityworks/ruleset-express": "1.0.1",
19
- "@reliabilityworks/ruleset-nextjs": "1.0.1",
20
- "@reliabilityworks/ruleset-react-native": "1.0.1",
21
- "@reliabilityworks/ruleset-sveltekit": "1.0.1",
14
+ "@reliabilityworks/analyzer-javascript": "1.0.3",
15
+ "@reliabilityworks/core": "1.0.3",
16
+ "@reliabilityworks/ruleset-astro": "1.0.3",
17
+ "@reliabilityworks/ruleset-expo": "1.0.3",
18
+ "@reliabilityworks/ruleset-express": "1.0.3",
19
+ "@reliabilityworks/ruleset-nextjs": "1.0.3",
20
+ "@reliabilityworks/ruleset-react-native": "1.0.3",
21
+ "@reliabilityworks/ruleset-sveltekit": "1.0.3",
22
22
  "commander": "^12.0.0"
23
23
  }
24
24
  }
package/src/cli.ts CHANGED
@@ -30,30 +30,129 @@ type ScanCommandOptions = {
30
30
  config?: string
31
31
  writeBaseline?: string | boolean
32
32
  rulesDir?: string
33
+ color?: boolean
33
34
  }
34
35
 
35
- function formatCliOutput(result: ScanResult): string {
36
+ type CliOutputOptions = {
37
+ output: string
38
+ outFile?: string
39
+ color?: boolean
40
+ }
41
+
42
+ type CliTheme = {
43
+ critical: (s: string) => string
44
+ high: (s: string) => string
45
+ medium: (s: string) => string
46
+ low: (s: string) => string
47
+ info: (s: string) => string
48
+ ruleId: (s: string) => string
49
+ location: (s: string) => string
50
+ muted: (s: string) => string
51
+ bold: (s: string) => string
52
+ }
53
+
54
+ function createAnsiTheme(enabled: boolean): CliTheme {
55
+ const wrap = (open: string, close: string) => (s: string) => (enabled ? `${open}${s}${close}` : s)
56
+
57
+ const reset = '\x1b[0m'
58
+ const bold = wrap('\x1b[1m', reset)
59
+ const dim = wrap('\x1b[2m', reset)
60
+
61
+ const red = wrap('\x1b[31m', reset)
62
+ const yellow = wrap('\x1b[33m', reset)
63
+ const blue = wrap('\x1b[34m', reset)
64
+ const magenta = wrap('\x1b[35m', reset)
65
+ const green = wrap('\x1b[32m', reset)
66
+ const cyan = wrap('\x1b[36m', reset)
67
+
68
+ return {
69
+ critical: red,
70
+ high: yellow,
71
+ medium: magenta,
72
+ low: blue,
73
+ info: green,
74
+ ruleId: cyan,
75
+ location: dim,
76
+ muted: dim,
77
+ bold,
78
+ }
79
+ }
80
+
81
+ function shouldUseColor(options: CliOutputOptions): boolean {
82
+ if (options.outFile) return false
83
+ if (process.env.NO_COLOR != null) return false
84
+ if (process.env.TERM === 'dumb') return false
85
+ if (!process.stdout.isTTY) return false
86
+
87
+ if (typeof options.color === 'boolean') return options.color
88
+
89
+ return true
90
+ }
91
+
92
+ function formatCliOutput(
93
+ result: ScanResult,
94
+ options: CliOutputOptions = { output: 'cli' },
95
+ ): string {
96
+ const theme = createAnsiTheme(shouldUseColor(options))
36
97
  const lines: string[] = []
37
98
 
38
- if (result.frameworks.length > 0) {
39
- const frameworkList = result.frameworks.map((f) => f.id).join(', ')
40
- lines.push(`Frameworks: ${frameworkList}`)
99
+ const divider = theme.muted('────────────────────────────────────────────────────────────')
100
+
101
+ if (result.findings.length > 0) {
102
+ lines.push(divider)
41
103
  lines.push('')
42
104
  }
43
105
 
44
106
  for (const finding of result.findings) {
45
- lines.push(
46
- `${finding.severity.toUpperCase()} ${finding.ruleId} ${finding.location.path}:${finding.location.startLine}`,
47
- )
48
- lines.push(` ${finding.message}`)
107
+ const severity = finding.severity.toUpperCase()
108
+
109
+ const severityColor =
110
+ finding.severity === 'critical'
111
+ ? theme.critical
112
+ : finding.severity === 'high'
113
+ ? theme.high
114
+ : finding.severity === 'medium'
115
+ ? theme.medium
116
+ : theme.low
117
+
118
+ const header = `${severityColor('●')} ${severityColor(severity)} ${theme.ruleId(finding.ruleId)}`
119
+
120
+ lines.push(header)
121
+ lines.push(`${theme.bold(finding.message)}`)
122
+ lines.push(theme.location(`${finding.location.path}:${finding.location.startLine}`))
123
+
124
+ if (finding.excerpt) {
125
+ lines.push('')
126
+ lines.push(` ${theme.muted(finding.excerpt)}`)
127
+ }
128
+
49
129
  lines.push('')
50
130
  }
51
131
 
52
- lines.push(`Scan complete: ${result.findings.length} issue(s) found`)
132
+ if (result.findings.length > 0) {
133
+ lines.push(divider)
134
+ lines.push('')
135
+ }
136
+
137
+ const count = result.findings.length
138
+ const noun = count === 1 ? 'issue' : 'issues'
139
+ lines.push(`Scan complete. ${count} ${noun} found.`)
53
140
 
54
141
  return lines.join('\n') + '\n'
55
142
  }
56
143
 
144
+ function shouldShowInfo(options: CliOutputOptions): boolean {
145
+ if (options.output !== 'cli') return false
146
+ if (options.outFile) return false
147
+ return Boolean(process.stderr.isTTY)
148
+ }
149
+
150
+ function logInfo(message: string, options: CliOutputOptions): void {
151
+ if (!shouldShowInfo(options)) return
152
+ const theme = createAnsiTheme(shouldUseColor(options))
153
+ process.stderr.write(`${theme.info('[info]')} ${message}\n`)
154
+ }
155
+
57
156
  function parseFrameworkIds(input: string): FrameworkId[] {
58
157
  if (!input || input === 'auto') return []
59
158
 
@@ -225,19 +324,38 @@ export async function runCli(argv: string[]): Promise<void> {
225
324
  'Write baseline file (defaults to .vibesec.baseline.yaml in scan root)',
226
325
  )
227
326
  .option('--rules-dir <path>', 'Custom rules dir (.vibesec/rules by default)')
327
+ .option('--no-color', 'Disable ANSI colors')
228
328
  .action(async (scanPath: string, options: ScanCommandOptions) => {
229
329
  const failOn = severityFromString(options.failOn)
230
330
 
231
331
  const absoluteRoot = path.resolve(scanPath)
232
- const detected = await detectFrameworksInWorkspace(absoluteRoot)
233
- const frameworks = selectFrameworks(detected, options.framework)
332
+
333
+ logInfo('Detecting frameworks...', options)
334
+ const workspaceDetected = await detectFrameworksInWorkspace(absoluteRoot)
335
+
336
+ let frameworks: FrameworkDetection[]
337
+ let frameworkRules: Rule[]
338
+
339
+ if (options.framework === 'auto') {
340
+ if (workspaceDetected.length > 0) {
341
+ frameworks = workspaceDetected
342
+ frameworkRules = await loadWorkspaceScopedRules(absoluteRoot)
343
+ } else {
344
+ const rootDetected = await detectFrameworks(absoluteRoot)
345
+ frameworks = rootDetected
346
+ frameworkRules = await loadRulesForFrameworks(rootDetected)
347
+ }
348
+ } else {
349
+ frameworks = selectFrameworks(workspaceDetected, options.framework)
350
+ frameworkRules = await loadRulesForFrameworks(frameworks)
351
+ }
352
+
353
+ logInfo('Loading rulesets...', options)
234
354
  const analyzerRules = getJavaScriptRules()
235
- const additionalRules = [
236
- ...analyzerRules,
237
- ...(options.framework === 'auto'
238
- ? await loadWorkspaceScopedRules(absoluteRoot)
239
- : await loadRulesForFrameworks(frameworks)),
240
- ]
355
+ const additionalRules = [...analyzerRules, ...frameworkRules]
356
+
357
+ logInfo('Scanning files...', options)
358
+ if (shouldShowInfo(options)) process.stderr.write('\n')
241
359
 
242
360
  const writeBaselinePath =
243
361
  typeof options.writeBaseline === 'string'
@@ -300,7 +418,7 @@ export async function runCli(argv: string[]): Promise<void> {
300
418
  process.stdout.write(html + '\n')
301
419
  }
302
420
  } else {
303
- process.stdout.write(formatCliOutput(result))
421
+ process.stdout.write(formatCliOutput(result, options))
304
422
  }
305
423
 
306
424
  const shouldFail = result.findings.some((finding) => finding.severityRank <= failOn.rank)
@@ -0,0 +1,55 @@
1
+ const assert = require('node:assert/strict')
2
+ const { execFileSync } = require('node:child_process')
3
+ const path = require('node:path')
4
+ const test = require('node:test')
5
+
6
+ function runScan(fixtureRoot) {
7
+ const cliPath = path.join(__dirname, '..', 'dist', 'cli.js')
8
+
9
+ const output = execFileSync(
10
+ process.execPath,
11
+ [
12
+ '--enable-source-maps',
13
+ cliPath,
14
+ 'scan',
15
+ fixtureRoot,
16
+ '--output',
17
+ 'json',
18
+ '--framework',
19
+ 'auto',
20
+ '--fail-on',
21
+ 'critical',
22
+ ],
23
+ { encoding: 'utf8' },
24
+ )
25
+
26
+ return JSON.parse(output)
27
+ }
28
+
29
+ test('auto detects frameworks in scan root (expo)', async () => {
30
+ const fixtureRoot = path.join(__dirname, '..', '..', 'core', 'test', 'fixtures', 'single-expo')
31
+ const result = runScan(fixtureRoot)
32
+
33
+ const frameworkIds = (result.frameworks ?? []).map((f) => f.id)
34
+ assert.ok(frameworkIds.includes('expo'))
35
+
36
+ const expoTokenFindings = (result.findings ?? []).filter(
37
+ (finding) => finding.ruleId === 'expo/asyncstorage-token-key',
38
+ )
39
+
40
+ assert.ok(expoTokenFindings.some((finding) => finding.location.path === 'src.js'))
41
+ })
42
+
43
+ test('auto detects frameworks in scan root (react-native)', async () => {
44
+ const fixtureRoot = path.join(__dirname, '..', '..', 'core', 'test', 'fixtures', 'single-rn')
45
+ const result = runScan(fixtureRoot)
46
+
47
+ const frameworkIds = (result.frameworks ?? []).map((f) => f.id)
48
+ assert.ok(frameworkIds.includes('react-native'))
49
+
50
+ const rnTokenFindings = (result.findings ?? []).filter(
51
+ (finding) => finding.ruleId === 'rn/asyncstorage-token-key',
52
+ )
53
+
54
+ assert.ok(rnTokenFindings.some((finding) => finding.location.path === 'src.js'))
55
+ })
@@ -0,0 +1,41 @@
1
+ const assert = require('node:assert/strict')
2
+ const { execFileSync } = require('node:child_process')
3
+ const path = require('node:path')
4
+ const test = require('node:test')
5
+
6
+ test('cli output is pretty and respects --no-color', async () => {
7
+ const fixtureRoot = path.join(
8
+ __dirname,
9
+ '..',
10
+ '..',
11
+ 'core',
12
+ 'test',
13
+ 'fixtures',
14
+ 'monorepo',
15
+ 'apps',
16
+ 'web',
17
+ )
18
+ const cliPath = path.join(__dirname, '..', 'dist', 'cli.js')
19
+
20
+ const output = execFileSync(
21
+ process.execPath,
22
+ [
23
+ '--enable-source-maps',
24
+ cliPath,
25
+ 'scan',
26
+ fixtureRoot,
27
+ '--framework',
28
+ 'nextjs',
29
+ '--output',
30
+ 'cli',
31
+ '--no-color',
32
+ '--fail-on',
33
+ 'critical',
34
+ ],
35
+ { encoding: 'utf8' },
36
+ )
37
+
38
+ assert.equal(output.includes('\x1b['), false)
39
+ assert.ok(output.includes('Scan complete.'))
40
+ assert.ok(output.includes('next.config.js:'))
41
+ })