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
package/dist/ui/format.js CHANGED
@@ -1,91 +1,241 @@
1
1
  // ─── UI Format Utilities ─────────────────────────────────────────────────────
2
2
  // Atomic formatters used across the entire CLI output layer.
3
- import chalk from "chalk";
3
+ // All color/glyph usage goes through theme.ts — no direct chalk calls here.
4
+ import { colors, glyphs, styledGlyph, severityColor as themeSeverityColor, severityGlyph, truncatePath, isPlainMode, text, } from "./theme.js";
4
5
  // ─── Severity Helpers ────────────────────────────────────────────────────────
5
6
  /**
6
- * Return the emoji icon for a severity level.
7
+ * Return the themed glyph for a severity level.
8
+ *
9
+ * - critical → ✖ (Pulse Coral)
10
+ * - warning → ▲ (Amber Flag)
11
+ * - info → ◆ (Slate Dim)
7
12
  */
8
13
  export function severityIcon(severity) {
9
- switch (severity) {
10
- case "critical":
11
- return "🔴";
12
- case "warning":
13
- return "🟡";
14
- case "info":
15
- return "🔵";
16
- }
14
+ return severityGlyph(severity);
15
+ }
16
+ /**
17
+ * Return the theme color function for a severity level.
18
+ */
19
+ export function severityColorFn(severity) {
20
+ return themeSeverityColor(severity).apply;
17
21
  }
18
22
  /**
19
- * Return the chalk color function for a severity level.
23
+ * Compatibility wrapper returning a styling function.
20
24
  */
