guardvibe 1.3.3 → 1.5.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 (66) hide show
  1. package/build/data/compliance-metadata.d.ts +24 -0
  2. package/build/data/compliance-metadata.d.ts.map +1 -0
  3. package/build/data/compliance-metadata.js +274 -0
  4. package/build/data/compliance-metadata.js.map +1 -0
  5. package/build/data/rules/api-security.d.ts.map +1 -1
  6. package/build/data/rules/api-security.js +1 -0
  7. package/build/data/rules/api-security.js.map +1 -1
  8. package/build/data/rules/deployment.d.ts.map +1 -1
  9. package/build/data/rules/deployment.js +6 -0
  10. package/build/data/rules/deployment.js.map +1 -1
  11. package/build/data/rules/index.d.ts.map +1 -1
  12. package/build/data/rules/index.js +3 -2
  13. package/build/data/rules/index.js.map +1 -1
  14. package/build/data/rules/payments.d.ts.map +1 -1
  15. package/build/data/rules/payments.js +3 -0
  16. package/build/data/rules/payments.js.map +1 -1
  17. package/build/data/rules/react-native.d.ts.map +1 -1
  18. package/build/data/rules/react-native.js +3 -0
  19. package/build/data/rules/react-native.js.map +1 -1
  20. package/build/data/rules/services.d.ts.map +1 -1
  21. package/build/data/rules/services.js +5 -0
  22. package/build/data/rules/services.js.map +1 -1
  23. package/build/data/rules/types.d.ts +2 -0
  24. package/build/data/rules/types.d.ts.map +1 -1
  25. package/build/data/rules/web-security.d.ts.map +1 -1
  26. package/build/data/rules/web-security.js +8 -0
  27. package/build/data/rules/web-security.js.map +1 -1
  28. package/build/index.js +77 -8
  29. package/build/index.js.map +1 -1
  30. package/build/tools/audit-config.d.ts +11 -0
  31. package/build/tools/audit-config.d.ts.map +1 -0
  32. package/build/tools/audit-config.js +370 -0
  33. package/build/tools/audit-config.js.map +1 -0
  34. package/build/tools/compliance-report.d.ts +1 -1
  35. package/build/tools/compliance-report.d.ts.map +1 -1
  36. package/build/tools/compliance-report.js +110 -11
  37. package/build/tools/compliance-report.js.map +1 -1
  38. package/build/tools/generate-policy.d.ts +2 -0
  39. package/build/tools/generate-policy.d.ts.map +1 -0
  40. package/build/tools/generate-policy.js +368 -0
  41. package/build/tools/generate-policy.js.map +1 -0
  42. package/build/tools/policy-check.d.ts +3 -0
  43. package/build/tools/policy-check.d.ts.map +1 -0
  44. package/build/tools/policy-check.js +208 -0
  45. package/build/tools/policy-check.js.map +1 -0
  46. package/build/tools/review-pr.d.ts +3 -0
  47. package/build/tools/review-pr.d.ts.map +1 -0
  48. package/build/tools/review-pr.js +179 -0
  49. package/build/tools/review-pr.js.map +1 -0
  50. package/build/tools/scan-directory.d.ts +1 -1
  51. package/build/tools/scan-directory.d.ts.map +1 -1
  52. package/build/tools/scan-directory.js +121 -7
  53. package/build/tools/scan-directory.js.map +1 -1
  54. package/build/tools/scan-secrets-history.d.ts +9 -0
  55. package/build/tools/scan-secrets-history.d.ts.map +1 -0
  56. package/build/tools/scan-secrets-history.js +142 -0
  57. package/build/tools/scan-secrets-history.js.map +1 -0
  58. package/build/tools/taint-analysis.d.ts +23 -0
  59. package/build/tools/taint-analysis.d.ts.map +1 -0
  60. package/build/tools/taint-analysis.js +183 -0
  61. package/build/tools/taint-analysis.js.map +1 -0
  62. package/build/utils/config.d.ts +14 -0
  63. package/build/utils/config.d.ts.map +1 -1
  64. package/build/utils/config.js +7 -0
  65. package/build/utils/config.js.map +1 -1
  66. package/package.json +2 -2
