project-shield 1.1.6 → 2.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 (69) hide show
  1. package/README.md +176 -6
  2. package/dist/auditor/checks/environment.d.ts +7 -0
  3. package/dist/auditor/checks/environment.d.ts.map +1 -0
  4. package/dist/auditor/checks/environment.js +463 -0
  5. package/dist/auditor/checks/environment.js.map +1 -0
  6. package/dist/auditor/checks/hooks.d.ts +13 -0
  7. package/dist/auditor/checks/hooks.d.ts.map +1 -0
  8. package/dist/auditor/checks/hooks.js +234 -0
  9. package/dist/auditor/checks/hooks.js.map +1 -0
  10. package/dist/auditor/engine.d.ts +7 -0
  11. package/dist/auditor/engine.d.ts.map +1 -0
  12. package/dist/auditor/engine.js +183 -0
  13. package/dist/auditor/engine.js.map +1 -0
  14. package/dist/auditor/providers/claude-code.d.ts +17 -0
  15. package/dist/auditor/providers/claude-code.d.ts.map +1 -0
  16. package/dist/auditor/providers/claude-code.js +176 -0
  17. package/dist/auditor/providers/claude-code.js.map +1 -0
  18. package/dist/auditor/providers/types.d.ts +36 -0
  19. package/dist/auditor/providers/types.d.ts.map +1 -0
  20. package/dist/auditor/providers/types.js +4 -0
  21. package/dist/auditor/providers/types.js.map +1 -0
  22. package/dist/index.js +99 -2
  23. package/dist/index.js.map +1 -1
  24. package/dist/license/gate.d.ts +3 -0
  25. package/dist/license/gate.d.ts.map +1 -1
  26. package/dist/license/gate.js +9 -0
  27. package/dist/license/gate.js.map +1 -1
  28. package/dist/license/index.d.ts +1 -1
  29. package/dist/license/index.d.ts.map +1 -1
  30. package/dist/license/index.js +3 -1
  31. package/dist/license/index.js.map +1 -1
  32. package/dist/license/storage.d.ts.map +1 -1
  33. package/dist/license/storage.js +5 -0
  34. package/dist/license/storage.js.map +1 -1
  35. package/dist/license/types.d.ts +5 -0
  36. package/dist/license/types.d.ts.map +1 -1
  37. package/dist/license/usage.d.ts +12 -0
  38. package/dist/license/usage.d.ts.map +1 -1
  39. package/dist/license/usage.js +47 -2
  40. package/dist/license/usage.js.map +1 -1
  41. package/dist/output/audit-evidence.d.ts +10 -0
  42. package/dist/output/audit-evidence.d.ts.map +1 -0
  43. package/dist/output/audit-evidence.js +82 -0
  44. package/dist/output/audit-evidence.js.map +1 -0
  45. package/dist/output/audit-fixit.d.ts +34 -0
  46. package/dist/output/audit-fixit.d.ts.map +1 -0
  47. package/dist/output/audit-fixit.js +267 -0
  48. package/dist/output/audit-fixit.js.map +1 -0
  49. package/dist/output/audit-terminal.d.ts +15 -0
  50. package/dist/output/audit-terminal.d.ts.map +1 -0
  51. package/dist/output/audit-terminal.js +200 -0
  52. package/dist/output/audit-terminal.js.map +1 -0
  53. package/dist/retention/expiry.d.ts +13 -0
  54. package/dist/retention/expiry.d.ts.map +1 -0
  55. package/dist/retention/expiry.js +37 -0
  56. package/dist/retention/expiry.js.map +1 -0
  57. package/dist/retention/hash-detect.d.ts +12 -0
  58. package/dist/retention/hash-detect.d.ts.map +1 -0
  59. package/dist/retention/hash-detect.js +29 -0
  60. package/dist/retention/hash-detect.js.map +1 -0
  61. package/dist/retention/storage.d.ts +17 -0
  62. package/dist/retention/storage.d.ts.map +1 -0
  63. package/dist/retention/storage.js +79 -0
  64. package/dist/retention/storage.js.map +1 -0
  65. package/dist/types/audit.d.ts +77 -0
  66. package/dist/types/audit.d.ts.map +1 -0
  67. package/dist/types/audit.js +4 -0
  68. package/dist/types/audit.js.map +1 -0
  69. package/package.json +6 -3
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ // ─── F009: Hooks Malicious Command Detection (7 items) ──────
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.checkHooks = checkHooks;
5
+ // ─── F009-01: Network request patterns ──────────────────────
6
+ const NETWORK_PATTERNS = [
7
+ /\bcurl\b/i,
8
+ /\bwget\b/i,
9
+ /\bnc\b/,
10
+ /\bncat\b/i,
11
+ /\bnetcat\b/i,
12
+ /\bhttp\b.*\brequest\b/i,
13
+ /\bfetch\b/i,
14
+ /\bhttpie\b/i,
15
+ /\baria2c?\b/i,
16
+ ];
17
+ // ─── F009-02: Data exfiltration patterns ────────────────────
18
+ const EXFIL_PATTERNS = [
19
+ />\s*\/dev\/tcp\//, // > /dev/tcp/host/port
20
+ /\bbase64\b.*\|\s*(curl|wget|nc)\b/i, // base64 | curl
21
+ /(curl|wget|nc).*\|\s*base64\b/i, // curl | base64
22
+ /\bdig\b.*\bTXT\b/i, // DNS tunneling via dig TXT
23
+ /\bnslookup\b.*\./, // DNS lookup
24
+ /\bbase64\b.*-w\s*0/, // base64 no-wrap (exfil prep)
25
+ /\|\s*xxd\b/, // hex dump pipe
26
+ ];
27
+ // ─── F009-03: Reverse shell patterns ────────────────────────
28
+ const REVERSE_SHELL_PATTERNS = [
29
+ /\bbash\s+-i\b/, // bash -i (interactive)
30
+ /\bpython[23]?\s+-c\b.*socket/i, // python -c ... socket
31
+ /\bnc\s+-e\b/, // nc -e (execute)
32
+ /\bncat\s+.*-e\b/, // ncat -e
33
+ /\bperl\s+-e\b.*socket/i, // perl -e ... socket
34
+ /\bruby\s+-r\s*socket\b/i, // ruby -r socket
35
+ /\bphp\s+-r\b.*fsockopen/i, // php -r ... fsockopen
36
+ /\/dev\/tcp\/\d/, // /dev/tcp/IP
37
+ /\bmkfifo\b.*\bnc\b/, // mkfifo + nc combo
38
+ ];
39
+ // ─── F009-04: File deletion patterns ────────────────────────
40
+ const FILE_DELETE_PATTERNS = [
41
+ /\brm\s+-[a-z]*r[a-z]*f\b/, // rm -rf
42
+ /\brm\s+-[a-z]*f[a-z]*r\b/, // rm -fr
43
+ /\bdel\s+\/[fF]\b/, // del /f (Windows)
44
+ /\bshred\b/, // shred
45
+ /\brmdir\s+\/[sS]\b/, // rmdir /s (Windows)
46
+ /\brm\s+-rf\s+[\/~]/, // rm -rf / or ~
47
+ ];
48
+ // ─── F009-05: Environment variable reading patterns ─────────
49
+ const ENV_READ_PATTERNS = [
50
+ /\benv\b(?!\s*=)/, // env command (not assignment)
51
+ /\bprintenv\b/, // printenv
52
+ /\$ANTHROPIC_API_KEY\b/, // direct key reference
53
+ /\$CLAUDE_API_KEY\b/,
54
+ /\$OPENAI_API_KEY\b/,
55
+ /\$AWS_SECRET_ACCESS_KEY\b/,
56
+ /\$GITHUB_TOKEN\b/,
57
+ /\bset\b\s*\|/, // set | (list all vars)
58
+ /\bexport\s+-p\b/, // export -p (print all)
59
+ ];
60
+ // ─── F009-07: Obfuscated command patterns (MVP) ─────────────
61
+ const OBFUSCATION_PATTERNS = [
62
+ /\bbase64\s+-d\b.*\|\s*(sh|bash)\b/i, // base64 -d | sh
63
+ /\bbase64\s+--decode\b.*\|\s*(sh|bash)\b/i,
64
+ /\beval\s+\$\(/, // eval $(...)
65
+ /\beval\s+"?\$\(/, // eval "$(...)"
66
+ /\$\(.*\bbase64\b.*-d\)/, // $(... base64 -d ...)
67
+ /echo\s+.*\|\s*base64\s+-d\s*\|\s*(sh|bash)\b/i,
68
+ ];
69
+ /**
70
+ * Run all F009 hooks checks and return findings.
71
+ * All F009 findings are tier: 'pro' (hidden from Free users entirely).
72
+ */
73
+ function checkHooks(ctx) {
74
+ const findings = [];
75
+ const { hooks, settings } = ctx;
76
+ if (hooks.length === 0)
77
+ return findings;
78
+ findings.push(...checkF009_01_networkRequests(hooks));
79
+ findings.push(...checkF009_02_dataExfiltration(hooks));
80
+ findings.push(...checkF009_03_reverseShell(hooks));
81
+ findings.push(...checkF009_04_fileDeletion(hooks));
82
+ findings.push(...checkF009_05_envVarReading(hooks));
83
+ findings.push(...checkF009_06_repoLevelHooks(settings));
84
+ findings.push(...checkF009_07_obfuscatedCommands(hooks));
85
+ return findings;
86
+ }
87
+ // ─── F009-01: Network requests ──────────────────────────────
88
+ function checkF009_01_networkRequests(hooks) {
89
+ const findings = [];
90
+ for (const hook of hooks) {
91
+ const matched = NETWORK_PATTERNS.filter((p) => p.test(hook.command));
92
+ if (matched.length > 0) {
93
+ findings.push({
94
+ id: 'F009-01',
95
+ title: 'Network request in hook command',
96
+ description: `Hook "${hook.event}" contains network tool. Data exfiltration channel detected.`,
97
+ severity: 'critical',
98
+ tier: 'pro',
99
+ category: 'hooks',
100
+ remediation: `Review and remove network commands from hook: ${hook.event}${hook.matcher ? ` (matcher: ${hook.matcher})` : ''}`,
101
+ evidence: `command: ${hook.command}`,
102
+ });
103
+ }
104
+ }
105
+ return findings;
106
+ }
107
+ // ─── F009-02: Data exfiltration patterns ────────────────────
108
+ function checkF009_02_dataExfiltration(hooks) {
109
+ const findings = [];
110
+ for (const hook of hooks) {
111
+ const matched = EXFIL_PATTERNS.filter((p) => p.test(hook.command));
112
+ if (matched.length > 0) {
113
+ findings.push({
114
+ id: 'F009-02',
115
+ title: 'Data exfiltration pattern in hook',
116
+ description: `Hook "${hook.event}" contains data exfiltration pattern (CVE-2025-59536).`,
117
+ severity: 'critical',
118
+ tier: 'pro',
119
+ category: 'hooks',
120
+ remediation: `Remove suspicious data transfer commands from hook: ${hook.event}`,
121
+ evidence: `command: ${hook.command}`,
122
+ });
123
+ }
124
+ }
125
+ return findings;
126
+ }
127
+ // ─── F009-03: Reverse shell patterns ────────────────────────
128
+ function checkF009_03_reverseShell(hooks) {
129
+ const findings = [];
130
+ for (const hook of hooks) {
131
+ const matched = REVERSE_SHELL_PATTERNS.filter((p) => p.test(hook.command));
132
+ if (matched.length > 0) {
133
+ findings.push({
134
+ id: 'F009-03',
135
+ title: 'Reverse shell pattern in hook',
136
+ description: `Hook "${hook.event}" contains reverse shell pattern. Remote access backdoor detected.`,
137
+ severity: 'critical',
138
+ tier: 'pro',
139
+ category: 'hooks',
140
+ remediation: `Remove reverse shell commands from hook: ${hook.event}`,
141
+ evidence: `command: ${hook.command}`,
142
+ });
143
+ }
144
+ }
145
+ return findings;
146
+ }
147
+ // ─── F009-04: File deletion ─────────────────────────────────
148
+ function checkF009_04_fileDeletion(hooks) {
149
+ const findings = [];
150
+ for (const hook of hooks) {
151
+ const matched = FILE_DELETE_PATTERNS.filter((p) => p.test(hook.command));
152
+ if (matched.length > 0) {
153
+ findings.push({
154
+ id: 'F009-04',
155
+ title: 'Destructive file operation in hook',
156
+ description: `Hook "${hook.event}" contains file deletion commands. Data destruction risk.`,
157
+ severity: 'medium',
158
+ tier: 'pro',
159
+ category: 'hooks',
160
+ remediation: `Review and restrict file deletion in hook: ${hook.event}`,
161
+ evidence: `command: ${hook.command}`,
162
+ });
163
+ }
164
+ }
165
+ return findings;
166
+ }
167
+ // ─── F009-05: Environment variable reading ──────────────────
168
+ function checkF009_05_envVarReading(hooks) {
169
+ const findings = [];
170
+ for (const hook of hooks) {
171
+ const matched = ENV_READ_PATTERNS.filter((p) => p.test(hook.command));
172
+ if (matched.length > 0) {
173
+ findings.push({
174
+ id: 'F009-05',
175
+ title: 'Environment variable access in hook',
176
+ description: `Hook "${hook.event}" reads environment variables. Credential collection risk.`,
177
+ severity: 'medium',
178
+ tier: 'pro',
179
+ category: 'hooks',
180
+ remediation: `Remove or restrict env var access in hook: ${hook.event}`,
181
+ evidence: `command: ${hook.command}`,
182
+ });
183
+ }
184
+ }
185
+ return findings;
186
+ }
187
+ // ─── F009-06: Repository-level hooks ────────────────────────
188
+ function checkF009_06_repoLevelHooks(settings) {
189
+ const findings = [];
190
+ const projectSettings = settings.filter((s) => s.isProjectLevel && s.exists);
191
+ for (const s of projectSettings) {
192
+ const hooksObj = s.raw.hooks;
193
+ if (typeof hooksObj === 'object' && hooksObj !== null) {
194
+ const hookEntries = Object.entries(hooksObj);
195
+ const hookCount = hookEntries.reduce((count, [, handlers]) => {
196
+ return count + (Array.isArray(handlers) ? handlers.length : 0);
197
+ }, 0);
198
+ if (hookCount > 0) {
199
+ findings.push({
200
+ id: 'F009-06',
201
+ title: 'Hooks defined in project-level settings',
202
+ description: `${hookCount} hook(s) in project settings auto-execute on all collaborator machines. Lateral movement risk.`,
203
+ severity: 'medium',
204
+ tier: 'pro',
205
+ category: 'hooks',
206
+ remediation: 'Move hooks to user-level settings or review project hooks in ' + s.filePath,
207
+ evidence: `${s.filePath}: ${hookCount} hook(s) defined`,
208
+ });
209
+ }
210
+ }
211
+ }
212
+ return findings;
213
+ }
214
+ // ─── F009-07: Obfuscated commands (MVP) ─────────────────────
215
+ function checkF009_07_obfuscatedCommands(hooks) {
216
+ const findings = [];
217
+ for (const hook of hooks) {
218
+ const matched = OBFUSCATION_PATTERNS.filter((p) => p.test(hook.command));
219
+ if (matched.length > 0) {
220
+ findings.push({
221
+ id: 'F009-07',
222
+ title: 'Obfuscated command in hook',
223
+ description: `Hook "${hook.event}" contains obfuscated command (base64+eval). Detection evasion attempt.`,
224
+ severity: 'critical',
225
+ tier: 'pro',
226
+ category: 'hooks',
227
+ remediation: `Remove obfuscated commands from hook: ${hook.event}. Replace with plain-text equivalents.`,
228
+ evidence: `command: ${hook.command}`,
229
+ });
230
+ }
231
+ }
232
+ return findings;
233
+ }
234
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/auditor/checks/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AuditConfig, AuditResult } from '../types/audit.js';
2
+ import type { FeatureGate } from '../license/types.js';
3
+ export declare class AuditFailedError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ export declare function audit(config: AuditConfig, gate: FeatureGate): Promise<AuditResult>;
7
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/auditor/engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAA4B,MAAM,mBAAmB,CAAC;AAC5F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAmDD,wBAAsB,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAgFxF"}
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ // ─── Audit Engine ───────────────────────────────────────────
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.AuditFailedError = void 0;
38
+ exports.audit = audit;
39
+ const crypto = __importStar(require("node:crypto"));
40
+ const claude_code_js_1 = require("./providers/claude-code.js");
41
+ const environment_js_1 = require("./checks/environment.js");
42
+ const hooks_js_1 = require("./checks/hooks.js");
43
+ class AuditFailedError extends Error {
44
+ constructor(message) {
45
+ super(message);
46
+ this.name = 'AuditFailedError';
47
+ }
48
+ }
49
+ exports.AuditFailedError = AuditFailedError;
50
+ function calculateScore(findings) {
51
+ let deductions = 0;
52
+ let envDeductions = 0;
53
+ let hookDeductions = 0;
54
+ for (const f of findings) {
55
+ let points = 0;
56
+ switch (f.severity) {
57
+ case 'critical':
58
+ points = 25;
59
+ break;
60
+ case 'high':
61
+ points = 15;
62
+ break;
63
+ case 'medium':
64
+ points = 10;
65
+ break;
66
+ case 'low':
67
+ points = 5;
68
+ break;
69
+ case 'info':
70
+ points = 0;
71
+ break;
72
+ }
73
+ deductions += points;
74
+ if (f.category === 'environment')
75
+ envDeductions += points;
76
+ if (f.category === 'hooks')
77
+ hookDeductions += points;
78
+ }
79
+ const total = Math.max(0, 100 - deductions);
80
+ let grade;
81
+ if (findings.some((f) => f.severity === 'critical'))
82
+ grade = 'F';
83
+ else if (total >= 90)
84
+ grade = 'A';
85
+ else if (total >= 80)
86
+ grade = 'B';
87
+ else if (total >= 70)
88
+ grade = 'C';
89
+ else if (total >= 60)
90
+ grade = 'D';
91
+ else if (total >= 50)
92
+ grade = 'E';
93
+ else
94
+ grade = 'F';
95
+ return {
96
+ total,
97
+ grade,
98
+ breakdown: {
99
+ environment: Math.max(0, 50 - envDeductions),
100
+ hooks: Math.max(0, 50 - hookDeductions),
101
+ },
102
+ };
103
+ }
104
+ function computeSettingsHash(settings) {
105
+ const combined = settings
106
+ .filter((s) => Object.keys(s.raw).length > 0)
107
+ .map((s) => JSON.stringify(s.raw))
108
+ .join('|');
109
+ if (!combined)
110
+ return '';
111
+ return crypto.createHash('sha256').update(combined).digest('hex');
112
+ }
113
+ async function audit(config, gate) {
114
+ const projectDir = config.projectDir ?? process.cwd();
115
+ const provider = new claude_code_js_1.ClaudeCodeProvider(projectDir);
116
+ // 1. Detect environment
117
+ const detected = await provider.detectEnvironment();
118
+ // 2. Gather data
119
+ const settings = await provider.getSettings();
120
+ const settingsHash = computeSettingsHash(settings);
121
+ if (!detected) {
122
+ // No Claude Code environment found — perfect score
123
+ const emptyScore = calculateScore([]);
124
+ return {
125
+ environment: [],
126
+ hooks: [],
127
+ score: emptyScore,
128
+ summary: {
129
+ total: 0,
130
+ critical: 0,
131
+ high: 0,
132
+ medium: 0,
133
+ low: 0,
134
+ info: 0,
135
+ freeVisible: 0,
136
+ proOnly: 0,
137
+ },
138
+ settingsHash,
139
+ scannedAt: new Date().toISOString(),
140
+ projectDir,
141
+ };
142
+ }
143
+ // 3. Collect provider data
144
+ const hooks = await provider.getHooks();
145
+ const envFiles = await provider.getEnvFiles();
146
+ const instructionFiles = await provider.getInstructionFiles();
147
+ // 4. F008 environment checks (9 items)
148
+ const envFindings = (0, environment_js_1.checkEnvironment)(settings, envFiles, instructionFiles, projectDir);
149
+ // 5. F009 hooks checks (7 items)
150
+ const hookFindings = (0, hooks_js_1.checkHooks)({ hooks, settings });
151
+ // 6. Combine all findings (before gate filtering)
152
+ const allFindings = [...envFindings, ...hookFindings];
153
+ // 7. Score based on ALL findings (Free users see real score → conversion trigger)
154
+ const score = calculateScore(allFindings);
155
+ // 8. Gate filtering for visible results
156
+ const visibleEnv = gate.canAuditFull
157
+ ? envFindings
158
+ : envFindings.filter((f) => f.tier === 'free');
159
+ const visibleHooks = gate.canAuditHooks
160
+ ? hookFindings
161
+ : [];
162
+ // 9. Summary based on ALL findings (not just visible)
163
+ const summary = {
164
+ total: allFindings.length,
165
+ critical: allFindings.filter((f) => f.severity === 'critical').length,
166
+ high: allFindings.filter((f) => f.severity === 'high').length,
167
+ medium: allFindings.filter((f) => f.severity === 'medium').length,
168
+ low: allFindings.filter((f) => f.severity === 'low').length,
169
+ info: allFindings.filter((f) => f.severity === 'info').length,
170
+ freeVisible: allFindings.filter((f) => f.tier === 'free').length,
171
+ proOnly: allFindings.filter((f) => f.tier === 'pro').length,
172
+ };
173
+ return {
174
+ environment: visibleEnv,
175
+ hooks: visibleHooks,
176
+ score,
177
+ summary,
178
+ settingsHash,
179
+ scannedAt: new Date().toISOString(),
180
+ projectDir,
181
+ };
182
+ }
183
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/auditor/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { AuditProvider, ToolSettings, HookConfig, EnvFileInfo, InstructionFileInfo } from './types.js';
2
+ export declare class ClaudeCodeProvider implements AuditProvider {
3
+ readonly name = "claude-code";
4
+ private readonly projectDir;
5
+ private readonly homeDir;
6
+ constructor(projectDir?: string);
7
+ private getSettingsFiles;
8
+ private getEnvFilePaths;
9
+ private getInstructionPaths;
10
+ private safeReadJson;
11
+ detectEnvironment(): Promise<boolean>;
12
+ getSettings(): Promise<ToolSettings[]>;
13
+ getHooks(): Promise<HookConfig[]>;
14
+ getEnvFiles(): Promise<EnvFileInfo[]>;
15
+ getInstructionFiles(): Promise<InstructionFileInfo[]>;
16
+ }
17
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/auditor/providers/claude-code.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,WAAW,EACX,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAOpB,qBAAa,kBAAmB,YAAW,aAAa;IACtD,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,UAAU,CAAC,EAAE,MAAM;IAK/B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,YAAY;IAad,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAUrC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmBtC,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IA0BjC,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAqBrC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;CAc5D"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ // ─── Claude Code Audit Provider ─────────────────────────────
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.ClaudeCodeProvider = void 0;
38
+ const fs = __importStar(require("node:fs"));
39
+ const path = __importStar(require("node:path"));
40
+ const os = __importStar(require("node:os"));
41
+ class ClaudeCodeProvider {
42
+ name = 'claude-code';
43
+ projectDir;
44
+ homeDir;
45
+ constructor(projectDir) {
46
+ this.projectDir = projectDir ?? process.cwd();
47
+ this.homeDir = os.homedir();
48
+ }
49
+ getSettingsFiles() {
50
+ return [
51
+ { filePath: path.join(this.homeDir, '.claude', 'settings.json'), isProjectLevel: false },
52
+ { filePath: path.join(this.homeDir, '.claude.json'), isProjectLevel: false },
53
+ { filePath: path.join(this.projectDir, '.claude', 'settings.json'), isProjectLevel: true },
54
+ { filePath: path.join(this.projectDir, '.claude', 'settings.local.json'), isProjectLevel: true },
55
+ ];
56
+ }
57
+ getEnvFilePaths() {
58
+ return [
59
+ path.join(this.projectDir, '.env'),
60
+ path.join(this.projectDir, '.env.local'),
61
+ ];
62
+ }
63
+ getInstructionPaths() {
64
+ return [
65
+ path.join(this.projectDir, 'CLAUDE.md'),
66
+ path.join(this.projectDir, '.claude', 'CLAUDE.md'),
67
+ ];
68
+ }
69
+ safeReadJson(filePath) {
70
+ try {
71
+ const raw = fs.readFileSync(filePath, 'utf-8');
72
+ const parsed = JSON.parse(raw);
73
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
74
+ return parsed;
75
+ }
76
+ return {};
77
+ }
78
+ catch {
79
+ return {};
80
+ }
81
+ }
82
+ async detectEnvironment() {
83
+ // Primary signals: .claude/ directory or CLAUDE.md — these are Claude Code specific.
84
+ // .env alone is NOT sufficient (every Node project has .env).
85
+ const primaryPaths = [
86
+ ...this.getSettingsFiles().map((s) => s.filePath),
87
+ ...this.getInstructionPaths(),
88
+ ];
89
+ return primaryPaths.some((p) => fs.existsSync(p));
90
+ }
91
+ async getSettings() {
92
+ const results = [];
93
+ for (const spec of this.getSettingsFiles()) {
94
+ const exists = fs.existsSync(spec.filePath);
95
+ const raw = exists ? this.safeReadJson(spec.filePath) : {};
96
+ const permissions = (typeof raw.permissions === 'object' && raw.permissions !== null)
97
+ ? raw.permissions
98
+ : {};
99
+ results.push({
100
+ permissions,
101
+ raw,
102
+ exists,
103
+ isProjectLevel: spec.isProjectLevel,
104
+ filePath: spec.filePath,
105
+ });
106
+ }
107
+ return results;
108
+ }
109
+ async getHooks() {
110
+ const hooks = [];
111
+ for (const spec of this.getSettingsFiles()) {
112
+ if (!fs.existsSync(spec.filePath))
113
+ continue;
114
+ const raw = this.safeReadJson(spec.filePath);
115
+ const hooksObj = raw.hooks;
116
+ if (typeof hooksObj !== 'object' || hooksObj === null)
117
+ continue;
118
+ // hooks structure: { "PreToolUse": [{ "matcher": "...", "command": "..." }], ... }
119
+ for (const [event, handlers] of Object.entries(hooksObj)) {
120
+ if (!Array.isArray(handlers))
121
+ continue;
122
+ for (const handler of handlers) {
123
+ if (typeof handler !== 'object' || handler === null)
124
+ continue;
125
+ const h = handler;
126
+ if (typeof h.command !== 'string')
127
+ continue;
128
+ hooks.push({
129
+ event,
130
+ matcher: typeof h.matcher === 'string' ? h.matcher : undefined,
131
+ command: h.command,
132
+ });
133
+ }
134
+ }
135
+ }
136
+ return hooks;
137
+ }
138
+ async getEnvFiles() {
139
+ return this.getEnvFilePaths().map((filePath) => {
140
+ const exists = fs.existsSync(filePath);
141
+ let keys = [];
142
+ if (exists) {
143
+ try {
144
+ const content = fs.readFileSync(filePath, 'utf-8');
145
+ keys = content
146
+ .split('\n')
147
+ .map((line) => line.trim())
148
+ .filter((line) => line && !line.startsWith('#'))
149
+ .map((line) => line.split('=')[0].trim())
150
+ .filter((key) => key.length > 0);
151
+ }
152
+ catch {
153
+ // ignore read errors
154
+ }
155
+ }
156
+ return { filePath, exists, keys };
157
+ });
158
+ }
159
+ async getInstructionFiles() {
160
+ return this.getInstructionPaths().map((filePath) => {
161
+ const exists = fs.existsSync(filePath);
162
+ let sizeBytes = 0;
163
+ if (exists) {
164
+ try {
165
+ sizeBytes = fs.statSync(filePath).size;
166
+ }
167
+ catch {
168
+ // ignore stat errors
169
+ }
170
+ }
171
+ return { filePath, exists, sizeBytes };
172
+ });
173
+ }
174
+ }
175
+ exports.ClaudeCodeProvider = ClaudeCodeProvider;
176
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/auditor/providers/claude-code.ts"],"names":[],"mappings":"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"}