bilt-toolkit 1.0.0 → 1.0.2

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 (106) hide show
  1. package/bin/bilt.js +1 -1
  2. package/dist/cli.js +62 -6
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/doctor.d.ts +1 -0
  5. package/dist/commands/doctor.d.ts.map +1 -1
  6. package/dist/commands/doctor.js +113 -52
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/fix.d.ts +1 -1
  9. package/dist/commands/fix.d.ts.map +1 -1
  10. package/dist/commands/fix.js +211 -64
  11. package/dist/commands/fix.js.map +1 -1
  12. package/dist/commands/init.d.ts.map +1 -1
  13. package/dist/commands/init.js +15 -13
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/scan.d.ts +6 -9
  16. package/dist/commands/scan.d.ts.map +1 -1
  17. package/dist/commands/scan.js +326 -206
  18. package/dist/commands/scan.js.map +1 -1
  19. package/dist/commands/undo.d.ts +3 -1
  20. package/dist/commands/undo.d.ts.map +1 -1
  21. package/dist/commands/undo.js +32 -14
  22. package/dist/commands/undo.js.map +1 -1
  23. package/dist/commands/watch.d.ts.map +1 -1
  24. package/dist/commands/watch.js +17 -8
  25. package/dist/commands/watch.js.map +1 -1
  26. package/dist/config/config.d.ts.map +1 -1
  27. package/dist/config/config.js +10 -0
  28. package/dist/config/config.js.map +1 -1
  29. package/dist/core/fix/confirm.d.ts +1 -1
  30. package/dist/core/fix/confirm.d.ts.map +1 -1
  31. package/dist/core/fix/confirm.js +4 -2
  32. package/dist/core/fix/confirm.js.map +1 -1
  33. package/dist/core/fix/git.d.ts +6 -0
  34. package/dist/core/fix/git.d.ts.map +1 -0
  35. package/dist/core/fix/git.js +45 -0
  36. package/dist/core/fix/git.js.map +1 -0
  37. package/dist/core/fix/snapshot.d.ts.map +1 -1
  38. package/dist/core/fix/snapshot.js +68 -1
  39. package/dist/core/fix/snapshot.js.map +1 -1
  40. package/dist/core/rules/providers.d.ts +2 -1
  41. package/dist/core/rules/providers.d.ts.map +1 -1
  42. package/dist/core/rules/providers.js +91 -0
  43. package/dist/core/rules/providers.js.map +1 -1
  44. package/dist/core/rules/secret-rules.d.ts.map +1 -1
  45. package/dist/core/rules/secret-rules.js +82 -3
  46. package/dist/core/rules/secret-rules.js.map +1 -1
  47. package/dist/core/scan/env.d.ts.map +1 -1
  48. package/dist/core/scan/env.js +15 -1
  49. package/dist/core/scan/env.js.map +1 -1
  50. package/dist/core/scan/secrets.d.ts.map +1 -1
  51. package/dist/core/scan/secrets.js +49 -4
  52. package/dist/core/scan/secrets.js.map +1 -1
  53. package/dist/core/scan/verifiers/aws.d.ts +4 -0
  54. package/dist/core/scan/verifiers/aws.d.ts.map +1 -0
  55. package/dist/core/scan/verifiers/aws.js +98 -0
  56. package/dist/core/scan/verifiers/aws.js.map +1 -0
  57. package/dist/core/scan/verifiers/github.d.ts +4 -0
  58. package/dist/core/scan/verifiers/github.d.ts.map +1 -0
  59. package/dist/core/scan/verifiers/github.js +23 -0
  60. package/dist/core/scan/verifiers/github.js.map +1 -0
  61. package/dist/core/scan/verifiers/index.d.ts +7 -0
  62. package/dist/core/scan/verifiers/index.d.ts.map +1 -0
  63. package/dist/core/scan/verifiers/index.js +15 -0
  64. package/dist/core/scan/verifiers/index.js.map +1 -0
  65. package/dist/core/scan/verifiers/openai.d.ts +4 -0
  66. package/dist/core/scan/verifiers/openai.d.ts.map +1 -0
  67. package/dist/core/scan/verifiers/openai.js +22 -0
  68. package/dist/core/scan/verifiers/openai.js.map +1 -0
  69. package/dist/core/scan/verifiers/slack.d.ts +4 -0
  70. package/dist/core/scan/verifiers/slack.d.ts.map +1 -0
  71. package/dist/core/scan/verifiers/slack.js +28 -0
  72. package/dist/core/scan/verifiers/slack.js.map +1 -0
  73. package/dist/core/scan/verifiers/stripe.d.ts +4 -0
  74. package/dist/core/scan/verifiers/stripe.d.ts.map +1 -0
  75. package/dist/core/scan/verifiers/stripe.js +22 -0
  76. package/dist/core/scan/verifiers/stripe.js.map +1 -0
  77. package/dist/core/scan/verifiers/supabase.d.ts +4 -0
  78. package/dist/core/scan/verifiers/supabase.d.ts.map +1 -0
  79. package/dist/core/scan/verifiers/supabase.js +35 -0
  80. package/dist/core/scan/verifiers/supabase.js.map +1 -0
  81. package/dist/core/score/health.d.ts.map +1 -1
  82. package/dist/core/score/health.js +1 -0
  83. package/dist/core/score/health.js.map +1 -1
  84. package/dist/core/watch/watcher.d.ts +4 -1
  85. package/dist/core/watch/watcher.d.ts.map +1 -1
  86. package/dist/core/watch/watcher.js +4 -2
  87. package/dist/core/watch/watcher.js.map +1 -1
  88. package/dist/types/index.d.ts +55 -4
  89. package/dist/types/index.d.ts.map +1 -1
  90. package/dist/ui/format.d.ts +22 -12
  91. package/dist/ui/format.d.ts.map +1 -1
  92. package/dist/ui/format.js +223 -74
  93. package/dist/ui/format.js.map +1 -1
  94. package/dist/ui/reporter.d.ts +18 -15
  95. package/dist/ui/reporter.d.ts.map +1 -1
  96. package/dist/ui/reporter.js +142 -182
  97. package/dist/ui/reporter.js.map +1 -1
  98. package/dist/ui/sound.d.ts +6 -0
  99. package/dist/ui/sound.d.ts.map +1 -0
  100. package/dist/ui/sound.js +13 -0
  101. package/dist/ui/sound.js.map +1 -0
  102. package/dist/ui/theme.d.ts +67 -0
  103. package/dist/ui/theme.d.ts.map +1 -0
  104. package/dist/ui/theme.js +252 -0
  105. package/dist/ui/theme.js.map +1 -0
  106. package/package.json +6 -3
