@vaultcompass/vault-guard-core 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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/dist/baseline.d.ts +24 -0
  3. package/dist/baseline.d.ts.map +1 -0
  4. package/dist/baseline.js +87 -0
  5. package/dist/baseline.js.map +1 -0
  6. package/dist/config-validate.d.ts +13 -0
  7. package/dist/config-validate.d.ts.map +1 -0
  8. package/dist/config-validate.js +111 -0
  9. package/dist/config-validate.js.map +1 -0
  10. package/dist/config.d.ts +69 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +106 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/diagnostics.d.ts +64 -0
  15. package/dist/diagnostics.d.ts.map +1 -0
  16. package/dist/diagnostics.js +59 -0
  17. package/dist/diagnostics.js.map +1 -0
  18. package/dist/errors.d.ts +63 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +98 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/index.d.ts +17 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +53 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/match-fingerprint.d.ts +7 -0
  27. package/dist/match-fingerprint.d.ts.map +1 -0
  28. package/dist/match-fingerprint.js +28 -0
  29. package/dist/match-fingerprint.js.map +1 -0
  30. package/dist/scan-output.d.ts +65 -0
  31. package/dist/scan-output.d.ts.map +1 -0
  32. package/dist/scan-output.js +140 -0
  33. package/dist/scan-output.js.map +1 -0
  34. package/dist/scanners/index.d.ts +5 -0
  35. package/dist/scanners/index.d.ts.map +1 -0
  36. package/dist/scanners/index.js +21 -0
  37. package/dist/scanners/index.js.map +1 -0
  38. package/dist/scanners/pre-commit-hook.d.ts +41 -0
  39. package/dist/scanners/pre-commit-hook.d.ts.map +1 -0
  40. package/dist/scanners/pre-commit-hook.js +389 -0
  41. package/dist/scanners/pre-commit-hook.js.map +1 -0
  42. package/dist/scanners/secret-scanner.d.ts +99 -0
  43. package/dist/scanners/secret-scanner.d.ts.map +1 -0
  44. package/dist/scanners/secret-scanner.js +422 -0
  45. package/dist/scanners/secret-scanner.js.map +1 -0
  46. package/dist/scanners/token-counter.d.ts +27 -0
  47. package/dist/scanners/token-counter.d.ts.map +1 -0
  48. package/dist/scanners/token-counter.js +121 -0
  49. package/dist/scanners/token-counter.js.map +1 -0
  50. package/dist/types.d.ts +36 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +3 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/utils/entropy.d.ts +17 -0
  55. package/dist/utils/entropy.d.ts.map +1 -0
  56. package/dist/utils/entropy.js +35 -0
  57. package/dist/utils/entropy.js.map +1 -0
  58. package/dist/utils/file-utils.d.ts +39 -0
  59. package/dist/utils/file-utils.d.ts.map +1 -0
  60. package/dist/utils/file-utils.js +442 -0
  61. package/dist/utils/file-utils.js.map +1 -0
  62. package/dist/utils/git-utils.d.ts +12 -0
  63. package/dist/utils/git-utils.d.ts.map +1 -0
  64. package/dist/utils/git-utils.js +55 -0
  65. package/dist/utils/git-utils.js.map +1 -0
  66. package/dist/utils/path-severity.d.ts +17 -0
  67. package/dist/utils/path-severity.d.ts.map +1 -0
  68. package/dist/utils/path-severity.js +96 -0
  69. package/dist/utils/path-severity.js.map +1 -0
  70. package/dist/utils/placeholder.d.ts +53 -0
  71. package/dist/utils/placeholder.d.ts.map +1 -0
  72. package/dist/utils/placeholder.js +198 -0
  73. package/dist/utils/placeholder.js.map +1 -0
  74. package/dist/utils/regex-safety.d.ts +102 -0
  75. package/dist/utils/regex-safety.d.ts.map +1 -0
  76. package/dist/utils/regex-safety.js +193 -0
  77. package/dist/utils/regex-safety.js.map +1 -0
  78. package/dist/utils/scan-file.d.ts +29 -0
  79. package/dist/utils/scan-file.d.ts.map +1 -0
  80. package/dist/utils/scan-file.js +125 -0
  81. package/dist/utils/scan-file.js.map +1 -0
  82. package/package.json +51 -0
