llm-mask 0.3.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 (88) hide show
  1. package/.github/workflows/llm-mask-check.yml +62 -0
  2. package/LICENSE +21 -0
  3. package/README.md +549 -0
  4. package/dist/audit.d.ts +56 -0
  5. package/dist/audit.d.ts.map +1 -0
  6. package/dist/audit.js +90 -0
  7. package/dist/audit.js.map +1 -0
  8. package/dist/cli-old.d.ts +12 -0
  9. package/dist/cli-old.d.ts.map +1 -0
  10. package/dist/cli-old.js +257 -0
  11. package/dist/cli-old.js.map +1 -0
  12. package/dist/cli.d.ts +19 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +197 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/commands.d.ts +9 -0
  17. package/dist/commands.d.ts.map +1 -0
  18. package/dist/commands.js +121 -0
  19. package/dist/commands.js.map +1 -0
  20. package/dist/config.d.ts +38 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +81 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/context-detection.d.ts +54 -0
  25. package/dist/context-detection.d.ts.map +1 -0
  26. package/dist/context-detection.js +219 -0
  27. package/dist/context-detection.js.map +1 -0
  28. package/dist/diff-masking.d.ts +51 -0
  29. package/dist/diff-masking.d.ts.map +1 -0
  30. package/dist/diff-masking.js +121 -0
  31. package/dist/diff-masking.js.map +1 -0
  32. package/dist/executor.d.ts +105 -0
  33. package/dist/executor.d.ts.map +1 -0
  34. package/dist/executor.js +250 -0
  35. package/dist/executor.js.map +1 -0
  36. package/dist/executor.test.d.ts +5 -0
  37. package/dist/executor.test.d.ts.map +1 -0
  38. package/dist/executor.test.js +500 -0
  39. package/dist/executor.test.js.map +1 -0
  40. package/dist/features.test.d.ts +5 -0
  41. package/dist/features.test.d.ts.map +1 -0
  42. package/dist/features.test.js +118 -0
  43. package/dist/features.test.js.map +1 -0
  44. package/dist/formatter.d.ts +54 -0
  45. package/dist/formatter.d.ts.map +1 -0
  46. package/dist/formatter.js +139 -0
  47. package/dist/formatter.js.map +1 -0
  48. package/dist/index.d.ts +36 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +37 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/language-patterns.d.ts +39 -0
  53. package/dist/language-patterns.d.ts.map +1 -0
  54. package/dist/language-patterns.js +177 -0
  55. package/dist/language-patterns.js.map +1 -0
  56. package/dist/masker.d.ts +100 -0
  57. package/dist/masker.d.ts.map +1 -0
  58. package/dist/masker.js +255 -0
  59. package/dist/masker.js.map +1 -0
  60. package/dist/masker.test.d.ts +11 -0
  61. package/dist/masker.test.d.ts.map +1 -0
  62. package/dist/masker.test.js +162 -0
  63. package/dist/masker.test.js.map +1 -0
  64. package/dist/mcp-server.d.ts +9 -0
  65. package/dist/mcp-server.d.ts.map +1 -0
  66. package/dist/mcp-server.js +494 -0
  67. package/dist/mcp-server.js.map +1 -0
  68. package/dist/patterns.d.ts +25 -0
  69. package/dist/patterns.d.ts.map +1 -0
  70. package/dist/patterns.js +184 -0
  71. package/dist/patterns.js.map +1 -0
  72. package/dist/scanner.d.ts +75 -0
  73. package/dist/scanner.d.ts.map +1 -0
  74. package/dist/scanner.js +247 -0
  75. package/dist/scanner.js.map +1 -0
  76. package/dist/test-utils.d.ts +5 -0
  77. package/dist/test-utils.d.ts.map +1 -0
  78. package/dist/test-utils.js +6 -0
  79. package/dist/test-utils.js.map +1 -0
  80. package/dist/tokenizer.d.ts +62 -0
  81. package/dist/tokenizer.d.ts.map +1 -0
  82. package/dist/tokenizer.js +95 -0
  83. package/dist/tokenizer.js.map +1 -0
  84. package/dist/types.d.ts +63 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +16 -0
  87. package/dist/types.js.map +1 -0
  88. package/package.json +60 -0
