@vaultcompass/vault-guard 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 (74) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/integration/proxy-test-helpers.d.ts +47 -0
  3. package/dist/__tests__/integration/proxy-test-helpers.d.ts.map +1 -0
  4. package/dist/__tests__/integration/proxy-test-helpers.js +146 -0
  5. package/dist/__tests__/integration/proxy-test-helpers.js.map +1 -0
  6. package/dist/cli-entry.d.ts +3 -0
  7. package/dist/cli-entry.d.ts.map +1 -0
  8. package/dist/cli-entry.js +15 -0
  9. package/dist/cli-entry.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +241 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/check.d.ts +2 -0
  15. package/dist/commands/check.d.ts.map +1 -0
  16. package/dist/commands/check.js +40 -0
  17. package/dist/commands/check.js.map +1 -0
  18. package/dist/commands/config.d.ts +6 -0
  19. package/dist/commands/config.d.ts.map +1 -0
  20. package/dist/commands/config.js +57 -0
  21. package/dist/commands/config.js.map +1 -0
  22. package/dist/commands/data.d.ts +67 -0
  23. package/dist/commands/data.d.ts.map +1 -0
  24. package/dist/commands/data.js +294 -0
  25. package/dist/commands/data.js.map +1 -0
  26. package/dist/commands/fix.d.ts +2 -0
  27. package/dist/commands/fix.d.ts.map +1 -0
  28. package/dist/commands/fix.js +80 -0
  29. package/dist/commands/fix.js.map +1 -0
  30. package/dist/commands/index.d.ts +11 -0
  31. package/dist/commands/index.d.ts.map +1 -0
  32. package/dist/commands/index.js +26 -0
  33. package/dist/commands/index.js.map +1 -0
  34. package/dist/commands/install-hook.d.ts +3 -0
  35. package/dist/commands/install-hook.d.ts.map +1 -0
  36. package/dist/commands/install-hook.js +31 -0
  37. package/dist/commands/install-hook.js.map +1 -0
  38. package/dist/commands/monitor.d.ts +2 -0
  39. package/dist/commands/monitor.d.ts.map +1 -0
  40. package/dist/commands/monitor.js +23 -0
  41. package/dist/commands/monitor.js.map +1 -0
  42. package/dist/commands/proxy.d.ts +68 -0
  43. package/dist/commands/proxy.d.ts.map +1 -0
  44. package/dist/commands/proxy.js +445 -0
  45. package/dist/commands/proxy.js.map +1 -0
  46. package/dist/commands/scan.d.ts +3 -0
  47. package/dist/commands/scan.d.ts.map +1 -0
  48. package/dist/commands/scan.js +156 -0
  49. package/dist/commands/scan.js.map +1 -0
  50. package/dist/commands/statusline.d.ts +2 -0
  51. package/dist/commands/statusline.d.ts.map +1 -0
  52. package/dist/commands/statusline.js +34 -0
  53. package/dist/commands/statusline.js.map +1 -0
  54. package/dist/commands/suggest-model.d.ts +6 -0
  55. package/dist/commands/suggest-model.d.ts.map +1 -0
  56. package/dist/commands/suggest-model.js +38 -0
  57. package/dist/commands/suggest-model.js.map +1 -0
  58. package/dist/commands/tokens.d.ts +2 -0
  59. package/dist/commands/tokens.d.ts.map +1 -0
  60. package/dist/commands/tokens.js +22 -0
  61. package/dist/commands/tokens.js.map +1 -0
  62. package/dist/index.d.ts +3 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +21 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/utils/index.d.ts +2 -0
  67. package/dist/utils/index.d.ts.map +1 -0
  68. package/dist/utils/index.js +18 -0
  69. package/dist/utils/index.js.map +1 -0
  70. package/dist/utils/scan-utils.d.ts +65 -0
  71. package/dist/utils/scan-utils.d.ts.map +1 -0
  72. package/dist/utils/scan-utils.js +333 -0
  73. package/dist/utils/scan-utils.js.map +1 -0
  74. package/package.json +56 -0
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.scanCommand = scanCommand;
7
+ const vault_guard_core_1 = require("@vaultcompass/vault-guard-core");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const scan_utils_1 = require("../utils/scan-utils");
10
+ async function scanCommand(targetPath, format = 'text', staged = false) {
11
+ const cwd = process.cwd();
12
+ let config;
13
+ try {
14
+ config = (0, vault_guard_core_1.loadConfig)(cwd);
15
+ }
16
+ catch (e) {
17
+ if (e instanceof vault_guard_core_1.ConfigError) {
18
+ console.error(chalk_1.default.red('❌ Config error:'), chalk_1.default.white(e.message));
19
+ console.error(chalk_1.default.gray(' Fix the JSON in the file above (or remove it) and re-run. ' +
20
+ 'Vault Guard refuses to scan with a broken config because silent ' +
21
+ 'fallback to defaults would mask the rules you intended.\n'));
22
+ return 1;
23
+ }
24
+ throw e;
25
+ }
26
+ const scanner = new vault_guard_core_1.SecretScanner(config);
27
+ // Merge config ignore paths and patterns into a single list for file filtering.
28
+ const configIgnorePatterns = [
29
+ ...(config.ignore?.paths ?? []),
30
+ ...(config.ignore?.patterns ?? []),
31
+ ];
32
+ const bus = new vault_guard_core_1.DiagnosticBus();
33
+ const diagnostics = [];
34
+ const extraPatternDiagnostics = [];
35
+ // Surface rejected `extra_patterns` (ReDoS guard, length cap, invalid syntax).
36
+ for (const rej of scanner.extraPatternRejections) {
37
+ const ctx = {
38
+ patternId: rej.id,
39
+ reason: rej.reason,
40
+ detail: rej.detail,
41
+ };
42
+ extraPatternDiagnostics.push(ctx);
43
+ diagnostics.push({
44
+ code: (0, vault_guard_core_1.mapPatternRejectionReasonToDiagnosticCode)(rej.reason),
45
+ severity: 'warning',
46
+ ctx: { ...ctx },
47
+ });
48
+ }
49
+ if (extraPatternDiagnostics.length > 0 && format === 'text') {
50
+ for (const ctx of extraPatternDiagnostics) {
51
+ console.error(chalk_1.default.yellow('⚠️ extra_pattern rejected:'), chalk_1.default.white(`${ctx.patternId} (${ctx.reason}) — ${ctx.detail}`));
52
+ }
53
+ console.error(chalk_1.default.gray(' Set "extra_patterns_unsafe": true in .vault-guard.json only if ' +
54
+ 'you have audited every pattern.\n'));
55
+ }
56
+ if (format === 'text' && !staged) {
57
+ console.log(chalk_1.default.blue('🔍 Scanning'), chalk_1.default.cyan(targetPath));
58
+ }
59
+ const stats = { filesScanned: 0, bytesScanned: 0 };
60
+ const t0 = Date.now();
61
+ try {
62
+ let results;
63
+ if (staged) {
64
+ if (!(0, vault_guard_core_1.isInsideGitWorkTree)(cwd)) {
65
+ console.error(chalk_1.default.red('❌ Error:'), chalk_1.default.white('Not a git repository (or outside a work tree).'));
66
+ return 1;
67
+ }
68
+ let stagedFiles;
69
+ try {
70
+ stagedFiles = (0, vault_guard_core_1.getGitStagedFilePaths)(cwd);
71
+ }
72
+ catch (e) {
73
+ if (e instanceof vault_guard_core_1.GitError) {
74
+ console.error(chalk_1.default.red('❌ Git error:'), chalk_1.default.white(e.message));
75
+ console.error(chalk_1.default.gray(' vault-guard cannot determine which files are staged.\n' +
76
+ ' Refusing to produce a ✅ result that may be incorrect.\n'));
77
+ return 2;
78
+ }
79
+ throw e;
80
+ }
81
+ if (format === 'text') {
82
+ console.log(chalk_1.default.blue('🔍 Scanning'), chalk_1.default.cyan('git staged files'));
83
+ if (stagedFiles.length === 0) {
84
+ console.log(chalk_1.default.green.bold('✅ SUCCESS:'), chalk_1.default.white('Nothing staged — nothing to scan\n'));
85
+ return 0;
86
+ }
87
+ console.log(chalk_1.default.gray(` ${stagedFiles.length} file(s) in the index\n`));
88
+ }
89
+ results = await (0, scan_utils_1.scanFileListAsync)(stagedFiles, scanner, {
90
+ verbose: format === 'text',
91
+ skipBinary: true,
92
+ progress: format === 'text',
93
+ bus,
94
+ stats,
95
+ configIgnorePatterns,
96
+ });
97
+ }
98
+ else {
99
+ results = await (0, scan_utils_1.scanFilesAsync)([targetPath], scanner, {
100
+ verbose: format === 'text',
101
+ skipBinary: true,
102
+ progress: format === 'text',
103
+ bus,
104
+ stats,
105
+ configIgnorePatterns,
106
+ });
107
+ }
108
+ // Merge bus diagnostics
109
+ diagnostics.push(...bus.drain());
110
+ const baselineLoad = (0, vault_guard_core_1.loadBaseline)(cwd);
111
+ if (baselineLoad.parseError) {
112
+ diagnostics.push({
113
+ code: 'baseline.invalid',
114
+ severity: 'warning',
115
+ ctx: { path: baselineLoad.sourcePath ?? '', detail: baselineLoad.parseError },
116
+ });
117
+ if (format === 'text') {
118
+ console.error(chalk_1.default.yellow('⚠️ Baseline file invalid:'), chalk_1.default.white(baselineLoad.parseError), chalk_1.default.gray(baselineLoad.sourcePath ? `(${baselineLoad.sourcePath})` : ''));
119
+ }
120
+ }
121
+ const { results: afterBaseline, suppressed: baselineSuppressed } = (0, vault_guard_core_1.filterResultsByBaseline)(process.cwd(), results, baselineLoad.fingerprints);
122
+ results = afterBaseline;
123
+ const durationMs = Date.now() - t0;
124
+ const run = {
125
+ duration_ms: durationMs,
126
+ files_scanned: stats.filesScanned,
127
+ bytes_scanned: stats.bytesScanned,
128
+ patterns_active: scanner.getActivePatternCount(),
129
+ diagnostics_count: diagnostics.length,
130
+ ...(baselineSuppressed > 0 ? { baseline_suppressed: baselineSuppressed } : {}),
131
+ };
132
+ if (format === 'json') {
133
+ process.stdout.write((0, scan_utils_1.formatJson)(results, { diagnostics, run }) + '\n');
134
+ return results.reduce((n, r) => n + r.matches.length, 0) === 0 ? 0 : 1;
135
+ }
136
+ if (format === 'sarif') {
137
+ process.stdout.write((0, scan_utils_1.formatSarif)(results, { diagnostics, run }) + '\n');
138
+ return results.reduce((n, r) => n + r.matches.length, 0) === 0 ? 0 : 1;
139
+ }
140
+ // Text mode: print one-line diagnostic summary when any non-fatal issues occurred
141
+ if (diagnostics.length > 0) {
142
+ console.error(chalk_1.default.yellow(`⚠️ ${diagnostics.length} warning(s) — run with --json for details`));
143
+ }
144
+ if (results.length === 0) {
145
+ console.log(chalk_1.default.green.bold('✅ SUCCESS:'), chalk_1.default.white('No secrets found\n'));
146
+ return 0;
147
+ }
148
+ (0, scan_utils_1.displayScanResults)(results);
149
+ return 1;
150
+ }
151
+ catch (error) {
152
+ console.error(chalk_1.default.red('❌ Fatal error:'), chalk_1.default.white(String(error)));
153
+ return 1;
154
+ }
155
+ }
156
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statuslineCommand(asJson: boolean): void;
2
+ //# sourceMappingURL=statusline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusline.d.ts","sourceRoot":"","sources":["../../src/commands/statusline.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA4BvD"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.statuslineCommand = statuslineCommand;
4
+ const vault_guard_telemetry_1 = require("@vaultcompass/vault-guard-telemetry");
5
+ function statuslineCommand(asJson) {
6
+ let store;
7
+ try {
8
+ store = new vault_guard_telemetry_1.TelemetryStore();
9
+ }
10
+ catch (e) {
11
+ if (e instanceof vault_guard_telemetry_1.TelemetryUnavailableError) {
12
+ if (asJson) {
13
+ process.stdout.write(`${JSON.stringify({ error: 'telemetry_unavailable', message: e.message })}\n`);
14
+ }
15
+ else {
16
+ process.stderr.write(`vault-guard statusline: telemetry unavailable — ${e.message}\n`);
17
+ }
18
+ return;
19
+ }
20
+ throw e;
21
+ }
22
+ try {
23
+ const payload = store.getStatuslinePayload();
24
+ if (asJson) {
25
+ process.stdout.write(`${JSON.stringify(payload)}\n`);
26
+ return;
27
+ }
28
+ process.stdout.write(`Vault Guard (today UTC): secrets=${payload.secrets_today} tokens in/out=${payload.tokens_today_input}/${payload.tokens_today_output} est_cost_usd≈${payload.est_cost_usd} model=${payload.model ?? '—'}\n`);
29
+ }
30
+ finally {
31
+ store.close();
32
+ }
33
+ }
34
+ //# sourceMappingURL=statusline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusline.js","sourceRoot":"","sources":["../../src/commands/statusline.ts"],"names":[],"mappings":";;AAEA,8CA4BC;AA9BD,+EAAgG;AAEhG,SAAgB,iBAAiB,CAAC,MAAe;IAC/C,IAAI,KAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,sCAAc,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,iDAAyB,EAAE,CAAC;YAC3C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;YACtG,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YACzF,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oCAAoC,OAAO,CAAC,aAAa,kBAAkB,OAAO,CAAC,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,iBAAiB,OAAO,CAAC,YAAY,UAAU,OAAO,CAAC,KAAK,IAAI,GAAG,IAAI,CAC5M,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function suggestModelCommand(options: {
2
+ json: boolean;
3
+ cwd?: string;
4
+ language?: string;
5
+ }): void;
6
+ //# sourceMappingURL=suggest-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest-model.d.ts","sourceRoot":"","sources":["../../src/commands/suggest-model.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAgCP"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.suggestModelCommand = suggestModelCommand;
4
+ const vault_guard_telemetry_1 = require("@vaultcompass/vault-guard-telemetry");
5
+ function suggestModelCommand(options) {
6
+ let store;
7
+ try {
8
+ store = new vault_guard_telemetry_1.TelemetryStore();
9
+ }
10
+ catch (e) {
11
+ if (e instanceof vault_guard_telemetry_1.TelemetryUnavailableError) {
12
+ if (options.json) {
13
+ process.stdout.write(`${JSON.stringify({ error: 'telemetry_unavailable', message: e.message }, null, 2)}\n`);
14
+ }
15
+ else {
16
+ process.stderr.write(`vault-guard suggest-model: telemetry unavailable — ${e.message}\n`);
17
+ }
18
+ return;
19
+ }
20
+ throw e;
21
+ }
22
+ try {
23
+ const s = store.suggestModel({ cwd: options.cwd, language: options.language });
24
+ if (options.json) {
25
+ process.stdout.write(`${JSON.stringify(s, null, 2)}\n`);
26
+ return;
27
+ }
28
+ if (!s.suggested_model) {
29
+ process.stdout.write(`${s.reason}\n`);
30
+ return;
31
+ }
32
+ process.stdout.write(`Suggested model: ${s.suggested_model}\n${s.reason}\n`);
33
+ }
34
+ finally {
35
+ store.close();
36
+ }
37
+ }
38
+ //# sourceMappingURL=suggest-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest-model.js","sourceRoot":"","sources":["../../src/commands/suggest-model.ts"],"names":[],"mappings":";;AAEA,kDAoCC;AAtCD,+EAAgG;AAEhG,SAAgB,mBAAmB,CAAC,OAInC;IACC,IAAI,KAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,sCAAc,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,iDAAyB,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YAC5F,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/E,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IAC/E,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function tokensCommand(): Promise<void>;
2
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBnD"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.tokensCommand = tokensCommand;
7
+ const vault_guard_core_1 = require("@vaultcompass/vault-guard-core");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ async function tokensCommand() {
10
+ console.log(chalk_1.default.magenta.bold('💰 Token Usage\n'));
11
+ const counter = new vault_guard_core_1.TokenCounter();
12
+ const report = counter.generateReport(process.cwd());
13
+ console.log(chalk_1.default.white.bold('Total Tokens:'), chalk_1.default.magenta.bold(report.totalTokens.toLocaleString()));
14
+ console.log(chalk_1.default.white.bold('Estimated Cost:'), chalk_1.default.magenta.bold(`$${report.estimatedCost.toFixed(2)}`));
15
+ console.log(chalk_1.default.white.bold('\nBreakdown by file type:'));
16
+ for (const [ext, tokens] of Object.entries(report.breakdown)) {
17
+ const percentage = ((tokens / report.totalTokens) * 100).toFixed(1);
18
+ console.log(` ${chalk_1.default.cyan(ext)}: ${chalk_1.default.magenta(tokens.toLocaleString())} tokens (${chalk_1.default.gray(percentage + '%')})`);
19
+ }
20
+ console.log(chalk_1.default.gray('\n💡 Tip: Use with AI coding tools to track token usage'));
21
+ }
22
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":";;;;;AAGA,sCAgBC;AAnBD,qEAA8D;AAC9D,kDAA0B;AAEnB,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,IAAI,+BAAY,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACxG,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,eAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5G,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,YAAY,eAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1H,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;AACrF,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { buildCli } from './cli';
2
+ export * from './commands';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.buildCli = void 0;
18
+ var cli_1 = require("./cli");
19
+ Object.defineProperty(exports, "buildCli", { enumerable: true, get: function () { return cli_1.buildCli; } });
20
+ __exportStar(require("./commands"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6BAAiC;AAAxB,+FAAA,QAAQ,OAAA;AACjB,6CAA2B"}
@@ -0,0 +1,2 @@
1
+ export * from './scan-utils';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./scan-utils"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B"}
@@ -0,0 +1,65 @@
1
+ import { SecretScanner, type JsonOutput, type JsonRunMetadata, type FileScanResult, type Diagnostic, type DiagnosticBus } from '@vaultcompass/vault-guard-core';
2
+ export type { JsonOutput, JsonRunMetadata };
3
+ export interface ScanFormatOptions {
4
+ diagnostics?: Diagnostic[];
5
+ run?: JsonRunMetadata;
6
+ }
7
+ export declare function formatJson(results: ScanResult[], opts?: ScanFormatOptions): string;
8
+ export declare function formatSarif(results: ScanResult[], opts?: ScanFormatOptions): string;
9
+ export type ScanResult = FileScanResult;
10
+ /** Filled by scan runners when provided (files opened for secret scanning, bytes read). */
11
+ export interface ScanTelemetryStats {
12
+ filesScanned: number;
13
+ bytesScanned: number;
14
+ }
15
+ export interface ScanOptions {
16
+ verbose?: boolean;
17
+ maxSize?: number;
18
+ skipBinary?: boolean;
19
+ progress?: boolean;
20
+ concurrency?: number;
21
+ bus?: DiagnosticBus;
22
+ stats?: ScanTelemetryStats;
23
+ /**
24
+ * Combined gitignore-style patterns from `config.ignore.paths` and
25
+ * `config.ignore.patterns`. Applied to every file before scanning so that
26
+ * `.vault-guard.json` `ignore` entries are honoured uniformly across
27
+ * directory scans and staged-file scans.
28
+ */
29
+ configIgnorePatterns?: string[];
30
+ }
31
+ /**
32
+ * Scan an explicit list of files (e.g. paths from \`git diff --cached\`).
33
+ * Skips missing paths and non-files silently.
34
+ */
35
+ export declare function scanFileListAsync(files: string[], scanner: SecretScanner, options?: ScanOptions): Promise<ScanResult[]>;
36
+ /**
37
+ * Check if a file is binary based on extension
38
+ */
39
+ export declare function isBinaryFile(filePath: string): boolean;
40
+ /**
41
+ * Scan files with proper filtering and error handling (async version)
42
+ * This is the shared scanning logic used by both scan and check commands
43
+ */
44
+ export declare function scanFilesAsync(targetPaths: string[], scanner: SecretScanner, options?: ScanOptions): Promise<ScanResult[]>;
45
+ /**
46
+ * Scan files with proper filtering and error handling (sync version for backwards compatibility)
47
+ * This is the shared scanning logic used by both scan and check commands
48
+ */
49
+ export declare function scanFiles(targetPaths: string[], scanner: SecretScanner, options?: ScanOptions): ScanResult[];
50
+ /**
51
+ * Display scan results with proper formatting.
52
+ *
53
+ * Output format: `<path>:<line>:<col> <severity> <type> <redacted>`
54
+ *
55
+ * Why this layout:
56
+ * - Most modern terminals (iTerm2, Windows Terminal, VS Code, JetBrains)
57
+ * auto-link `path:line:col` so users can cmd/ctrl-click directly to the
58
+ * source — no copy-paste, no greppable secret value needed.
59
+ * - Paths are cwd-relative for the same reason JSON/SARIF are: avoids
60
+ * leaking the developer's home dir / username when output is shared.
61
+ * - The redacted match value (`sk-a…(37c)`) is shown last and intentionally
62
+ * low-information.
63
+ */
64
+ export declare function displayScanResults(results: ScanResult[]): void;
65
+ //# sourceMappingURL=scan-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-utils.d.ts","sourceRoot":"","sources":["../../src/utils/scan-utils.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EAQb,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;AAC5C,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAMtF;AACD,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAMvF;AASD,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC;AAExC,2FAA2F;AAC3F,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC,CAiFvB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC,CA4GvB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,WAAgB,GACxB,UAAU,EAAE,CAoFd;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAyB9D"}