@@ -0,0 +1,389 @@
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.PreCommitHook = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const child_process_1 = require("child_process");
10
+ const errors_1 = require("../errors");
11
+ /**
12
+ * Shell hook body for **native** Git hooks (`core.hooksPath` or `.git/hooks`).
13
+ * Scans **staged files only** — fast and matches what will actually be committed.
14
+ */
15
+ const NATIVE_HOOK_SCRIPT = `#!/bin/sh
16
+ # vault-guard pre-commit (installed by @vaultcompass/vault-guard)
17
+ set -e
18
+
19
+ # Re-attach stdin for GUI git clients.
20
+ if [ -t 0 ]; then :; else exec </dev/tty 2>/dev/null || true; fi
21
+
22
+ if ! command -v vault-guard >/dev/null 2>&1; then
23
+ echo "❌ vault-guard: command not found (install: npm i -g @vaultcompass/vault-guard)"
24
+ exit 1
25
+ fi
26
+
27
+ echo "🔍 vault-guard: scanning staged files..."
28
+ if vault-guard scan --staged; then
29
+ echo "✅ vault-guard: no secrets in staged files"
30
+ exit 0
31
+ fi
32
+
33
+ echo ""
34
+ echo "❌ COMMIT BLOCKED: secrets detected in staged files"
35
+ echo "💡 Fix or unstage, then retry. Emergency bypass (discouraged): git commit --no-verify"
36
+ exit 1
37
+ `;
38
+ /** Husky-friendly hook (sources \`_/husky.sh\` when present). */
39
+ const HUSKY_HOOK_SCRIPT = `#!/usr/bin/env sh
40
+ if [ -f "$(dirname "$0")/_/husky.sh" ]; then
41
+ . "$(dirname "$0")/_/husky.sh"
42
+ fi
43
+
44
+ if ! command -v vault-guard >/dev/null 2>&1; then
45
+ echo "❌ vault-guard: command not found (install: npm i -g @vaultcompass/vault-guard)"
46
+ exit 1
47
+ fi
48
+
49
+ echo "🔍 vault-guard: scanning staged files..."
50
+ vault-guard scan --staged || {
51
+ echo ""
52
+ echo "❌ COMMIT BLOCKED: secrets detected in staged files"
53
+ echo "💡 git commit --no-verify to bypass (discouraged)"
54
+ exit 1
55
+ }
56
+ echo "✅ vault-guard: no secrets in staged files"
57
+ `;
58
+ const LEFTHOOK_LOCAL = `# Merged by Lefthook with lefthook.yml — added by vault-guard install-hook
59
+ pre-commit:
60
+ commands:
61
+ vault-guard:
62
+ run: vault-guard scan --staged
63
+ `;
64
+ const PRE_COMMIT_CONFIG = `# See https://pre-commit.com
65
+ repos:
66
+ - repo: local
67
+ hooks:
68
+ - id: vault-guard
69
+ name: Vault Guard (staged files)
70
+ entry: vault-guard scan --staged
71
+ language: system
72
+ pass_filenames: false
73
+ `;
74
+ class PreCommitHook {
75
+ /**
76
+ * Resolve the directory where Git expects the \`pre-commit\` executable.
77
+ * Honors \`core.hooksPath\` (local then global). Relative paths are resolved
78
+ * against the **.git** directory, per Git documentation.
79
+ */
80
+ getEffectiveHooksDir(cwd) {
81
+ const gitDirAbs = this.resolveGitDir(cwd);
82
+ if (!gitDirAbs) {
83
+ return { hooksDir: path_1.default.join(cwd, '.git', 'hooks'), viaHooksPath: false };
84
+ }
85
+ let hooksPath = '';
86
+ try {
87
+ hooksPath = (0, child_process_1.execSync)('git config --get core.hooksPath', {
88
+ cwd,
89
+ encoding: 'utf-8',
90
+ stdio: ['ignore', 'pipe', 'pipe'],
91
+ }).trim();
92
+ }
93
+ catch {
94
+ hooksPath = '';
95
+ }
96
+ if (!hooksPath) {
97
+ return { hooksDir: path_1.default.join(gitDirAbs, 'hooks'), viaHooksPath: false };
98
+ }
99
+ const hooksDir = path_1.default.isAbsolute(hooksPath)
100
+ ? hooksPath
101
+ : path_1.default.join(gitDirAbs, hooksPath);
102
+ return { hooksDir, viaHooksPath: true };
103
+ }
104
+ /**
105
+ * Absolute path to the \`pre-commit\` hook file for the given manager.
106
+ */
107
+ getPreCommitHookPath(cwd, manager = 'native') {
108
+ if (manager === 'husky') {
109
+ return path_1.default.join(cwd, '.husky', 'pre-commit');
110
+ }
111
+ return path_1.default.join(this.getEffectiveHooksDir(cwd).hooksDir, 'pre-commit');
112
+ }
113
+ install(options = {}) {
114
+ const cwd = options.cwd ?? process.cwd();
115
+ const manager = options.manager ?? 'native';
116
+ if (!fs_1.default.existsSync(path_1.default.join(cwd, '.git'))) {
117
+ return { success: false, message: 'Not a git repository' };
118
+ }
119
+ switch (manager) {
120
+ case 'native':
121
+ return this.installNative(cwd);
122
+ case 'husky':
123
+ return this.installHusky(cwd);
124
+ case 'lefthook':
125
+ return this.installLefthook(cwd);
126
+ case 'precommit':
127
+ return this.installPreCommitFramework(cwd);
128
+ default:
129
+ return { success: false, message: `Unknown hook manager: ${String(manager)}` };
130
+ }
131
+ }
132
+ uninstall(options = {}) {
133
+ const cwd = options.cwd ?? process.cwd();
134
+ const manager = options.manager ?? 'native';
135
+ if (!fs_1.default.existsSync(path_1.default.join(cwd, '.git'))) {
136
+ return { success: false, message: 'Not a git repository' };
137
+ }
138
+ switch (manager) {
139
+ case 'native':
140
+ return this.uninstallNative(cwd);
141
+ case 'husky':
142
+ return this.uninstallHusky(cwd);
143
+ case 'lefthook':
144
+ return this.uninstallLefthook(cwd);
145
+ case 'precommit':
146
+ return this.uninstallPreCommitFramework(cwd);
147
+ default:
148
+ return { success: false, message: `Unknown hook manager: ${String(manager)}` };
149
+ }
150
+ }
151
+ isInstalled(options = {}) {
152
+ const cwd = options.cwd ?? process.cwd();
153
+ const manager = options.manager ?? 'native';
154
+ const hookPath = this.getPreCommitHookPath(cwd, manager);
155
+ if (!fs_1.default.existsSync(hookPath))
156
+ return false;
157
+ const content = fs_1.default.readFileSync(hookPath, 'utf-8');
158
+ return content.includes('vault-guard') && content.includes('scan --staged');
159
+ }
160
+ // -------------------------------------------------------------------------
161
+ // native (Git hooks / core.hooksPath)
162
+ // -------------------------------------------------------------------------
163
+ installNative(cwd) {
164
+ const { hooksDir, viaHooksPath } = this.getEffectiveHooksDir(cwd);
165
+ const hookPath = path_1.default.join(hooksDir, 'pre-commit');
166
+ try {
167
+ if (!fs_1.default.existsSync(hooksDir)) {
168
+ fs_1.default.mkdirSync(hooksDir, { recursive: true });
169
+ }
170
+ if (fs_1.default.existsSync(hookPath)) {
171
+ const existing = fs_1.default.readFileSync(hookPath, 'utf-8');
172
+ if (existing.includes('vault-guard') && existing.includes('scan --staged')) {
173
+ return {
174
+ success: true,
175
+ message: 'Hook already installed',
176
+ hookPath,
177
+ };
178
+ }
179
+ }
180
+ fs_1.default.writeFileSync(hookPath, NATIVE_HOOK_SCRIPT, { mode: 0o755 });
181
+ const hint = viaHooksPath
182
+ ? `Installed to hooksPath: ${hooksDir}`
183
+ : 'Installed to .git/hooks/pre-commit';
184
+ return { success: true, message: `Pre-commit hook installed (${hint})`, hookPath };
185
+ }
186
+ catch (error) {
187
+ const hookError = new errors_1.HookError(`Failed to install hook: ${error}`, 'install');
188
+ return { success: false, message: hookError.message };
189
+ }
190
+ }
191
+ uninstallNative(cwd) {
192
+ const hookPath = this.getPreCommitHookPath(cwd, 'native');
193
+ if (!fs_1.default.existsSync(hookPath)) {
194
+ return { success: true, message: 'No hook to remove' };
195
+ }
196
+ const content = fs_1.default.readFileSync(hookPath, 'utf-8');
197
+ if (!content.includes('vault-guard')) {
198
+ return { success: true, message: 'No vault-guard hook to remove' };
199
+ }
200
+ try {
201
+ fs_1.default.unlinkSync(hookPath);
202
+ return { success: true, message: 'Pre-commit hook removed' };
203
+ }
204
+ catch (error) {
205
+ const hookError = new errors_1.HookError(`Failed to remove hook: ${error}`, 'uninstall');
206
+ return { success: false, message: hookError.message };
207
+ }
208
+ }
209
+ // -------------------------------------------------------------------------
210
+ // Husky — .husky/pre-commit
211
+ // -------------------------------------------------------------------------
212
+ installHusky(cwd) {
213
+ const huskyDir = path_1.default.join(cwd, '.husky');
214
+ const hookPath = path_1.default.join(huskyDir, 'pre-commit');
215
+ try {
216
+ if (!fs_1.default.existsSync(huskyDir)) {
217
+ fs_1.default.mkdirSync(huskyDir, { recursive: true });
218
+ }
219
+ if (fs_1.default.existsSync(hookPath)) {
220
+ const existing = fs_1.default.readFileSync(hookPath, 'utf-8');
221
+ if (existing.includes('vault-guard') && existing.includes('scan --staged')) {
222
+ return { success: true, message: 'Husky hook already contains vault-guard', hookPath };
223
+ }
224
+ if (existing.includes('# --- vault-guard ---')) {
225
+ return { success: true, message: 'Husky hook already contains vault-guard block', hookPath };
226
+ }
227
+ fs_1.default.appendFileSync(hookPath, `\n# --- vault-guard ---\nvault-guard scan --staged || {\n echo "❌ vault-guard blocked commit"\n exit 1\n}\n`, { encoding: 'utf-8' });
228
+ return { success: true, message: 'Appended vault-guard to existing .husky/pre-commit', hookPath };
229
+ }
230
+ fs_1.default.writeFileSync(hookPath, HUSKY_HOOK_SCRIPT, { mode: 0o755 });
231
+ return {
232
+ success: true,
233
+ message: 'Created .husky/pre-commit (run `npx husky init` first if _/husky.sh is missing)',
234
+ hookPath,
235
+ };
236
+ }
237
+ catch (error) {
238
+ const hookError = new errors_1.HookError(`Failed to install Husky hook: ${error}`, 'install');
239
+ return { success: false, message: hookError.message };
240
+ }
241
+ }
242
+ uninstallHusky(cwd) {
243
+ const hookPath = path_1.default.join(cwd, '.husky', 'pre-commit');
244
+ if (!fs_1.default.existsSync(hookPath)) {
245
+ return { success: true, message: 'No .husky/pre-commit to remove' };
246
+ }
247
+ let content = fs_1.default.readFileSync(hookPath, 'utf-8');
248
+ if (!content.includes('vault-guard')) {
249
+ return { success: true, message: 'No vault-guard stanza in .husky/pre-commit' };
250
+ }
251
+ // Remove appended block if present.
252
+ content = content.replace(/\n# --- vault-guard ---[\s\S]*$/m, '');
253
+ // If entire file is only our husky template, delete file.
254
+ if (!content.includes('vault-guard')) {
255
+ if (content.trim().length === 0) {
256
+ fs_1.default.unlinkSync(hookPath);
257
+ return { success: true, message: 'Removed .husky/pre-commit' };
258
+ }
259
+ fs_1.default.writeFileSync(hookPath, content, { mode: 0o755 });
260
+ return { success: true, message: 'Removed vault-guard stanza from .husky/pre-commit' };
261
+ }
262
+ fs_1.default.writeFileSync(hookPath, content, { mode: 0o755 });
263
+ return { success: true, message: 'Updated .husky/pre-commit (review manually if needed)' };
264
+ }
265
+ // -------------------------------------------------------------------------
266
+ // Lefthook — lefthook-local.yml (merged with lefthook.yml)
267
+ // -------------------------------------------------------------------------
268
+ installLefthook(cwd) {
269
+ const localPath = path_1.default.join(cwd, 'lefthook-local.yml');
270
+ try {
271
+ if (fs_1.default.existsSync(localPath)) {
272
+ const existing = fs_1.default.readFileSync(localPath, 'utf-8');
273
+ if (existing.includes('vault-guard scan --staged')) {
274
+ return { success: true, message: 'lefthook-local.yml already configures vault-guard', hookPath: localPath };
275
+ }
276
+ return {
277
+ success: false,
278
+ message: 'lefthook-local.yml already exists. Add under pre-commit.commands:\n' +
279
+ ' vault-guard:\n run: vault-guard scan --staged\n',
280
+ };
281
+ }
282
+ fs_1.default.writeFileSync(localPath, LEFTHOOK_LOCAL, 'utf-8');
283
+ return {
284
+ success: true,
285
+ message: 'Wrote lefthook-local.yml (merged by Lefthook with lefthook.yml). Run: lefthook install',
286
+ hookPath: localPath,
287
+ };
288
+ }
289
+ catch (error) {
290
+ const hookError = new errors_1.HookError(`Failed to write lefthook-local.yml: ${error}`, 'install');
291
+ return { success: false, message: hookError.message };
292
+ }
293
+ }
294
+ uninstallLefthook(cwd) {
295
+ const localPath = path_1.default.join(cwd, 'lefthook-local.yml');
296
+ if (!fs_1.default.existsSync(localPath)) {
297
+ return { success: true, message: 'No lefthook-local.yml' };
298
+ }
299
+ const content = fs_1.default.readFileSync(localPath, 'utf-8');
300
+ if (!content.includes('vault-guard')) {
301
+ return { success: true, message: 'lefthook-local.yml does not reference vault-guard' };
302
+ }
303
+ // Only remove the file if it is exactly what we wrote (avoid deleting user merges).
304
+ if (content.replace(/\r\n/g, '\n').trim() !== LEFTHOOK_LOCAL.replace(/\r\n/g, '\n').trim()) {
305
+ return {
306
+ success: true,
307
+ message: 'lefthook-local.yml was edited — remove the vault-guard stanza manually',
308
+ };
309
+ }
310
+ try {
311
+ fs_1.default.unlinkSync(localPath);
312
+ return { success: true, message: 'Removed lefthook-local.yml (vault-guard stub)' };
313
+ }
314
+ catch (error) {
315
+ const hookError = new errors_1.HookError(`Failed to remove lefthook-local.yml: ${error}`, 'uninstall');
316
+ return { success: false, message: hookError.message };
317
+ }
318
+ }
319
+ // -------------------------------------------------------------------------
320
+ // pre-commit.com framework
321
+ // -------------------------------------------------------------------------
322
+ installPreCommitFramework(cwd) {
323
+ const cfg = path_1.default.join(cwd, '.pre-commit-config.yaml');
324
+ if (fs_1.default.existsSync(cfg)) {
325
+ const existing = fs_1.default.readFileSync(cfg, 'utf-8');
326
+ if (existing.includes('vault-guard') && existing.includes('scan --staged')) {
327
+ return { success: true, message: '.pre-commit-config.yaml already includes vault-guard', hookPath: cfg };
328
+ }
329
+ return {
330
+ success: false,
331
+ message: '.pre-commit-config.yaml already exists. Merge manually:\n\n' +
332
+ PRE_COMMIT_CONFIG +
333
+ '\n(under your existing `repos:` list as an additional item, or combine with `repo: local`)',
334
+ };
335
+ }
336
+ try {
337
+ fs_1.default.writeFileSync(cfg, PRE_COMMIT_CONFIG, 'utf-8');
338
+ return {
339
+ success: true,
340
+ message: 'Created .pre-commit-config.yaml — run: pre-commit install',
341
+ hookPath: cfg,
342
+ };
343
+ }
344
+ catch (error) {
345
+ const hookError = new errors_1.HookError(`Failed to write .pre-commit-config.yaml: ${error}`, 'install');
346
+ return { success: false, message: hookError.message };
347
+ }
348
+ }
349
+ uninstallPreCommitFramework(cwd) {
350
+ const cfg = path_1.default.join(cwd, '.pre-commit-config.yaml');
351
+ if (!fs_1.default.existsSync(cfg)) {
352
+ return { success: true, message: 'No .pre-commit-config.yaml' };
353
+ }
354
+ const content = fs_1.default.readFileSync(cfg, 'utf-8');
355
+ if (!content.includes('vault-guard')) {
356
+ return { success: true, message: '.pre-commit-config.yaml does not reference vault-guard' };
357
+ }
358
+ // Only delete if we created the minimal file (only our hook).
359
+ if (content.includes('id: vault-guard') && content.split('\n').length < 25) {
360
+ try {
361
+ fs_1.default.unlinkSync(cfg);
362
+ return { success: true, message: 'Removed .pre-commit-config.yaml (vault-guard-only stub)' };
363
+ }
364
+ catch (error) {
365
+ const hookError = new errors_1.HookError(`Failed to remove config: ${error}`, 'uninstall');
366
+ return { success: false, message: hookError.message };
367
+ }
368
+ }
369
+ return {
370
+ success: true,
371
+ message: 'Edit .pre-commit-config.yaml manually to remove the vault-guard hook entry',
372
+ };
373
+ }
374
+ resolveGitDir(cwd) {
375
+ try {
376
+ const rel = (0, child_process_1.execSync)('git rev-parse --git-dir', {
377
+ cwd,
378
+ encoding: 'utf-8',
379
+ stdio: ['ignore', 'pipe', 'pipe'],
380
+ }).trim();
381
+ return path_1.default.resolve(cwd, rel);
382
+ }
383
+ catch {
384
+ return null;
385
+ }
386
+ }
387
+ }
388
+ exports.PreCommitHook = PreCommitHook;
389
+ //# sourceMappingURL=pre-commit-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-commit-hook.js","sourceRoot":"","sources":["../../src/scanners/pre-commit-hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import { SecretMatch } from '../types';
2
+ import { VaultGuardConfig } from '../config';
3
+ /**
4
+ * Read-only metadata for built-in patterns (docs / codegen). Exposes
5
+ * `RegExp#source` and flags only — not live `RegExp` instances.
6
+ */
7
+ export interface BuiltinPatternDocEntry {
8
+ id: string;
9
+ severity: SecretMatch['severity'];
10
+ minEntropy?: number;
11
+ regexSource: string;
12
+ regexFlags: string;
13
+ }
14
+ /** Stable insertion order of {@link BUILTIN_PATTERNS}. */
15
+ export declare function getBuiltinPatternDocEntries(): BuiltinPatternDocEntry[];
16
+ export declare class SecretScanner {
17
+ private readonly patterns;
18
+ private readonly entropyThreshold;
19
+ constructor(config?: VaultGuardConfig);
20
+ /**
21
+ * Rejected `extra_patterns` from the most recent constructor call.
22
+ *
23
+ * Callers should surface these to the user (stderr today, structured
24
+ * `diagnostics[]` channel post Phase 2.2). A non-empty list means the
25
+ * user's `.vault-guard.json` declared rules that are not active.
26
+ */
27
+ readonly extraPatternRejections: Array<{
28
+ id: string;
29
+ reason: string;
30
+ detail: string;
31
+ }>;
32
+ /** Number of built-in + extra patterns active after config (severity "off" removes rules). */
33
+ getActivePatternCount(): number;
34
+ /**
35
+ * Scan a file and return deduplicated, ignore-directive-filtered matches.
36
+ */
37
+ scan(filePath: string): SecretMatch[];
38
+ /**
39
+ * Scan arbitrary UTF-8 text (editor buffer, pasted snippet, MCP payload).
40
+ * Line numbers and byte offsets are relative to this string.
41
+ *
42
+ * Each call uses fresh `RegExp` instances so overlapping `scanContent` work
43
+ * (e.g. after an `await` in a concurrent worker pool) cannot corrupt
44
+ * `lastIndex` on shared patterns.
45
+ */
46
+ scanContent(content: string): SecretMatch[];
47
+ /**
48
+ * Merge matches produced from chunked reads (e.g. line-by-line streaming)
49
+ * using the same overlap / severity rules as a full-file scan.
50
+ */
51
+ mergeChunkedMatches(matches: SecretMatch[]): SecretMatch[];
52
+ /**
53
+ * Build an index of line-start byte offsets for O(log n) line lookup.
54
+ * Index position 0 = start of line 1.
55
+ */
56
+ private buildLineIndex;
57
+ /** Binary-search the line index to return a 1-based line number. */
58
+ private lineFromIndex;
59
+ /**
60
+ * Parse inline ignore directives from file content.
61
+ *
62
+ * Supported forms (case-insensitive):
63
+ * `// vault-guard: ignore-line` — ignores that line
64
+ * `// vault-guard: ignore-next-line` — ignores the following line
65
+ * `# vault-guard: ignore-line` — same, for shell/Python/YAML
66
+ * `# vault-guard: ignore-next-line`
67
+ *
68
+ * Returns a Set of 1-based line numbers to ignore.
69
+ */
70
+ private parseIgnoreDirectives;
71
+ /**
72
+ * Deduplicate matches by overlapping byte ranges.
73
+ *
74
+ * When two matches cover the same (or overlapping) bytes in the file the
75
+ * more-specific (higher-severity or shorter) match is kept. This prevents
76
+ * the same secret from being reported multiple times when several patterns
77
+ * overlap.
78
+ */
79
+ private deduplicateMatches;
80
+ /**
81
+ * Redact a matched secret to a low-information identifier.
82
+ *
83
+ * Format: `<prefix>…(<length>c)` — e.g. `sk-a…(37c)`.
84
+ *
85
+ * Why not show more characters?
86
+ * - 4-char prefix is enough to identify vendor (sk-a, sk_l, ghp_, AKIA, …)
87
+ * without leaking meaningful entropy of the underlying secret.
88
+ * - The exact location is already in `line` / `column`, so users don't
89
+ * need a longer fragment to find the match in source.
90
+ * - Output of this tool is routinely pasted into PRs, Slack, terminals,
91
+ * SARIF uploads, and GitHub Code Scanning — the surface area for
92
+ * leakage is large, so we keep the redaction conservative.
93
+ *
94
+ * For values shorter than 6 chars (rare; broad patterns enforce ≥20)
95
+ * we redact entirely to `*…(<length>c)`.
96
+ */
97
+ private maskValue;
98
+ }
99
+ //# sourceMappingURL=secret-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scanner.d.ts","sourceRoot":"","sources":["../../src/scanners/secret-scanner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAoI7C;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,0DAA0D;AAC1D,wBAAgB,2BAA2B,IAAI,sBAAsB,EAAE,CAQtE;AAgBD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,MAAM,CAAC,EAAE,gBAAgB;IA4ErC;;;;;;OAMG;IACH,QAAQ,CAAC,sBAAsB,EAAE,KAAK,CAAC;QACrC,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAM;IAER,8FAA8F;IAC9F,qBAAqB,IAAI,MAAM;IAI/B;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE;IASrC;;;;;;;OAOG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE;IAkF3C;;;OAGG;IACH,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAQ1D;;;OAGG;IACH,OAAO,CAAC,cAAc;IAQtB,oEAAoE;IACpE,OAAO,CAAC,aAAa;IAWrB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,qBAAqB;IAsB7B;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IA4C1B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,SAAS;CAQlB"}