guardvibe 0.6.4 → 0.7.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/build/data/rules/auth.d.ts +3 -0
- package/build/data/rules/auth.d.ts.map +1 -0
- package/build/data/rules/auth.js +100 -0
- package/build/data/rules/auth.js.map +1 -0
- package/build/data/rules/database.d.ts +3 -0
- package/build/data/rules/database.d.ts.map +1 -0
- package/build/data/rules/database.js +100 -0
- package/build/data/rules/database.js.map +1 -0
- package/build/data/rules/deployment.d.ts +3 -0
- package/build/data/rules/deployment.d.ts.map +1 -0
- package/build/data/rules/deployment.js +192 -0
- package/build/data/rules/deployment.js.map +1 -0
- package/build/data/rules/index.d.ts.map +1 -1
- package/build/data/rules/index.js +8 -0
- package/build/data/rules/index.js.map +1 -1
- package/build/data/rules/nextjs.d.ts +3 -0
- package/build/data/rules/nextjs.d.ts.map +1 -0
- package/build/data/rules/nextjs.js +148 -0
- package/build/data/rules/nextjs.js.map +1 -0
- package/build/index.js +32 -15
- package/build/index.js.map +1 -1
- package/build/tools/check-code.d.ts +2 -1
- package/build/tools/check-code.d.ts.map +1 -1
- package/build/tools/check-code.js +22 -1
- package/build/tools/check-code.js.map +1 -1
- package/build/tools/check-package-health.d.ts +29 -0
- package/build/tools/check-package-health.d.ts.map +1 -0
- package/build/tools/check-package-health.js +142 -0
- package/build/tools/check-package-health.js.map +1 -0
- package/build/tools/check-project.d.ts +1 -1
- package/build/tools/check-project.d.ts.map +1 -1
- package/build/tools/check-project.js +20 -2
- package/build/tools/check-project.js.map +1 -1
- package/build/tools/compliance-report.d.ts +1 -1
- package/build/tools/compliance-report.d.ts.map +1 -1
- package/build/tools/compliance-report.js +26 -2
- package/build/tools/compliance-report.js.map +1 -1
- package/build/tools/scan-dependencies.d.ts +1 -1
- package/build/tools/scan-dependencies.d.ts.map +1 -1
- package/build/tools/scan-dependencies.js +25 -2
- package/build/tools/scan-dependencies.js.map +1 -1
- package/build/tools/scan-directory.d.ts +1 -1
- package/build/tools/scan-directory.d.ts.map +1 -1
- package/build/tools/scan-directory.js +26 -3
- package/build/tools/scan-directory.js.map +1 -1
- package/build/tools/scan-secrets.d.ts +1 -1
- package/build/tools/scan-secrets.d.ts.map +1 -1
- package/build/tools/scan-secrets.js +10 -1
- package/build/tools/scan-secrets.js.map +1 -1
- package/build/tools/scan-staged.d.ts +1 -1
- package/build/tools/scan-staged.d.ts.map +1 -1
- package/build/tools/scan-staged.js +20 -2
- package/build/tools/scan-staged.js.map +1 -1
- package/build/utils/typosquat.d.ts +9 -0
- package/build/utils/typosquat.d.ts.map +1 -0
- package/build/utils/typosquat.js +101 -0
- package/build/utils/typosquat.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Popular npm packages for typosquat detection
|
|
2
|
+
export const POPULAR_PACKAGES = [
|
|
3
|
+
// React ecosystem
|
|
4
|
+
"react", "react-dom", "react-router", "react-router-dom", "react-hook-form",
|
|
5
|
+
"@tanstack/react-query", "react-icons", "react-select",
|
|
6
|
+
// Next.js
|
|
7
|
+
"next", "@next/font", "@next/mdx",
|
|
8
|
+
// Vue / Svelte / Angular
|
|
9
|
+
"vue", "svelte", "nuxt", "@angular/core",
|
|
10
|
+
// State management
|
|
11
|
+
"zustand", "jotai", "redux", "@reduxjs/toolkit", "mobx", "valtio",
|
|
12
|
+
// Styling
|
|
13
|
+
"tailwindcss", "postcss", "autoprefixer", "sass", "styled-components",
|
|
14
|
+
"@emotion/react", "@emotion/styled", "clsx", "tailwind-merge",
|
|
15
|
+
// UI frameworks
|
|
16
|
+
"@radix-ui/react-dialog", "@radix-ui/react-popover", "@radix-ui/react-select",
|
|
17
|
+
"@radix-ui/react-tooltip", "@radix-ui/react-dropdown-menu",
|
|
18
|
+
"class-variance-authority", "lucide-react",
|
|
19
|
+
// Build tools
|
|
20
|
+
"typescript", "vite", "esbuild", "webpack", "turbo", "tsup", "tsx",
|
|
21
|
+
// Testing
|
|
22
|
+
"vitest", "jest", "@testing-library/react", "playwright", "cypress",
|
|
23
|
+
// HTTP / API
|
|
24
|
+
"axios", "ky", "got", "node-fetch", "undici",
|
|
25
|
+
// Validation
|
|
26
|
+
"zod", "yup", "joi", "valibot", "ajv",
|
|
27
|
+
// Database / ORM
|
|
28
|
+
"prisma", "@prisma/client", "drizzle-orm", "drizzle-kit",
|
|
29
|
+
"mongoose", "typeorm", "knex", "pg", "mysql2", "better-sqlite3",
|
|
30
|
+
// Auth
|
|
31
|
+
"@clerk/nextjs", "@clerk/clerk-sdk-node", "next-auth", "@auth/core",
|
|
32
|
+
"passport", "jsonwebtoken", "bcrypt", "bcryptjs",
|
|
33
|
+
// Supabase
|
|
34
|
+
"@supabase/supabase-js", "@supabase/ssr",
|
|
35
|
+
// Payments
|
|
36
|
+
"stripe", "@stripe/stripe-js",
|
|
37
|
+
// Email
|
|
38
|
+
"resend", "nodemailer", "@sendgrid/mail",
|
|
39
|
+
// AI
|
|
40
|
+
"ai", "@ai-sdk/react", "@ai-sdk/openai", "@ai-sdk/anthropic", "@ai-sdk/google",
|
|
41
|
+
"openai", "@anthropic-ai/sdk",
|
|
42
|
+
// Server frameworks
|
|
43
|
+
"express", "fastify", "hono", "koa",
|
|
44
|
+
// Utilities
|
|
45
|
+
"lodash", "lodash-es", "date-fns", "dayjs", "uuid", "nanoid",
|
|
46
|
+
"dotenv", "chalk", "commander", "inquirer", "ora", "execa",
|
|
47
|
+
"fs-extra", "glob", "minimatch", "semver", "debug",
|
|
48
|
+
// File handling
|
|
49
|
+
"sharp", "multer", "formidable",
|
|
50
|
+
// Logging / monitoring
|
|
51
|
+
"winston", "pino", "@sentry/nextjs",
|
|
52
|
+
// MCP
|
|
53
|
+
"@modelcontextprotocol/sdk",
|
|
54
|
+
];
|
|
55
|
+
export function levenshtein(a, b) {
|
|
56
|
+
const m = a.length;
|
|
57
|
+
const n = b.length;
|
|
58
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
59
|
+
for (let i = 0; i <= m; i++)
|
|
60
|
+
dp[i][0] = i;
|
|
61
|
+
for (let j = 0; j <= n; j++)
|
|
62
|
+
dp[0][j] = j;
|
|
63
|
+
for (let i = 1; i <= m; i++) {
|
|
64
|
+
for (let j = 1; j <= n; j++) {
|
|
65
|
+
if (a[i - 1] === b[j - 1]) {
|
|
66
|
+
dp[i][j] = dp[i - 1][j - 1];
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return dp[m][n];
|
|
74
|
+
}
|
|
75
|
+
export function detectTyposquat(name) {
|
|
76
|
+
const lower = name.toLowerCase();
|
|
77
|
+
// Exact match = not a typosquat
|
|
78
|
+
if (POPULAR_PACKAGES.includes(lower))
|
|
79
|
+
return null;
|
|
80
|
+
// Strip scope for comparison
|
|
81
|
+
const bareName = lower.startsWith("@") ? lower.split("/").pop() ?? lower : lower;
|
|
82
|
+
let bestMatch = null;
|
|
83
|
+
let bestDistance = Infinity;
|
|
84
|
+
for (const popular of POPULAR_PACKAGES) {
|
|
85
|
+
const popularBare = popular.startsWith("@") ? popular.split("/").pop() ?? popular : popular;
|
|
86
|
+
// Only compare if lengths are within 2 chars
|
|
87
|
+
if (Math.abs(bareName.length - popularBare.length) > 2)
|
|
88
|
+
continue;
|
|
89
|
+
const dist = levenshtein(bareName, popularBare);
|
|
90
|
+
if (dist > 0 && dist <= 2 && dist < bestDistance) {
|
|
91
|
+
bestDistance = dist;
|
|
92
|
+
bestMatch = popular;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (!bestMatch)
|
|
96
|
+
return null;
|
|
97
|
+
// Confidence: distance 1 = 0.9, distance 2 = 0.7
|
|
98
|
+
const confidence = bestDistance === 1 ? 0.9 : 0.7;
|
|
99
|
+
return { similarTo: bestMatch, confidence };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=typosquat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typosquat.js","sourceRoot":"","sources":["../../src/utils/typosquat.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "guardvibe",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Local-first security MCP for vibe coding. Focused on TypeScript, JavaScript, Python, Go, Dockerfile, YAML, and Terraform.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"guardvibe": "
|
|
8
|
-
"guardvibe-init": "
|
|
7
|
+
"guardvibe": "build/index.js",
|
|
8
|
+
"guardvibe-init": "build/cli.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"build"
|