@@ -12,255 +12,375 @@ import { calculateHealthScore } from "../core/score/health.js";
12
12
  import { loadPlugins } from "../plugins/loader.js";
13
13
  import { createPluginContext } from "../plugins/interface.js";
14
14
  import { SECRET_RULES } from "../core/rules/secret-rules.js";
15
- import { reportScanStart, reportScanProgress, reportScanResults, } from "../ui/reporter.js";
15
+ import { colors, glyphs, banner, pulseBar, isPlainMode, Spinner, showBliptBanner, } from "../ui/theme.js";
16
+ import { formatFinding } from "../ui/format.js";
17
+ import { playSound } from "../ui/sound.js";
18
+ import { VERIFIERS } from "../core/scan/verifiers/index.js";
19
+ import { createRequire } from "node:module";
20
+ // Helper to run a scan step and stream findings
21
+ async function runScanStep(name, quiet, action, detailsEnabled) {
22
+ const spinner = quiet ? null : new Spinner(name).start();
23
+ const stepFindings = await action();
24
+ if (spinner) {
25
+ spinner.stop();
26
+ }
27
+ if (!quiet && stepFindings.length > 0) {
28
+ const isPlain = isPlainMode();
29
+ const mode = (detailsEnabled || isPlain) ? "detail" : "headline";
30
+ for (const f of stepFindings) {
31
+ console.log(formatFinding(f, mode));
32
+ if (!isPlain) {
33
+ await new Promise((resolve) => setTimeout(resolve, 80));
34
+ }
35
+ console.log("");
36
+ }
37
+ }
38
+ return stepFindings;
39
+ }
40
+ // Apply overrides and severity filters to a list of findings
41
+ function applyOverridesAndFilter(findings, config, minSeverity) {
42
+ // Apply overrides
43
+ for (const finding of findings) {
44
+ if (finding.ruleId) {
45
+ const override = config.severityOverrides[finding.ruleId];
46
+ if (override) {
47
+ finding.severity = override;
48
+ }
49
+ }
50
+ }
51
+ // Filter by severity
52
+ if (minSeverity) {
53
+ const severityOrder = {
54
+ critical: 0,
55
+ warning: 1,
56
+ info: 2,
57
+ passed: 3,
58
+ };
59
+ const minLevel = severityOrder[minSeverity];
60
+ return findings.filter((f) => severityOrder[f.severity] <= minLevel);
61
+ }
62
+ return findings;
63
+ }
16
64
  /**
17
65
  * Execute a full project scan, returning a ScanResult.
18
66
  *
19
67
  * 1. Load config
20
- * 2. Find & parse .env files
21
- * 3. Detect env mismatches (missing/unused vars)
22
- * 4. Check .gitignore coverage
23
- * 5. Scan working tree for secrets
24
- * 6. Scan git history for secrets
25
- * 7. Detect framework & client-exposed secrets
26
- * 8. Run plugins
27
- * 9. Calculate health score
28
- * 10. Report results
68
+ * 2. Step 1: Check .gitignore
69
+ * 3. Step 2: Check env variable usage (and mismatches, unused, client exposed)
70
+ * 4. Step 3: Check for secrets (working tree & git history)
71
+ * 5. Step 4: Run plugins
72
+ * 6. Calculate health score
73
+ * 7. Report final results
29
74
  */
