bilt-toolkit 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.
Files changed (116) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +168 -0
  3. package/bin/bilt.js +2 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +161 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/doctor.d.ts +13 -0
  9. package/dist/commands/doctor.d.ts.map +1 -0
  10. package/dist/commands/doctor.js +194 -0
  11. package/dist/commands/doctor.js.map +1 -0
  12. package/dist/commands/fix.d.ts +12 -0
  13. package/dist/commands/fix.d.ts.map +1 -0
  14. package/dist/commands/fix.js +273 -0
  15. package/dist/commands/fix.js.map +1 -0
  16. package/dist/commands/init.d.ts +11 -0
  17. package/dist/commands/init.d.ts.map +1 -0
  18. package/dist/commands/init.js +101 -0
  19. package/dist/commands/init.js.map +1 -0
  20. package/dist/commands/scan.d.ts +17 -0
  21. package/dist/commands/scan.d.ts.map +1 -0
  22. package/dist/commands/scan.js +267 -0
  23. package/dist/commands/scan.js.map +1 -0
  24. package/dist/commands/undo.d.ts +12 -0
  25. package/dist/commands/undo.d.ts.map +1 -0
  26. package/dist/commands/undo.js +90 -0
  27. package/dist/commands/undo.js.map +1 -0
  28. package/dist/commands/watch.d.ts +10 -0
  29. package/dist/commands/watch.d.ts.map +1 -0
  30. package/dist/commands/watch.js +68 -0
  31. package/dist/commands/watch.js.map +1 -0
  32. package/dist/config/config.d.ts +8 -0
  33. package/dist/config/config.d.ts.map +1 -0
  34. package/dist/config/config.js +75 -0
  35. package/dist/config/config.js.map +1 -0
  36. package/dist/core/fix/confirm.d.ts +21 -0
  37. package/dist/core/fix/confirm.d.ts.map +1 -0
  38. package/dist/core/fix/confirm.js +60 -0
  39. package/dist/core/fix/confirm.js.map +1 -0
  40. package/dist/core/fix/env-fix.d.ts +40 -0
  41. package/dist/core/fix/env-fix.d.ts.map +1 -0
  42. package/dist/core/fix/env-fix.js +186 -0
  43. package/dist/core/fix/env-fix.js.map +1 -0
  44. package/dist/core/fix/snapshot.d.ts +30 -0
  45. package/dist/core/fix/snapshot.d.ts.map +1 -0
  46. package/dist/core/fix/snapshot.js +186 -0
  47. package/dist/core/fix/snapshot.js.map +1 -0
  48. package/dist/core/rules/entropy.d.ts +29 -0
  49. package/dist/core/rules/entropy.d.ts.map +1 -0
  50. package/dist/core/rules/entropy.js +117 -0
  51. package/dist/core/rules/entropy.js.map +1 -0
  52. package/dist/core/rules/providers.d.ts +12 -0
  53. package/dist/core/rules/providers.d.ts.map +1 -0
  54. package/dist/core/rules/providers.js +184 -0
  55. package/dist/core/rules/providers.js.map +1 -0
  56. package/dist/core/rules/secret-rules.d.ts +3 -0
  57. package/dist/core/rules/secret-rules.d.ts.map +1 -0
  58. package/dist/core/rules/secret-rules.js +205 -0
  59. package/dist/core/rules/secret-rules.js.map +1 -0
  60. package/dist/core/scan/env.d.ts +47 -0
  61. package/dist/core/scan/env.d.ts.map +1 -0
  62. package/dist/core/scan/env.js +301 -0
  63. package/dist/core/scan/env.js.map +1 -0
  64. package/dist/core/scan/framework.d.ts +26 -0
  65. package/dist/core/scan/framework.d.ts.map +1 -0
  66. package/dist/core/scan/framework.js +254 -0
  67. package/dist/core/scan/framework.js.map +1 -0
  68. package/dist/core/scan/gitignore.d.ts +20 -0
  69. package/dist/core/scan/gitignore.d.ts.map +1 -0
  70. package/dist/core/scan/gitignore.js +217 -0
  71. package/dist/core/scan/gitignore.js.map +1 -0
  72. package/dist/core/scan/secrets.d.ts +27 -0
  73. package/dist/core/scan/secrets.d.ts.map +1 -0
  74. package/dist/core/scan/secrets.js +247 -0
  75. package/dist/core/scan/secrets.js.map +1 -0
  76. package/dist/core/score/health.d.ts +29 -0
  77. package/dist/core/score/health.d.ts.map +1 -0
  78. package/dist/core/score/health.js +73 -0
  79. package/dist/core/score/health.js.map +1 -0
  80. package/dist/core/watch/watcher.d.ts +29 -0
  81. package/dist/core/watch/watcher.d.ts.map +1 -0
  82. package/dist/core/watch/watcher.js +176 -0
  83. package/dist/core/watch/watcher.js.map +1 -0
  84. package/dist/index.d.ts +2 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +2 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/plugins/interface.d.ts +12 -0
  89. package/dist/plugins/interface.d.ts.map +1 -0
  90. package/dist/plugins/interface.js +91 -0
  91. package/dist/plugins/interface.js.map +1 -0
  92. package/dist/plugins/loader.d.ts +10 -0
  93. package/dist/plugins/loader.d.ts.map +1 -0
  94. package/dist/plugins/loader.js +104 -0
  95. package/dist/plugins/loader.js.map +1 -0
  96. package/dist/plugins/official/docker.d.ts +4 -0
  97. package/dist/plugins/official/docker.d.ts.map +1 -0
  98. package/dist/plugins/official/docker.js +111 -0
  99. package/dist/plugins/official/docker.js.map +1 -0
  100. package/dist/plugins/official/terraform.d.ts +4 -0
  101. package/dist/plugins/official/terraform.d.ts.map +1 -0
  102. package/dist/plugins/official/terraform.js +131 -0
  103. package/dist/plugins/official/terraform.js.map +1 -0
  104. package/dist/types/index.d.ts +158 -0
  105. package/dist/types/index.d.ts.map +1 -0
  106. package/dist/types/index.js +3 -0
  107. package/dist/types/index.js.map +1 -0
  108. package/dist/ui/format.d.ts +43 -0
  109. package/dist/ui/format.d.ts.map +1 -0
  110. package/dist/ui/format.js +207 -0
  111. package/dist/ui/format.js.map +1 -0
  112. package/dist/ui/reporter.d.ts +39 -0
  113. package/dist/ui/reporter.d.ts.map +1 -0
  114. package/dist/ui/reporter.js +254 -0
  115. package/dist/ui/reporter.js.map +1 -0
  116. package/package.json +65 -0
