project-shield 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 (71) hide show
  1. package/README.md +440 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +151 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/integrity/failsafe.d.ts +17 -0
  7. package/dist/integrity/failsafe.d.ts.map +1 -0
  8. package/dist/integrity/failsafe.js +45 -0
  9. package/dist/integrity/failsafe.js.map +1 -0
  10. package/dist/integrity/ruleset.d.ts +12 -0
  11. package/dist/integrity/ruleset.d.ts.map +1 -0
  12. package/dist/integrity/ruleset.js +77 -0
  13. package/dist/integrity/ruleset.js.map +1 -0
  14. package/dist/integrity/seal.d.ts +12 -0
  15. package/dist/integrity/seal.d.ts.map +1 -0
  16. package/dist/integrity/seal.js +77 -0
  17. package/dist/integrity/seal.js.map +1 -0
  18. package/dist/output/badge.d.ts +16 -0
  19. package/dist/output/badge.d.ts.map +1 -0
  20. package/dist/output/badge.js +112 -0
  21. package/dist/output/badge.js.map +1 -0
  22. package/dist/output/evidence.d.ts +18 -0
  23. package/dist/output/evidence.d.ts.map +1 -0
  24. package/dist/output/evidence.js +205 -0
  25. package/dist/output/evidence.js.map +1 -0
  26. package/dist/output/fixit.d.ts +32 -0
  27. package/dist/output/fixit.d.ts.map +1 -0
  28. package/dist/output/fixit.js +387 -0
  29. package/dist/output/fixit.js.map +1 -0
  30. package/dist/output/terminal.d.ts +10 -0
  31. package/dist/output/terminal.d.ts.map +1 -0
  32. package/dist/output/terminal.js +190 -0
  33. package/dist/output/terminal.js.map +1 -0
  34. package/dist/scanner/engine.d.ts +6 -0
  35. package/dist/scanner/engine.d.ts.map +1 -0
  36. package/dist/scanner/engine.js +155 -0
  37. package/dist/scanner/engine.js.map +1 -0
  38. package/dist/scanner/ignore.d.ts +20 -0
  39. package/dist/scanner/ignore.d.ts.map +1 -0
  40. package/dist/scanner/ignore.js +125 -0
  41. package/dist/scanner/ignore.js.map +1 -0
  42. package/dist/scanner/injection.d.ts +15 -0
  43. package/dist/scanner/injection.d.ts.map +1 -0
  44. package/dist/scanner/injection.js +234 -0
  45. package/dist/scanner/injection.js.map +1 -0
  46. package/dist/scanner/mcp.d.ts +6 -0
  47. package/dist/scanner/mcp.d.ts.map +1 -0
  48. package/dist/scanner/mcp.js +322 -0
  49. package/dist/scanner/mcp.js.map +1 -0
  50. package/dist/scanner/pii.d.ts +21 -0
  51. package/dist/scanner/pii.d.ts.map +1 -0
  52. package/dist/scanner/pii.js +161 -0
  53. package/dist/scanner/pii.js.map +1 -0
  54. package/dist/scanner/secrets.d.ts +10 -0
  55. package/dist/scanner/secrets.d.ts.map +1 -0
  56. package/dist/scanner/secrets.js +224 -0
  57. package/dist/scanner/secrets.js.map +1 -0
  58. package/dist/scoring/lock.d.ts +12 -0
  59. package/dist/scoring/lock.d.ts.map +1 -0
  60. package/dist/scoring/lock.js +58 -0
  61. package/dist/scoring/lock.js.map +1 -0
  62. package/dist/scoring/score.d.ts +14 -0
  63. package/dist/scoring/score.d.ts.map +1 -0
  64. package/dist/scoring/score.js +74 -0
  65. package/dist/scoring/score.js.map +1 -0
  66. package/dist/types/index.d.ts +205 -0
  67. package/dist/types/index.d.ts.map +1 -0
  68. package/dist/types/index.js +3 -0
  69. package/dist/types/index.js.map +1 -0
  70. package/package.json +52 -0
  71. package/rules/v1.0.0.json +248 -0