30
75
  export async function executeScan(projectDir, options = {}) {
31
76
  const start = Date.now();
32
77
  const rootDir = path.resolve(projectDir);
33
78
  const config = await loadConfig(rootDir);
34
79
  const findings = [];
35
- // Start spinner unless quiet mode
36
- const spinner = options.quiet ? null : reportScanStart(rootDir);
80
+ const isQuiet = !!options.quiet;
81
+ const isJson = !!options.json;
82
+ const detailsEnabled = options.details !== false;
83
+ if (!isQuiet && !isJson) {
84
+ console.log("");
85
+ const require = createRequire(import.meta.url);
86
+ const pkg = require("../../package.json");
87
+ showBliptBanner(pkg.version);
88
+ }
89
+ let scannedFiles = 0;
90
+ let detectedFramework;
37
91
  try {
38
- // ── 1. Find & parse .env files ──────────────────────────────────────
39
- if (spinner)
40
- reportScanProgress(spinner, "Parsing .env files…");
41
- const envFiles = await findEnvFiles(rootDir);
42
- const parsedEnvFiles = [];
43
- for (const envFile of envFiles) {
44
- try {
45
- const content = await fs.readFile(envFile, "utf-8");
46
- const parsed = parseEnvFile(content, envFile);
47
- parsedEnvFiles.push(parsed);
92
+ // ── STEP 1. Check .gitignore ──────────────────────────────────────────
93
+ const gitignoreStepFindings = await runScanStep("Checking .gitignore", isQuiet || isJson, async () => {
94
+ const envFiles = await findEnvFiles(rootDir);
95
+ const stepFindings = await checkEnvFilesIgnoredWithGit(rootDir, envFiles);
96
+ return applyOverridesAndFilter(stepFindings, config, options.severity);
97
+ }, detailsEnabled);
98
+ findings.push(...gitignoreStepFindings);
99
+ // ── STEP 2. Check environment variables ────────────────────────────────
100
+ const envStepFindings = await runScanStep("Checking environment variables", isQuiet || isJson, async () => {
101
+ const stepFindings = [];
102
+ const envFiles = await findEnvFiles(rootDir);
103
+ const parsedEnvFiles = [];
104
+ for (const envFile of envFiles) {
105
+ try {
106
+ const content = await fs.readFile(envFile, "utf-8");
107
+ if (options.debug) {
108
+ console.log(`[DEBUG READ] ${envFile} (${Buffer.byteLength(content, "utf8")} bytes)`);
109
+ }
110
+ const parsed = parseEnvFile(content, envFile);
111
+ parsedEnvFiles.push(parsed);
112
+ }
113
+ catch {
114
+ // Skip unreadable files
115
+ }
48
116
  }
49
- catch {
50
- // Skip unreadable files
117
+ const codeFiles = await fg(["**/*.ts", "**/*.js", "**/*.tsx", "**/*.jsx", "**/*.py", "**/*.rb"], {
118
+ cwd: rootDir,
119
+ ignore: config.ignore,
120
+ onlyFiles: true,
121
+ absolute: true,
122
+ });
123
+ const envRefs = new Set();
124
+ const primaryEnv = parsedEnvFiles[0];
125
+ const definedKeys = primaryEnv ? [...primaryEnv.entries.keys()] : [];
126
+ for (const codeFile of codeFiles) {
127
+ try {
128
+ const content = await fs.readFile(codeFile, "utf-8");
129
+ if (options.debug) {
130
+ console.log(`[DEBUG READ] ${codeFile} (${Buffer.byteLength(content, "utf8")} bytes)`);
131
+ }
132
+ const refs = scanCodeForEnvRefs(content, codeFile);
133
+ for (const ref of refs)
134
+ envRefs.add(ref);
135
+ if (primaryEnv) {
136
+ const missingFindings = findMissingEnvVars(refs, definedKeys, path.relative(rootDir, codeFile));
137
+ stepFindings.push(...missingFindings);
138
+ }
139
+ }
140
+ catch {
141
+ // Skip unreadable files
142
+ }
143
+ }
144
+ if (parsedEnvFiles.length >= 2) {
145
+ const diffFindings = diffEnvFiles(parsedEnvFiles);
146
+ stepFindings.push(...diffFindings);
147
+ }
148
+ if (primaryEnv) {
149
+ const unusedFindings = findUnusedEnvVars([...envRefs], [...primaryEnv.entries.values()], path.relative(rootDir, primaryEnv.filePath));
150
+ stepFindings.push(...unusedFindings);
51
151
  }
52
- }
53
- // ── 2. Env mismatch detection ───────────────────────────────────────
54
- if (spinner)
55
- reportScanProgress(spinner, "Checking env variable usage…");
56
- // Find code files
57
- const codeFiles = await fg(["**/*.ts", "**/*.js", "**/*.tsx", "**/*.jsx", "**/*.py", "**/*.rb"], {
58
- cwd: rootDir,
59
- ignore: config.ignore,
60
- onlyFiles: true,
61
- absolute: true,
62
- });
63
- // Scan code for env references and missing vars
64
- const envRefs = new Set();
65
- const primaryEnv = parsedEnvFiles[0];
66
- const definedKeys = primaryEnv ? [...primaryEnv.entries.keys()] : [];
67
- for (const codeFile of codeFiles) {
68
152
  try {
69
- const content = await fs.readFile(codeFile, "utf-8");
70
- const refs = scanCodeForEnvRefs(content, codeFile);
71
- for (const ref of refs)
72
- envRefs.add(ref);
73
- if (primaryEnv) {
74
- const missingFindings = findMissingEnvVars(refs, definedKeys, path.relative(rootDir, codeFile));
75
- findings.push(...missingFindings);
153
+ const detected = await detectFramework(rootDir);
154
+ detectedFramework = detected || undefined;
155
+ if (detectedFramework && parsedEnvFiles.length > 0) {
156
+ const exposedFindings = checkClientExposedSecrets(parsedEnvFiles, detectedFramework, SECRET_RULES, config.entropyThreshold);
157
+ stepFindings.push(...exposedFindings);
76
158
  }
77
159
  }
78
160
  catch {
79
- // Skip unreadable files
161
+ // Framework detection failed
80
162
  }
81
- }
82
- // Compare env files to find mismatches
83
- if (parsedEnvFiles.length >= 2) {
84
- const diffFindings = diffEnvFiles(parsedEnvFiles);
85
- findings.push(...diffFindings);
86
- }
87
- // Find unused env vars
88
- if (primaryEnv) {
89
- const unusedFindings = findUnusedEnvVars([...envRefs], [...primaryEnv.entries.values()], path.relative(rootDir, primaryEnv.filePath));
90
- findings.push(...unusedFindings);
91
- }
92
- // ── 3. Check .gitignore coverage ────────────────────────────────────
93
- if (spinner)
94
- reportScanProgress(spinner, "Checking .gitignore…");
95
- let gitignoreContent = "";
96
- try {
97
- gitignoreContent = await fs.readFile(path.join(rootDir, ".gitignore"), "utf-8");
98
- }
99
- catch { }
100
- const gitignoreFindings = await checkEnvFilesIgnoredWithGit(rootDir, envFiles);
101
- findings.push(...gitignoreFindings);
102
- // ── 4. Scan working tree for secrets ────────────────────────────────
103
- if (spinner)
104
- reportScanProgress(spinner, "Scanning for secrets…");
105
- const scanTargets = await fg(["**/*"], {
106
- cwd: rootDir,
107
- ignore: config.ignore,
108
- onlyFiles: true,
109
- });
110
- // Filter to text-like files only
111
- const textExtensions = new Set([
112
- ".ts",
113
- ".js",
114
- ".tsx",
115
- ".jsx",
116
- ".mjs",
117
- ".cjs",
118
- ".py",
119
- ".rb",
120
- ".go",
121
- ".rs",
122
- ".java",
123
- ".kt",
124
- ".json",
125
- ".yaml",
126
- ".yml",
127
- ".toml",
128
- ".xml",
129
- ".env",
130
- ".cfg",
131
- ".conf",
132
- ".ini",
133
- ".properties",
134
- ".sh",
135
- ".bash",
136
- ".zsh",
137
- ".fish",
138
- ".tf",
139
- ".hcl",
140
- ".dockerfile",
141
- ".md",
142
- ".txt",
143
- ".csv",
144
- ]);
145
- let scannedFiles = 0;
146
- for (const file of scanTargets) {
147
- const ext = path.extname(file).toLowerCase();
148
- const basename = path.basename(file).toLowerCase();
149
- // Include dotfiles like .env, .env.local etc.
150
- const isEnvFile = basename.startsWith(".env");
151
- if (!isEnvFile && !textExtensions.has(ext) && ext !== "")
152
- continue;
153
- const fullPath = path.join(rootDir, file);
154
- try {
155
- const stat = await fs.stat(fullPath);
156
- // Skip files > 1MB
157
- if (stat.size > 1_048_576)
163
+ // Apply overrides and severity filters to raw step findings
164
+ let filteredStepFindings = applyOverridesAndFilter(stepFindings, config, options.severity);
165
+ // Compute healthy env vars
166
+ if (primaryEnv) {
167
+ const envIssueKeys = new Set();
168
+ for (const f of filteredStepFindings) {
169
+ const keyMatch = f.message.match(/Variable "(?<key>[A-Z_][A-Z0-9_]*)"/) ||
170
+ f.message.match(/process\.env\.(?<key>[A-Z_][A-Z0-9_]*)/);
171
+ if (keyMatch?.groups?.["key"]) {
172
+ envIssueKeys.add(keyMatch.groups["key"]);
173
+ }
174
+ }
175
+ const healthyKeys = definedKeys.filter((k) => !envIssueKeys.has(k));
176
+ if (healthyKeys.length > 0) {
177
+ filteredStepFindings.push({
178
+ id: `env-healthy-${Date.now()}`,
179
+ severity: "passed",
180
+ category: "env-mismatch",
181
+ message: `${healthyKeys.length} var${healthyKeys.length > 1 ? "s" : ""} healthy`,
182
+ file: primaryEnv.filePath,
183
+ suggestion: healthyKeys.join(", "),
184
+ });
185
+ }
186
+ }
187
+ return filteredStepFindings;
188
+ }, detailsEnabled);
189
+ findings.push(...envStepFindings);
190
+ // ── STEP 3. Check for secrets ─────────────────────────────────────────
191
+ const secretsStepFindings = await runScanStep("Checking for secrets", isQuiet || isJson, async () => {
192
+ const stepFindings = [];
193
+ const scanTargets = await fg(["**/*"], {
194
+ cwd: rootDir,
195
+ ignore: config.ignore,
196
+ onlyFiles: true,
197
+ });
198
+ const textExtensions = new Set([
199
+ ".ts", ".js", ".tsx", ".jsx", ".mjs", ".cjs", ".py", ".rb", ".go", ".rs",
200
+ ".java", ".kt", ".json", ".yaml", ".yml", ".toml", ".xml", ".env", ".cfg",
201
+ ".conf", ".ini", ".properties", ".sh", ".bash", ".zsh", ".fish", ".tf",
202
+ ".hcl", ".dockerfile", ".md", ".txt", ".csv",
203
+ ]);
204
+ for (const file of scanTargets) {
205
+ const ext = path.extname(file).toLowerCase();
206
+ const basename = path.basename(file).toLowerCase();
207
+ const isEnvFile = basename.startsWith(".env");
208
+ if (!isEnvFile && !textExtensions.has(ext) && ext !== "")
158
209
  continue;
159
- const content = await fs.readFile(fullPath, "utf-8");
160
- const secretFindings = scanFileForSecrets(content, file, SECRET_RULES, config.entropyThreshold);
161
- findings.push(...secretFindings);
162
- scannedFiles++;
210
+ const fullPath = path.join(rootDir, file);
211
+ try {
212
+ const stat = await fs.stat(fullPath);
213
+ if (stat.size > 1_048_576)
214
+ continue;
215
+ const content = await fs.readFile(fullPath, "utf-8");
216
+ if (options.debug) {
217
+ console.log(`[DEBUG READ] ${fullPath} (${Buffer.byteLength(content, "utf8")} bytes)`);
218
+ }
219
+ const secretFindings = scanFileForSecrets(content, file, SECRET_RULES, config.entropyThreshold);
220
+ stepFindings.push(...secretFindings);
221
+ scannedFiles++;
222
+ }
223
+ catch {
224
+ // Skip
225
+ }
226
+ }
227
+ try {
228
+ const depth = options.fullHistory ? undefined : config.historyDepth;
229
+ const historyFindings = await scanGitHistory(rootDir, SECRET_RULES, config.entropyThreshold, depth);
230
+ stepFindings.push(...historyFindings);
163
231
  }
164
232
  catch {
165
- // Skip binary/unreadable files
233
+ // Skip
166
234
  }
167
- }
168
- // ── 5. Scan git history ─────────────────────────────────────────────
169
- if (spinner)
170
- reportScanProgress(spinner, "Scanning git history…");
171
- try {
172
- const depth = options.fullHistory ? undefined : config.historyDepth;
173
- const historyFindings = await scanGitHistory(rootDir, SECRET_RULES, config.entropyThreshold, depth);
174
- findings.push(...historyFindings);
175
- }
176
- catch {
177
- // Not a git repo or git not available — skip
178
- }
179
- // ── 6. Detect framework & client-exposed secrets ────────────────────
180
- if (spinner)
181
- reportScanProgress(spinner, "Detecting framework…");
182
- let framework;
183
- try {
184
- const detected = await detectFramework(rootDir);
185
- framework = detected || undefined;
186
- if (framework && parsedEnvFiles.length > 0) {
187
- const exposedFindings = checkClientExposedSecrets(parsedEnvFiles, framework, SECRET_RULES, config.entropyThreshold);
188
- findings.push(...exposedFindings);
235
+ // Liveness verification
236
+ if (options.noVerify && !isQuiet && !isJson) {
237
+ console.log(` ${colors.slateDim.apply(glyphs.info)} Offline mode — live verification skipped`);
189
238
  }
190
- }
191
- catch {
192
- // Framework detection failed — non-critical
193
- }
194
- // ── 7. Load and run plugins ─────────────────────────────────────────
195
- if (spinner)
196
- reportScanProgress(spinner, "Running plugins…");
197
- try {
198
- const plugins = await loadPlugins(config, rootDir);
199
- if (plugins.length > 0) {
200
- const pluginContext = await createPluginContext(rootDir, config);
201
- for (const plugin of plugins) {
202
- try {
203
- const result = await plugin.check(pluginContext);
204
- findings.push(...result.findings);
239
+ for (const finding of stepFindings) {
240
+ if (finding.category === "secret-detected" && finding.secret) {
241
+ if (options.noVerify) {
242
+ finding.verificationState = "unverified";
243
+ }
244
+ else {
245
+ const providerName = finding.provider?.name;
246
+ if (providerName && VERIFIERS[providerName]) {
247
+ try {
248
+ const state = await VERIFIERS[providerName](finding.secret);
249
+ finding.verificationState = state;
250
+ if (state === "verified-live") {
251
+ finding.confidence = "high";
252
+ }
253
+ }
254
+ catch {
255
+ finding.verificationState = "unverified";
256
+ }
257
+ }
258
+ else {
259
+ finding.verificationState = "unverified";
260
+ }
205
261
  }
206
- catch {
207
- // Plugin error — skip silently
262
+ if (!options.retainSecrets) {
263
+ delete finding.secret;
208
264
  }
209
265
  }
210
266
  }
211
- }
212
- catch {
213
- // Plugin loading failed — non-critical
214
- }
215
- // ── 8. Apply severity overrides ─────────────────────────────────────
216
- for (const finding of findings) {
217
- if (finding.ruleId) {
218
- const override = config.severityOverrides[finding.ruleId];
219
- if (override) {
220
- finding.severity = override;
267
+ return applyOverridesAndFilter(stepFindings, config, options.severity);
268
+ }, detailsEnabled);
269
+ findings.push(...secretsStepFindings);
270
+ // ── STEP 4. Running plugins ───────────────────────────────────────────
271
+ const pluginsStepFindings = await runScanStep("Running plugins", isQuiet || isJson, async () => {
272
+ const stepFindings = [];
273
+ try {
274
+ const plugins = await loadPlugins(config, rootDir);
275
+ if (plugins.length > 0) {
276
+ const pluginContext = await createPluginContext(rootDir, config);
277
+ for (const plugin of plugins) {
278
+ try {
279
+ const result = await plugin.check(pluginContext);
280
+ stepFindings.push(...result.findings);
281
+ }
282
+ catch {
283
+ // Skip
284
+ }
285
+ }
221
286
  }
222
287
  }
223
- }
224
- // ── 9. Filter by severity if requested ──────────────────────────────
225
- let filteredFindings = findings;
226
- if (options.severity) {
227
- const severityOrder = {
228
- critical: 0,
229
- warning: 1,
230
- info: 2,
231
- };
232
- const minLevel = severityOrder[options.severity];
233
- filteredFindings = findings.filter((f) => severityOrder[f.severity] <= minLevel);
234
- }
235
- // ── 10. Calculate health score ──────────────────────────────────────
236
- const { score, grade } = calculateHealthScore(filteredFindings);
288
+ catch {
289
+ // Skip
290
+ }
291
+ return applyOverridesAndFilter(stepFindings, config, options.severity);
292
+ }, detailsEnabled);
293
+ findings.push(...pluginsStepFindings);
294
+ // Sort verified-live findings first
295
+ findings.sort((a, b) => {
296
+ const aLive = a.category === "secret-detected" && a.verificationState === "verified-live";
297
+ const bLive = b.category === "secret-detected" && b.verificationState === "verified-live";
298
+ if (aLive && !bLive)
299
+ return -1;
300
+ if (!aLive && bLive)
301
+ return 1;
302
+ return 0;
303
+ });
304
+ // Calculate final score
305
+ // Passed findings don't count towards point deductions
306
+ const { score, grade } = calculateHealthScore(findings);
237
307
  const duration = Date.now() - start;
238
308
  const result = {
239
- findings: filteredFindings,
309
+ findings: findings.filter((f) => f.severity !== "passed"),
240
310
  healthScore: score,
241
311
  grade,
242
312
  timestamp: new Date(),
243
313
  scannedFiles,
244
- framework,
314
+ framework: detectedFramework,
245
315
  duration,
246
316
  };
247
- // ── 11. Report ──────────────────────────────────────────────────────
248
- if (spinner)
249
- spinner.stop();
250
- if (options.json) {
317
+ // Report
318
+ if (isJson) {
251
319
  console.log(JSON.stringify(result, null, 2));
252
320
  }
253
- else if (!options.quiet) {
254
- reportScanResults(result, {
255
- fun: options.fun ?? config.funMode,
256
- verbose: options.verbose,
257
- });
321
+ else if (!isQuiet) {
322
+ console.log(pulseBar(score));
323
+ console.log("");
324
+ const criticalCount = findings.filter((f) => f.severity === "critical").length;
325
+ const warningCount = findings.filter((f) => f.severity === "warning").length;
326
+ const issuesCount = criticalCount + warningCount;
327
+ if (criticalCount > 0 && config.sound) {
328
+ playSound();
329
+ }
330
+ const parts = [];
331
+ if (issuesCount === 0) {
332
+ parts.push(colors.mintClear.apply("all clear"));
333
+ }
334
+ else {
335
+ parts.push(colors.pulseCoral.apply(`${issuesCount} issue${issuesCount > 1 ? "s" : ""}`));
336
+ }
337
+ parts.push(colors.slateDim.apply("bilt fix"));
338
+ const isPlain = isPlainMode();
339
+ const mode = (options.verbose || options.details !== false || isPlain) ? "detail" : "headline";
340
+ if (mode !== "detail") {
341
+ parts.push(colors.slateDim.apply("bilt scan"));
342
+ }
343
+ console.log(` ${parts.join(colors.slateDim.dim(" \u00B7 "))}`);
344
+ console.log("");
345
+ // Interactive mode keypress listener
346
+ if (process.stdin.isTTY && !options.details && !isPlain) {
347
+ const hint = colors.slateDim.dim(" (press d for details, any other key to exit)");
348
+ process.stdout.write(hint);
349
+ process.stdin.setRawMode(true);
350
+ process.stdin.resume();
351
+ process.stdin.setEncoding("utf8");
352
+ await new Promise((resolve) => {
353
+ const onData = (key) => {
354
+ // Clear the hint line
355
+ process.stdout.write("\r" + " ".repeat(hint.length + 10) + "\r");
356
+ process.stdin.removeListener("data", onData);
357
+ process.stdin.setRawMode(false);
358
+ process.stdin.pause();
359
+ if (key === "\u0003") {
360
+ process.exit(0);
361
+ }
362
+ if (key.toLowerCase() === "d") {
363
+ console.log("");
364
+ // Reprint findings in detailed mode
365
+ for (const f of findings) {
366
+ console.log(formatFinding(f, "detail"));
367
+ console.log("");
368
+ }
369
+ // Print pulse bar and summary again
370
+ console.log(pulseBar(score));
371
+ console.log("");
372
+ console.log(` ${parts.join(colors.slateDim.dim(" \u00B7 "))}`);
373
+ console.log("");
374
+ }
375
+ resolve();
376
+ };
377
+ process.stdin.on("data", onData);
378
+ });
379
+ }
258
380
  }
259
381
  return result;
260
382
  }
261
383
  catch (error) {
262
- if (spinner)
263
- spinner.fail("Scan failed");
264
384
  throw error;
265
385
  }
266
386
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}