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.
- package/LICENSE +0 -0
- package/README.md +168 -0
- package/bin/bilt.js +2 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +161 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/doctor.d.ts +13 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +194 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/fix.d.ts +12 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +273 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +101 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/scan.d.ts +17 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +267 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/undo.d.ts +12 -0
- package/dist/commands/undo.d.ts.map +1 -0
- package/dist/commands/undo.js +90 -0
- package/dist/commands/undo.js.map +1 -0
- package/dist/commands/watch.d.ts +10 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +68 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config/config.d.ts +8 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +75 -0
- package/dist/config/config.js.map +1 -0
- package/dist/core/fix/confirm.d.ts +21 -0
- package/dist/core/fix/confirm.d.ts.map +1 -0
- package/dist/core/fix/confirm.js +60 -0
- package/dist/core/fix/confirm.js.map +1 -0
- package/dist/core/fix/env-fix.d.ts +40 -0
- package/dist/core/fix/env-fix.d.ts.map +1 -0
- package/dist/core/fix/env-fix.js +186 -0
- package/dist/core/fix/env-fix.js.map +1 -0
- package/dist/core/fix/snapshot.d.ts +30 -0
- package/dist/core/fix/snapshot.d.ts.map +1 -0
- package/dist/core/fix/snapshot.js +186 -0
- package/dist/core/fix/snapshot.js.map +1 -0
- package/dist/core/rules/entropy.d.ts +29 -0
- package/dist/core/rules/entropy.d.ts.map +1 -0
- package/dist/core/rules/entropy.js +117 -0
- package/dist/core/rules/entropy.js.map +1 -0
- package/dist/core/rules/providers.d.ts +12 -0
- package/dist/core/rules/providers.d.ts.map +1 -0
- package/dist/core/rules/providers.js +184 -0
- package/dist/core/rules/providers.js.map +1 -0
- package/dist/core/rules/secret-rules.d.ts +3 -0
- package/dist/core/rules/secret-rules.d.ts.map +1 -0
- package/dist/core/rules/secret-rules.js +205 -0
- package/dist/core/rules/secret-rules.js.map +1 -0
- package/dist/core/scan/env.d.ts +47 -0
- package/dist/core/scan/env.d.ts.map +1 -0
- package/dist/core/scan/env.js +301 -0
- package/dist/core/scan/env.js.map +1 -0
- package/dist/core/scan/framework.d.ts +26 -0
- package/dist/core/scan/framework.d.ts.map +1 -0
- package/dist/core/scan/framework.js +254 -0
- package/dist/core/scan/framework.js.map +1 -0
- package/dist/core/scan/gitignore.d.ts +20 -0
- package/dist/core/scan/gitignore.d.ts.map +1 -0
- package/dist/core/scan/gitignore.js +217 -0
- package/dist/core/scan/gitignore.js.map +1 -0
- package/dist/core/scan/secrets.d.ts +27 -0
- package/dist/core/scan/secrets.d.ts.map +1 -0
- package/dist/core/scan/secrets.js +247 -0
- package/dist/core/scan/secrets.js.map +1 -0
- package/dist/core/score/health.d.ts +29 -0
- package/dist/core/score/health.d.ts.map +1 -0
- package/dist/core/score/health.js +73 -0
- package/dist/core/score/health.js.map +1 -0
- package/dist/core/watch/watcher.d.ts +29 -0
- package/dist/core/watch/watcher.d.ts.map +1 -0
- package/dist/core/watch/watcher.js +176 -0
- package/dist/core/watch/watcher.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/interface.d.ts +12 -0
- package/dist/plugins/interface.d.ts.map +1 -0
- package/dist/plugins/interface.js +91 -0
- package/dist/plugins/interface.js.map +1 -0
- package/dist/plugins/loader.d.ts +10 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +104 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/official/docker.d.ts +4 -0
- package/dist/plugins/official/docker.d.ts.map +1 -0
- package/dist/plugins/official/docker.js +111 -0
- package/dist/plugins/official/docker.js.map +1 -0
- package/dist/plugins/official/terraform.d.ts +4 -0
- package/dist/plugins/official/terraform.d.ts.map +1 -0
- package/dist/plugins/official/terraform.js +131 -0
- package/dist/plugins/official/terraform.js.map +1 -0
- package/dist/types/index.d.ts +158 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/format.d.ts +43 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +207 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/reporter.d.ts +39 -0
- package/dist/ui/reporter.d.ts.map +1 -0
- package/dist/ui/reporter.js +254 -0
- package/dist/ui/reporter.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// ─── Terraform Plugin ────────────────────────────────────────────────────────
|
|
2
|
+
// Scans .tf files for hardcoded credentials and checks gitignore for tfvars.
|
|
3
|
+
import { promises as fs } from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
// Patterns that match hardcoded secrets in Terraform files
|
|
6
|
+
const TF_SECRET_PATTERNS = [
|
|
7
|
+
{
|
|
8
|
+
name: "AWS access key",
|
|
9
|
+
pattern: /access_key\s*=\s*"(?!(\$\{|var\.|local\.|data\.))(AKIA[0-9A-Z]{16})"/i,
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: "AWS secret key",
|
|
13
|
+
pattern: /secret_key\s*=\s*"(?!(\$\{|var\.|local\.|data\.))[A-Za-z0-9/+=]{40}"/,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: "password",
|
|
17
|
+
pattern: /password\s*=\s*"(?!(\$\{|var\.|local\.|data\.|<|your_|changeme|placeholder))[^"]{6,}"/i,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "token",
|
|
21
|
+
pattern: /token\s*=\s*"(?!(\$\{|var\.|local\.|data\.|<|your_|changeme|placeholder))[^"]{10,}"/i,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "private key",
|
|
25
|
+
pattern: /private_key\s*=\s*"(?!(\$\{|var\.|local\.|data\.|file\())[^"]+"/i,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "secret",
|
|
29
|
+
pattern: /(?:client_secret|api_secret|secret_access_key)\s*=\s*"(?!(\$\{|var\.|local\.|data\.))[^"]{8,}"/i,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "connection string",
|
|
33
|
+
pattern: /(?:connection_string|database_url)\s*=\s*"(?!(\$\{|var\.|local\.|data\.))[^"]+:\/\/[^"]+"/i,
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
const plugin = {
|
|
37
|
+
name: "bilt-plugin-terraform",
|
|
38
|
+
version: "1.0.0",
|
|
39
|
+
description: "Scans Terraform files for hardcoded credentials and validates .gitignore for .tfvars.",
|
|
40
|
+
async check(context) {
|
|
41
|
+
const findings = [];
|
|
42
|
+
// ── Find all .tf files ─────────────────────────────────────────────
|
|
43
|
+
const tfFiles = context.files.filter((f) => f.endsWith(".tf") || f.endsWith(".tf.json"));
|
|
44
|
+
for (const tfFile of tfFiles) {
|
|
45
|
+
const fullPath = path.join(context.rootDir, tfFile);
|
|
46
|
+
let content;
|
|
47
|
+
try {
|
|
48
|
+
content = await fs.readFile(fullPath, "utf-8");
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const lines = content.split("\n");
|
|
54
|
+
for (let i = 0; i < lines.length; i++) {
|
|
55
|
+
const line = lines[i];
|
|
56
|
+
const trimmed = line.trim();
|
|
57
|
+
// Skip comments
|
|
58
|
+
if (trimmed.startsWith("#") ||
|
|
59
|
+
trimmed.startsWith("//") ||
|
|
60
|
+
trimmed.startsWith("/*")) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
for (const { name, pattern } of TF_SECRET_PATTERNS) {
|
|
64
|
+
if (pattern.test(trimmed)) {
|
|
65
|
+
findings.push({
|
|
66
|
+
id: `terraform-hardcoded-${name.replace(/\s+/g, "-")}-${tfFile}-${i + 1}`,
|
|
67
|
+
severity: "critical",
|
|
68
|
+
category: "plugin-finding",
|
|
69
|
+
message: `Hardcoded ${name} found in Terraform file`,
|
|
70
|
+
file: tfFile,
|
|
71
|
+
line: i + 1,
|
|
72
|
+
suggestion: `Use a Terraform variable (var.${name.replace(/\s+/g, "_")}) or environment variable instead of hardcoding the value.`,
|
|
73
|
+
});
|
|
74
|
+
break; // One finding per line
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ── Check terraform.tfvars in .gitignore ───────────────────────────
|
|
80
|
+
const hasTfvars = context.files.some((f) => f.endsWith(".tfvars") ||
|
|
81
|
+
f.endsWith(".tfvars.json") ||
|
|
82
|
+
path.basename(f) === "terraform.tfvars");
|
|
83
|
+
if (hasTfvars || tfFiles.length > 0) {
|
|
84
|
+
const gitignorePath = path.join(context.rootDir, ".gitignore");
|
|
85
|
+
try {
|
|
86
|
+
const content = await fs.readFile(gitignorePath, "utf-8");
|
|
87
|
+
const lines = content
|
|
88
|
+
.split("\n")
|
|
89
|
+
.map((l) => l.trim())
|
|
90
|
+
.filter((l) => l !== "" && !l.startsWith("#"));
|
|
91
|
+
const coversTfvars = lines.some((l) => l === "*.tfvars" ||
|
|
92
|
+
l === "*.tfvars.json" ||
|
|
93
|
+
l === "terraform.tfvars" ||
|
|
94
|
+
l === "*.auto.tfvars" ||
|
|
95
|
+
l === ".terraform/" ||
|
|
96
|
+
l === ".terraform");
|
|
97
|
+
if (!coversTfvars) {
|
|
98
|
+
findings.push({
|
|
99
|
+
id: "terraform-gitignore-tfvars",
|
|
100
|
+
severity: "warning",
|
|
101
|
+
category: "plugin-finding",
|
|
102
|
+
message: ".gitignore does not exclude *.tfvars — variable files with secrets may be committed",
|
|
103
|
+
file: ".gitignore",
|
|
104
|
+
suggestion: "Add `*.tfvars` and `*.tfvars.json` to your .gitignore to prevent committing secret variable files.",
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// Also check .terraform directory
|
|
108
|
+
const coversTerraformDir = lines.some((l) => l === ".terraform" ||
|
|
109
|
+
l === ".terraform/" ||
|
|
110
|
+
l === ".terraform/**" ||
|
|
111
|
+
l === ".terraform/*");
|
|
112
|
+
if (!coversTerraformDir) {
|
|
113
|
+
findings.push({
|
|
114
|
+
id: "terraform-gitignore-dir",
|
|
115
|
+
severity: "info",
|
|
116
|
+
category: "plugin-finding",
|
|
117
|
+
message: ".gitignore does not exclude .terraform/ directory — state and providers should not be committed",
|
|
118
|
+
file: ".gitignore",
|
|
119
|
+
suggestion: "Add `.terraform/` to your .gitignore to exclude provider binaries and local state.",
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// No .gitignore at all — already covered by core scan
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return { findings };
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
export default plugin;
|
|
131
|
+
//# sourceMappingURL=terraform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../../src/plugins/official/terraform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
export type Severity = "critical" | "warning" | "info";
|
|
2
|
+
export type FindingCategory = "secret-detected" | "env-missing" | "env-unused" | "env-mismatch" | "env-exposed" | "gitignore-missing" | "framework-warning" | "plugin-finding";
|
|
3
|
+
export interface ScanFinding {
|
|
4
|
+
id: string;
|
|
5
|
+
severity: Severity;
|
|
6
|
+
category: FindingCategory;
|
|
7
|
+
message: string;
|
|
8
|
+
file: string;
|
|
9
|
+
line?: number;
|
|
10
|
+
column?: number;
|
|
11
|
+
suggestion?: string;
|
|
12
|
+
provider?: ProviderInfo;
|
|
13
|
+
ruleId?: string;
|
|
14
|
+
/** Masked preview of the detected value */
|
|
15
|
+
preview?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ScanResult {
|
|
18
|
+
findings: ScanFinding[];
|
|
19
|
+
healthScore: number;
|
|
20
|
+
grade: string;
|
|
21
|
+
timestamp: Date;
|
|
22
|
+
scannedFiles: number;
|
|
23
|
+
framework?: FrameworkInfo;
|
|
24
|
+
duration: number;
|
|
25
|
+
}
|
|
26
|
+
export interface SecretRule {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
pattern: RegExp;
|
|
30
|
+
provider?: string;
|
|
31
|
+
severity: Severity;
|
|
32
|
+
description: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ProviderInfo {
|
|
35
|
+
name: string;
|
|
36
|
+
displayName: string;
|
|
37
|
+
icon: string;
|
|
38
|
+
rotationUrl: string;
|
|
39
|
+
docsUrl: string;
|
|
40
|
+
}
|
|
41
|
+
export type FixType = "safe" | "destructive" | "irreversible";
|
|
42
|
+
export interface FixAction {
|
|
43
|
+
id: string;
|
|
44
|
+
description: string;
|
|
45
|
+
type: FixType;
|
|
46
|
+
/** The finding this fix addresses */
|
|
47
|
+
findingId: string;
|
|
48
|
+
/** Preview of what the fix will do */
|
|
49
|
+
preview?: string;
|
|
50
|
+
/** Function to apply the fix — returns true if successful */
|
|
51
|
+
apply: () => Promise<boolean>;
|
|
52
|
+
}
|
|
53
|
+
export interface SnapshotFile {
|
|
54
|
+
path: string;
|
|
55
|
+
content: string;
|
|
56
|
+
}
|
|
57
|
+
export interface Snapshot {
|
|
58
|
+
id: string;
|
|
59
|
+
timestamp: Date;
|
|
60
|
+
description: string;
|
|
61
|
+
files: SnapshotFile[];
|
|
62
|
+
}
|
|
63
|
+
export interface SnapshotManifest {
|
|
64
|
+
id: string;
|
|
65
|
+
timestamp: string;
|
|
66
|
+
description: string;
|
|
67
|
+
filePaths: string[];
|
|
68
|
+
}
|
|
69
|
+
export interface BiltConfig {
|
|
70
|
+
/** Glob patterns to ignore during scanning */
|
|
71
|
+
ignore: string[];
|
|
72
|
+
/** Severity overrides by rule ID */
|
|
73
|
+
severityOverrides: Record<string, Severity>;
|
|
74
|
+
/** Paths to plugin files/packages */
|
|
75
|
+
plugins: string[];
|
|
76
|
+
/** Entropy threshold for secret detection */
|
|
77
|
+
entropyThreshold: number;
|
|
78
|
+
/** Number of git commits to scan (default 10) */
|
|
79
|
+
historyDepth: number;
|
|
80
|
+
/** Custom secret rules */
|
|
81
|
+
customRules: SecretRule[];
|
|
82
|
+
/** Enable fun mode */
|
|
83
|
+
funMode: boolean;
|
|
84
|
+
}
|
|
85
|
+
export interface FrameworkInfo {
|
|
86
|
+
name: string;
|
|
87
|
+
displayName: string;
|
|
88
|
+
/** Prefixes that expose env vars to client bundles */
|
|
89
|
+
clientExposedPrefixes: string[];
|
|
90
|
+
/** Config files that identify this framework */
|
|
91
|
+
configFiles: string[];
|
|
92
|
+
}
|
|
93
|
+
export interface PluginContext {
|
|
94
|
+
/** Root directory of the project */
|
|
95
|
+
rootDir: string;
|
|
96
|
+
/** All files in the project (relative paths) */
|
|
97
|
+
files: string[];
|
|
98
|
+
/** Parsed env vars from all .env files */
|
|
99
|
+
envVars: Map<string, Map<string, string>>;
|
|
100
|
+
/** Git info */
|
|
101
|
+
git: {
|
|
102
|
+
isRepo: boolean;
|
|
103
|
+
branch?: string;
|
|
104
|
+
};
|
|
105
|
+
/** Bilt config */
|
|
106
|
+
config: BiltConfig;
|
|
107
|
+
}
|
|
108
|
+
export interface PluginResult {
|
|
109
|
+
findings: ScanFinding[];
|
|
110
|
+
fixes?: FixAction[];
|
|
111
|
+
}
|
|
112
|
+
export interface PluginManifest {
|
|
113
|
+
name: string;
|
|
114
|
+
version: string;
|
|
115
|
+
description: string;
|
|
116
|
+
check: (context: PluginContext) => Promise<PluginResult>;
|
|
117
|
+
fix?: (context: PluginContext) => Promise<PluginResult>;
|
|
118
|
+
}
|
|
119
|
+
export interface WatchEvent {
|
|
120
|
+
type: "add" | "change" | "unlink";
|
|
121
|
+
file: string;
|
|
122
|
+
findings: ScanFinding[];
|
|
123
|
+
timestamp: Date;
|
|
124
|
+
}
|
|
125
|
+
export interface ParsedEnvEntry {
|
|
126
|
+
key: string;
|
|
127
|
+
value: string;
|
|
128
|
+
line: number;
|
|
129
|
+
comment?: string;
|
|
130
|
+
/** Whether the value appears to be a secret */
|
|
131
|
+
isSecret?: boolean;
|
|
132
|
+
}
|
|
133
|
+
export interface ParsedEnvFile {
|
|
134
|
+
filePath: string;
|
|
135
|
+
entries: Map<string, ParsedEnvEntry>;
|
|
136
|
+
/** Raw lines for preserving structure */
|
|
137
|
+
rawLines: string[];
|
|
138
|
+
}
|
|
139
|
+
export interface ScanOptions {
|
|
140
|
+
fullHistory?: boolean;
|
|
141
|
+
json?: boolean;
|
|
142
|
+
severity?: Severity;
|
|
143
|
+
verbose?: boolean;
|
|
144
|
+
quiet?: boolean;
|
|
145
|
+
dryRun?: boolean;
|
|
146
|
+
fun?: boolean;
|
|
147
|
+
}
|
|
148
|
+
export interface FixOptions {
|
|
149
|
+
safe?: boolean;
|
|
150
|
+
dryRun?: boolean;
|
|
151
|
+
verbose?: boolean;
|
|
152
|
+
quiet?: boolean;
|
|
153
|
+
}
|
|
154
|
+
export interface WatchOptions {
|
|
155
|
+
quiet?: boolean;
|
|
156
|
+
debounce?: number;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,gFAAgF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ScanFinding, Severity, ProviderInfo } from "../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Return the emoji icon for a severity level.
|
|
4
|
+
*/
|
|
5
|
+
export declare function severityIcon(severity: Severity): string;
|
|
6
|
+
/**
|
|
7
|
+
* Return the chalk color function for a severity level.
|
|
8
|
+
*/
|
|
9
|
+
export declare function severityColor(severity: Severity): (text: string) => string;
|
|
10
|
+
/**
|
|
11
|
+
* Format a single finding as a one-line string with severity icon,
|
|
12
|
+
* colored message, and file:line reference.
|
|
13
|
+
*
|
|
14
|
+
* Example: 🔴 AWS access key detected config.js:12
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatFinding(finding: ScanFinding): string;
|
|
17
|
+
/**
|
|
18
|
+
* Format a health score as a colored ASCII progress bar with grade.
|
|
19
|
+
*
|
|
20
|
+
* Example: ████████████████████░░░ 92% A
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatHealthScore(score: number, grade: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Format a provider name with a clickable rotation URL as a terminal hyperlink.
|
|
25
|
+
*
|
|
26
|
+
* Terminals that support OSC 8 will render this as a clickable link.
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatProviderLink(provider: ProviderInfo): string;
|
|
29
|
+
/**
|
|
30
|
+
* Mask a secret value for safe display.
|
|
31
|
+
*
|
|
32
|
+
* - If value ≥ 12 chars: show first 4 + asterisks + last 4
|
|
33
|
+
* - If value < 12 chars: show first 2 + asterisks for rest
|
|
34
|
+
*/
|
|
35
|
+
export declare function maskSecret(value: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Simple colored diff between two strings.
|
|
38
|
+
* Lines prefixed with - are colored red (removed).
|
|
39
|
+
* Lines prefixed with + are colored green (added).
|
|
40
|
+
* Context lines are dimmed.
|
|
41
|
+
*/
|
|
42
|
+
export declare function formatDiff(before: string, after: string): string;
|
|
43
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAI7E;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CASvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAS1E;AAID;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAe1D;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBtE;AAwBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAKjE;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAehD;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA6ChE"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// ─── UI Format Utilities ─────────────────────────────────────────────────────
|
|
2
|
+
// Atomic formatters used across the entire CLI output layer.
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
// ─── Severity Helpers ────────────────────────────────────────────────────────
|
|
5
|
+
/**
|
|
6
|
+
* Return the emoji icon for a severity level.
|
|
7
|
+
*/
|
|
8
|
+
export function severityIcon(severity) {
|
|
9
|
+
switch (severity) {
|
|
10
|
+
case "critical":
|
|
11
|
+
return "🔴";
|
|
12
|
+
case "warning":
|
|
13
|
+
return "🟡";
|
|
14
|
+
case "info":
|
|
15
|
+
return "🔵";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Return the chalk color function for a severity level.
|
|
20
|
+
*/
|
|
21
|
+
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);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// ─── Finding Formatter ───────────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
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
|
|
37
|
+
*/
|
|
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}]`)}`;
|
|
48
|
+
}
|
|
49
|
+
return line;
|
|
50
|
+
}
|
|
51
|
+
// ─── Health Score Formatter ──────────────────────────────────────────────────
|
|
52
|
+
/**
|
|
53
|
+
* Format a health score as a colored ASCII progress bar with grade.
|
|
54
|
+
*
|
|
55
|
+
* Example: ████████████████████░░░ 92% A
|
|
56
|
+
*/
|
|
57
|
+
export function formatHealthScore(score, grade) {
|
|
58
|
+
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);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// ─── Provider Link Formatter ─────────────────────────────────────────────────
|
|
91
|
+
/**
|
|
92
|
+
* Format a provider name with a clickable rotation URL as a terminal hyperlink.
|
|
93
|
+
*
|
|
94
|
+
* Terminals that support OSC 8 will render this as a clickable link.
|
|
95
|
+
*/
|
|
96
|
+
export function formatProviderLink(provider) {
|
|
97
|
+
const icon = provider.icon || "🔑";
|
|
98
|
+
// 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}`;
|
|
101
|
+
}
|
|
102
|
+
// ─── Secret Masker ───────────────────────────────────────────────────────────
|
|
103
|
+
/**
|
|
104
|
+
* Mask a secret value for safe display.
|
|
105
|
+
*
|
|
106
|
+
* - If value ≥ 12 chars: show first 4 + asterisks + last 4
|
|
107
|
+
* - If value < 12 chars: show first 2 + asterisks for rest
|
|
108
|
+
*/
|
|
109
|
+
export function maskSecret(value) {
|
|
110
|
+
if (value.length >= 12) {
|
|
111
|
+
const first = value.slice(0, 4);
|
|
112
|
+
const last = value.slice(-4);
|
|
113
|
+
const masked = "*".repeat(Math.min(value.length - 8, 16));
|
|
114
|
+
return `${first}${masked}${last}`;
|
|
115
|
+
}
|
|
116
|
+
if (value.length <= 2) {
|
|
117
|
+
return "*".repeat(value.length);
|
|
118
|
+
}
|
|
119
|
+
const first = value.slice(0, 2);
|
|
120
|
+
const masked = "*".repeat(value.length - 2);
|
|
121
|
+
return `${first}${masked}`;
|
|
122
|
+
}
|
|
123
|
+
// ─── Diff Formatter ──────────────────────────────────────────────────────────
|
|
124
|
+
/**
|
|
125
|
+
* Simple colored diff between two strings.
|
|
126
|
+
* Lines prefixed with - are colored red (removed).
|
|
127
|
+
* Lines prefixed with + are colored green (added).
|
|
128
|
+
* Context lines are dimmed.
|
|
129
|
+
*/
|
|
130
|
+
export function formatDiff(before, after) {
|
|
131
|
+
const beforeLines = before.split("\n");
|
|
132
|
+
const afterLines = after.split("\n");
|
|
133
|
+
const output = [];
|
|
134
|
+
// Build a simple LCS-based diff
|
|
135
|
+
const lcs = buildLCS(beforeLines, afterLines);
|
|
136
|
+
let bi = 0;
|
|
137
|
+
let ai = 0;
|
|
138
|
+
let li = 0;
|
|
139
|
+
while (bi < beforeLines.length || ai < afterLines.length) {
|
|
140
|
+
if (li < lcs.length &&
|
|
141
|
+
bi < beforeLines.length &&
|
|
142
|
+
ai < afterLines.length &&
|
|
143
|
+
beforeLines[bi] === lcs[li] &&
|
|
144
|
+
afterLines[ai] === lcs[li]) {
|
|
145
|
+
// Context line — common to both
|
|
146
|
+
output.push(chalk.dim(` ${beforeLines[bi]}`));
|
|
147
|
+
bi++;
|
|
148
|
+
ai++;
|
|
149
|
+
li++;
|
|
150
|
+
}
|
|
151
|
+
else if (bi < beforeLines.length &&
|
|
152
|
+
(li >= lcs.length || beforeLines[bi] !== lcs[li])) {
|
|
153
|
+
// Removed line
|
|
154
|
+
output.push(chalk.red(`- ${beforeLines[bi]}`));
|
|
155
|
+
bi++;
|
|
156
|
+
}
|
|
157
|
+
else if (ai < afterLines.length &&
|
|
158
|
+
(li >= lcs.length || afterLines[ai] !== lcs[li])) {
|
|
159
|
+
// Added line
|
|
160
|
+
output.push(chalk.green(`+ ${afterLines[ai]}`));
|
|
161
|
+
ai++;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// Fallback safety — shouldn't happen
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return output.join("\n");
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Build the Longest Common Subsequence of two string arrays.
|
|
172
|
+
*/
|
|
173
|
+
function buildLCS(a, b) {
|
|
174
|
+
const m = a.length;
|
|
175
|
+
const n = b.length;
|
|
176
|
+
// Build DP table
|
|
177
|
+
const dp = Array.from({ length: m + 1 }, () => Array.from({ length: n + 1 }, () => 0));
|
|
178
|
+
for (let i = 1; i <= m; i++) {
|
|
179
|
+
for (let j = 1; j <= n; j++) {
|
|
180
|
+
if (a[i - 1] === b[j - 1]) {
|
|
181
|
+
dp[i][j] = (dp[i - 1]?.[j - 1] ?? 0) + 1;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
dp[i][j] = Math.max(dp[i - 1]?.[j] ?? 0, dp[i]?.[j - 1] ?? 0);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Backtrack to recover the LCS
|
|
189
|
+
const result = [];
|
|
190
|
+
let i = m;
|
|
191
|
+
let j = n;
|
|
192
|
+
while (i > 0 && j > 0) {
|
|
193
|
+
if (a[i - 1] === b[j - 1]) {
|
|
194
|
+
result.unshift(a[i - 1]);
|
|
195
|
+
i--;
|
|
196
|
+
j--;
|
|
197
|
+
}
|
|
198
|
+
else if ((dp[i - 1]?.[j] ?? 0) > (dp[i]?.[j - 1] ?? 0)) {
|
|
199
|
+
i--;
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
j--;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return result;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Ora } from "ora";
|
|
2
|
+
import type { ScanResult, WatchEvent, FixAction, Snapshot } from "../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Start a scan spinner — returns the ora instance for later updates.
|
|
5
|
+
*/
|
|
6
|
+
export declare function reportScanStart(projectDir: string): Ora;
|
|
7
|
+
/**
|
|
8
|
+
* Update the spinner text mid-scan.
|
|
9
|
+
*/
|
|
10
|
+
export declare function reportScanProgress(spinner: Ora, message: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* Print a comprehensive, beautiful scan report with findings grouped by
|
|
13
|
+
* severity and a framed health card.
|
|
14
|
+
*/
|
|
15
|
+
export declare function reportScanResults(result: ScanResult, options?: {
|
|
16
|
+
fun?: boolean;
|
|
17
|
+
verbose?: boolean;
|
|
18
|
+
}): void;
|
|
19
|
+
/**
|
|
20
|
+
* Print a real-time watch notification for a file event.
|
|
21
|
+
*/
|
|
22
|
+
export declare function reportWatchEvent(event: WatchEvent): void;
|
|
23
|
+
/**
|
|
24
|
+
* Show a preview of all fix actions that will be applied.
|
|
25
|
+
*/
|
|
26
|
+
export declare function reportFixPreview(actions: FixAction[]): void;
|
|
27
|
+
/**
|
|
28
|
+
* Report fix application summary.
|
|
29
|
+
*/
|
|
30
|
+
export declare function reportFixComplete(applied: number, skipped: number): void;
|
|
31
|
+
/**
|
|
32
|
+
* Report a successful undo (snapshot restore).
|
|
33
|
+
*/
|
|
34
|
+
export declare function reportUndoComplete(snapshot: Snapshot): void;
|
|
35
|
+
/**
|
|
36
|
+
* Print the zero-friction onboarding summary after `bilt init`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function reportInitComplete(result: ScanResult, fixesApplied: number): void;
|
|
39
|
+
//# sourceMappingURL=reporter.d.ts.map
|
|
@@ -0,0 +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"}
|