@@ -0,0 +1,368 @@
1
+ import { readFileSync, existsSync, readdirSync } from "fs";
2
+ import { join, resolve, extname } from "path";
3
+ function tryRead(path) {
4
+ try {
5
+ return existsSync(path) ? readFileSync(path, "utf-8") : null;
6
+ }
7
+ catch {
8
+ return null;
9
+ }
10
+ }
11
+ function collectSourceFiles(dir, results, depth = 0) {
12
+ if (depth > 6)
13
+ return;
14
+ const skip = new Set(["node_modules", ".git", ".next", "build", "dist", "coverage", ".turbo", "vendor"]);
15
+ try {
16
+ const entries = readdirSync(dir, { withFileTypes: true });
17
+ for (const entry of entries) {
18
+ if (skip.has(entry.name))
19
+ continue;
20
+ const full = join(dir, entry.name);
21
+ if (entry.isDirectory()) {
22
+ collectSourceFiles(full, results, depth + 1);
23
+ }
24
+ else if (entry.isFile()) {
25
+ const ext = extname(entry.name).toLowerCase();
26
+ if ([".ts", ".tsx", ".js", ".jsx", ".mjs", ".env", ".json", ".toml", ".yaml", ".yml"].includes(ext) ||
27
+ entry.name === ".env" || entry.name === ".env.local" || entry.name === ".env.example") {
28
+ results.push(full);
29
+ }
30
+ }
31
+ }
32
+ }
33
+ catch { /* skip */ }
34
+ }
35
+ function detectStack(root) {
36
+ const pkg = tryRead(join(root, "package.json"));
37
+ const deps = pkg ? { ...JSON.parse(pkg).dependencies, ...JSON.parse(pkg).devDependencies } : {};
38
+ const depKeys = Object.keys(deps);
39
+ const files = [];
40
+ collectSourceFiles(root, files);
41
+ const allContent = files.slice(0, 200).map(f => {
42
+ try {
43
+ return readFileSync(f, "utf-8").substring(0, 5000);
44
+ }
45
+ catch {
46
+ return "";
47
+ }
48
+ }).join("\n");
49
+ const has = (pattern) => depKeys.some(d => d.includes(pattern)) || allContent.includes(pattern);
50
+ const stack = {
51
+ framework: null,
52
+ css: [], auth: [], database: [], payments: [],
53
+ ai: [], storage: [], cms: [], analytics: [], cdns: [],
54
+ };
55
+ // Framework
56
+ if (has("next"))
57
+ stack.framework = "nextjs";
58
+ else if (has("nuxt"))
59
+ stack.framework = "nuxt";
60
+ else if (has("svelte"))
61
+ stack.framework = "sveltekit";
62
+ else if (has("astro"))
63
+ stack.framework = "astro";
64
+ else if (has("remix"))
65
+ stack.framework = "remix";
66
+ // CSS
67
+ if (has("tailwindcss"))
68
+ stack.css.push("tailwindcss");
69
+ if (has("@radix-ui") || has("shadcn"))
70
+ stack.css.push("radix-ui");
71
+ // Auth
72
+ if (has("@clerk"))
73
+ stack.auth.push("clerk");
74
+ if (has("next-auth") || has("@auth/"))
75
+ stack.auth.push("next-auth");
76
+ if (has("@supabase/auth"))
77
+ stack.auth.push("supabase-auth");
78
+ if (has("firebase/auth") || has("firebase-admin"))
79
+ stack.auth.push("firebase-auth");
80
+ if (has("@descope"))
81
+ stack.auth.push("descope");
82
+ // Database
83
+ if (has("@supabase"))
84
+ stack.database.push("supabase");
85
+ if (has("prisma") || has("@prisma"))
86
+ stack.database.push("prisma");
87
+ if (has("drizzle"))
88
+ stack.database.push("drizzle");
89
+ if (has("@neondatabase") || has("@vercel/postgres"))
90
+ stack.database.push("neon");
91
+ if (has("mongoose") || has("mongodb"))
92
+ stack.database.push("mongodb");
93
+ if (has("@upstash/redis"))
94
+ stack.database.push("upstash-redis");
95
+ // Payments
96
+ if (has("stripe"))
97
+ stack.payments.push("stripe");
98
+ if (has("@polar"))
99
+ stack.payments.push("polar");
100
+ if (has("lemonsqueezy") || has("@lemonsqueezy"))
101
+ stack.payments.push("lemonsqueezy");
102
+ // AI
103
+ if (has("openai") || has("@ai-sdk") || has("OPENAI_API_KEY"))
104
+ stack.ai.push("openai");
105
+ if (has("anthropic") || has("ANTHROPIC_API_KEY"))
106
+ stack.ai.push("anthropic");
107
+ if (has("@google/generative-ai") || has("@ai-sdk/google"))
108
+ stack.ai.push("google-ai");
109
+ // Storage
110
+ if (has("@vercel/blob"))
111
+ stack.storage.push("vercel-blob");
112
+ if (has("@aws-sdk/client-s3") || has("aws-sdk"))
113
+ stack.storage.push("s3");
114
+ if (has("cloudinary"))
115
+ stack.storage.push("cloudinary");
116
+ if (has("@uploadthing"))
117
+ stack.storage.push("uploadthing");
118
+ // CMS
119
+ if (has("sanity") || has("@sanity"))
120
+ stack.cms.push("sanity");
121
+ if (has("contentful"))
122
+ stack.cms.push("contentful");
123
+ // Analytics
124
+ if (has("@vercel/analytics"))
125
+ stack.analytics.push("vercel-analytics");
126
+ if (has("posthog") || has("@posthog"))
127
+ stack.analytics.push("posthog");
128
+ if (has("@sentry"))
129
+ stack.analytics.push("sentry");
130
+ // CDN detection from content
131
+ const cdnPatterns = [
132
+ ["fonts.googleapis.com", /fonts\.googleapis\.com/],
133
+ ["fonts.gstatic.com", /fonts\.gstatic\.com/],
134
+ ["cdn.jsdelivr.net", /cdn\.jsdelivr\.net/],
135
+ ["unpkg.com", /unpkg\.com/],
136
+ ["cdnjs.cloudflare.com", /cdnjs\.cloudflare\.com/],
137
+ ["vercel.live", /vercel\.live/],
138
+ ["va.vercel-scripts.com", /va\.vercel-scripts\.com/],
139
+ ];
140
+ for (const [cdn, pattern] of cdnPatterns) {
141
+ if (pattern.test(allContent))
142
+ stack.cdns.push(cdn);
143
+ }
144
+ return stack;
145
+ }
146
+ function generateCSP(stack) {
147
+ const directives = {
148
+ "default-src": ["'self'"],
149
+ "script-src": ["'self'"],
150
+ "style-src": ["'self'", "'unsafe-inline'"],
151
+ "img-src": ["'self'", "data:", "blob:"],
152
+ "font-src": ["'self'"],
153
+ "connect-src": ["'self'"],
154
+ "frame-src": ["'none'"],
155
+ "object-src": ["'none'"],
156
+ "base-uri": ["'self'"],
157
+ "form-action": ["'self'"],
158
+ "frame-ancestors": ["'none'"],
159
+ };
160
+ // Script sources
161
+ if (stack.framework === "nextjs") {
162
+ directives["script-src"].push("'unsafe-eval'"); // needed for dev, remove in production ideally
163
+ }
164
+ if (stack.analytics.includes("vercel-analytics")) {
165
+ directives["script-src"].push("https://va.vercel-scripts.com");
166
+ directives["connect-src"].push("https://vitals.vercel-insights.com");
167
+ }
168
+ if (stack.analytics.includes("posthog")) {
169
+ directives["script-src"].push("https://us.i.posthog.com", "https://eu.i.posthog.com");
170
+ directives["connect-src"].push("https://us.i.posthog.com", "https://eu.i.posthog.com");
171
+ }
172
+ if (stack.analytics.includes("sentry")) {
173
+ directives["script-src"].push("https://*.sentry.io");
174
+ directives["connect-src"].push("https://*.sentry.io");
175
+ }
176
+ // Image sources
177
+ if (stack.storage.includes("vercel-blob")) {
178
+ directives["img-src"].push("https://*.public.blob.vercel-storage.com");
179
+ }
180
+ if (stack.storage.includes("s3")) {
181
+ directives["img-src"].push("https://*.s3.amazonaws.com");
182
+ }
183
+ if (stack.storage.includes("cloudinary")) {
184
+ directives["img-src"].push("https://res.cloudinary.com");
185
+ }
186
+ if (stack.storage.includes("uploadthing")) {
187
+ directives["img-src"].push("https://utfs.io");
188
+ }
189
+ if (stack.cms.includes("sanity")) {
190
+ directives["img-src"].push("https://cdn.sanity.io");
191
+ }
192
+ if (stack.cms.includes("contentful")) {
193
+ directives["img-src"].push("https://images.ctfassets.net");
194
+ }
195
+ // Font sources
196
+ for (const cdn of stack.cdns) {
197
+ if (cdn.includes("fonts.googleapis")) {
198
+ directives["style-src"].push("https://fonts.googleapis.com");
199
+ directives["font-src"].push("https://fonts.gstatic.com");
200
+ }
201
+ if (cdn.includes("jsdelivr") || cdn.includes("unpkg") || cdn.includes("cdnjs")) {
202
+ directives["script-src"].push(`https://${cdn}`);
203
+ }
204
+ }
205
+ // Connect sources for auth
206
+ if (stack.auth.includes("clerk")) {
207
+ directives["connect-src"].push("https://*.clerk.accounts.dev", "https://clerk.com");
208
+ directives["script-src"].push("https://*.clerk.accounts.dev");
209
+ directives["frame-src"] = ["'self'", "https://*.clerk.accounts.dev"];
210
+ }
211
+ if (stack.auth.includes("supabase-auth")) {
212
+ directives["connect-src"].push("https://*.supabase.co");
213
+ }
214
+ if (stack.auth.includes("firebase-auth")) {
215
+ directives["connect-src"].push("https://*.firebaseapp.com", "https://*.googleapis.com");
216
+ directives["frame-src"] = ["'self'", "https://*.firebaseapp.com"];
217
+ }
218
+ // Connect sources for payments
219
+ if (stack.payments.includes("stripe")) {
220
+ directives["script-src"].push("https://js.stripe.com");
221
+ directives["frame-src"] = [...(directives["frame-src"].includes("'none'") ? ["'self'"] : directives["frame-src"]), "https://js.stripe.com"];
222
+ directives["connect-src"].push("https://api.stripe.com");
223
+ }
224
+ // Connect sources for AI
225
+ if (stack.ai.includes("openai"))
226
+ directives["connect-src"].push("https://api.openai.com");
227
+ if (stack.ai.includes("anthropic"))
228
+ directives["connect-src"].push("https://api.anthropic.com");
229
+ if (stack.ai.includes("google-ai"))
230
+ directives["connect-src"].push("https://generativelanguage.googleapis.com");
231
+ // Database connect
232
+ if (stack.database.includes("supabase")) {
233
+ directives["connect-src"].push("https://*.supabase.co");
234
+ }
235
+ // Deduplicate
236
+ for (const key of Object.keys(directives)) {
237
+ directives[key] = [...new Set(directives[key])];
238
+ }
239
+ return Object.entries(directives)
240
+ .map(([key, values]) => `${key} ${values.join(" ")}`)
241
+ .join("; ");
242
+ }
243
+ function generateCORS(stack) {
244
+ const origins = [];
245
+ if (stack.auth.includes("clerk"))
246
+ origins.push("https://*.clerk.accounts.dev");
247
+ if (stack.payments.includes("stripe"))
248
+ origins.push("https://js.stripe.com");
249
+ return {
250
+ allowedOrigins: origins.length > 0 ? origins : ["https://yourdomain.com"],
251
+ allowedMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
252
+ allowedHeaders: ["Content-Type", "Authorization", "X-Requested-With"],
253
+ maxAge: 86400,
254
+ };
255
+ }
256
+ function generateRLS(stack) {
257
+ const suggestions = [];
258
+ if (stack.database.includes("supabase")) {
259
+ suggestions.push({
260
+ table: "profiles",
261
+ policy: `CREATE POLICY "Users can view own profile" ON profiles FOR SELECT USING (auth.uid() = id);`,
262
+ description: "Restrict profile reads to the owner only.",
263
+ }, {
264
+ table: "profiles",
265
+ policy: `CREATE POLICY "Users can update own profile" ON profiles FOR UPDATE USING (auth.uid() = id) WITH CHECK (auth.uid() = id);`,
266
+ description: "Restrict profile updates to the owner only.",
267
+ }, {
268
+ table: "*",
269
+ policy: `ALTER TABLE your_table ENABLE ROW LEVEL SECURITY;`,
270
+ description: "Enable RLS on every table. Without RLS enabled, all data is publicly accessible via the Supabase client.",
271
+ }, {
272
+ table: "*",
273
+ policy: `REVOKE ALL ON your_table FROM anon; GRANT SELECT ON your_table TO anon;`,
274
+ description: "Restrict anonymous role to read-only on public tables.",
275
+ });
276
+ if (stack.payments.length > 0) {
277
+ suggestions.push({
278
+ table: "subscriptions",
279
+ policy: `CREATE POLICY "Users can view own subscription" ON subscriptions FOR SELECT USING (auth.uid() = user_id);`,
280
+ description: "Protect subscription data — users should only see their own.",
281
+ });
282
+ }
283
+ }
284
+ if (stack.database.includes("prisma") || stack.database.includes("drizzle")) {
285
+ suggestions.push({
286
+ table: "N/A (ORM-level)",
287
+ policy: `// Always filter by authenticated user\nconst items = await prisma.item.findMany({ where: { userId: session.user.id } });`,
288
+ description: "Without RLS, enforce row-level access in your ORM queries. Always include user ID in WHERE clauses.",
289
+ });
290
+ }
291
+ return suggestions;
292
+ }
293
+ function generateRateLimiting(stack) {
294
+ return {
295
+ global: { requests: 100, window: "1m" },
296
+ auth: { requests: 5, window: "1m" },
297
+ api: stack.ai.length > 0
298
+ ? { requests: 20, window: "1m" }
299
+ : { requests: 60, window: "1m" },
300
+ };
301
+ }
302
+ function generateHeaders(stack) {
303
+ const headers = [
304
+ { key: "Strict-Transport-Security", value: "max-age=63072000; includeSubDomains; preload", description: "Enforce HTTPS for all connections." },
305
+ { key: "X-Frame-Options", value: "DENY", description: "Prevent clickjacking by blocking iframe embedding." },
306
+ { key: "X-Content-Type-Options", value: "nosniff", description: "Prevent MIME-type sniffing attacks." },
307
+ { key: "Referrer-Policy", value: "strict-origin-when-cross-origin", description: "Control referrer information sent to other sites." },
308
+ { key: "Permissions-Policy", value: "camera=(), microphone=(), geolocation=()", description: "Disable sensitive browser APIs unless explicitly needed." },
309
+ ];
310
+ if (stack.framework === "nextjs") {
311
+ headers.push({ key: "X-DNS-Prefetch-Control", value: "on", description: "Enable DNS prefetching for performance." });
312
+ }
313
+ return headers;
314
+ }
315
+ export function generatePolicy(path, format = "markdown") {
316
+ const root = resolve(path);
317
+ const stack = detectStack(root);
318
+ const csp = generateCSP(stack);
319
+ const cors = generateCORS(stack);
320
+ const rls = generateRLS(stack);
321
+ const rateLimiting = generateRateLimiting(stack);
322
+ const headers = generateHeaders(stack);
323
+ const policy = { stack, csp, cors, rls, rateLimiting, headers };
324
+ if (format === "json") {
325
+ return JSON.stringify(policy);
326
+ }
327
+ const lines = [
328
+ `# GuardVibe Security Policy Generator`,
329
+ ``,
330
+ `Directory: ${root}`,
331
+ ``,
332
+ `## Detected Stack`,
333
+ `- Framework: ${stack.framework ?? "unknown"}`,
334
+ ];
335
+ if (stack.auth.length > 0)
336
+ lines.push(`- Auth: ${stack.auth.join(", ")}`);
337
+ if (stack.database.length > 0)
338
+ lines.push(`- Database: ${stack.database.join(", ")}`);
339
+ if (stack.payments.length > 0)
340
+ lines.push(`- Payments: ${stack.payments.join(", ")}`);
341
+ if (stack.ai.length > 0)
342
+ lines.push(`- AI: ${stack.ai.join(", ")}`);
343
+ if (stack.storage.length > 0)
344
+ lines.push(`- Storage: ${stack.storage.join(", ")}`);
345
+ if (stack.cms.length > 0)
346
+ lines.push(`- CMS: ${stack.cms.join(", ")}`);
347
+ if (stack.analytics.length > 0)
348
+ lines.push(`- Analytics: ${stack.analytics.join(", ")}`);
349
+ lines.push(``);
350
+ lines.push(`## Content-Security-Policy`, ``, "```", csp, "```", ``, `### Next.js Configuration`, ``, "```typescript", `// next.config.ts`, `async headers() {`, ` return [{`, ` source: "/(.*)",`, ` headers: [`, ` { key: "Content-Security-Policy", value: \`${csp}\` },`, ...headers.map(h => ` { key: "${h.key}", value: "${h.value}" },`), ` ]`, ` }];`, `}`, "```", ``);
351
+ lines.push(`## CORS Policy`, ``, "```typescript", `// Recommended CORS configuration`, `const corsConfig = {`, ` allowedOrigins: ${JSON.stringify(cors.allowedOrigins)},`, ` allowedMethods: ${JSON.stringify(cors.allowedMethods)},`, ` allowedHeaders: ${JSON.stringify(cors.allowedHeaders)},`, ` maxAge: ${cors.maxAge},`, `};`, "```", ``);
352
+ if (rls.length > 0) {
353
+ lines.push(`## Row-Level Security Suggestions`, ``);
354
+ for (const r of rls) {
355
+ lines.push(`### ${r.table}`, r.description, "```sql", r.policy, "```", ``);
356
+ }
357
+ }
358
+ lines.push(`## Rate Limiting`, ``, `| Endpoint | Limit | Window |`, `|----------|-------|--------|`, `| Global | ${rateLimiting.global.requests} req | ${rateLimiting.global.window} |`, `| Auth (login/register) | ${rateLimiting.auth.requests} req | ${rateLimiting.auth.window} |`, `| API | ${rateLimiting.api.requests} req | ${rateLimiting.api.window} |`, ``);
359
+ if (stack.database.includes("upstash-redis")) {
360
+ lines.push(`### Upstash Rate Limit Implementation`, ``, "```typescript", `import { Ratelimit } from "@upstash/ratelimit";`, `import { Redis } from "@upstash/redis";`, ``, `const ratelimit = new Ratelimit({`, ` redis: Redis.fromEnv(),`, ` limiter: Ratelimit.slidingWindow(${rateLimiting.api.requests}, "${rateLimiting.api.window}"),`, `});`, "```", ``);
361
+ }
362
+ lines.push(`## Security Headers`, ``, `| Header | Value | Purpose |`, `|--------|-------|---------|`);
363
+ for (const h of headers) {
364
+ lines.push(`| ${h.key} | ${h.value} | ${h.description} |`);
365
+ }
366
+ return lines.join("\n");
367
+ }
368
+ //# sourceMappingURL=generate-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-policy.js","sourceRoot":"","sources":["../../src/tools/generate-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SecurityRule } from "../data/rules/types.js";
2
+ export declare function policyCheck(path: string, format?: "markdown" | "json", rules?: SecurityRule[]): string;
3
+ //# sourceMappingURL=policy-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-check.d.ts","sourceRoot":"","sources":["../../src/tools/policy-check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAiG3D,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,UAAU,GAAG,MAAmB,EACxC,KAAK,CAAC,EAAE,YAAY,EAAE,GACrB,MAAM,CAiJR"}
@@ -0,0 +1,208 @@
1
+ import { readdirSync, readFileSync, statSync } from "fs";
2
+ import { join, extname, basename, resolve } from "path";
3
+ import { analyzeCode } from "./check-code.js";
4
+ import { loadConfig } from "../utils/config.js";
5
+ const EXTENSION_MAP = {
6
+ ".js": "javascript", ".jsx": "javascript", ".mjs": "javascript", ".cjs": "javascript",
7
+ ".ts": "typescript", ".tsx": "typescript", ".mts": "typescript", ".cts": "typescript",
8
+ ".py": "python", ".go": "go", ".html": "html",
9
+ ".sql": "sql", ".sh": "shell", ".bash": "shell",
10
+ ".yml": "yaml", ".yaml": "yaml", ".tf": "terraform",
11
+ ".toml": "toml", ".json": "json",
12
+ };
13
+ const CONFIG_FILE_MAP = {
14
+ "vercel.json": "vercel-config",
15
+ "next.config.js": "nextjs-config", "next.config.mjs": "nextjs-config", "next.config.ts": "nextjs-config",
16
+ "docker-compose.yml": "docker-compose", "docker-compose.yaml": "docker-compose",
17
+ };
18
+ const DEFAULT_EXCLUDES = new Set([
19
+ "node_modules", ".git", "build", "dist", "vendor", "__pycache__",
20
+ ".next", ".nuxt", "coverage", ".turbo",
21
+ ]);
22
+ function walkDir(dir, excludes, results) {
23
+ let entries;
24
+ try {
25
+ entries = readdirSync(dir, { withFileTypes: true });
26
+ }
27
+ catch {
28
+ return;
29
+ }
30
+ for (const entry of entries) {
31
+ if (excludes.has(entry.name))
32
+ continue;
33
+ const fullPath = join(dir, entry.name);
34
+ if (entry.isDirectory())
35
+ walkDir(fullPath, excludes, results);
36
+ else if (entry.isFile()) {
37
+ const ext = extname(entry.name).toLowerCase();
38
+ if (EXTENSION_MAP[ext] || entry.name.startsWith("Dockerfile") || CONFIG_FILE_MAP[entry.name]) {
39
+ results.push(fullPath);
40
+ }
41
+ }
42
+ }
43
+ }
44
+ function isExcepted(ruleId, filePath, exceptions) {
45
+ for (const exc of exceptions) {
46
+ if (exc.ruleId !== ruleId && exc.ruleId !== "*")
47
+ continue;
48
+ // Check expiration
49
+ if (exc.expiresAt) {
50
+ const expiry = new Date(exc.expiresAt);
51
+ if (expiry < new Date())
52
+ continue; // expired
53
+ }
54
+ // Check file scope
55
+ if (exc.files && exc.files.length > 0) {
56
+ const matches = exc.files.some(pattern => {
57
+ if (pattern.includes("*")) {
58
+ const regex = new RegExp(pattern.replace(/\*/g, ".*"));
59
+ return regex.test(filePath);
60
+ }
61
+ return filePath.includes(pattern);
62
+ });
63
+ if (!matches)
64
+ continue;
65
+ }
66
+ return exc;
67
+ }
68
+ return null;
69
+ }
70
+ function getControlsForRule(rule, frameworks) {
71
+ if (!rule.compliance)
72
+ return [];
73
+ return rule.compliance.filter(c => {
74
+ const prefix = c.split(":")[0].toUpperCase();
75
+ return frameworks.some(f => f.toUpperCase() === prefix || f.toUpperCase() === "ALL");
76
+ });
77
+ }
78
+ export function policyCheck(path, format = "markdown", rules) {
79
+ const scanRoot = resolve(path);
80
+ const config = loadConfig(scanRoot);
81
+ const policy = config.compliance;
82
+ if (!policy) {
83
+ const msg = "No compliance policy defined. Add a `compliance` section to .guardviberc.";
84
+ if (format === "json")
85
+ return JSON.stringify({ error: msg });
86
+ return `# GuardVibe Policy Check\n\n${msg}\n\nExample:\n\`\`\`json\n{\n "compliance": {\n "frameworks": ["SOC2", "GDPR"],\n "failOn": "high",\n "exceptions": [],\n "requiredControls": ["SOC2:CC6.1"]\n }\n}\n\`\`\``;
87
+ }
88
+ const excludes = new Set([...DEFAULT_EXCLUDES, ...config.scan.exclude]);
89
+ const filePaths = [];
90
+ walkDir(scanRoot, excludes, filePaths);
91
+ const policyFindings = [];
92
+ const severityOrder = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };
93
+ const failLevel = severityOrder[policy.failOn] ?? 1;
94
+ for (const filePath of filePaths) {
95
+ try {
96
+ const stat = statSync(filePath);
97
+ if (stat.size > config.scan.maxFileSize)
98
+ continue;
99
+ const content = readFileSync(filePath, "utf-8");
100
+ const ext = extname(filePath).toLowerCase();
101
+ let language = EXTENSION_MAP[ext];
102
+ if (!language && basename(filePath).startsWith("Dockerfile"))
103
+ language = "dockerfile";
104
+ if (!language)
105
+ language = CONFIG_FILE_MAP[basename(filePath)];
106
+ if (!language)
107
+ continue;
108
+ const findings = analyzeCode(content, language, undefined, filePath, scanRoot, rules);
109
+ for (const f of findings) {
110
+ const controls = getControlsForRule(f.rule, policy.frameworks);
111
+ if (controls.length === 0)
112
+ continue;
113
+ const exception = isExcepted(f.rule.id, filePath, policy.exceptions);
114
+ policyFindings.push({
115
+ rule: f.rule, match: f.match, line: f.line, filePath,
116
+ controls,
117
+ excepted: !!exception,
118
+ exceptionReason: exception?.reason,
119
+ });
120
+ }
121
+ }
122
+ catch { /* skip */ }
123
+ }
124
+ const activeFindings = policyFindings.filter(f => !f.excepted);
125
+ const exceptedFindings = policyFindings.filter(f => f.excepted);
126
+ const blockingFindings = activeFindings.filter(f => (severityOrder[f.rule.severity] ?? 4) <= failLevel);
127
+ // Required controls check
128
+ const controlStatus = {};
129
+ if (policy.requiredControls) {
130
+ for (const ctrl of policy.requiredControls) {
131
+ const violations = activeFindings.filter(f => f.controls.includes(ctrl));
132
+ controlStatus[ctrl] = violations.length === 0 ? "pass" : "fail";
133
+ }
134
+ }
135
+ const pass = blockingFindings.length === 0 && !Object.values(controlStatus).includes("fail");
136
+ const result = {
137
+ pass,
138
+ findings: activeFindings,
139
+ exceptions: exceptedFindings,
140
+ summary: {
141
+ total: policyFindings.length,
142
+ excepted: exceptedFindings.length,
143
+ blocking: blockingFindings.length,
144
+ frameworks: policy.frameworks,
145
+ failOn: policy.failOn,
146
+ requiredControlsStatus: controlStatus,
147
+ },
148
+ };
149
+ if (format === "json") {
150
+ return JSON.stringify({
151
+ pass: result.pass,
152
+ summary: result.summary,
153
+ findings: result.findings.map(f => ({
154
+ id: f.rule.id, name: f.rule.name, severity: f.rule.severity,
155
+ file: f.filePath, line: f.line, controls: f.controls,
156
+ fix: f.rule.fix,
157
+ })),
158
+ exceptions: result.exceptions.map(f => ({
159
+ id: f.rule.id, name: f.rule.name, severity: f.rule.severity,
160
+ file: f.filePath, line: f.line, reason: f.exceptionReason,
161
+ })),
162
+ });
163
+ }
164
+ // Markdown
165
+ const lines = [
166
+ `# GuardVibe Policy Check`,
167
+ ``,
168
+ `**Result:** ${pass ? "PASS" : "FAIL"}`,
169
+ `**Frameworks:** ${policy.frameworks.join(", ")}`,
170
+ `**Fail threshold:** ${policy.failOn}`,
171
+ `**Directory:** ${scanRoot}`,
172
+ ``,
173
+ `| Metric | Count |`,
174
+ `|--------|-------|`,
175
+ `| Total compliance findings | ${policyFindings.length} |`,
176
+ `| Excepted (accepted risk) | ${exceptedFindings.length} |`,
177
+ `| Blocking (above threshold) | ${blockingFindings.length} |`,
178
+ ``,
179
+ ];
180
+ // Required controls
181
+ if (Object.keys(controlStatus).length > 0) {
182
+ lines.push(`## Required Controls`, ``, `| Control | Status |`, `|---------|--------|`);
183
+ for (const [ctrl, status] of Object.entries(controlStatus)) {
184
+ lines.push(`| ${ctrl} | ${status === "pass" ? "PASS" : "**FAIL**"} |`);
185
+ }
186
+ lines.push(``);
187
+ }
188
+ // Blocking findings
189
+ if (blockingFindings.length > 0) {
190
+ lines.push(`## Blocking Findings`, ``);
191
+ for (const f of blockingFindings) {
192
+ lines.push(`- **[${f.rule.severity.toUpperCase()}]** ${f.rule.name} (${f.rule.id}) in \`${f.filePath}\`:${f.line}`, ` Controls: ${f.controls.join(", ")} | Fix: ${f.rule.fix}`, ``);
193
+ }
194
+ }
195
+ // Exceptions
196
+ if (exceptedFindings.length > 0) {
197
+ lines.push(`## Accepted Exceptions`, ``);
198
+ for (const f of exceptedFindings) {
199
+ lines.push(`- ~~${f.rule.name} (${f.rule.id})~~ in \`${f.filePath}\`:${f.line} — *${f.exceptionReason}*`);
200
+ }
201
+ lines.push(``);
202
+ }
203
+ if (pass && blockingFindings.length === 0) {
204
+ lines.push(`All compliance checks passed.`);
205
+ }
206
+ return lines.join("\n");
207
+ }
208
+ //# sourceMappingURL=policy-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-check.js","sourceRoot":"","sources":["../../src/tools/policy-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SecurityRule } from "../data/rules/types.js";
2
+ export declare function reviewPr(cwd?: string, base?: string, format?: "markdown" | "json" | "annotations", diffOnly?: boolean, failOn?: "critical" | "high" | "medium" | "low" | "none", rules?: SecurityRule[]): string;
3
+ //# sourceMappingURL=review-pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-pr.d.ts","sourceRoot":"","sources":["../../src/tools/review-pr.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AA0F3D,wBAAgB,QAAQ,CACtB,GAAG,GAAE,MAAsB,EAC3B,IAAI,GAAE,MAAe,EACrB,MAAM,GAAE,UAAU,GAAG,MAAM,GAAG,aAA0B,EACxD,QAAQ,GAAE,OAAc,EACxB,MAAM,GAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAe,EAChE,KAAK,CAAC,EAAE,YAAY,EAAE,GACrB,MAAM,CA8HR"}