package/dist/audit.js ADDED
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Audit logging for masking operations
3
+ *
4
+ * Logs masking events WITHOUT the actual sensitive values
5
+ * Only records: timestamp, pattern type, placeholder, length
6
+ */
7
+ import { appendFileSync, existsSync } from 'fs';
8
+ import { dirname } from 'path';
9
+ import { mkdirSync } from 'fs';
10
+ /**
11
+ * Audit logger - records masking operations safely
12
+ */
13
+ export class AuditLogger {
14
+ file;
15
+ consoleOutput;
16
+ context;
17
+ buffer = [];
18
+ constructor(options = {}) {
19
+ this.file = options.file;
20
+ this.consoleOutput = options.console || false;
21
+ this.context = options.context;
22
+ }
23
+ /**
24
+ * Log a masking event
25
+ */
26
+ log(event) {
27
+ const logEvent = {
28
+ ...event,
29
+ context: this.context
30
+ };
31
+ // Add to buffer for batch writing
32
+ this.buffer.push(logEvent);
33
+ // Console output if enabled
34
+ if (this.consoleOutput) {
35
+ console.error('[AUDIT]', JSON.stringify(logEvent));
36
+ }
37
+ // Write to file if configured
38
+ if (this.file) {
39
+ this.writeToFile(logEvent);
40
+ }
41
+ }
42
+ /**
43
+ * Write event to file (append)
44
+ */
45
+ writeToFile(event) {
46
+ try {
47
+ // Ensure directory exists
48
+ const dir = dirname(this.file);
49
+ if (!existsSync(dir)) {
50
+ mkdirSync(dir, { recursive: true });
51
+ }
52
+ // Append as JSONL (one JSON object per line)
53
+ appendFileSync(this.file, JSON.stringify(event) + '\n');
54
+ }
55
+ catch (error) {
56
+ console.error('Failed to write audit log:', error);
57
+ }
58
+ }
59
+ /**
60
+ * Flush buffer and clear
61
+ */
62
+ flush() {
63
+ const events = [...this.buffer];
64
+ this.buffer = [];
65
+ return events;
66
+ }
67
+ /**
68
+ * Get buffered events
69
+ */
70
+ getBuffer() {
71
+ return [...this.buffer];
72
+ }
73
+ /**
74
+ * Clear buffer
75
+ */
76
+ clear() {
77
+ this.buffer = [];
78
+ }
79
+ }
80
+ /**
81
+ * Create audit logger from environment or config
82
+ */
83
+ export function createAuditLogger(options) {
84
+ return new AuditLogger({
85
+ file: options?.file || process.env.LLM_MASK_AUDIT_FILE,
86
+ console: options?.console || process.env.LLM_MASK_AUDIT_CONSOLE === 'true',
87
+ context: options?.context
88
+ });
89
+ }
90
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAiB,cAAc,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAmB9B;;GAEG;AACH,MAAM,OAAO,WAAW;IACd,IAAI,CAAS;IACb,aAAa,CAAS;IACtB,OAAO,CAAS;IAChB,MAAM,GAAiB,EAAE,CAAA;IAEjC,YAAY,UAA8B,EAAE;QAC1C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QACxB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAA;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,KAAiB;QACnB,MAAM,QAAQ,GAAe;YAC3B,GAAG,KAAK;YACR,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAA;QAED,kCAAkC;QAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE1B,4BAA4B;QAC5B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;QACpD,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,KAAiB;QACnC,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAK,CAAC,CAAA;YAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACrC,CAAC;YAED,6CAA6C;YAC7C,cAAc,CAAC,IAAI,CAAC,IAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;QAChB,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;IACzB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;IAClB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA4B;IAC5D,OAAO,IAAI,WAAW,CAAC;QACrB,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB;QACtD,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,MAAM;QAC1E,OAAO,EAAE,OAAO,EAAE,OAAO;KAC1B,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Enhanced CLI tool for llm-mask
4
+ *
5
+ * Usage:
6
+ * llm-mask [options] [text]
7
+ * cat file.txt | llm-mask [options]
8
+ * llm-mask scan /path/to/code [options]
9
+ * llm-mask diff [base] [head] [options]
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=cli-old.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-old.d.ts","sourceRoot":"","sources":["../src/cli-old.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
@@ -0,0 +1,257 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Enhanced CLI tool for llm-mask
4
+ *
5
+ * Usage:
6
+ * llm-mask [options] [text]
7
+ * cat file.txt | llm-mask [options]
8
+ * llm-mask scan /path/to/code [options]
9
+ * llm-mask diff [base] [head] [options]
10
+ */
11
+ import { DataMasker } from './masker.js';
12
+ import { Scanner } from './scanner.js';
13
+ import { DiffMasker } from './diff-masking.js';
14
+ import { ContextMasker } from './context-detection.js';
15
+ import { loadConfig, getMaskLevel, createMaskerConfig } from './config.js';
16
+ import { BUILTIN_PATTERNS } from './patterns.js';
17
+ import { resolve } from 'path';
18
+ function parseArgs(args) {
19
+ const result = {
20
+ check: false,
21
+ level: 'standard',
22
+ unmask: false,
23
+ patterns: false,
24
+ json: false,
25
+ stdin: false,
26
+ preserveFormat: false,
27
+ context: false,
28
+ diff: false,
29
+ failOnDetect: false
30
+ };
31
+ for (let i = 0; i < args.length; i++) {
32
+ const arg = args[i];
33
+ switch (arg) {
34
+ case '--check':
35
+ case '-c':
36
+ result.check = true;
37
+ break;
38
+ case '--level':
39
+ case '-l':
40
+ result.level = args[++i] || 'standard';
41
+ break;
42
+ case '--unmask':
43
+ case '-u':
44
+ result.unmask = true;
45
+ break;
46
+ case '--patterns':
47
+ case '-p':
48
+ result.patterns = true;
49
+ break;
50
+ case '--json':
51
+ case '-j':
52
+ result.json = true;
53
+ break;
54
+ case '--preserve-format':
55
+ case '-f':
56
+ result.preserveFormat = true;
57
+ break;
58
+ case '--context':
59
+ result.context = true;
60
+ break;
61
+ case '--scan':
62
+ result.scan = args[++i] || '.';
63
+ break;
64
+ case '--diff':
65
+ result.diff = true;
66
+ break;
67
+ case '--fail-on-detect':
68
+ result.failOnDetect = true;
69
+ break;
70
+ case '--extensions':
71
+ result.extensions = args[++i];
72
+ break;
73
+ case '--skip-dirs':
74
+ result.skipDirs = args[++i];
75
+ break;
76
+ case '--config':
77
+ result.config = args[++i];
78
+ break;
79
+ case '--base':
80
+ result.diffBase = args[++i];
81
+ break;
82
+ case '--head':
83
+ result.diffHead = args[++i];
84
+ break;
85
+ case '--':
86
+ result.text = args.slice(i + 1).join(' ');
87
+ return result;
88
+ case '-':
89
+ result.stdin = true;
90
+ break;
91
+ default:
92
+ if (!arg.startsWith('-')) {
93
+ result.text = args.slice(i).join(' ');
94
+ return result;
95
+ }
96
+ }
97
+ }
98
+ return result;
99
+ }
100
+ function formatOutput(data, json) {
101
+ if (json) {
102
+ return JSON.stringify(data, null, 2);
103
+ }
104
+ if (typeof data === 'object' && data !== null) {
105
+ const obj = data;
106
+ if (obj.masked !== undefined) {
107
+ return String(obj.masked);
108
+ }
109
+ if (obj.unmasked !== undefined) {
110
+ return String(obj.unmasked);
111
+ }
112
+ if (obj.summary !== undefined) {
113
+ return String(obj.summary);
114
+ }
115
+ if (obj.patterns !== undefined && Array.isArray(obj.patterns)) {
116
+ const patterns = obj.patterns;
117
+ return `Available patterns (${obj.total}):\n\n` +
118
+ patterns.map(p => ` ${p.name.padEnd(30)} priority: ${p.priority ?? 50} → ${p.placeholder}`).join('\n');
119
+ }
120
+ }
121
+ return String(data);
122
+ }
123
+ async function main() {
124
+ const args = parseArgs(process.argv.slice(2));
125
+ // Load config
126
+ const config = loadConfig(args.config);
127
+ const maskerConfig = createMaskerConfig(config);
128
+ const level = getMaskLevel(config, args.level);
129
+ // Handle --patterns
130
+ if (args.patterns) {
131
+ const patterns = BUILTIN_PATTERNS.map(p => ({
132
+ name: p.name,
133
+ priority: p.priority,
134
+ placeholder: p.placeholder(1)
135
+ }));
136
+ console.log(formatOutput({ patterns, total: patterns.length }, args.json));
137
+ return;
138
+ }
139
+ // Handle --scan
140
+ if (args.scan) {
141
+ const scanner = new Scanner({
142
+ level: level,
143
+ failOnDetect: args.failOnDetect,
144
+ extensions: args.extensions ? args.extensions.split(',') : undefined,
145
+ skipDirs: args.skipDirs ? args.skipDirs.split(',') : undefined
146
+ });
147
+ try {
148
+ const report = await scanner.scan(args.scan);
149
+ console.log(scanner.formatReport(report, resolve(args.scan)));
150
+ }
151
+ catch (error) {
152
+ if (error instanceof Error && error.name === 'ScanError') {
153
+ const scanError = error;
154
+ console.log(scanner.formatReport(scanError.report, resolve(args.scan)));
155
+ process.exit(1);
156
+ }
157
+ throw error;
158
+ }
159
+ return;
160
+ }
161
+ // Handle --diff
162
+ if (args.diff) {
163
+ const diffMasker = new DiffMasker();
164
+ const result = diffMasker.maskDiff({
165
+ base: args.diffBase,
166
+ head: args.diffHead,
167
+ level: level
168
+ });
169
+ console.log(diffMasker.format(result));
170
+ return;
171
+ }
172
+ // Get input text
173
+ let text = args.text;
174
+ if (args.stdin || !text) {
175
+ const chunks = [];
176
+ for await (const chunk of process.stdin) {
177
+ chunks.push(chunk);
178
+ }
179
+ text = Buffer.concat(chunks).toString('utf-8').trim();
180
+ }
181
+ if (!text) {
182
+ console.error('llm-mask - Mask sensitive data before sending to LLMs');
183
+ console.error('');
184
+ console.error('Usage:');
185
+ console.error(' llm-mask [options] "text"');
186
+ console.error(' echo "text" | llm-mask [options]');
187
+ console.error(' llm-mask scan /path/to/code [options]');
188
+ console.error(' llm-mask diff [base] [head] [options]');
189
+ console.error('');
190
+ console.error('Options:');
191
+ console.error(' --check, -c Dry run: show what would be masked');
192
+ console.error(' --level, -l Masking level (basic|standard|aggressive)');
193
+ console.error(' --preserve-format, -f Preserve format (j***@a***.com)');
194
+ console.error(' --context Smart context detection (SQL, JSON, etc.)');
195
+ console.error(' --unmask, -u Unmask previously masked text');
196
+ console.error(' --patterns, -p List all available patterns');
197
+ console.error(' --json, -j Output as JSON');
198
+ console.error(' --scan <path> Scan codebase for secrets');
199
+ console.error(' --diff Mask git diff output');
200
+ console.error(' --fail-on-detect Exit with error if secrets found (for CI)');
201
+ console.error(' --extensions <exts> File extensions to scan (comma-separated)');
202
+ console.error(' --skip-dirs <dirs> Directories to skip (comma-separated)');
203
+ console.error(' --config <path> Path to config file');
204
+ console.error('');
205
+ console.error('Examples:');
206
+ console.error(' llm-mask "API key sk-proj-123 expired for user@email.com"');
207
+ console.error(' llm-mask --scan ./src --fail-on-detect');
208
+ console.error(' git diff main | llm-mask --diff');
209
+ console.error(' llm-mask --preserve-format "Contact john@acme.com"');
210
+ process.exit(1);
211
+ }
212
+ // Create masker with config
213
+ const masker = new DataMasker(maskerConfig);
214
+ // Handle --unmask
215
+ if (args.unmask) {
216
+ const unmasked = masker.unmask(text);
217
+ console.log(formatOutput({ unmasked }, args.json));
218
+ return;
219
+ }
220
+ // Handle --context
221
+ if (args.context) {
222
+ const contextMasker = new ContextMasker();
223
+ const result = contextMasker.mask(text);
224
+ console.log(formatOutput({
225
+ masked: result.masked,
226
+ context: result.context,
227
+ stats: result.stats
228
+ }, args.json));
229
+ return;
230
+ }
231
+ // Handle --check (dry run)
232
+ if (args.check) {
233
+ const result = masker.mask(text, { level: level });
234
+ console.log(formatOutput({
235
+ wouldMask: result.stats,
236
+ summary: `Would mask ${result.stats.total} items`,
237
+ original: text,
238
+ masked: result.masked
239
+ }, args.json));
240
+ return;
241
+ }
242
+ // Default: mask the text
243
+ const result = masker.mask(text, {
244
+ level: level,
245
+ preserveFormat: args.preserveFormat
246
+ });
247
+ console.log(formatOutput({
248
+ masked: result.masked,
249
+ stats: result.stats,
250
+ summary: masker.summarize(result.stats)
251
+ }, args.json));
252
+ }
253
+ main().catch((error) => {
254
+ console.error('Error:', error instanceof Error ? error.message : error);
255
+ process.exit(1);
256
+ });
257
+ //# sourceMappingURL=cli-old.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-old.js","sourceRoot":"","sources":["../src/cli-old.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Enhanced CLI tool for llm-mask
4
+ *
5
+ * Usage:
6
+ * llm-mask [command] [options] [arguments]
7
+ *
8
+ * Commands:
9
+ * exec <cmd> Execute command with redaction
10
+ * kube <args> Execute kubectl with redaction
11
+ * ssh <host> Execute SSH with redaction
12
+ * scan <path> Scan codebase for secrets
13
+ * diff Mask git diff
14
+ *
15
+ * Or use as pipe:
16
+ * echo "text" | llm-mask [options]
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}
package/dist/cli.js ADDED
@@ -0,0 +1,197 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Enhanced CLI tool for llm-mask
4
+ *
5
+ * Usage:
6
+ * llm-mask [command] [options] [arguments]
7
+ *
8
+ * Commands:
9
+ * exec <cmd> Execute command with redaction
10
+ * kube <args> Execute kubectl with redaction
11
+ * ssh <host> Execute SSH with redaction
12
+ * scan <path> Scan codebase for secrets
13
+ * diff Mask git diff
14
+ *
15
+ * Or use as pipe:
16
+ * echo "text" | llm-mask [options]
17
+ */
18
+ import { Command } from 'commander';
19
+ import { resolve } from 'path';
20
+ // Import commands
21
+ import { registerExecCommands } from './commands.js';
22
+ import { Scanner } from './scanner.js';
23
+ import { DiffMasker } from './diff-masking.js';
24
+ import { loadConfig, getMaskLevel, createMaskerConfig } from './config.js';
25
+ import { BUILTIN_PATTERNS } from './patterns.js';
26
+ const program = new Command();
27
+ program
28
+ .name('llm-mask')
29
+ .description('Mask sensitive data before sending to LLMs')
30
+ .version('0.3.0');
31
+ // === Legacy pipe/input functionality ===
32
+ const handlePipeInput = async (text, options) => {
33
+ const config = loadConfig(options.config);
34
+ const maskerConfig = createMaskerConfig(config);
35
+ const level = getMaskLevel(config, options.level);
36
+ // Create fresh masker with config
37
+ const { DataMasker } = await import('./masker.js');
38
+ const masker = new DataMasker(maskerConfig);
39
+ if (options.unmask) {
40
+ const unmasked = masker.unmask(text);
41
+ console.log(options.json ? JSON.stringify({ unmasked }) : unmasked);
42
+ return;
43
+ }
44
+ if (options.context) {
45
+ const { ContextMasker } = await import('./context-detection.js');
46
+ const contextMasker = new ContextMasker();
47
+ const result = contextMasker.mask(text);
48
+ console.log(options.json ? JSON.stringify(result, null, 2) : result.masked);
49
+ return;
50
+ }
51
+ if (options.check) {
52
+ const result = masker.mask(text, { level: options.level });
53
+ if (options.json) {
54
+ console.log(JSON.stringify({
55
+ wouldMask: result.stats,
56
+ original: text,
57
+ masked: result.masked
58
+ }, null, 2));
59
+ }
60
+ else {
61
+ console.log(`Would mask: ${result.stats.total} items`);
62
+ console.log(`Masked: ${result.masked}`);
63
+ }
64
+ return;
65
+ }
66
+ // Default masking
67
+ const result = masker.mask(text, {
68
+ level: options.level,
69
+ preserveFormat: options.preserveFormat
70
+ });
71
+ if (options.json) {
72
+ console.log(JSON.stringify({
73
+ masked: result.masked,
74
+ stats: result.stats
75
+ }, null, 2));
76
+ }
77
+ else {
78
+ console.log(result.masked);
79
+ }
80
+ };
81
+ // === Input reading ===
82
+ async function readInput() {
83
+ const chunks = [];
84
+ for await (const chunk of process.stdin) {
85
+ chunks.push(chunk);
86
+ }
87
+ return Buffer.concat(chunks).toString('utf-8').trim();
88
+ }
89
+ // === Legacy flags (for pipe mode) ===
90
+ program
91
+ .option('-l, --level <level>', 'Masking level (basic|standard|aggressive)')
92
+ .option('-f, --preserve-format', 'Preserve format (j***@a***.com)')
93
+ .option('--context', 'Smart context detection (SQL, JSON, etc.)')
94
+ .option('-u, --unmask', 'Unmask previously masked text')
95
+ .option('-c, --check', 'Dry run: show what would be masked')
96
+ .option('-p, --patterns', 'List all available patterns')
97
+ .option('-j, --json', 'Output as JSON')
98
+ .option('--config <path>', 'Path to config file');
99
+ // Register exec commands
100
+ registerExecCommands(program);
101
+ // === Scan command ===
102
+ program
103
+ .command('scan [path]')
104
+ .description('Scan codebase for secrets')
105
+ .option('-l, --level <level>', 'Masking level', 'standard')
106
+ .option('--fail-on-detect', 'Exit with error if secrets found')
107
+ .option('--extensions <exts>', 'File extensions (comma-separated)')
108
+ .option('--skip-dirs <dirs>', 'Directories to skip (comma-separated)')
109
+ .action(async (path, options) => {
110
+ const scanner = new Scanner({
111
+ level: options.level,
112
+ failOnDetect: options.failOnDetect,
113
+ extensions: options.extensions?.split(','),
114
+ skipDirs: options.skipDirs?.split(',')
115
+ });
116
+ try {
117
+ const report = await scanner.scan(path || '.');
118
+ console.log(scanner.formatReport(report, resolve(path || '.')));
119
+ }
120
+ catch (error) {
121
+ if (error instanceof Error && error.name === 'ScanError') {
122
+ const scanError = error;
123
+ console.log(scanner.formatReport(scanError.report, resolve(path || '.')));
124
+ process.exit(1);
125
+ }
126
+ throw error;
127
+ }
128
+ });
129
+ // === Diff command ===
130
+ program
131
+ .command('diff')
132
+ .description('Mask git diff output')
133
+ .option('--base <branch>', 'Base branch or commit')
134
+ .option('--head <branch>', 'Head branch or commit')
135
+ .option('-l, --level <level>', 'Masking level', 'standard')
136
+ .option('--path <path>', 'Path to restrict diff to')
137
+ .action(async (options) => {
138
+ const diffMasker = new DiffMasker();
139
+ const result = diffMasker.maskDiff({
140
+ base: options.base,
141
+ head: options.head,
142
+ level: options.level,
143
+ path: options.path
144
+ });
145
+ console.log(diffMasker.format(result));
146
+ });
147
+ // === Patterns command ===
148
+ program
149
+ .command('patterns')
150
+ .description('List all available patterns')
151
+ .action(() => {
152
+ const patterns = BUILTIN_PATTERNS.map(p => ({
153
+ name: p.name,
154
+ priority: p.priority,
155
+ example: p.placeholder(1)
156
+ }));
157
+ console.log(`Available patterns (${patterns.length}):\n`);
158
+ patterns.forEach(p => {
159
+ console.log(` ${p.name.padEnd(30)} priority: ${p.priority ?? 50} → ${p.example}`);
160
+ });
161
+ });
162
+ // === Default handler (pipe mode) ===
163
+ program
164
+ .action(async (options) => {
165
+ // If no command specified, check if we're receiving piped input
166
+ const stdin = await readInput();
167
+ if (stdin || options.patterns) {
168
+ if (options.patterns) {
169
+ // List patterns
170
+ const patterns = BUILTIN_PATTERNS.map(p => ({
171
+ name: p.name,
172
+ priority: p.priority,
173
+ example: p.placeholder(1)
174
+ }));
175
+ console.log(`Available patterns (${patterns.length}):\n`);
176
+ patterns.forEach(p => {
177
+ console.log(` ${p.name.padEnd(30)} priority: ${p.priority ?? 50} → ${p.example}`);
178
+ });
179
+ return;
180
+ }
181
+ if (stdin) {
182
+ await handlePipeInput(stdin, options);
183
+ return;
184
+ }
185
+ }
186
+ // No input, show help
187
+ program.outputHelp();
188
+ });
189
+ // === Dynamic imports for lazy loading ===
190
+ async function main() {
191
+ await program.parseAsync(process.argv);
192
+ }
193
+ main().catch((error) => {
194
+ console.error('Error:', error instanceof Error ? error.message : error);
195
+ process.exit(1);
196
+ });
197
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI commands for exec functionality
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Register exec commands with commander program
7
+ */
8
+ export declare function registerExecCommands(program: Command): void;
9
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoH3D"}