产品
](https://www.npmjs.com/package/prodlint) ](https://www.npmjs.com/package/prodlint) 
为vibe编码的应用程序做好生产准备。
vibe编码应用程序的静态分析。标记Cursor、v0、Bolt和Copilot造成的安全性、可靠性、性能和AI质量问题——幻觉导入、缺少身份验证、硬编码秘密、未验证的服务器操作等等。零配置,无LLM,52条规则。
npx prodlint prodlint v0.9.2
Scanned 148 files · 2 critical · 5 warnings · 1 info
src/app/api/checkout/route.ts
12:1 INFO No rate limiting — anyone could spam this endpoint and run up your API costs rate-limiting
28:5 WARN Empty catch block silently swallows error shallow-catch
src/actions/submit.ts
5:3 CRIT Server action uses formData without validation next-server-action-validation
↳ Validate with Zod: const data = schema.safeParse(Object.fromEntries(formData))
src/lib/db.ts
1:1 CRIT Package "drizzle-orm" is imported but not in package.json hallucinated-imports
Scores
security 72 ████████████████░░░░ (8 issues)
reliability 85 █████████████████░░░ (4 issues)
performance 95 ███████████████████░ (1 issue)
ai-quality 90 ██████████████████░░ (3 issues)
Overall: 82/100 (weighted)
2 critical · 5 warnings · 4 info为什么?
Vibe编码是最快的构建方式。快速交付意味着知道你的代码已经准备好投入生产,而不仅仅是它可以编译。硬编码的秘密、幻觉包、丢失的身份验证和XSS向量通过了类型检查,看起来是正确的,但它们还没有准备好投入生产。
prodlint检查TypeScript和ESLint没有检查的内容: 你的vibe编码应用程序是否已准备好投入生产.
安装
npx prodlint # Run directly (no install)
npx prodlint ./my-app # Scan specific path
npx prodlint --json # JSON output for CI
npx prodlint --sarif # SARIF 2.1.0 for GitHub Code Scanning
npx prodlint --summary # Quick pass/fail + top 3 blockers
npx prodlint --profile startup # Only critical findings
npx prodlint --profile strict # All findings including info
npx prodlint --baseline .prodlint-baseline.json # Only new findings
npx prodlint --ignore "*.test.ts" # Ignore patterns
npx prodlint --min-severity warning # Only warnings and criticals
npx prodlint --quiet # Suppress badge output或者安装它:
npm i -D prodlint # Project dependency
npm i -g prodlint # Global install4个类别的52条规则
安全(27条规则)
| 规则 | 它检查什么 |
|---|---|
secrets | 源代码中硬编码的API密钥、令牌、密码 |
auth-checks | 没有身份验证的API路由 |
env-exposure | NEXT_PUBLIC_ 仅服务器机密 |
input-validation | 未经验证使用请求正文 |
cors-config | Access-Control-Allow-Origin: *,通配符+凭据升级为关键 |
unsafe-html | dangerouslySetInnerHTML 用户数据 |
sql-injection | 字符串插值SQL查询(ORM感知) |
open-redirect | 用户输入传递给 redirect() |
rate-limiting | 没有速率限制器的API路由 |
phantom-dependency | node_modules中的包,但package.json中缺少 |
insecure-cookie | 会话Cookie缺少httpOnly/secure/sameSite |
leaked-env-in-logs | process.env.* console.log内部调用 |
insecure-random | Math.random() 用于令牌、机密或会话ID |
next-server-action-validation | 使用formData而不进行Zod/模式验证的服务器操作 |
env-fallback-secret | 具有硬编码回退值的安全敏感环境变量 |
verbose-error-response | API响应中的错误堆栈跟踪或消息泄漏 |
missing-webhook-verification | 没有签名验证的Webhook路由 |
server-action-auth | 具有突变但没有身份验证检查的服务器操作 |
eval-injection | eval(), new Function(),动态代码执行 |
next-public-sensitive | NEXT_PUBLIC_ secret环境变量前缀 |
ssrf-risk | 传递用户控制的URL以获取服务器代码 |
path-traversal | 使用未经消毒的用户输入的文件系统操作 |
unsafe-file-upload | 没有类型或大小验证的文件上传处理程序 |
supabase-missing-rls | CREATE TABLE 在不启用RLS的情况下进行迁移 |
deprecated-oauth-flow | OAuth隐式授权(response_type=令牌) |
jwt-no-expiry | 无过期签名的JWT令牌 |
client-side-auth-only | 客户端组件中的密码比较或身份验证逻辑 |
可靠性(11条规则)
| 规则 | 它检查什么 |
|---|---|
hallucinated-imports | 导入不在package.json中的包 |
error-handling | 不使用try/catch的异步操作 |
unhandled-promise | 没有wait或.catch的浮动承诺 |
shallow-catch | 空的捕获块会吞下错误 |
missing-loading-state | 不带加载状态的客户端组件 |
missing-error-boundary | 没有匹配错误的路线布局.tsx |
missing-transaction | 多棱镜写入没有 $transaction |
redirect-in-try-catch | redirect() try/catch内部——Next.js重定向抛出,catch吞下它 |
missing-revalidation | 服务器操作有DB突变,但没有 revalidatePath |
missing-useeffect-cleanup | useEffect具有订阅/计时器,但没有清理返回 |
hydration-mismatch | window/Date.now()/Math.random() 服务器组件中的呈现路径 |
性能(6条规则)
| 规则 | 它检查什么 |
|---|---|
no-sync-fs | readFileSync API路线 |
no-n-plus-one | 循环内部的数据库调用 |
no-unbounded-query | .findMany() / .select('*') 没有限制 |
no-dynamic-import-loop | import() 内环 |
server-component-fetch-self | 获取自己的API路由的服务器组件 |
missing-abort-controller | 无超时或AbortController的Fetch/axios调用 |
AI质量(8条规则)
| 规则 | 它检查什么 |
|---|---|
ai-smells | any 类型, console.log,TODO评论堆积如山 |
placeholder-content | Lorem ipsum,示例电子邮件,“你的api密钥在这里”留在生产代码中 |
hallucinated-api | .flatten(), .contains(), .substr() --人工智能发明的方法 |
stale-fallback | localhost:3000 在生产代码中硬编码 |
comprehension-debt | 函数超过80行,嵌套深度大,参数太多 |
codebase-consistency | 整个项目中的混合命名约定 |
dead-exports | 导出了没有任何东西导入的函数 |
use-client-overuse | "use client" 在不使用任何客户端API的文件上 |
智能检测
prodlint避免了常见的误报:
- AST解析 --使用正则表达式回退对12条规则(导入、捕获块、重定向、SSRF、路径遍历、JWT、HTML注入、水合、事务、环境泄漏、循环、SQL)进行基于Babel的分析
- Monorepo支持 --npm/yarn/pnpm工作区依赖关系自动解析
- 框架意识 --Prisma、Drizzle、Supabase、Knex和Sequelize白名单可防止错误的SQL注入标志
- 中间件检测 --检测到办事员、NextAuth、Supabase中间件——身份验证结果降级
- 阻止评论意识 --内部图案
/* */被忽略 - 路径别名支持 —
@/,~/,并且tsconfig路径不会被标记为幻觉导入 - 路线豁免 --auth、webhook、运行状况和cron路由免于auth/速率限制检查
- 测试/脚本文件感知 --非生产文件的严重性较低
- 修复建议 --调查结果包括可采取行动
fix带有修复代码的提示
评分
每个类别从100开始。根据调查结果扣除:
| 严重性 | 扣除额 | 按规则上限 |
|---|---|---|
| 临界 | -8 | 最大1 |
| 警告 | -2 | 最多2 |
| 信息 | -0.5 | 最多3个 |
收益递减在一个类别中扣除30分后,进一步的扣除减半;50岁之后,四分卫。
加权总体安全性40%,可靠性30%,性能15%,人工智能质量15%。0楼。退出码 1 如果存在任何关键发现。
GitHub行动
增添 .github/workflows/prodlint.yml:
name: Prodlint
on: [pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: prodlint/prodlint@v1
with:
threshold: 50将分数细分作为公关评论发布,如果低于阈值,则构建失败。
| 输入 | 默认值 | 描述 |
|---|---|---|
path | . | 扫描路径 |
threshold | 0 | 通过的最低分数(0-100) |
ignore | 要忽略的逗号分隔的球形图案 | |
comment | true | 发布带有结果的PR评论 |
| 输出 | 描述 |
|---|---|
score | 总得分(0-100) |
critical | 关键发现数量 |
SARIF+GitHub代码扫描
将prodlint结果上传到GitHub的安全选项卡:
- name: Run prodlint
run: npx prodlint --sarif > prodlint.sarif
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: prodlint.sarif
category: prodlint现有项目的基线
逐渐采用prodlint,不要淹没在已有的发现中:
# Save current state as baseline
npx prodlint --baseline-save .prodlint-baseline.json
# CI only fails on NEW findings
npx prodlint --baseline .prodlint-baseline.jsonMCP服务器
在Cursor、Claude Code或任何兼容MCP的编辑器中使用prodlint:
克劳德代码:
claude mcp add prodlint -- npx -y prodlint-mcp光标/风帆:
{
"mcpServers": {
"prodlint": {
"command": "npx",
"args": ["-y", "prodlint-mcp"]
}
}
}问你的AI: *“在此项目上运行prodlint”* 它称之为 scan 工具直接。
网站评分
检查任何已部署的网站是否已准备好AI代理——14项检查涵盖了新兴标准,如llms.txt、TDMRep、AgentCard、AI Disclosure、HTTP签名(RFC 9421)等。
npx prodlint --web example.com
npx prodlint --web example.com --json # JSON output prodlint site score
example.com · 14 checks
Score: 42 C ████████░░░░░░░░░░░░
✗ AI-Disclosure Header 0/10 No AI-Disclosure header found.
✗ Content-Usage Directives 0/10 No Content-Usage directives found.
✗ TDMRep 0/10 No TDMRep found.
✗ A2A AgentCard 0/5 No agent-card.json found.
✗ ai.txt 0/5 No ai.txt found at site root.
! llms.txt 2/5 llms.txt found but missing key sections.
✓ robots.txt 10/10 robots.txt found with 15 rules.
✓ Sitemap 10/10 Valid sitemap with 42 URLs.
✓ Structured Data 10/10 Found JSON-LD structured data.
✓ OpenGraph 10/10 Complete OpenGraph tags found.
✓ Page Speed 5/5 Loaded in 0.8s.
✓ AI Bot Directives 5/5 AI-specific bot rules found.
✓ WebMCP Tools 0/5 No WebMCP tools detected.
7 passed · 5 failed · 1 warnings
Full results: https://prodlint.com/score?url=example.com或者在以下网址交互式查看您的分数 prodlint.com/score.
AI工具
- LLM友好文档: prodlint.com/llms.txt --LLM简明项目总结
- 全参考: prodlint.com/llms-full.txt --全部52条规则及详细信息
- MCP设置指南: prodlint.com/mcp --Claude Code、Cursor、Windsurf的详细编辑器设置
prodlint是专门为AI生成的代码模式而设计的。每条规则都会检查人工智能编码工具持续创建的生产问题,而不是样式问题。
压制
抑制单行:
// prodlint-disable-next-line secrets
const key = "sk_test_example_for_docs"抑制整个文件(放在顶部):
// prodlint-disable secrets程序化API
import { scan } from 'prodlint'
const result = await scan({ path: './my-project' })
console.log(result.overallScore) // 0-100
console.log(result.findings) // Finding[]徽章
[](https://prodlint.com)许可证
麻省理工学院