@@ -0,0 +1,322 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.scanMCPConfigs = scanMCPConfigs;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const glob_1 = require("glob");
40
+ /**
41
+ * Scan for MCP configuration files and check 5 security items.
42
+ */
43
+ async function scanMCPConfigs(targetPath, ruleset, secretsFindings) {
44
+ const configFiles = await findMCPConfigs(targetPath, ruleset.mcp.config_files);
45
+ if (configFiles.length === 0) {
46
+ return [];
47
+ }
48
+ const findings = [];
49
+ for (const configFile of configFiles) {
50
+ const fullPath = path.join(targetPath, configFile);
51
+ const config = parseMCPConfig(fullPath);
52
+ if (config === null)
53
+ continue;
54
+ const items = {
55
+ auth: checkAuth(config, ruleset.mcp.auth_fields),
56
+ secrets: checkSecrets(config, configFile, secretsFindings),
57
+ toolMeta: checkToolMeta(config, ruleset.mcp.dangerous_tool_keywords),
58
+ permissions: checkPermissions(config, ruleset.mcp.permission_patterns),
59
+ logging: checkLogging(config, ruleset.mcp.logging_fields),
60
+ };
61
+ const { overallSeverity, failedCount } = assessOverall(items);
62
+ findings.push({
63
+ file: configFile,
64
+ items,
65
+ overallSeverity,
66
+ failedCount,
67
+ });
68
+ }
69
+ return findings;
70
+ }
71
+ /**
72
+ * Find MCP config files in the target directory.
73
+ */
74
+ async function findMCPConfigs(targetPath, configFileNames) {
75
+ const patterns = configFileNames.map(name => `**/${name}`);
76
+ const results = [];
77
+ for (const pattern of patterns) {
78
+ const matches = await (0, glob_1.glob)(pattern, {
79
+ cwd: targetPath,
80
+ nodir: true,
81
+ dot: true,
82
+ ignore: ['node_modules/**', '.git/**', 'dist/**', 'build/**'],
83
+ absolute: false,
84
+ });
85
+ results.push(...matches);
86
+ }
87
+ // Deduplicate
88
+ return [...new Set(results)];
89
+ }
90
+ /**
91
+ * Parse an MCP config file (JSON only in Phase 1).
92
+ * Returns null on parse failure (graceful skip).
93
+ */
94
+ function parseMCPConfig(fullPath) {
95
+ try {
96
+ const content = fs.readFileSync(fullPath, 'utf-8');
97
+ return JSON.parse(content);
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ /**
104
+ * Recursively search for any of the given keys in an object.
105
+ */
106
+ function hasAnyKey(obj, keys) {
107
+ if (obj === null || obj === undefined || typeof obj !== 'object') {
108
+ return false;
109
+ }
110
+ const lowerKeys = keys.map(k => k.toLowerCase());
111
+ if (Array.isArray(obj)) {
112
+ return obj.some(item => hasAnyKey(item, keys));
113
+ }
114
+ for (const key of Object.keys(obj)) {
115
+ if (lowerKeys.includes(key.toLowerCase())) {
116
+ return true;
117
+ }
118
+ if (hasAnyKey(obj[key], keys)) {
119
+ return true;
120
+ }
121
+ }
122
+ return false;
123
+ }
124
+ /**
125
+ * Check 1: Auth field existence.
126
+ */
127
+ function checkAuth(config, authFields) {
128
+ const found = hasAnyKey(config, authFields);
129
+ if (found) {
130
+ return { status: 'pass', detail: 'Authentication configuration found' };
131
+ }
132
+ return { status: 'critical', detail: 'No authentication configuration detected' };
133
+ }
134
+ /**
135
+ * Check 2: Hardcoded secrets — cross-reference with F001 findings + env pattern check.
136
+ */
137
+ function checkSecrets(config, filePath, secretsFindings) {
138
+ // Check if F001 found hardcoded secrets in this file
139
+ const fileSecrets = secretsFindings.filter(s => s.file === filePath && s.severity === 'critical');
140
+ if (fileSecrets.length > 0) {
141
+ return {
142
+ status: 'critical',
143
+ detail: `${fileSecrets.length} hardcoded secret(s) found in config`,
144
+ };
145
+ }
146
+ // Check for env reference patterns (good practice)
147
+ const configStr = JSON.stringify(config);
148
+ const envPatterns = [/\$\{[A-Z_]+\}/g, /\$[A-Z_]+/g, /process\.env\./g];
149
+ const hasEnvRef = envPatterns.some(p => p.test(configStr));
150
+ // Check for suspicious inline values (long strings that look like keys)
151
+ const hasInlineSecrets = checkInlineSecrets(config);
152
+ if (hasInlineSecrets) {
153
+ return { status: 'warning', detail: 'Possible inline secret values detected' };
154
+ }
155
+ if (hasEnvRef) {
156
+ return { status: 'pass', detail: 'Secrets use environment variable references' };
157
+ }
158
+ return { status: 'pass', detail: 'No hardcoded secrets detected' };
159
+ }
160
+ /**
161
+ * Recursively check for values that look like inline secrets.
162
+ */
163
+ function checkInlineSecrets(obj) {
164
+ if (typeof obj === 'string') {
165
+ // Check for patterns that look like API keys
166
+ if (/^(sk-|sk_live_|sk_test_|AKIA|ghp_|gho_|xoxb-|AIza)/.test(obj)) {
167
+ return true;
168
+ }
169
+ return false;
170
+ }
171
+ if (obj === null || obj === undefined || typeof obj !== 'object') {
172
+ return false;
173
+ }
174
+ if (Array.isArray(obj)) {
175
+ return obj.some(item => checkInlineSecrets(item));
176
+ }
177
+ return Object.values(obj).some(v => checkInlineSecrets(v));
178
+ }
179
+ /**
180
+ * Check 3: Tool metadata — dangerous keywords in tool names/descriptions.
181
+ */
182
+ function checkToolMeta(config, dangerousKeywords) {
183
+ const tools = extractTools(config);
184
+ if (tools.length === 0) {
185
+ return { status: 'pass', detail: 'No tools defined or no dangerous keywords found' };
186
+ }
187
+ const dangerous = [];
188
+ for (const tool of tools) {
189
+ const text = `${tool.name ?? ''} ${tool.description ?? ''}`.toLowerCase();
190
+ for (const keyword of dangerousKeywords) {
191
+ if (text.includes(keyword.toLowerCase())) {
192
+ dangerous.push(`${tool.name ?? 'unnamed'}: "${keyword}"`);
193
+ }
194
+ }
195
+ }
196
+ if (dangerous.length > 0) {
197
+ return {
198
+ status: 'warning',
199
+ detail: `Dangerous tool keywords: ${dangerous.join(', ')}`,
200
+ };
201
+ }
202
+ return { status: 'pass', detail: 'No dangerous tool keywords found' };
203
+ }
204
+ /**
205
+ * Extract tool definitions from MCP config.
206
+ */
207
+ function extractTools(config) {
208
+ const tools = [];
209
+ // Direct tools array
210
+ if (Array.isArray(config.tools)) {
211
+ for (const tool of config.tools) {
212
+ if (typeof tool === 'object' && tool !== null) {
213
+ tools.push(tool);
214
+ }
215
+ }
216
+ }
217
+ // mcpServers -> each server may have tools
218
+ if (config.mcpServers && typeof config.mcpServers === 'object') {
219
+ for (const server of Object.values(config.mcpServers)) {
220
+ if (server && typeof server === 'object' && !Array.isArray(server)) {
221
+ const s = server;
222
+ // Server command/args can contain dangerous keywords
223
+ const command = typeof s.command === 'string' ? s.command : '';
224
+ const args = Array.isArray(s.args) ? s.args.join(' ') : '';
225
+ tools.push({ name: command, description: args });
226
+ if (Array.isArray(s.tools)) {
227
+ for (const tool of s.tools) {
228
+ if (typeof tool === 'object' && tool !== null) {
229
+ tools.push(tool);
230
+ }
231
+ }
232
+ }
233
+ }
234
+ }
235
+ }
236
+ return tools;
237
+ }
238
+ /**
239
+ * Check 4: Overly broad permissions — root filesystem, wildcard network, privileged.
240
+ */
241
+ function checkPermissions(config, permissionPatterns) {
242
+ const matched = [];
243
+ const allValues = collectStringValues(config);
244
+ for (const pattern of permissionPatterns) {
245
+ for (const value of pattern.values) {
246
+ // Exact match or the value is the entire string (not substring)
247
+ if (allValues.some(v => v === value || v === `"${value}"`)) {
248
+ matched.push(pattern.name);
249
+ break;
250
+ }
251
+ }
252
+ }
253
+ // Also check args arrays for privileged flags
254
+ const configStr = JSON.stringify(config);
255
+ for (const pattern of permissionPatterns) {
256
+ if (matched.includes(pattern.name))
257
+ continue;
258
+ for (const value of pattern.values) {
259
+ // Match "--privileged" or "privileged" as standalone tokens in args
260
+ if (value.startsWith('--') && configStr.includes(`"${value}"`)) {
261
+ matched.push(pattern.name);
262
+ break;
263
+ }
264
+ }
265
+ }
266
+ if (matched.length > 0) {
267
+ return {
268
+ status: 'critical',
269
+ detail: `Overly broad permissions: ${matched.join(', ')}`,
270
+ };
271
+ }
272
+ return { status: 'pass', detail: 'No overly broad permissions detected' };
273
+ }
274
+ /**
275
+ * Collect all string values from a nested object.
276
+ */
277
+ function collectStringValues(obj) {
278
+ const values = [];
279
+ if (typeof obj === 'string') {
280
+ values.push(obj);
281
+ return values;
282
+ }
283
+ if (obj === null || obj === undefined || typeof obj !== 'object') {
284
+ return values;
285
+ }
286
+ if (Array.isArray(obj)) {
287
+ for (const item of obj) {
288
+ values.push(...collectStringValues(item));
289
+ }
290
+ return values;
291
+ }
292
+ for (const val of Object.values(obj)) {
293
+ values.push(...collectStringValues(val));
294
+ }
295
+ return values;
296
+ }
297
+ /**
298
+ * Check 5: Logging/audit configuration existence.
299
+ */
300
+ function checkLogging(config, loggingFields) {
301
+ const found = hasAnyKey(config, loggingFields);
302
+ if (found) {
303
+ return { status: 'pass', detail: 'Logging/audit configuration found' };
304
+ }
305
+ return { status: 'warning', detail: 'No logging/audit configuration detected' };
306
+ }
307
+ /**
308
+ * Assess overall severity from the 5 check items.
309
+ * 3+ failures → critical, 1-2 → warning, 0 → pass
310
+ */
311
+ function assessOverall(items) {
312
+ const checks = [items.auth, items.secrets, items.toolMeta, items.permissions, items.logging];
313
+ const failedCount = checks.filter(c => c.status !== 'pass').length;
314
+ if (failedCount >= 3) {
315
+ return { overallSeverity: 'critical', failedCount };
316
+ }
317
+ if (failedCount >= 1) {
318
+ return { overallSeverity: 'warning', failedCount };
319
+ }
320
+ return { overallSeverity: 'pass', failedCount: 0 };
321
+ }
322
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/scanner/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { PIIFinding, Ruleset } from '../types/index.js';
2
+ /**
3
+ * Validate Korean RRN (Resident Registration Number) checksum.
4
+ * Format: 6 digits (birth date) + 1 digit (gender) + 6 digits
5
+ * Total: 13 digits. Last digit is check digit.
6
+ */
7
+ export declare function validateKoreanRRN(digits: string): boolean;
8
+ /**
9
+ * Validate credit card number using Luhn algorithm.
10
+ */
11
+ export declare function luhnCheck(cardNumber: string): boolean;
12
+ /**
13
+ * Validate Korean Business Registration Number check digit.
14
+ * Format: XXX-XX-XXXXX (10 digits total)
15
+ */
16
+ export declare function validateBusinessNumber(number: string): boolean;
17
+ /**
18
+ * Scan a single file's content for PII using 2-layer detection.
19
+ */
20
+ export declare function scanFilePII(content: string, filePath: string, ruleset: Ruleset): PIIFinding[];
21
+ //# sourceMappingURL=pii.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pii.d.ts","sourceRoot":"","sources":["../../src/scanner/pii.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAa7D;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAwBzD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAkBrD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAa9D;AAiCD;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,UAAU,EAAE,CAgDd"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateKoreanRRN = validateKoreanRRN;
4
+ exports.luhnCheck = luhnCheck;
5
+ exports.validateBusinessNumber = validateBusinessNumber;
6
+ exports.scanFilePII = scanFilePII;
7
+ const ignore_js_1 = require("./ignore.js");
8
+ /**
9
+ * Mask a matched value: show first 3 chars + ****
10
+ */
11
+ function maskValue(value) {
12
+ if (value.length <= 3)
13
+ return '****';
14
+ return value.substring(0, 3) + '****';
15
+ }
16
+ // ─── Checksum Validators ──────────────────────────────────────
17
+ /**
18
+ * Validate Korean RRN (Resident Registration Number) checksum.
19
+ * Format: 6 digits (birth date) + 1 digit (gender) + 6 digits
20
+ * Total: 13 digits. Last digit is check digit.
21
+ */
22
+ function validateKoreanRRN(digits) {
23
+ const clean = digits.replace(/-/g, '');
24
+ if (clean.length !== 13)
25
+ return false;
26
+ // Validate birth date portion
27
+ const monthStr = clean.substring(2, 4);
28
+ const dayStr = clean.substring(4, 6);
29
+ const month = parseInt(monthStr, 10);
30
+ const day = parseInt(dayStr, 10);
31
+ if (month < 1 || month > 12)
32
+ return false;
33
+ if (day < 1 || day > 31)
34
+ return false;
35
+ // Validate gender code (1-4)
36
+ const genderCode = parseInt(clean[6], 10);
37
+ if (genderCode < 1 || genderCode > 4)
38
+ return false;
39
+ // Checksum: multiply each digit by weights [2,3,4,5,6,7,8,9,2,3,4,5]
40
+ const weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
41
+ let sum = 0;
42
+ for (let i = 0; i < 12; i++) {
43
+ sum += parseInt(clean[i], 10) * weights[i];
44
+ }
45
+ const checkDigit = (11 - (sum % 11)) % 10;
46
+ return checkDigit === parseInt(clean[12], 10);
47
+ }
48
+ /**
49
+ * Validate credit card number using Luhn algorithm.
50
+ */
51
+ function luhnCheck(cardNumber) {
52
+ const clean = cardNumber.replace(/[\s-]/g, '');
53
+ if (!/^\d{13,19}$/.test(clean))
54
+ return false;
55
+ let sum = 0;
56
+ let alternate = false;
57
+ for (let i = clean.length - 1; i >= 0; i--) {
58
+ let digit = parseInt(clean[i], 10);
59
+ if (alternate) {
60
+ digit *= 2;
61
+ if (digit > 9)
62
+ digit -= 9;
63
+ }
64
+ sum += digit;
65
+ alternate = !alternate;
66
+ }
67
+ return sum % 10 === 0;
68
+ }
69
+ /**
70
+ * Validate Korean Business Registration Number check digit.
71
+ * Format: XXX-XX-XXXXX (10 digits total)
72
+ */
73
+ function validateBusinessNumber(number) {
74
+ const clean = number.replace(/-/g, '');
75
+ if (clean.length !== 10 || !/^\d{10}$/.test(clean))
76
+ return false;
77
+ const weights = [1, 3, 7, 1, 3, 7, 1, 3, 5];
78
+ let sum = 0;
79
+ for (let i = 0; i < 9; i++) {
80
+ sum += parseInt(clean[i], 10) * weights[i];
81
+ }
82
+ // Add the extra calculation for the 9th position
83
+ sum += Math.floor((parseInt(clean[8], 10) * 5) / 10);
84
+ const checkDigit = (10 - (sum % 10)) % 10;
85
+ return checkDigit === parseInt(clean[9], 10);
86
+ }
87
+ /**
88
+ * Run checksum validation for a pattern match.
89
+ * Returns true if valid, false if invalid, null if not applicable.
90
+ */
91
+ function runChecksum(patternId, matchedValue) {
92
+ switch (patternId) {
93
+ case 'korean_rrn_hyphen':
94
+ case 'korean_rrn_no_hyphen':
95
+ return validateKoreanRRN(matchedValue);
96
+ case 'credit_card':
97
+ return luhnCheck(matchedValue);
98
+ case 'korean_business_number':
99
+ return validateBusinessNumber(matchedValue);
100
+ default:
101
+ return null;
102
+ }
103
+ }
104
+ /**
105
+ * Determine PII severity based on layer results.
106
+ */
107
+ function determinePIISeverity(regexHit, checksumResult) {
108
+ if (!regexHit)
109
+ return 'info';
110
+ if (checksumResult === true)
111
+ return 'confirmed';
112
+ if (checksumResult === null)
113
+ return 'possible'; // No checksum applicable
114
+ return 'possible'; // Checksum failed but regex matched
115
+ }
116
+ /**
117
+ * Scan a single file's content for PII using 2-layer detection.
118
+ */
119
+ function scanFilePII(content, filePath, ruleset) {
120
+ const findings = [];
121
+ const lines = content.split('\n');
122
+ const { patterns } = ruleset.pii;
123
+ for (let i = 0; i < lines.length; i++) {
124
+ const line = lines[i];
125
+ const lineNum = i + 1;
126
+ // Skip shield-ignored lines
127
+ if ((0, ignore_js_1.isLineIgnored)(line))
128
+ continue;
129
+ for (const pattern of patterns) {
130
+ const regex = new RegExp(pattern.regex, 'g');
131
+ let match;
132
+ while ((match = regex.exec(line)) !== null) {
133
+ const matchedStr = match[0];
134
+ const column = (match.index ?? 0) + 1;
135
+ // Layer 2: Checksum validation
136
+ const checksumResult = pattern.has_checksum
137
+ ? runChecksum(pattern.id, matchedStr)
138
+ : null;
139
+ const severity = determinePIISeverity(true, checksumResult);
140
+ if (severity !== 'info') {
141
+ findings.push({
142
+ file: filePath,
143
+ line: lineNum,
144
+ column,
145
+ type: pattern.id,
146
+ severity,
147
+ layers: {
148
+ regex: true,
149
+ checksum: checksumResult,
150
+ },
151
+ matched: maskValue(matchedStr),
152
+ description: pattern.description,
153
+ locale: pattern.locale,
154
+ });
155
+ }
156
+ }
157
+ }
158
+ }
159
+ return findings;
160
+ }
161
+ //# sourceMappingURL=pii.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pii.js","sourceRoot":"","sources":["../../src/scanner/pii.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { SecretFinding, Ruleset } from '../types/index.js';
2
+ /**
3
+ * Calculate Shannon entropy of a string.
4
+ */
5
+ export declare function shannonEntropy(str: string): number;
6
+ /**
7
+ * Scan a single file's content for secrets using 3-layer detection.
8
+ */
9
+ export declare function scanFileSecrets(content: string, filePath: string, ruleset: Ruleset): SecretFinding[];
10
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/scanner/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAiB,MAAM,mBAAmB,CAAC;AAG/E;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkBlD;AA+ID;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,aAAa,EAAE,CA0FjB"}