21
25
  export function severityColor(severity) {
22
- switch (severity) {
23
- case "critical":
24
- return (t) => chalk.red(t);
25
- case "warning":
26
- return (t) => chalk.yellow(t);
27
- case "info":
28
- return (t) => chalk.cyan(t);
26
+ return themeSeverityColor(severity).apply;
27
+ }
28
+ function getFindingHeadlineAndDetail(finding) {
29
+ const file = truncatePath(finding.file);
30
+ const loc = finding.line ? `${file}:${finding.line}` : file;
31
+ if (finding.severity === "passed") {
32
+ return {
33
+ headline: finding.message,
34
+ detail: finding.suggestion || "",
35
+ };
36
+ }
37
+ const baseName = (fp) => fp.split(/[\\/]/).pop() ?? fp;
38
+ switch (finding.category) {
39
+ case "secret-detected": {
40
+ const headline = finding.message;
41
+ let detail = loc;
42
+ if (finding.provider) {
43
+ detail += ` ${glyphs.arrow} rotate at ${finding.provider.rotationUrl}`;
44
+ }
45
+ else if (finding.suggestion) {
46
+ detail += ` ${glyphs.arrow} ${finding.suggestion}`;
47
+ }
48
+ return { headline, detail };
49
+ }
50
+ case "env-missing": {
51
+ const match = finding.message.match(/process\.env\.(?<key>[A-Z_][A-Z0-9_]*)/);
52
+ const key = match?.groups?.["key"] ?? "Unknown key";
53
+ return {
54
+ headline: `${key} missing from env`,
55
+ detail: `referenced in ${loc}`,
56
+ };
57
+ }
58
+ case "env-unused": {
59
+ const match = finding.message.match(/Variable "(?<key>[A-Z_][A-Z0-9_]*)"/);
60
+ const key = match?.groups?.["key"] ?? "Unknown key";
61
+ return {
62
+ headline: `${key} defined but unused`,
63
+ detail: `defined in ${loc}`,
64
+ };
65
+ }
66
+ case "env-mismatch": {
67
+ const match = finding.message.match(/Variable "(?<key>[A-Z_][A-Z0-9_]*)" is defined in (?<fileA>[^\s]+) but missing from (?<fileB>[^\s]+)/);
68
+ if (match?.groups) {
69
+ const { key, fileA, fileB } = match.groups;
70
+ return {
71
+ headline: `${key} missing from ${baseName(fileB)}`,
72
+ detail: `defined in ${baseName(fileA)}, absent from ${baseName(fileB)}`,
73
+ };
74
+ }
75
+ return {
76
+ headline: finding.message,
77
+ detail: `in ${loc}`,
78
+ };
79
+ }
80
+ case "env-exposed": {
81
+ const match = finding.message.match(/Variable "(?<key>[A-Z_][A-Z0-9_]*)" is exposed to the client bundle via (?<framework>[^\n]+) and contains a secret \((?<ruleName>[^\)]+)\)/);
82
+ if (match?.groups) {
83
+ const { key, framework, ruleName } = match.groups;
84
+ return {
85
+ headline: `${key} exposed to client`,
86
+ detail: `via ${framework}, contains secret (${ruleName})`,
87
+ };
88
+ }
89
+ return {
90
+ headline: finding.message,
91
+ detail: `exposed in ${loc}`,
92
+ };
93
+ }
94
+ case "gitignore-missing": {
95
+ return {
96
+ headline: `${baseName(finding.file)} not ignored`,
97
+ detail: `secrets may be committed. Add env patterns to ${file}`,
98
+ };
99
+ }
100
+ case "plugin-finding": {
101
+ if (finding.id.startsWith("docker-no-dockerignore")) {
102
+ return {
103
+ headline: `No .dockerignore found`,
104
+ detail: `.env files may be copied into Docker image. Create one and add .env*`,
105
+ };
106
+ }
107
+ if (finding.id.startsWith("docker-dockerignore-env")) {
108
+ return {
109
+ headline: `.dockerignore misses .env`,
110
+ detail: `.dockerignore does not exclude .env files. Add .env*`,
111
+ };
112
+ }
113
+ if (finding.id.startsWith("docker-env-secret")) {
114
+ return {
115
+ headline: `Hardcoded key in Dockerfile`,
116
+ detail: `in ${loc}. Use ARG/--build-arg or mount secrets instead`,
117
+ };
118
+ }
119
+ if (finding.id.startsWith("terraform-gitignore-tfvars")) {
120
+ return {
121
+ headline: `*.tfvars files not ignored`,
122
+ detail: `in .gitignore. Add *.tfvars and *.tfvars.json to prevent commits`,
123
+ };
124
+ }
125
+ if (finding.id.startsWith("terraform-gitignore-dir")) {
126
+ return {
127
+ headline: `.terraform/ not ignored`,
128
+ detail: `in .gitignore. Add .terraform/ to exclude local state/providers`,
129
+ };
130
+ }
131
+ if (finding.id.startsWith("terraform-hardcoded")) {
132
+ return {
133
+ headline: `Hardcoded key in Terraform`,
134
+ detail: `in ${loc}. Use variables or env vars instead of hardcoding`,
135
+ };
136
+ }
137
+ return {
138
+ headline: finding.message,
139
+ detail: `in ${loc}`,
140
+ };
141
+ }
142
+ default: {
143
+ return {
144
+ headline: finding.message,
145
+ detail: `in ${loc}`,
146
+ };
147
+ }
29
148
  }
30
149
  }
31
- // ─── Finding Formatter ───────────────────────────────────────────────────────
150
+ function renderFiveQuestions(finding, defaultDetail) {
151
+ if (!finding.knowledge)
152
+ return ` ${defaultDetail}`;
153
+ const k = finding.knowledge;
154
+ const fixable = finding.suggestion?.toLowerCase().includes("rotate") ? "yes → bilt fix" : "no → manual";
155
+ // The default detail often includes rotation URLs, we just want the location prefix
156
+ const loc = defaultDetail.split(" ")[0];
157
+ const lines = [
158
+ ` loc ${loc}`,
159
+ ` what ${k.whatItIs}`,
160
+ ` why ${k.why}`,
161
+ ` confidence ${finding.confidence ?? "low"}`,
162
+ ` do next ${k.action}`,
163
+ ` fixable ${fixable}`
164
+ ];
165
+ return lines.join("\n");
166
+ }
32
167
  /**
33
- * Format a single finding as a one-line string with severity icon,
34
- * colored message, and file:line reference.
35
- *
36
- * Example: 🔴 AWS access key detected config.js:12
168
+ * Format a single finding in either headline or detail mode.
37
169
  */
