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.
- package/README.md +176 -6
- package/dist/auditor/checks/environment.d.ts +7 -0
- package/dist/auditor/checks/environment.d.ts.map +1 -0
- package/dist/auditor/checks/environment.js +463 -0
- package/dist/auditor/checks/environment.js.map +1 -0
- package/dist/auditor/checks/hooks.d.ts +13 -0
- package/dist/auditor/checks/hooks.d.ts.map +1 -0
- package/dist/auditor/checks/hooks.js +234 -0
- package/dist/auditor/checks/hooks.js.map +1 -0
- package/dist/auditor/engine.d.ts +7 -0
- package/dist/auditor/engine.d.ts.map +1 -0
- package/dist/auditor/engine.js +183 -0
- package/dist/auditor/engine.js.map +1 -0
- package/dist/auditor/providers/claude-code.d.ts +17 -0
- package/dist/auditor/providers/claude-code.d.ts.map +1 -0
- package/dist/auditor/providers/claude-code.js +176 -0
- package/dist/auditor/providers/claude-code.js.map +1 -0
- package/dist/auditor/providers/types.d.ts +36 -0
- package/dist/auditor/providers/types.d.ts.map +1 -0
- package/dist/auditor/providers/types.js +4 -0
- package/dist/auditor/providers/types.js.map +1 -0
- package/dist/index.js +99 -2
- package/dist/index.js.map +1 -1
- package/dist/license/gate.d.ts +3 -0
- package/dist/license/gate.d.ts.map +1 -1
- package/dist/license/gate.js +9 -0
- package/dist/license/gate.js.map +1 -1
- package/dist/license/index.d.ts +1 -1
- package/dist/license/index.d.ts.map +1 -1
- package/dist/license/index.js +3 -1
- package/dist/license/index.js.map +1 -1
- package/dist/license/storage.d.ts.map +1 -1
- package/dist/license/storage.js +5 -0
- package/dist/license/storage.js.map +1 -1
- package/dist/license/types.d.ts +5 -0
- package/dist/license/types.d.ts.map +1 -1
- package/dist/license/usage.d.ts +12 -0
- package/dist/license/usage.d.ts.map +1 -1
- package/dist/license/usage.js +47 -2
- package/dist/license/usage.js.map +1 -1
- package/dist/output/audit-evidence.d.ts +10 -0
- package/dist/output/audit-evidence.d.ts.map +1 -0
- package/dist/output/audit-evidence.js +82 -0
- package/dist/output/audit-evidence.js.map +1 -0
- package/dist/output/audit-fixit.d.ts +34 -0
- package/dist/output/audit-fixit.d.ts.map +1 -0
- package/dist/output/audit-fixit.js +267 -0
- package/dist/output/audit-fixit.js.map +1 -0
- package/dist/output/audit-terminal.d.ts +15 -0
- package/dist/output/audit-terminal.d.ts.map +1 -0
- package/dist/output/audit-terminal.js +200 -0
- package/dist/output/audit-terminal.js.map +1 -0
- package/dist/retention/expiry.d.ts +13 -0
- package/dist/retention/expiry.d.ts.map +1 -0
- package/dist/retention/expiry.js +37 -0
- package/dist/retention/expiry.js.map +1 -0
- package/dist/retention/hash-detect.d.ts +12 -0
- package/dist/retention/hash-detect.d.ts.map +1 -0
- package/dist/retention/hash-detect.js +29 -0
- package/dist/retention/hash-detect.js.map +1 -0
- package/dist/retention/storage.d.ts +17 -0
- package/dist/retention/storage.d.ts.map +1 -0
- package/dist/retention/storage.js +79 -0
- package/dist/retention/storage.js.map +1 -0
- package/dist/types/audit.d.ts +77 -0
- package/dist/types/audit.d.ts.map +1 -0
- package/dist/types/audit.js +4 -0
- package/dist/types/audit.js.map +1 -0
- 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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"}
|