vibe-checking 1.0.0 → 1.0.3
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 +31 -24
- package/dist/claude/correlator.js +42 -3
- package/dist/claude/correlator.js.map +1 -1
- package/dist/claude/reader.js +96 -53
- package/dist/claude/reader.js.map +1 -1
- package/dist/cursor/reader.d.ts +5 -0
- package/dist/cursor/reader.js +178 -0
- package/dist/cursor/reader.js.map +1 -0
- package/dist/index.js +35 -11
- package/dist/index.js.map +1 -1
- package/dist/repl/display.d.ts +2 -1
- package/dist/repl/display.js +10 -2
- package/dist/repl/display.js.map +1 -1
- package/dist/scanners/aggregator.js +1 -0
- package/dist/scanners/aggregator.js.map +1 -1
- package/dist/scanners/gitleaks.js +30 -14
- package/dist/scanners/gitleaks.js.map +1 -1
- package/dist/scanners/semgrep.js +47 -11
- package/dist/scanners/semgrep.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/package.json +11 -3
package/README.md
CHANGED
|
@@ -1,52 +1,59 @@
|
|
|
1
1
|
# vibecheck
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Security audit for AI-generated codebases. Finds vulnerabilities, then traces them back to the prompt that caused them.
|
|
4
|
+
|
|
5
|
+
No account. No API key. Nothing leaves your machine.
|
|
4
6
|
|
|
5
7
|
## Quick start
|
|
6
8
|
|
|
7
9
|
```bash
|
|
8
|
-
npx
|
|
10
|
+
npx vibe-checking --with-cursor-history
|
|
9
11
|
```
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
Run this from your project directory. The tool scans your code, reads your Cursor session history, and shows which prompts introduced each vulnerability.
|
|
14
|
+
|
|
15
|
+
## What it checks
|
|
16
|
+
|
|
17
|
+
- **Secrets** — leaked API keys, tokens, credentials in git history (via gitleaks)
|
|
18
|
+
- **Code vulnerabilities** — injection, XSS, auth gaps, unverified webhooks (via semgrep)
|
|
19
|
+
- **Supabase RLS** — tables missing Row Level Security in your migrations
|
|
20
|
+
- **Dependencies** — known CVEs in your packages (via npm audit)
|
|
12
21
|
|
|
13
|
-
|
|
22
|
+
gitleaks and semgrep are auto-installed if missing. If installation fails, the tool skips that check and continues.
|
|
14
23
|
|
|
15
|
-
|
|
16
|
-
2. **Reads** your Claude Code session history and **correlates** each finding to the prompt that generated it
|
|
17
|
-
3. **Shows** rewritten prompts that would have produced secure code the first time
|
|
18
|
-
4. **Generates** a shareable HTML report
|
|
24
|
+
## Prompt tracing
|
|
19
25
|
|
|
20
|
-
|
|
26
|
+
This is what makes vibecheck different from a regular scanner.
|
|
21
27
|
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
28
|
+
When you add `--with-cursor-history` or `--with-claude-history`, the tool reads the session files that Cursor and Claude Code store locally on your machine. It matches each finding to the prompt that generated the vulnerable code, and shows how the prompt should have been written.
|
|
29
|
+
|
|
30
|
+
Without these flags, you still get the full security scan — just without the prompt correlation.
|
|
25
31
|
|
|
26
32
|
## Usage
|
|
27
33
|
|
|
28
34
|
```bash
|
|
29
|
-
npx
|
|
30
|
-
npx
|
|
31
|
-
npx
|
|
32
|
-
npx
|
|
35
|
+
npx vibe-checking # security scan only
|
|
36
|
+
npx vibe-checking --with-cursor-history # scan + trace Cursor prompts
|
|
37
|
+
npx vibe-checking --with-claude-history # scan + trace Claude Code prompts
|
|
38
|
+
npx vibe-checking --with-cursor-history --with-claude-history # scan + trace both
|
|
33
39
|
```
|
|
34
40
|
|
|
35
41
|
## Interactive commands
|
|
36
42
|
|
|
43
|
+
Once the scan completes, you get an interactive prompt:
|
|
44
|
+
|
|
37
45
|
| Command | Action |
|
|
38
46
|
|---------|--------|
|
|
39
|
-
| `1
|
|
40
|
-
| `fix`
|
|
41
|
-
| `ignore`
|
|
42
|
-
| `next`
|
|
43
|
-
| `list`
|
|
44
|
-
| `
|
|
45
|
-
| `q` | Finish and write report |
|
|
47
|
+
| `1`, `2`, `3`... | Inspect a finding |
|
|
48
|
+
| `fix` | Show the rewritten secure prompt |
|
|
49
|
+
| `ignore` | Dismiss the current finding |
|
|
50
|
+
| `next` | Jump to the next open finding |
|
|
51
|
+
| `list` | Reprint the list with updated score |
|
|
52
|
+
| `q` | Save an HTML report and exit |
|
|
46
53
|
|
|
47
54
|
## Privacy
|
|
48
55
|
|
|
49
|
-
|
|
56
|
+
Everything runs locally. The scanners are local binaries. The session history is read from local files. The HTML report is saved to your project directory. Nothing is uploaded, no telemetry, no account required.
|
|
50
57
|
|
|
51
58
|
---
|
|
52
59
|
|
|
@@ -17,14 +17,39 @@ function findCorrelation(finding, sessions, repoPath) {
|
|
|
17
17
|
const findingPath = extractFilePath(finding.path);
|
|
18
18
|
if (!findingPath)
|
|
19
19
|
return null;
|
|
20
|
+
const findingBase = basename(findingPath);
|
|
21
|
+
// For migration files, extract the name portion without timestamp prefix and .sql extension
|
|
22
|
+
// e.g. "001_hexagon_system.sql" → "hexagon_system", "20260520_cleanup.sql" → "cleanup"
|
|
23
|
+
const findingMigrationName = findingBase.replace(/^\d+_/, "").replace(/\.sql$/, "").toLowerCase();
|
|
20
24
|
for (const session of sessions) {
|
|
21
25
|
for (const prompt of session.prompts) {
|
|
22
26
|
const matchedFile = prompt.filesGenerated.find((f) => {
|
|
23
27
|
const resolved = f.startsWith("/") ? f : resolve(repoPath, f);
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
const resolvedBase = basename(resolved);
|
|
29
|
+
// Exact path match
|
|
30
|
+
if (resolved.endsWith(findingPath) ||
|
|
26
31
|
f === findingPath ||
|
|
27
|
-
f.endsWith(findingPath))
|
|
32
|
+
f.endsWith(findingPath)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
// Basename match
|
|
36
|
+
if (resolvedBase === findingBase)
|
|
37
|
+
return true;
|
|
38
|
+
// Migration fuzzy match: apply_migration stores partial names like
|
|
39
|
+
// "supabase/migrations/cleanup_cycling_taxonomy" which need to match
|
|
40
|
+
// "supabase/migrations/20260520223550_cleanup_cycling_taxonomy.sql"
|
|
41
|
+
if (findingPath.includes("supabase/migrations/") && f.includes("supabase/migrations/")) {
|
|
42
|
+
const genName = basename(f).replace(/^\d+_/, "").replace(/\.sql$/, "").toLowerCase();
|
|
43
|
+
if (genName && findingMigrationName && genName === findingMigrationName)
|
|
44
|
+
return true;
|
|
45
|
+
// Also match if one contains the other (partial name from apply_migration)
|
|
46
|
+
if (genName && findingMigrationName) {
|
|
47
|
+
if (genName.includes(findingMigrationName) || findingMigrationName.includes(genName)) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
28
53
|
});
|
|
29
54
|
if (matchedFile) {
|
|
30
55
|
const trace = buildTrace(finding, prompt, session, matchedFile);
|
|
@@ -74,6 +99,11 @@ function inferResult(finding) {
|
|
|
74
99
|
if (title.includes("xss") || title.includes("cross-site")) {
|
|
75
100
|
return "User input rendered without sanitization. The prompt didn't mention output encoding.";
|
|
76
101
|
}
|
|
102
|
+
if (title.includes("cipher") || title.includes("crypto") ||
|
|
103
|
+
title.includes("gcm") || title.includes("decipher") ||
|
|
104
|
+
title.includes("hash") || title.includes("hmac")) {
|
|
105
|
+
return "The cryptographic operation is missing a required security parameter. The prompt didn't specify the full crypto requirements.";
|
|
106
|
+
}
|
|
77
107
|
if (meta.includes("auth") || title.includes("auth")) {
|
|
78
108
|
return "No authentication check generated. The prompt didn't specify access control.";
|
|
79
109
|
}
|
|
@@ -121,6 +151,15 @@ function generateFix(finding, prompt) {
|
|
|
121
151
|
`and never set innerHTML with unescaped user data."`,
|
|
122
152
|
];
|
|
123
153
|
}
|
|
154
|
+
if (title.includes("cipher") || title.includes("crypto") ||
|
|
155
|
+
title.includes("gcm") || title.includes("decipher") ||
|
|
156
|
+
title.includes("hash") || title.includes("hmac")) {
|
|
157
|
+
return [
|
|
158
|
+
`"${truncate(prompt.text, 80)}.`,
|
|
159
|
+
`Use authenticated encryption (e.g. GCM with auth tag verification),`,
|
|
160
|
+
`a strong key derivation function, and reject tampered ciphertext."`,
|
|
161
|
+
];
|
|
162
|
+
}
|
|
124
163
|
if (title.includes("auth") && !title.includes("webhook")) {
|
|
125
164
|
return [
|
|
126
165
|
`"${truncate(prompt.text, 80)}.`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"correlator.js","sourceRoot":"","sources":["../../src/claude/correlator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAa9C,MAAM,UAAU,iBAAiB,CAC/B,QAAmB,EACnB,QAAyB,EACzB,QAAgB;IAEhB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM;YAAE,SAAS;QAE9C,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjE,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;YAClC,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC;QAChC,CAAC;aAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,OAAgB,EAChB,QAAyB,EACzB,QAAgB;IAEhB,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBACnD,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC9D,
|
|
1
|
+
{"version":3,"file":"correlator.js","sourceRoot":"","sources":["../../src/claude/correlator.ts"],"names":[],"mappings":"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"}
|
package/dist/claude/reader.js
CHANGED
|
@@ -6,6 +6,18 @@ const CLAUDE_DIRS = [
|
|
|
6
6
|
join(homedir(), ".claude", "projects"),
|
|
7
7
|
join(homedir(), ".claude"),
|
|
8
8
|
];
|
|
9
|
+
const GENERIC_PROMPT_RE = /^(ok|oui|yes|yep|go|continue|next|sure|d'accord|parfait|merci|thanks|good|bien|c'est bon|les autres|et les autres|la suite)/i;
|
|
10
|
+
function isGenericPrompt(text) {
|
|
11
|
+
const clean = text.replace(/\s+/g, " ").trim();
|
|
12
|
+
return clean.length < 25 || GENERIC_PROMPT_RE.test(clean);
|
|
13
|
+
}
|
|
14
|
+
function findSubstantivePrompt(prompts) {
|
|
15
|
+
for (let i = prompts.length - 1; i >= 0; i--) {
|
|
16
|
+
if (!isGenericPrompt(prompts[i].text))
|
|
17
|
+
return prompts[i];
|
|
18
|
+
}
|
|
19
|
+
return prompts[prompts.length - 1] ?? null;
|
|
20
|
+
}
|
|
9
21
|
export async function readClaudeHistory(repoPath) {
|
|
10
22
|
const resolvedRepo = resolve(repoPath);
|
|
11
23
|
const allSessions = [];
|
|
@@ -15,7 +27,6 @@ export async function readClaudeHistory(repoPath) {
|
|
|
15
27
|
const sessions = await findSessionFiles(dir, resolvedRepo);
|
|
16
28
|
allSessions.push(...sessions);
|
|
17
29
|
}
|
|
18
|
-
// Sort by timestamp, newest first
|
|
19
30
|
allSessions.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
20
31
|
return { sessions: allSessions, sessionCount: allSessions.length };
|
|
21
32
|
}
|
|
@@ -32,7 +43,6 @@ async function findSessionFiles(baseDir, repoPath) {
|
|
|
32
43
|
for (const entry of entries) {
|
|
33
44
|
const fullPath = join(dir, entry.name);
|
|
34
45
|
if (entry.isDirectory()) {
|
|
35
|
-
// Look inside project-specific directories
|
|
36
46
|
await walk(fullPath);
|
|
37
47
|
}
|
|
38
48
|
else if (entry.name.endsWith(".jsonl") || entry.name.endsWith(".json")) {
|
|
@@ -56,7 +66,6 @@ async function parseSessionFile(filePath, repoPath) {
|
|
|
56
66
|
const lines = content.split("\n").filter(Boolean);
|
|
57
67
|
let sessionTimestamp = "";
|
|
58
68
|
const prompts = [];
|
|
59
|
-
// Check if this session is related to the repo
|
|
60
69
|
let isRelevant = false;
|
|
61
70
|
for (const line of lines) {
|
|
62
71
|
let entry;
|
|
@@ -66,18 +75,38 @@ async function parseSessionFile(filePath, repoPath) {
|
|
|
66
75
|
catch {
|
|
67
76
|
continue;
|
|
68
77
|
}
|
|
69
|
-
// Detect relevance from
|
|
78
|
+
// Detect relevance from cwd field
|
|
70
79
|
if (!isRelevant) {
|
|
71
80
|
const cwd = (entry.cwd || entry.workingDirectory || "");
|
|
72
81
|
if (cwd && resolve(cwd).startsWith(repoPath)) {
|
|
73
82
|
isRelevant = true;
|
|
74
83
|
}
|
|
75
84
|
}
|
|
76
|
-
//
|
|
77
|
-
const
|
|
85
|
+
// Normalize: Claude Code nests message under entry.message
|
|
86
|
+
const msg = (entry.message && typeof entry.message === "object"
|
|
87
|
+
? entry.message
|
|
88
|
+
: entry);
|
|
89
|
+
const role = msg.role || entry.role || entry.type || "";
|
|
90
|
+
// Extract user prompts
|
|
78
91
|
if (role === "human" || role === "user") {
|
|
79
|
-
|
|
80
|
-
if (
|
|
92
|
+
// Skip pure tool_result lines (they are user-type but contain tool output, not prompts)
|
|
93
|
+
if (entry.toolUseResult !== undefined) {
|
|
94
|
+
// Harvest file paths from toolUseResult, attach to the best prompt
|
|
95
|
+
const tur = entry.toolUseResult;
|
|
96
|
+
if (tur && typeof tur === "object") {
|
|
97
|
+
const turObj = tur;
|
|
98
|
+
const fp = turObj.filePath;
|
|
99
|
+
if (fp && prompts.length > 0) {
|
|
100
|
+
const target = findSubstantivePrompt(prompts);
|
|
101
|
+
if (!target.filesGenerated.includes(fp)) {
|
|
102
|
+
target.filesGenerated.push(fp);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const text = extractText(msg);
|
|
109
|
+
if (text && text.length > 5) {
|
|
81
110
|
const ts = entry.timestamp ||
|
|
82
111
|
entry.createdAt ||
|
|
83
112
|
sessionTimestamp;
|
|
@@ -91,21 +120,21 @@ async function parseSessionFile(filePath, repoPath) {
|
|
|
91
120
|
});
|
|
92
121
|
}
|
|
93
122
|
}
|
|
94
|
-
// Extract assistant
|
|
123
|
+
// Extract assistant tool calls to find generated files
|
|
95
124
|
if (role === "assistant") {
|
|
96
|
-
const toolCalls = extractToolCalls(
|
|
125
|
+
const toolCalls = extractToolCalls(msg);
|
|
97
126
|
if (toolCalls.length > 0 && prompts.length > 0) {
|
|
98
|
-
const
|
|
99
|
-
|
|
127
|
+
const target = findSubstantivePrompt(prompts);
|
|
128
|
+
target.toolCalls.push(...toolCalls);
|
|
100
129
|
for (const tc of toolCalls) {
|
|
101
|
-
if (tc.filePath) {
|
|
102
|
-
|
|
130
|
+
if (tc.filePath && !target.filesGenerated.includes(tc.filePath)) {
|
|
131
|
+
target.filesGenerated.push(tc.filePath);
|
|
103
132
|
}
|
|
104
133
|
}
|
|
105
134
|
}
|
|
106
135
|
}
|
|
107
136
|
}
|
|
108
|
-
//
|
|
137
|
+
// Check relevance by file path heuristic
|
|
109
138
|
if (!isRelevant) {
|
|
110
139
|
const repoName = basename(repoPath).toLowerCase();
|
|
111
140
|
if (filePath.toLowerCase().includes(repoName)) {
|
|
@@ -113,7 +142,6 @@ async function parseSessionFile(filePath, repoPath) {
|
|
|
113
142
|
}
|
|
114
143
|
}
|
|
115
144
|
if (!isRelevant && prompts.length > 0) {
|
|
116
|
-
// Check if any generated files match repo files
|
|
117
145
|
for (const p of prompts) {
|
|
118
146
|
for (const f of p.filesGenerated) {
|
|
119
147
|
if (resolve(f).startsWith(repoPath) || !f.startsWith("/")) {
|
|
@@ -127,7 +155,6 @@ async function parseSessionFile(filePath, repoPath) {
|
|
|
127
155
|
}
|
|
128
156
|
if (!isRelevant)
|
|
129
157
|
return null;
|
|
130
|
-
// Try to get session timestamp from file stat if not found in content
|
|
131
158
|
if (!sessionTimestamp) {
|
|
132
159
|
try {
|
|
133
160
|
const s = await stat(filePath);
|
|
@@ -139,52 +166,68 @@ async function parseSessionFile(filePath, repoPath) {
|
|
|
139
166
|
}
|
|
140
167
|
return { timestamp: sessionTimestamp, prompts };
|
|
141
168
|
}
|
|
142
|
-
function extractText(
|
|
143
|
-
if (typeof
|
|
144
|
-
return
|
|
145
|
-
if (typeof
|
|
146
|
-
return
|
|
147
|
-
if (Array.isArray(
|
|
148
|
-
const texts =
|
|
169
|
+
function extractText(msg) {
|
|
170
|
+
if (typeof msg.content === "string")
|
|
171
|
+
return msg.content;
|
|
172
|
+
if (typeof msg.message === "string")
|
|
173
|
+
return msg.message;
|
|
174
|
+
if (Array.isArray(msg.content)) {
|
|
175
|
+
const texts = msg.content
|
|
149
176
|
.filter((c) => c.type === "text" && typeof c.text === "string")
|
|
150
177
|
.map((c) => c.text);
|
|
151
178
|
return texts.join("\n");
|
|
152
179
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
180
|
+
// Recurse into nested message
|
|
181
|
+
if (msg.message &&
|
|
182
|
+
typeof msg.message === "object" &&
|
|
183
|
+
msg.message.content) {
|
|
184
|
+
return extractText(msg.message);
|
|
157
185
|
}
|
|
158
186
|
return "";
|
|
159
187
|
}
|
|
160
|
-
function extractToolCalls(
|
|
188
|
+
function extractToolCalls(msg) {
|
|
161
189
|
const calls = [];
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
190
|
+
// Claude Code: tool_use blocks are in msg.content (which is message.content)
|
|
191
|
+
const content = msg.content;
|
|
192
|
+
if (!Array.isArray(content))
|
|
193
|
+
return calls;
|
|
194
|
+
for (const block of content) {
|
|
195
|
+
if (!block ||
|
|
196
|
+
typeof block !== "object" ||
|
|
197
|
+
(block.type !== "tool_use" && block.type !== "tool_call")) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const tc = {
|
|
201
|
+
tool: (block.name || block.function?.name || "unknown"),
|
|
202
|
+
args: (block.input || block.function?.arguments || {}),
|
|
203
|
+
};
|
|
204
|
+
const toolName = tc.tool.toLowerCase();
|
|
205
|
+
// Write / Create / Edit / StrReplace / EditNotebook — direct file writes
|
|
206
|
+
if (toolName.includes("write") ||
|
|
207
|
+
toolName.includes("create") ||
|
|
208
|
+
toolName.includes("edit") ||
|
|
209
|
+
toolName.includes("file") ||
|
|
210
|
+
toolName.includes("strreplace") ||
|
|
211
|
+
toolName.includes("notebookedit")) {
|
|
212
|
+
const path = tc.args.file_path ||
|
|
213
|
+
tc.args.path ||
|
|
214
|
+
tc.args.filePath ||
|
|
215
|
+
tc.args.file ||
|
|
216
|
+
tc.args.target_notebook;
|
|
217
|
+
if (path) {
|
|
218
|
+
tc.filePath = path;
|
|
219
|
+
tc.content = tc.args.content || tc.args.contents || undefined;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// mcp__supabase__apply_migration — derive migration file path from name
|
|
223
|
+
if (toolName.includes("apply_migration")) {
|
|
224
|
+
const migrationName = tc.args.name;
|
|
225
|
+
if (migrationName) {
|
|
226
|
+
tc.filePath = `supabase/migrations/${migrationName}`;
|
|
227
|
+
tc.content = tc.args.query || undefined;
|
|
186
228
|
}
|
|
187
229
|
}
|
|
230
|
+
calls.push(tc);
|
|
188
231
|
}
|
|
189
232
|
return calls;
|
|
190
233
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/claude/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,MAAM,WAAW,GAAG;IAClB,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC;CAC3B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB;IAEhB,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,WAAW,GAAoB,EAAE,CAAC;IAExC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC3D,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/claude/reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
const CURSOR_PROJECTS_DIR = join(homedir(), ".cursor", "projects");
|
|
6
|
+
const GENERIC_PROMPT_RE = /^(ok|oui|yes|yep|go|continue|next|sure|d'accord|parfait|merci|thanks|good|bien|c'est bon|les autres|et les autres|la suite)/i;
|
|
7
|
+
function isGenericPrompt(text) {
|
|
8
|
+
const clean = text.replace(/\s+/g, " ").trim();
|
|
9
|
+
return clean.length < 25 || GENERIC_PROMPT_RE.test(clean);
|
|
10
|
+
}
|
|
11
|
+
function findSubstantivePrompt(prompts) {
|
|
12
|
+
for (let i = prompts.length - 1; i >= 0; i--) {
|
|
13
|
+
if (!isGenericPrompt(prompts[i].text))
|
|
14
|
+
return prompts[i];
|
|
15
|
+
}
|
|
16
|
+
return prompts[prompts.length - 1] ?? null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Build the Cursor project slug from an absolute repo path.
|
|
20
|
+
* /Users/foo/Documents/github/titane → Users-foo-Documents-github-titane
|
|
21
|
+
*/
|
|
22
|
+
function repoPathToSlug(repoPath) {
|
|
23
|
+
const resolved = resolve(repoPath);
|
|
24
|
+
// Strip leading / and replace all / with -
|
|
25
|
+
return resolved.replace(/^\//, "").replace(/\//g, "-");
|
|
26
|
+
}
|
|
27
|
+
export async function readCursorHistory(repoPath) {
|
|
28
|
+
const slug = repoPathToSlug(repoPath);
|
|
29
|
+
const transcriptsDir = join(CURSOR_PROJECTS_DIR, slug, "agent-transcripts");
|
|
30
|
+
if (!existsSync(transcriptsDir)) {
|
|
31
|
+
return { sessions: [], sessionCount: 0 };
|
|
32
|
+
}
|
|
33
|
+
const sessions = [];
|
|
34
|
+
let sessionDirs;
|
|
35
|
+
try {
|
|
36
|
+
sessionDirs = await readdir(transcriptsDir);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return { sessions: [], sessionCount: 0 };
|
|
40
|
+
}
|
|
41
|
+
for (const dir of sessionDirs) {
|
|
42
|
+
const dirPath = join(transcriptsDir, dir);
|
|
43
|
+
const jsonlFile = join(dirPath, `${dir}.jsonl`);
|
|
44
|
+
if (!existsSync(jsonlFile))
|
|
45
|
+
continue;
|
|
46
|
+
try {
|
|
47
|
+
const session = await parseTranscript(jsonlFile);
|
|
48
|
+
if (session && session.prompts.length > 0) {
|
|
49
|
+
sessions.push(session);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Skip unparseable transcripts
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
sessions.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
57
|
+
return { sessions, sessionCount: sessions.length };
|
|
58
|
+
}
|
|
59
|
+
async function parseTranscript(filePath) {
|
|
60
|
+
const content = await readFile(filePath, "utf-8");
|
|
61
|
+
const lines = content.split("\n").filter(Boolean);
|
|
62
|
+
let sessionTimestamp = "";
|
|
63
|
+
const prompts = [];
|
|
64
|
+
for (const line of lines) {
|
|
65
|
+
let entry;
|
|
66
|
+
try {
|
|
67
|
+
entry = JSON.parse(line);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const role = entry.role || "";
|
|
73
|
+
const msg = (entry.message || {});
|
|
74
|
+
const msgContent = msg.content;
|
|
75
|
+
if (role === "user") {
|
|
76
|
+
const text = extractUserText(msgContent);
|
|
77
|
+
if (text && text.length > 5) {
|
|
78
|
+
const ts = entry.timestamp || sessionTimestamp;
|
|
79
|
+
if (!sessionTimestamp)
|
|
80
|
+
sessionTimestamp = ts;
|
|
81
|
+
prompts.push({
|
|
82
|
+
text,
|
|
83
|
+
timestamp: ts,
|
|
84
|
+
filesGenerated: [],
|
|
85
|
+
toolCalls: [],
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (role === "assistant" && Array.isArray(msgContent)) {
|
|
90
|
+
const toolCalls = extractToolCalls(msgContent);
|
|
91
|
+
if (toolCalls.length > 0 && prompts.length > 0) {
|
|
92
|
+
const target = findSubstantivePrompt(prompts);
|
|
93
|
+
target.toolCalls.push(...toolCalls);
|
|
94
|
+
for (const tc of toolCalls) {
|
|
95
|
+
if (tc.filePath && !target.filesGenerated.includes(tc.filePath)) {
|
|
96
|
+
target.filesGenerated.push(tc.filePath);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (prompts.length === 0)
|
|
103
|
+
return null;
|
|
104
|
+
if (!sessionTimestamp) {
|
|
105
|
+
try {
|
|
106
|
+
const s = await stat(filePath);
|
|
107
|
+
sessionTimestamp = s.mtime.toISOString();
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
sessionTimestamp = new Date().toISOString();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return { timestamp: sessionTimestamp, prompts };
|
|
114
|
+
}
|
|
115
|
+
function extractUserText(content) {
|
|
116
|
+
if (typeof content === "string")
|
|
117
|
+
return content;
|
|
118
|
+
if (Array.isArray(content)) {
|
|
119
|
+
return content
|
|
120
|
+
.filter((c) => c.type === "text" && typeof c.text === "string")
|
|
121
|
+
.map((c) => {
|
|
122
|
+
let text = c.text;
|
|
123
|
+
// Strip system tags to get the actual user query
|
|
124
|
+
const match = text.match(/<user_query>\s*([\s\S]*?)\s*<\/user_query>/);
|
|
125
|
+
if (match)
|
|
126
|
+
return match[1];
|
|
127
|
+
return text;
|
|
128
|
+
})
|
|
129
|
+
.join("\n");
|
|
130
|
+
}
|
|
131
|
+
return "";
|
|
132
|
+
}
|
|
133
|
+
function extractToolCalls(content) {
|
|
134
|
+
const calls = [];
|
|
135
|
+
for (const block of content) {
|
|
136
|
+
if (!block ||
|
|
137
|
+
typeof block !== "object" ||
|
|
138
|
+
block.type !== "tool_use") {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const b = block;
|
|
142
|
+
const toolName = (b.name || "unknown");
|
|
143
|
+
const input = (b.input || {});
|
|
144
|
+
const tc = {
|
|
145
|
+
tool: toolName,
|
|
146
|
+
args: input,
|
|
147
|
+
};
|
|
148
|
+
const name = toolName.toLowerCase();
|
|
149
|
+
// Write, StrReplace, EditNotebook — direct file modifications
|
|
150
|
+
if (name === "write" ||
|
|
151
|
+
name === "strreplace" ||
|
|
152
|
+
name === "editnotebook" ||
|
|
153
|
+
name === "delete") {
|
|
154
|
+
const path = input.path ||
|
|
155
|
+
input.file_path ||
|
|
156
|
+
input.filePath ||
|
|
157
|
+
input.target_notebook;
|
|
158
|
+
if (path) {
|
|
159
|
+
tc.filePath = path;
|
|
160
|
+
tc.content = input.contents || input.content || input.new_string || undefined;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// CallMcpTool — check for apply_migration
|
|
164
|
+
if (name === "callmcptool") {
|
|
165
|
+
const mcpToolName = (input.toolName || "").toLowerCase();
|
|
166
|
+
if (mcpToolName.includes("apply_migration")) {
|
|
167
|
+
const args = input.arguments;
|
|
168
|
+
if (args?.name) {
|
|
169
|
+
tc.filePath = `supabase/migrations/${args.name}`;
|
|
170
|
+
tc.content = args.query || undefined;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
calls.push(tc);
|
|
175
|
+
}
|
|
176
|
+
return calls;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/cursor/reader.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,12 +3,14 @@ import { resolve } from "node:path";
|
|
|
3
3
|
import pc from "picocolors";
|
|
4
4
|
import { runAllScanners } from "./scanners/aggregator.js";
|
|
5
5
|
import { readClaudeHistory } from "./claude/reader.js";
|
|
6
|
+
import { readCursorHistory } from "./cursor/reader.js";
|
|
6
7
|
import { correlateFindings } from "./claude/correlator.js";
|
|
7
8
|
import { printBoot, printNoFindings } from "./repl/display.js";
|
|
8
9
|
import { startRepl } from "./repl/repl.js";
|
|
9
10
|
async function main() {
|
|
10
11
|
const args = process.argv.slice(2);
|
|
11
12
|
const withClaudeHistory = args.includes("--with-claude-history");
|
|
13
|
+
const withCursorHistory = args.includes("--with-cursor-history");
|
|
12
14
|
const dbUrlIdx = args.indexOf("--db-url");
|
|
13
15
|
const dbUrl = dbUrlIdx !== -1 ? args[dbUrlIdx + 1] : undefined;
|
|
14
16
|
const helpFlag = args.includes("--help") || args.includes("-h");
|
|
@@ -25,23 +27,41 @@ async function main() {
|
|
|
25
27
|
}
|
|
26
28
|
}
|
|
27
29
|
// Banner
|
|
28
|
-
|
|
30
|
+
const flags = [];
|
|
31
|
+
if (withClaudeHistory)
|
|
32
|
+
flags.push(pc.magenta("--with-claude-history"));
|
|
33
|
+
if (withCursorHistory)
|
|
34
|
+
flags.push(pc.magenta("--with-cursor-history"));
|
|
35
|
+
console.log(`$ npx vibecheck ${flags.join(" ")}`);
|
|
29
36
|
console.log();
|
|
30
37
|
// Run scanners
|
|
31
|
-
const result = await runAllScanners({ repoPath, dbUrl, withClaudeHistory }, (msg) => console.log(pc.dim(msg)));
|
|
32
|
-
//
|
|
38
|
+
const result = await runAllScanners({ repoPath, dbUrl, withClaudeHistory: withClaudeHistory || withCursorHistory }, (msg) => console.log(pc.dim(msg)));
|
|
39
|
+
// Collect AI session history from all requested sources
|
|
40
|
+
const allSessions = [];
|
|
33
41
|
if (withClaudeHistory) {
|
|
34
42
|
try {
|
|
35
43
|
const { sessions, sessionCount } = await readClaudeHistory(repoPath);
|
|
36
44
|
result.stats.claudeSessions = sessionCount;
|
|
37
|
-
|
|
38
|
-
correlateFindings(result.findings, sessions, repoPath);
|
|
39
|
-
}
|
|
45
|
+
allSessions.push(...sessions);
|
|
40
46
|
}
|
|
41
47
|
catch (err) {
|
|
42
48
|
console.log(pc.dim(pc.yellow(` ⚠ could not read claude history: ${String(err)}`)));
|
|
43
49
|
}
|
|
44
50
|
}
|
|
51
|
+
if (withCursorHistory) {
|
|
52
|
+
try {
|
|
53
|
+
const { sessions, sessionCount } = await readCursorHistory(repoPath);
|
|
54
|
+
result.stats.cursorSessions = sessionCount;
|
|
55
|
+
allSessions.push(...sessions);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
console.log(pc.dim(pc.yellow(` ⚠ could not read cursor history: ${String(err)}`)));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Correlate findings with prompts from all sources
|
|
62
|
+
if (allSessions.length > 0 && result.findings.length > 0) {
|
|
63
|
+
correlateFindings(result.findings, allSessions, repoPath);
|
|
64
|
+
}
|
|
45
65
|
// Fill in manual notes for findings that weren't correlated
|
|
46
66
|
for (const f of result.findings) {
|
|
47
67
|
if (!f.trace && !f.manual) {
|
|
@@ -56,7 +76,7 @@ async function main() {
|
|
|
56
76
|
}
|
|
57
77
|
}
|
|
58
78
|
// Boot line
|
|
59
|
-
printBoot(result.stats, withClaudeHistory);
|
|
79
|
+
printBoot(result.stats, withClaudeHistory, withCursorHistory);
|
|
60
80
|
if (result.findings.length === 0) {
|
|
61
81
|
printNoFindings();
|
|
62
82
|
return;
|
|
@@ -74,14 +94,18 @@ ${pc.dim("USAGE")}
|
|
|
74
94
|
${pc.dim("OPTIONS")}
|
|
75
95
|
--with-claude-history Read Claude Code session history and correlate
|
|
76
96
|
findings to the prompts that generated them
|
|
97
|
+
--with-cursor-history Read Cursor agent transcripts and correlate
|
|
98
|
+
findings to the prompts that generated them
|
|
77
99
|
--db-url <url> Live Supabase RLS check via a postgres connection
|
|
78
100
|
-h, --help Show this help
|
|
79
101
|
|
|
80
102
|
${pc.dim("EXAMPLES")}
|
|
81
|
-
npx vibecheck
|
|
82
|
-
npx vibecheck --with-claude-history
|
|
83
|
-
npx vibecheck --
|
|
84
|
-
npx vibecheck
|
|
103
|
+
npx vibecheck scan current directory
|
|
104
|
+
npx vibecheck --with-claude-history scan + trace Claude prompts
|
|
105
|
+
npx vibecheck --with-cursor-history scan + trace Cursor prompts
|
|
106
|
+
npx vibecheck --with-claude-history --with-cursor-history scan + trace both
|
|
107
|
+
npx vibecheck --db-url postgres://... include live RLS check
|
|
108
|
+
npx vibecheck ~/projects/my-app scan a specific directory
|
|
85
109
|
|
|
86
110
|
${pc.dim("COMMANDS (interactive)")}
|
|
87
111
|
1-N inspect a finding
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/repl/display.d.ts
CHANGED
|
@@ -4,9 +4,10 @@ export declare function printBoot(stats: {
|
|
|
4
4
|
sourceScanned: boolean;
|
|
5
5
|
supabaseMigrations: boolean;
|
|
6
6
|
claudeSessions: number;
|
|
7
|
+
cursorSessions: number;
|
|
7
8
|
stack: string[];
|
|
8
9
|
contributors: number;
|
|
9
|
-
}, withClaude: boolean): void;
|
|
10
|
+
}, withClaude: boolean, withCursor?: boolean): void;
|
|
10
11
|
export declare function printList(findings: Finding[], statuses: FindingStatus[]): void;
|
|
11
12
|
export declare function printInspect(finding: Finding, index: number): void;
|
|
12
13
|
export declare function printFix(finding: Finding): void;
|
package/dist/repl/display.js
CHANGED
|
@@ -18,7 +18,7 @@ function colorByCol(text, col) {
|
|
|
18
18
|
return text;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
export function printBoot(stats, withClaude) {
|
|
21
|
+
export function printBoot(stats, withClaude, withCursor = false) {
|
|
22
22
|
const parts = [];
|
|
23
23
|
if (stats.gitHistory)
|
|
24
24
|
parts.push("git history");
|
|
@@ -29,6 +29,9 @@ export function printBoot(stats, withClaude) {
|
|
|
29
29
|
if (withClaude && stats.claudeSessions > 0) {
|
|
30
30
|
parts.push(pc.green(`${stats.claudeSessions} claude code sessions`));
|
|
31
31
|
}
|
|
32
|
+
if (withCursor && stats.cursorSessions > 0) {
|
|
33
|
+
parts.push(pc.green(`${stats.cursorSessions} cursor sessions`));
|
|
34
|
+
}
|
|
32
35
|
console.log(pc.dim(`scanned ${parts.join(" · ")}`));
|
|
33
36
|
const stackParts = [];
|
|
34
37
|
if (stats.stack.length > 0)
|
|
@@ -43,8 +46,13 @@ export function printList(findings, statuses) {
|
|
|
43
46
|
const { score, verdict, col } = computeScore(findings, statuses);
|
|
44
47
|
const open = statuses.filter((s) => s === "open").length;
|
|
45
48
|
const cleared = findings.length - open;
|
|
49
|
+
const traced = findings.filter((f) => f.trace !== null).length;
|
|
46
50
|
console.log();
|
|
47
|
-
|
|
51
|
+
let summaryLine = `${colorByCol(pc.bold(verdict), col)} score ${colorByCol(pc.bold(String(score)), col)}${pc.dim(pc.gray("/10"))} · ${pc.dim(`${open} open · ${cleared} cleared`)}`;
|
|
52
|
+
if (traced > 0) {
|
|
53
|
+
summaryLine += ` · ${pc.magenta(`${traced} traced to prompts`)}`;
|
|
54
|
+
}
|
|
55
|
+
console.log(summaryLine);
|
|
48
56
|
console.log(pc.dim(pc.gray(RULE_LINE)));
|
|
49
57
|
for (let i = 0; i < findings.length; i++) {
|
|
50
58
|
const f = findings[i];
|
package/dist/repl/display.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/repl/display.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,SAAS,GACb,+DAA+D,CAAC;AAElE,SAAS,MAAM,CAAC,GAA0B;IACxC,OAAO,GAAG,KAAK,UAAU;QACvB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,GAAW;IAC3C,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/repl/display.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../../src/scanners/aggregator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../../src/scanners/aggregator.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,12 @@ async function findGitleaks() {
|
|
|
14
14
|
return null;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
+
function extractJson(raw) {
|
|
18
|
+
const start = raw.indexOf("[");
|
|
19
|
+
if (start === -1)
|
|
20
|
+
return "[]";
|
|
21
|
+
return raw.slice(start);
|
|
22
|
+
}
|
|
17
23
|
export async function scanSecrets(repoPath, onProgress) {
|
|
18
24
|
let bin = await findGitleaks();
|
|
19
25
|
if (!bin && onProgress) {
|
|
@@ -34,11 +40,18 @@ export async function scanSecrets(repoPath, onProgress) {
|
|
|
34
40
|
error: "not a git repository — skipping git history secret scan",
|
|
35
41
|
};
|
|
36
42
|
}
|
|
43
|
+
const gitleaksArgs = [
|
|
44
|
+
"detect",
|
|
45
|
+
"--source", repoPath,
|
|
46
|
+
"--report-format", "json",
|
|
47
|
+
"--report-path", "-",
|
|
48
|
+
"--no-banner",
|
|
49
|
+
"--log-level", "fatal",
|
|
50
|
+
];
|
|
37
51
|
try {
|
|
38
52
|
let stdout;
|
|
39
|
-
const gitleaksArgs = ["detect", "--source", repoPath, "--report-format", "json", "--no-banner"];
|
|
40
53
|
if (bin === "npx-gitleaks") {
|
|
41
|
-
const result = await execAsync(`npx --yes @gitleaks/gitleaks ${gitleaksArgs.join(" ")}`, { maxBuffer: 50 * 1024 * 1024, timeout: 120_000 });
|
|
54
|
+
const result = await execAsync(`npx --yes @gitleaks/gitleaks ${gitleaksArgs.map(a => `"${a}"`).join(" ")}`, { maxBuffer: 50 * 1024 * 1024, timeout: 120_000 });
|
|
42
55
|
stdout = result.stdout;
|
|
43
56
|
}
|
|
44
57
|
else {
|
|
@@ -48,29 +61,32 @@ export async function scanSecrets(repoPath, onProgress) {
|
|
|
48
61
|
});
|
|
49
62
|
stdout = result.stdout;
|
|
50
63
|
}
|
|
51
|
-
const matches = JSON.parse(stdout
|
|
64
|
+
const matches = JSON.parse(extractJson(stdout));
|
|
52
65
|
return { findings: matchesToFindings(matches), available: true };
|
|
53
66
|
}
|
|
54
67
|
catch (err) {
|
|
55
68
|
const e = err;
|
|
56
|
-
// gitleaks exits 1 when
|
|
57
|
-
if (e.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
69
|
+
// gitleaks exits 1 when leaks are found — this is success-with-findings
|
|
70
|
+
if (e.stdout) {
|
|
71
|
+
const json = extractJson(e.stdout);
|
|
72
|
+
if (json !== "[]") {
|
|
73
|
+
try {
|
|
74
|
+
const matches = JSON.parse(json);
|
|
75
|
+
return { findings: matchesToFindings(matches), available: true };
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
/* JSON parse failed — fall through to error */
|
|
79
|
+
}
|
|
64
80
|
}
|
|
65
81
|
}
|
|
66
|
-
// Exit code 0 means no findings
|
|
82
|
+
// Exit code 0 with no stdout means no findings (shouldn't reach catch, but defensive)
|
|
67
83
|
if (e.code === 0) {
|
|
68
84
|
return { findings: [], available: true };
|
|
69
85
|
}
|
|
70
86
|
return {
|
|
71
87
|
findings: [],
|
|
72
88
|
available: true,
|
|
73
|
-
error: `gitleaks error: ${e.stderr || String(err)}`,
|
|
89
|
+
error: `gitleaks error (exit ${e.code ?? "?"}): ${(e.stderr || String(err)).slice(0, 500)}`,
|
|
74
90
|
};
|
|
75
91
|
}
|
|
76
92
|
}
|
|
@@ -88,7 +104,7 @@ function matchesToFindings(matches) {
|
|
|
88
104
|
const shortCommit = m.Commit?.slice(0, 7) || "unknown";
|
|
89
105
|
findings.push({
|
|
90
106
|
id: 0,
|
|
91
|
-
severity:
|
|
107
|
+
severity: "critical",
|
|
92
108
|
path: `git history · commit ${shortCommit}`,
|
|
93
109
|
title: `${m.Description || m.Rule} committed${m.File ? ` in ${m.File}` : ""} — still live in history`,
|
|
94
110
|
meta: `gitleaks · ${isServiceRole ? "key bypasses RLS entirely · rotate immediately" : "rotate this credential immediately"}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitleaks.js","sourceRoot":"","sources":["../../src/scanners/gitleaks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAmB,MAAM,gBAAgB,CAAC;AAEtE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAWlC,KAAK,UAAU,YAAY;IACzB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,UAAuB;IAMvB,IAAI,GAAG,GAAG,MAAM,YAAY,EAAE,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;QACvB,GAAG,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,KAAK;YAChB,KAAK,EACH,4FAA4F;SAC/F,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,yDAAyD;SACjE,CAAC;IACJ,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"gitleaks.js","sourceRoot":"","sources":["../../src/scanners/gitleaks.ts"],"names":[],"mappings":"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"}
|
package/dist/scanners/semgrep.js
CHANGED
|
@@ -48,6 +48,17 @@ function isRelevant(m) {
|
|
|
48
48
|
function mapSeverity(sev) {
|
|
49
49
|
return sev.toLowerCase() === "error" ? "critical" : "medium";
|
|
50
50
|
}
|
|
51
|
+
function formatSemgrepErrors(errors) {
|
|
52
|
+
return errors
|
|
53
|
+
.map((e) => e.long_msg || e.message || e.type || "unknown error")
|
|
54
|
+
.filter(Boolean)
|
|
55
|
+
.join("; ");
|
|
56
|
+
}
|
|
57
|
+
function parseSemgrepOutput(stdout) {
|
|
58
|
+
if (!stdout)
|
|
59
|
+
return { results: [], errors: [] };
|
|
60
|
+
return JSON.parse(stdout);
|
|
61
|
+
}
|
|
51
62
|
export async function scanSAST(repoPath, onProgress) {
|
|
52
63
|
let bin = await findSemgrep();
|
|
53
64
|
if (!bin && onProgress) {
|
|
@@ -67,38 +78,63 @@ export async function scanSAST(repoPath, onProgress) {
|
|
|
67
78
|
"auto",
|
|
68
79
|
"--json",
|
|
69
80
|
"--quiet",
|
|
70
|
-
"--no-git-ignore",
|
|
71
81
|
"--timeout",
|
|
72
|
-
"
|
|
82
|
+
"120",
|
|
73
83
|
repoPath,
|
|
74
84
|
], { maxBuffer: 50 * 1024 * 1024, timeout: 300_000 });
|
|
75
|
-
const result =
|
|
76
|
-
|
|
85
|
+
const result = parseSemgrepOutput(stdout);
|
|
86
|
+
if (result.errors?.length && (!result.results || result.results.length === 0)) {
|
|
87
|
+
return {
|
|
88
|
+
findings: [],
|
|
89
|
+
available: true,
|
|
90
|
+
error: `semgrep: ${formatSemgrepErrors(result.errors)}`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return { findings: resultsToFindings(result.results ?? [], repoPath), available: true };
|
|
77
94
|
}
|
|
78
95
|
catch (err) {
|
|
79
96
|
const e = err;
|
|
97
|
+
// semgrep may exit non-zero but still produce valid JSON with results and/or errors
|
|
80
98
|
if (e.stdout) {
|
|
81
99
|
try {
|
|
82
|
-
const result =
|
|
83
|
-
|
|
100
|
+
const result = parseSemgrepOutput(e.stdout);
|
|
101
|
+
if (result.results && result.results.length > 0) {
|
|
102
|
+
return { findings: resultsToFindings(result.results, repoPath), available: true };
|
|
103
|
+
}
|
|
104
|
+
if (result.errors?.length) {
|
|
105
|
+
return {
|
|
106
|
+
findings: [],
|
|
107
|
+
available: true,
|
|
108
|
+
error: `semgrep: ${formatSemgrepErrors(result.errors)}`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
84
111
|
}
|
|
85
112
|
catch {
|
|
86
|
-
/* fall through */
|
|
113
|
+
/* JSON parse failed — fall through */
|
|
87
114
|
}
|
|
88
115
|
}
|
|
116
|
+
const detail = e.stderr || e.message || String(err);
|
|
89
117
|
return {
|
|
90
118
|
findings: [],
|
|
91
119
|
available: true,
|
|
92
|
-
error: `semgrep error
|
|
120
|
+
error: `semgrep error (exit ${e.code ?? "?"}): ${detail}`,
|
|
93
121
|
};
|
|
94
122
|
}
|
|
95
123
|
}
|
|
96
|
-
function
|
|
124
|
+
function normalizePath(filePath, repoPath) {
|
|
125
|
+
const prefix = repoPath.endsWith("/") ? repoPath : repoPath + "/";
|
|
126
|
+
if (filePath.startsWith(prefix)) {
|
|
127
|
+
return filePath.slice(prefix.length);
|
|
128
|
+
}
|
|
129
|
+
return filePath;
|
|
130
|
+
}
|
|
131
|
+
function resultsToFindings(results, repoPath) {
|
|
97
132
|
const seen = new Set();
|
|
98
133
|
const findings = [];
|
|
99
134
|
const relevant = results.filter(isRelevant);
|
|
100
135
|
for (const m of relevant) {
|
|
101
|
-
const
|
|
136
|
+
const relPath = normalizePath(m.path, repoPath);
|
|
137
|
+
const key = `${m.check_id}:${relPath}`;
|
|
102
138
|
if (seen.has(key))
|
|
103
139
|
continue;
|
|
104
140
|
seen.add(key);
|
|
@@ -107,7 +143,7 @@ function resultsToFindings(results) {
|
|
|
107
143
|
findings.push({
|
|
108
144
|
id: 0,
|
|
109
145
|
severity: mapSeverity(m.extra.severity),
|
|
110
|
-
path:
|
|
146
|
+
path: relPath,
|
|
111
147
|
title: message.length > 120 ? message.slice(0, 117) + "…" : message,
|
|
112
148
|
meta: `semgrep · ${shortId}`,
|
|
113
149
|
source: "semgrep",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semgrep.js","sourceRoot":"","sources":["../../src/scanners/semgrep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAmB,MAAM,gBAAgB,CAAC;AAErE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"semgrep.js","sourceRoot":"","sources":["../../src/scanners/semgrep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAmB,MAAM,gBAAgB,CAAC;AAErE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AA8B1C,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,UAAU;IACV,aAAa;IACb,OAAO;CACR,CAAC,CAAC;AAEH,SAAS,UAAU,CAAC,CAAe;IACjC,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;IAC5C,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAEjC,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC5D,IAAI,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACpC,IACE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QACxB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnB,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACzB,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtB,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACrB,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QACxB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClB,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACrB,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACrB,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QACxB,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EACvB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEtD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/D,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAsB;IACjD,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,eAAe,CAAC;SAChE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,UAAuB;IAMvB,IAAI,GAAG,GAAG,MAAM,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;QACvB,GAAG,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,KAAK;YAChB,KAAK,EACH,2EAA2E;SAC9E,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,GAAG,EACH;YACE,MAAM;YACN,UAAU;YACV,MAAM;YACN,QAAQ;YACR,SAAS;YACT,WAAW;YACX,KAAK;YACL,QAAQ;SACT,EACD,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAClD,CAAC;QAEF,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE1C,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO;gBACL,QAAQ,EAAE,EAAE;gBACZ,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,YAAY,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;aACxD,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC1F,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAA4E,CAAC;QAEvF,oFAAoF;QACpF,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAE5C,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBACpF,CAAC;gBAED,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;oBAC1B,OAAO;wBACL,QAAQ,EAAE,EAAE;wBACZ,SAAS,EAAE,IAAI;wBACf,KAAK,EAAE,YAAY,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;qBACxD,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sCAAsC;YACxC,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;QACpD,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,uBAAuB,CAAC,CAAC,IAAI,IAAI,GAAG,MAAM,MAAM,EAAE;SAC1D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,QAAgB;IACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC;IAClE,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAuB,EAAE,QAAgB;IAClE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE5C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC;QAC1D,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC;QAE3C,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,CAAC;YACL,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;YACvC,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO;YACnE,IAAI,EAAE,aAAa,OAAO,EAAE;YAC5B,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,IAAI;YACT,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibe-checking",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Audit AI-generated codebases — trace security findings back to the prompts that caused them",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"vibecheck": "
|
|
7
|
+
"vibecheck": "dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
10
|
"build": "tsc",
|
|
11
11
|
"dev": "tsc --watch",
|
|
12
12
|
"start": "node dist/index.js"
|
|
13
13
|
},
|
|
14
|
-
"keywords": [
|
|
14
|
+
"keywords": [
|
|
15
|
+
"security",
|
|
16
|
+
"audit",
|
|
17
|
+
"cli",
|
|
18
|
+
"ai",
|
|
19
|
+
"claude",
|
|
20
|
+
"sast",
|
|
21
|
+
"secrets"
|
|
22
|
+
],
|
|
15
23
|
"license": "MIT",
|
|
16
24
|
"devDependencies": {
|
|
17
25
|
"typescript": "^5.5.0",
|