@@ -0,0 +1,254 @@
1
+ // ─── Reporter — Stunning Terminal Output ─────────────────────────────────────
2
+ // Renders every piece of user-visible CLI output.
3
+ import chalk from "chalk";
4
+ import ora from "ora";
5
+ import boxen from "boxen";
6
+ import { formatFinding, formatHealthScore, formatProviderLink, severityIcon, } from "./format.js";
7
+ // ─── Scan Lifecycle ──────────────────────────────────────────────────────────
8
+ /**
9
+ * Start a scan spinner — returns the ora instance for later updates.
10
+ */
11
+ export function reportScanStart(projectDir) {
12
+ const spinner = ora({
13
+ text: chalk.cyan(`Scanning project ${chalk.bold(projectDir)}…`),
14
+ spinner: "dots12",
15
+ color: "cyan",
16
+ }).start();
17
+ return spinner;
18
+ }
19
+ /**
20
+ * Update the spinner text mid-scan.
21
+ */
22
+ export function reportScanProgress(spinner, message) {
23
+ spinner.text = chalk.cyan(message);
24
+ }
25
+ // ─── Scan Results ────────────────────────────────────────────────────────────
26
+ /**
27
+ * Print a comprehensive, beautiful scan report with findings grouped by
28
+ * severity and a framed health card.
29
+ */
30
+ export function reportScanResults(result, options = {}) {
31
+ const { findings, healthScore, grade, scannedFiles, duration, framework } = result;
32
+ console.log("");
33
+ // ── Group findings by severity ───────────────────────────────────────
34
+ const grouped = groupBySeverity(findings);
35
+ if (findings.length === 0) {
36
+ console.log(chalk.green.bold(" ✨ No issues found — your project is squeaky clean!"));
37
+ console.log("");
38
+ }
39
+ else {
40
+ // Print critical first, then warning, then info
41
+ const order = ["critical", "warning", "info"];
42
+ for (const sev of order) {
43
+ const group = grouped.get(sev);
44
+ if (!group || group.length === 0)
45
+ continue;
46
+ const icon = severityIcon(sev);
47
+ const label = sev.charAt(0).toUpperCase() + sev.slice(1);
48
+ console.log(` ${icon} ${chalk.bold(label)} ${chalk.dim(`(${group.length})`)}`);
49
+ for (const f of group) {
50
+ console.log(formatFinding(f));
51
+ if (options.verbose && f.suggestion) {
52
+ console.log(chalk.dim(` 💡 ${f.suggestion}`));
53
+ }
54
+ }
55
+ console.log("");
56
+ }
57
+ }
58
+ // ── Provider rotation links for secrets ──────────────────────────────
59
+ const providers = new Map();
60
+ for (const f of findings) {
61
+ if (f.provider && !providers.has(f.provider.name)) {
62
+ providers.set(f.provider.name, f);
63
+ }
64
+ }
65
+ if (providers.size > 0) {
66
+ console.log(chalk.bold(" 🔑 Rotate compromised keys:"));
67
+ for (const [, f] of providers) {
68
+ if (f.provider) {
69
+ console.log(formatProviderLink(f.provider));
70
+ }
71
+ }
72
+ console.log("");
73
+ }
74
+ // ── Health card ──────────────────────────────────────────────────────
75
+ const healthBar = formatHealthScore(healthScore, grade);
76
+ const criticalCount = grouped.get("critical")?.length ?? 0;
77
+ const warningCount = grouped.get("warning")?.length ?? 0;
78
+ const envMissing = findings.filter((f) => f.category === "env-missing").length;
79
+ const gitignoreOk = findings.filter((f) => f.category === "gitignore-missing").length === 0;
80
+ const secretsClean = criticalCount === 0;
81
+ const lines = [];
82
+ lines.push("");
83
+ lines.push(chalk.bold(" 🏗️ BILT HEALTH REPORT"));
84
+ lines.push("");
85
+ lines.push(` Score: ${chalk.bold(String(healthScore))}/100 ${chalk.bold(grade)}`);
86
+ lines.push(` ${healthBar}`);
87
+ lines.push("");
88
+ // Status lines
89
+ if (secretsClean) {
90
+ lines.push(chalk.green(" ✓ Secrets: Clean"));
91
+ }
92
+ else {
93
+ lines.push(chalk.red(` ✗ Secrets: ${criticalCount} found`));
94
+ }
95
+ if (envMissing === 0) {
96
+ lines.push(chalk.green(" ✓ Env vars: All present"));
97
+ }
98
+ else {
99
+ lines.push(chalk.yellow(` ⚠ Env vars: ${envMissing} missing`));
100
+ }
101
+ if (gitignoreOk) {
102
+ lines.push(chalk.green(" ✓ .gitignore: OK"));
103
+ }
104
+ else {
105
+ lines.push(chalk.yellow(" ⚠ .gitignore: Needs attention"));
106
+ }
107
+ if (framework) {
108
+ lines.push(chalk.green(` ✓ Framework: ${framework.displayName} detected`));
109
+ }
110
+ lines.push("");
111
+ lines.push(chalk.dim(` Scanned ${scannedFiles} files in ${duration}ms`));
112
+ lines.push("");
113
+ // Fun mode extras
114
+ if (options.fun) {
115
+ if (healthScore === 100) {
116
+ lines.push(chalk.bold.green(" 🎉🎉🎉 PERFECT SCORE! You are a security legend! 🎉🎉🎉"));
117
+ lines.push("");
118
+ }
119
+ else if (healthScore >= 90) {
120
+ lines.push(chalk.green(" 🔥 Almost there — keep the streak alive!"));
121
+ lines.push("");
122
+ }
123
+ else if (healthScore >= 70) {
124
+ lines.push(chalk.yellow(" 💪 Not bad! A few tweaks and you'll be golden."));
125
+ lines.push("");
126
+ }
127
+ else {
128
+ lines.push(chalk.red(" 🩹 Time to roll up those sleeves."));
129
+ lines.push("");
130
+ }
131
+ }
132
+ if (warningCount > 0 && criticalCount === 0) {
133
+ lines.push(chalk.dim(" Run `bilt fix` to auto-fix safe issues."));
134
+ lines.push("");
135
+ }
136
+ else if (criticalCount > 0) {
137
+ lines.push(chalk.dim(" Run `bilt fix --safe` to fix what can be safely automated."));
138
+ lines.push("");
139
+ }
140
+ const card = boxen(lines.join("\n"), {
141
+ padding: 0,
142
+ margin: { top: 0, bottom: 0, left: 1, right: 1 },
143
+ borderStyle: "round",
144
+ borderColor: healthScore >= 90 ? "green" : healthScore >= 70 ? "yellow" : "red",
145
+ dimBorder: false,
146
+ });
147
+ console.log(card);
148
+ console.log("");
149
+ }
150
+ // ─── Watch Events ────────────────────────────────────────────────────────────
151
+ /**
152
+ * Print a real-time watch notification for a file event.
153
+ */
154
+ export function reportWatchEvent(event) {
155
+ const ts = chalk.dim(event.timestamp.toLocaleTimeString("en-US", { hour12: false }));
156
+ if (event.findings.length === 0) {
157
+ console.log(`${ts} ${chalk.green("✓")} ${chalk.dim(event.file)} — clean`);
158
+ return;
159
+ }
160
+ for (const f of event.findings) {
161
+ const icon = severityIcon(f.severity);
162
+ console.log(`${ts} ${icon} ${chalk.bold(f.message)} ${chalk.dim(`${event.file}${f.line ? `:${f.line}` : ""}`)}`);
163
+ }
164
+ }
165
+ // ─── Fix Previews ────────────────────────────────────────────────────────────
166
+ /**
167
+ * Show a preview of all fix actions that will be applied.
168
+ */
169
+ export function reportFixPreview(actions) {
170
+ console.log("");
171
+ console.log(chalk.bold(" 📋 Fix Plan"));
172
+ console.log("");
173
+ for (const action of actions) {
174
+ const typeIcon = action.type === "safe"
175
+ ? chalk.green("●")
176
+ : action.type === "destructive"
177
+ ? chalk.yellow("●")
178
+ : chalk.red("●");
179
+ const typeLabel = chalk.dim(`[${action.type}]`);
180
+ console.log(` ${typeIcon} ${action.description} ${typeLabel}`);
181
+ if (action.preview) {
182
+ console.log(chalk.dim(` ${action.preview}`));
183
+ }
184
+ }
185
+ console.log("");
186
+ console.log(chalk.dim(` ${chalk.green("●")} safe ${chalk.yellow("●")} destructive ${chalk.red("●")} irreversible`));
187
+ console.log("");
188
+ }
189
+ /**
190
+ * Report fix application summary.
191
+ */
192
+ export function reportFixComplete(applied, skipped) {
193
+ console.log("");
194
+ if (applied > 0) {
195
+ console.log(chalk.green.bold(` ✅ ${applied} fix${applied !== 1 ? "es" : ""} applied successfully.`));
196
+ }
197
+ if (skipped > 0) {
198
+ console.log(chalk.yellow(` ⏭ ${skipped} fix${skipped !== 1 ? "es" : ""} skipped.`));
199
+ }
200
+ if (applied > 0) {
201
+ console.log(chalk.dim(" A snapshot was saved — run `bilt undo` to revert."));
202
+ }
203
+ console.log("");
204
+ }
205
+ // ─── Undo ────────────────────────────────────────────────────────────────────
206
+ /**
207
+ * Report a successful undo (snapshot restore).
208
+ */
209
+ export function reportUndoComplete(snapshot) {
210
+ console.log("");
211
+ console.log(chalk.green.bold(" ⏪ Undo successful!"));
212
+ console.log(chalk.dim(` Restored snapshot ${chalk.white(snapshot.id)} (${snapshot.description})`));
213
+ console.log(chalk.dim(` ${snapshot.files.length} file${snapshot.files.length !== 1 ? "s" : ""} restored.`));
214
+ console.log("");
215
+ }
216
+ // ─── Init Summary ────────────────────────────────────────────────────────────
217
+ /**
218
+ * Print the zero-friction onboarding summary after `bilt init`.
219
+ */
220
+ export function reportInitComplete(result, fixesApplied) {
221
+ console.log("");
222
+ const banner = boxen(`\n${chalk.bold.cyan(" 🏗️ Welcome to Bilt!")}\n\n` +
223
+ chalk.dim(" Your project has been scanned and hardened.\n") +
224
+ chalk.dim(" Zero configuration needed.\n"), {
225
+ padding: 0,
226
+ margin: { top: 0, bottom: 0, left: 1, right: 1 },
227
+ borderStyle: "round",
228
+ borderColor: "cyan",
229
+ });
230
+ console.log(banner);
231
+ console.log("");
232
+ if (fixesApplied > 0) {
233
+ console.log(chalk.green(` ✅ ${fixesApplied} safe fix${fixesApplied !== 1 ? "es" : ""} applied automatically.`));
234
+ }
235
+ // Delegate to the main health card
236
+ reportScanResults(result, { fun: true });
237
+ console.log(chalk.bold(" 🚀 Next steps:"));
238
+ console.log(chalk.dim(" bilt scan Full project scan"));
239
+ console.log(chalk.dim(" bilt fix Auto-fix issues"));
240
+ console.log(chalk.dim(" bilt watch Real-time monitoring"));
241
+ console.log(chalk.dim(" bilt doctor Detailed health report"));
242
+ console.log("");
243
+ }
244
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
245
+ function groupBySeverity(findings) {
246
+ const map = new Map();
247
+ for (const f of findings) {
248
+ const list = map.get(f.severity) ?? [];
249
+ list.push(f);
250
+ map.set(f.severity, list);
251
+ }
252
+ return map;
253
+ }
254
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/ui/reporter.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "bilt-toolkit",
3
+ "version": "1.0.0",
4
+ "description": "Zero-configuration CLI toolkit that keeps local projects healthy before they reach Git.",
5
+ "type": "module",
6
+ "main": "dist/cli.js",
7
+ "bin": {
8
+ "bilt": "./bin/bilt.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "bin"
13
+ ],
14
+ "scripts": {
15
+ "dev": "tsx src/cli.ts",
16
+ "build": "tsc",
17
+ "start": "node dist/cli.js",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "test:unit": "vitest run --project unit",
21
+ "test:integration": "vitest run --project integration",
22
+ "test:regression": "vitest run --project regression",
23
+ "test:fuzz": "vitest run --project fuzz",
24
+ "test:perf": "vitest run --project perf",
25
+ "test:coverage": "vitest run --coverage",
26
+ "test:all": "vitest run",
27
+ "clean": "rimraf dist",
28
+ "lint": "eslint .",
29
+ "format": "prettier --write ."
30
+ },
31
+ "keywords": [
32
+ "cli",
33
+ "security",
34
+ "secrets",
35
+ "env",
36
+ "gitignore",
37
+ "developer-tools"
38
+ ],
39
+ "author": "",
40
+ "license": "MIT",
41
+ "dependencies": {
42
+ "boxen": "^8.0.1",
43
+ "chalk": "^5.6.2",
44
+ "chokidar": "^4.0.3",
45
+ "commander": "^15.0.0",
46
+ "cosmiconfig": "^9.0.2",
47
+ "dotenv": "^17.4.2",
48
+ "enquirer": "^2.4.1",
49
+ "execa": "^9.6.1",
50
+ "fast-glob": "^3.3.3",
51
+ "ora": "^9.4.1",
52
+ "simple-git": "^3.27.0",
53
+ "zod": "^4.4.3"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^26.1.1",
57
+ "@vitest/coverage-v8": "^4.1.10",
58
+ "eslint": "^10.7.0",
59
+ "prettier": "^3.9.5",
60
+ "rimraf": "^6.1.3",
61
+ "tsx": "^4.23.1",
62
+ "typescript": "^7.0.2",
63
+ "vitest": "^4.1.10"
64
+ }
65
+ }