38
- export function formatFinding(finding) {
39
- const icon = severityIcon(finding.severity);
40
- const colorFn = severityColor(finding.severity);
41
- const location = finding.line
42
- ? chalk.dim(`${finding.file}:${finding.line}`)
43
- : chalk.dim(finding.file);
44
- const message = colorFn(finding.message);
45
- let line = ` ${icon} ${message} ${location}`;
46
- if (finding.preview) {
47
- line += ` ${chalk.dim(`[${finding.preview}]`)}`;
170
+ export function formatFinding(finding, mode = "headline") {
171
+ const { headline, detail } = getFindingHeadlineAndDetail(finding);
172
+ if (finding.category === "secret-detected" && finding.verificationState) {
173
+ const state = finding.verificationState;
174
+ if (state === "verified-live") {
175
+ const icon = colors.pulseCoral.apply(glyphs.critical);
176
+ const boldText = colors.pulseCoral.bold(`${headline} [verified-live]`);
177
+ const headlineStr = ` ${icon} ${boldText}`;
178
+ if (mode === "headline")
179
+ return headlineStr;
180
+ return `${headlineStr}\n${colors.slateDim.apply(renderFiveQuestions(finding, detail))}`;
181
+ }
182
+ else if (state === "unverified") {
183
+ const icon = colors.pulseCoral.dim(glyphs.critical);
184
+ const boldText = colors.pulseCoral.dim(`${headline} [unverified]`);
185
+ const headlineStr = ` ${icon} ${boldText}`;
186
+ if (mode === "headline")
187
+ return headlineStr;
188
+ const detailStr = colors.slateDim.dim(`${renderFiveQuestions(finding, detail)}\n (detection could not confirm liveness)`);
189
+ return `${headlineStr}\n${detailStr}`;
190
+ }
191
+ else if (state === "verified-dead") {
192
+ const icon = colors.slateDim.dim(glyphs.critical);
193
+ const boldText = colors.slateDim.dim(`${headline} [verified-dead]`);
194
+ const headlineStr = ` ${icon} ${boldText}`;
195
+ if (mode === "headline")
196
+ return headlineStr;
197
+ return `${headlineStr}\n${colors.slateDim.dim(renderFiveQuestions(finding, detail))}`;
198
+ }
199
+ }
200
+ const icon = styledGlyph(finding.severity);
201
+ const color = themeSeverityColor(finding.severity);
202
+ const headlineStr = ` ${icon} ${color.bold(headline)}`;
203
+ if (mode === "headline") {
204
+ return headlineStr;
205
+ }
206
+ else {
207
+ const detailStr = colors.slateDim.apply(renderFiveQuestions(finding, detail));
208
+ return `${headlineStr}\n${detailStr}`;
48
209
  }
49
- return line;
50
210
  }
51
211
  // ─── Health Score Formatter ──────────────────────────────────────────────────
52
212
  /**
53
- * Format a health score as a colored ASCII progress bar with grade.
213
+ * Format a health score using the Pulse Bar.
54
214
  *
55
- * Example: ████████████████████░░░ 92% A
215
+ * Example: Health ████████████████████░░░ 92/100
216
+ *
217
+ * Score-color mapping:
218
+ * 0-39 Pulse Coral
219
+ * 40-74 Amber Flag
220
+ * 75-100 Mint Clear
56
221
  */
57
- export function formatHealthScore(score, grade) {
222
+ export function formatHealthScore(score) {
58
223
  const clamped = Math.max(0, Math.min(100, Math.round(score)));
59
- const barWidth = 25;
60
- const filled = Math.round((clamped / 100) * barWidth);
61
- const empty = barWidth - filled;
62
- const filledChar = "█";
63
- const emptyChar = "";
64
- const gradeColorFn = gradeColor(grade);
65
- const bar = gradeColorFn(filledChar.repeat(filled)) +
66
- chalk.dim(emptyChar.repeat(empty));
67
- const pct = gradeColorFn(`${clamped}%`);
68
- const gradeLabel = gradeColorFn(chalk.bold(grade));
69
- return `${bar} ${pct} ${gradeLabel}`;
70
- }
71
- /**
72
- * Determine chalk color for a letter grade.
73
- */
74
- function gradeColor(grade) {
75
- const letter = grade.charAt(0).toUpperCase();
76
- switch (letter) {
77
- case "A":
78
- return (t) => chalk.green(t);
79
- case "B":
80
- return (t) => chalk.blue(t);
81
- case "C":
82
- return (t) => chalk.yellow(t);
83
- case "D":
84
- case "F":
85
- return (t) => chalk.red(t);
86
- default:
87
- return (t) => chalk.white(t);
224
+ const width = 25;
225
+ const filled = Math.round((clamped / 100) * width);
226
+ const empty = width - filled;
227
+ if (isPlainMode()) {
228
+ return `Health ${"#".repeat(filled)}${".".repeat(empty)} ${clamped}/100`;
88
229
  }
230
+ const fillColor = clamped <= 39
231
+ ? colors.pulseCoral
232
+ : clamped <= 74
233
+ ? colors.amberFlag
234
+ : colors.mintClear;
235
+ const filledStr = fillColor.apply(glyphs.filledBlock.repeat(filled));
236
+ const emptyStr = colors.slateDim.dim(glyphs.emptyBlock.repeat(empty));
237
+ const scoreStr = fillColor.bold(`${clamped}/100`);
238
+ return `${filledStr}${emptyStr} ${scoreStr}`;
89
239
  }
90
240
  // ─── Provider Link Formatter ─────────────────────────────────────────────────
91
241
  /**
@@ -94,10 +244,9 @@ function gradeColor(grade) {
94
244
  * Terminals that support OSC 8 will render this as a clickable link.
95
245
  */
96
246
  export function formatProviderLink(provider) {
97
- const icon = provider.icon || "🔑";
98
247
  // OSC 8 hyperlink: \e]8;;URL\e\\LABEL\e]8;;\e\\
99
- const link = `\u001B]8;;${provider.rotationUrl}\u001B\\${chalk.underline.cyan(provider.rotationUrl)}\u001B]8;;\u001B\\`;
100
- return ` ${icon} ${chalk.bold(provider.displayName)} Rotate: ${link}`;
248
+ const link = `\u001B]8;;${provider.rotationUrl}\u001B\\${colors.vitalTeal.apply(provider.rotationUrl)}\u001B]8;;\u001B\\`;
249
+ return ` ${colors.slateDim.apply(glyphs.info)} ${text.bold(provider.displayName)} ${glyphs.arrow} Rotate: ${link}`;
101
250
  }
102
251
  // ─── Secret Masker ───────────────────────────────────────────────────────────
103
252
  /**
@@ -123,8 +272,8 @@ export function maskSecret(value) {
123
272
  // ─── Diff Formatter ──────────────────────────────────────────────────────────
124
273
  /**
125
274
  * Simple colored diff between two strings.
126
- * Lines prefixed with - are colored red (removed).
127
- * Lines prefixed with + are colored green (added).
275
+ * Lines prefixed with - are colored Pulse Coral (removed).
276
+ * Lines prefixed with + are colored Mint Clear (added).
128
277
  * Context lines are dimmed.
129
278
  */
130
279
  export function formatDiff(before, after) {
@@ -143,7 +292,7 @@ export function formatDiff(before, after) {
143
292
  beforeLines[bi] === lcs[li] &&
144
293
  afterLines[ai] === lcs[li]) {
145
294
  // Context line — common to both
146
- output.push(chalk.dim(` ${beforeLines[bi]}`));
295
+ output.push(colors.slateDim.dim(` ${beforeLines[bi]}`));
147
296
  bi++;
148
297
  ai++;
149
298
  li++;
@@ -151,13 +300,13 @@ export function formatDiff(before, after) {
151
300
  else if (bi < beforeLines.length &&
152
301
  (li >= lcs.length || beforeLines[bi] !== lcs[li])) {
153
302
  // Removed line
154
- output.push(chalk.red(`- ${beforeLines[bi]}`));
303
+ output.push(colors.pulseCoral.apply(`- ${beforeLines[bi]}`));
155
304
  bi++;
156
305
  }
157
306
  else if (ai < afterLines.length &&
158
307
  (li >= lcs.length || afterLines[ai] !== lcs[li])) {
159
308
  // Added line
160
- output.push(chalk.green(`+ ${afterLines[ai]}`));
309
+ output.push(colors.mintClear.apply(`+ ${afterLines[ai]}`));
161
310
  ai++;
162
311
  }
163
312
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"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"}
@@ -1,39 +1,42 @@
1
- import type { Ora } from "ora";
2
- import type { ScanResult, WatchEvent, FixAction, Snapshot } from "../types/index.js";
1
+ import { Spinner } from "./theme.js";
2
+ import type { ScanResult, WatchEvent, Snapshot, FixPlan } from "../types/index.js";
3
3
  /**
4
- * Start a scan spinner — returns the ora instance for later updates.
4
+ * Start a scan spinner — returns a Spinner instance for later updates.
5
5
  */
6
- export declare function reportScanStart(projectDir: string): Ora;
6
+ export declare function reportScanStart(projectDir: string): Spinner;
7
7
  /**
8
8
  * Update the spinner text mid-scan.
9
9
  */
10
- export declare function reportScanProgress(spinner: Ora, message: string): void;
10
+ export declare function reportScanProgress(spinner: Spinner, message: string): void;
11
11
  /**
12
- * Print a comprehensive, beautiful scan report with findings grouped by
13
- * severity and a framed health card.
12
+ * Print the full Pulse-styled scan report:
13
+ * 1. Banner (BILT wordmark)
14
+ * 2. Pulse Bar (health score)
15
+ * 3. Findings
16
+ * 4. Summary line + CTA
14
17
  */
15
18
  export declare function reportScanResults(result: ScanResult, options?: {
16
- fun?: boolean;
17
19
  verbose?: boolean;
18
- }): void;
20
+ details?: boolean;
21
+ }): Promise<void>;
19
22
  /**
20
23
  * Print a real-time watch notification for a file event.
21
24
  */
22
- export declare function reportWatchEvent(event: WatchEvent): void;
25
+ export declare function reportWatchEvent(event: WatchEvent): Promise<void>;
23
26
  /**
24
- * Show a preview of all fix actions that will be applied.
27
+ * Show a detailed preview of a single fix plan.
25
28
  */
26
- export declare function reportFixPreview(actions: FixAction[]): void;
29
+ export declare function reportFixPlan(plan: FixPlan): Promise<void>;
27
30
  /**
28
31
  * Report fix application summary.
29
32
  */
30
- export declare function reportFixComplete(applied: number, skipped: number): void;
33
+ export declare function reportFixComplete(applied: number, skipped: number): Promise<void>;
31
34
  /**
32
35
  * Report a successful undo (snapshot restore).
33
36
  */
34
- export declare function reportUndoComplete(snapshot: Snapshot): void;
37
+ export declare function reportUndoComplete(snapshot: Snapshot): Promise<void>;
35
38
  /**
36
39
  * Print the zero-friction onboarding summary after `bilt init`.
37
40
  */
38
- export declare function reportInitComplete(result: ScanResult, fixesApplied: number): void;
41
+ export declare function reportInitComplete(result: ScanResult, fixesApplied: number): Promise<void>;
39
42
  //# sourceMappingURL=reporter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/ui/reporter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,KAAK,EACV,UAAU,EAEV,UAAU,EACV,SAAS,EACT,QAAQ,EAET,MAAM,mBAAmB,CAAC;AAU3B;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAOvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEtE;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GACjD,IAAI,CAmJN;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAgBxD;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CA0B3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAoBxE;AAID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAc3D;AAID;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,MAAM,GACnB,IAAI,CAkCN"}
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/ui/reporter.ts"],"names":[],"mappings":"AAIA,OAAO,EAWL,OAAO,EAER,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,UAAU,EAEV,UAAU,EACV,QAAQ,EAGR,OAAO,EACR,MAAM,mBAAmB,CAAC;AAuB3B;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAI3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1E;AAsBD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GACrD,OAAO,CAAC,IAAI,CAAC,CAyDf;AAID;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBvE;AAID;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BvF;AAID;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB1E;AAID;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAgDf"}