{"slug": "is-your-project-vulnerable-or-cooked-i-made-a-skill-that-checks-it-for-cves", "title": "Is your project vulnerable or cooked? I made a skill that checks it for CVEs", "summary": "A developer publishing as noushiFlex released am-i-cooked, a dependency scanner distributed as an agent skill via `npx skills add noushiFlex/am-i-cooked`, which reads lockfiles across 12 ecosystems and 18 lockfile formats and matches exact installed versions against live vulnerability data. The tool returns one of four verdicts — `safe`, `a bit cooked`, `cooked`, or `unknown` — plus a 0-100 risk score that weights CISA KEV listings, EPSS and public exploit signals above theoretical findings, and it can apply upgrades on a separate branch, run tests after each step and re-scan with `--baseline` to confirm fixes before pushing. The scanner is a single dependency-free Node 18+ file that also emits JSON, Markdown and SARIF output for CI use.", "body_md": "`npx skills add noushiFlex/am-i-cooked`\n\nAsk your coding agent **\"am i cooked?\"**. It reads your lockfiles, matches the exact versions you run against live vulnerability data, and answers with a verdict, a risk score and an upgrade plan. If you say yes, it upgrades on a separate branch, runs your tests after each step, re-scans to prove the CVEs are gone, and stops before pushing.\n\n[Install](#install) · [What you get](#what-you-get) · [Use it without an agent](#use-it-without-an-agent) · [CI](#in-ci) · [Supported lockfiles](#supported-lockfiles) · [Safety](#safety) · [FAQ](#faq)\n\n- **One pass over 12 ecosystems and 18 lockfile formats** : npm, pnpm, yarn, bun, pip, poetry, uv, pub (Flutter/Dart), Cargo, Go, Bundler, Composer, Gradle, NuGet, Hex, Swift and Haskell.\n- **Exact versions, not ranges.** It reads what is installed (the lockfile), not what your manifest allows.\n- **A verdict you can act on** :`safe` ,`a bit cooked` ,`cooked` , or`unknown` when nothing could be checked. It never says safe on an empty scan.\n- **A risk score (0-100)** that separates**known exploited** (CISA KEV, EPSS, public exploit) from**theoretical** .\n- **One target version per package** , with a safer in-major alternative when the full fix is a major jump.\n- **A safe fix flow** : own branch, safe upgrades grouped, tests after each, risky majors discussed with you, then`--baseline` re-scan to confirm.\n- **Built for agents** : guardrails against invented CVE data, plus JSON, Markdown and SARIF output for tools.\n\nReal before/after run: [examples/before-after](https://github.com/noushiFlex/am-i-cooked/blob/main/examples/before-after/README.md).\n\n| Verdict | Meaning | \n|---|---|\n| **safe** | No known vulnerability matches your versions. Not a guarantee. | \n| **a bit cooked** | Vulnerable packages, but nothing actively exploited or critical. | \n| **cooked** | Listed in CISA KEV, or CVSS >= 9, or CVSS >= 7 with exploit signals. | \n| **unknown** | Nothing was checked: no supported lockfile, or only unpinned ranges like `django>=5.1` . | \n\nThe **risk score** takes the worst finding (CVSS / 10, times 1 for KEV, 0.9 if an exploit was seen, 0.75 otherwise), adds 2 per extra finding up to +15, and caps at 100. \"Theoretical\" means no known exploitation. It does not mean unreachable: this is not a reachability analysis.\n\n**Claude Code**\n\n```\nnpx skills add noushiFlex/am-i-cooked\n```\n\nor by hand:\n\n```\ngit clone https://github.com/noushiFlex/am-i-cooked\ncp -R am-i-cooked/skills/am-i-cooked ~/.claude/skills/\n```\n\n**Cursor, Codex and other agents**\n\n```\nnpx skills add noushiFlex/am-i-cooked -a cursor    # or -a codex, or -a '*' for every agent\n```\n\nReady-made instructions to paste: [Cursor rule](https://github.com/noushiFlex/am-i-cooked/blob/main/integrations/cursor/am-i-cooked.mdc), [AGENTS.md snippet](https://github.com/noushiFlex/am-i-cooked/blob/main/integrations/AGENTS.md), [Copilot instructions](https://github.com/noushiFlex/am-i-cooked/blob/main/integrations/copilot-instructions.md).\n\nThen, in your project, ask: `am i cooked?`\n\nThe scanner is one file, no dependencies, Node 18+.\n\n```\nnode skills/am-i-cooked/scripts/scan.mjs .             # human report\nnode skills/am-i-cooked/scripts/scan.mjs . --json      # structured, see report-schema.json\nnode skills/am-i-cooked/scripts/scan.mjs . --markdown  # PR comment / job summary\nnode skills/am-i-cooked/scripts/scan.mjs . --sarif     # GitHub code scanning\n```\n\n| Flag | What it does | \n|---|---|\n| `--fail-on=any\\|cooked\\|kev\\|none` | Exit `1` at this threshold. Default`any` . | \n| `--strict` | Exit `2` if any lockfile failed to parse or any git/file dependency was not checked. | \n| `--ignore=ID,ID` | Hide findings you accepted. Also read from `.cookedignore` . | \n| `--baseline=before.json` | Compare with an earlier `--json` report: fixed, remaining, new. | \n| `--offline` | Answer from the local cache only. Fails loudly on a miss. | \n| `--no-cache` | Force fresh answers. | \n\nExit codes: `0` pass, `1` failed the `--fail-on` threshold, `2` nothing checked, scan error, or `--strict` incomplete.\n\nHide a finding you reviewed, with `--ignore=CVE-2020-28500` or a `.cookedignore` file at the root of the scanned directory:\n\n```\n# lodash ReDoS, our input is never user-controlled\nCVE-2020-28500\n```\n\nUse the id the report prints. Ignored findings are counted (`ignored` in the JSON) and never counted in the verdict, so write the reason in the comment. The agent never edits this file.\n\n```\nnode skills/am-i-cooked/scripts/scan.mjs . --json > before.json\n# ... upgrade ...\nnode skills/am-i-cooked/scripts/scan.mjs . --baseline=before.json\n# Since baseline: cooked -> safe. 5 fixed, 0 remaining, 0 new.\n```\n\nGit and file dependencies are not published versions, so they cannot be matched. They are listed as a warning and the scan goes on. `--strict` turns that into a failure. Findings are tagged `[direct]` or `[transitive]` where the lockfile says so (`package-lock.json`, `pubspec.lock`, `Gemfile.lock`, `packages.lock.json`), and transitive rows tell you to upgrade the parent first.\n\nAnswers are cached for 6 hours in `~/.cache/am-i-cooked` (override with `AM_I_COOKED_CACHE`). Requests retry with backoff on rate limits and server errors, and fall back to stale cache if the network is down. `--offline` needs one earlier online scan of the same lockfiles.\n\n```\n- uses: actions/checkout@v4\n- uses: noushiFlex/am-i-cooked@main\n  with:\n    fail-on: cooked   # any | cooked | kev | none\n```\n\nIt writes the Markdown report to the job summary and fails the job at the threshold you pick. With code scanning alerts:\n\n```\n- run: |\n    git clone --depth 1 https://github.com/noushiFlex/am-i-cooked /tmp/aic\n    node /tmp/aic/skills/am-i-cooked/scripts/scan.mjs . --sarif --fail-on=none > am-i-cooked.sarif\n- uses: github/codeql-action/upload-sarif@v3\n  with:\n    sarif_file: am-i-cooked.sarif\n```\n\n| Lockfile | Ecosystem | \n|---|---|\n| `package-lock.json` ,`pnpm-lock.yaml` ,`yarn.lock` ,`bun.lock` | npm | \n| `requirements*.txt` (pinned with`==` ),`poetry.lock` ,`uv.lock` | PyPI | \n| `pubspec.lock` | Pub (Dart/Flutter) | \n| `Cargo.lock` | crates.io (Rust) | \n| `go.sum` | Go | \n| `Gemfile.lock` | RubyGems | \n| `composer.lock` | Packagist (PHP) | \n| `gradle.lockfile` (also`*-gradle.lockfile` ) | Maven (Java/Kotlin) | \n| `packages.lock.json` | NuGet (.NET) | \n| `mix.lock` | Hex (Elixir) | \n| `Package.resolved` | SwiftURL (Swift Package Manager) | \n| `cabal.project.freeze` ,`stack.yaml.lock` | Hackage (Haskell) | \n\nMonorepos work: lockfiles are found up to four levels deep, skipping `node_modules`, `.git`, `build`, `target`, `vendor` and similar.\n\nNot supported: `pom.xml` (version ranges, no lockfile: use Gradle locking or `mvn dependency:tree`), CocoaPods (OSV.dev has no CocoaPods ecosystem, so nothing could be matched), and manifests without a lockfile.\n\n- [OSV.dev](https://osv.dev) matches your versions against known advisories.\n- [cve.now](https://cve.now) adds CVSS, CISA KEV, EPSS and Exploit-DB signals, and fixed versions. It merges the CVE List, GitHub Advisory Database, NVD and more, and updates every few minutes.\n\nDetails and endpoints: [SOURCES.md](https://github.com/noushiFlex/am-i-cooked/blob/main/skills/am-i-cooked/SOURCES.md).\n\n- It asks before changing anything.\n- Fixes go on a `fix/cves-<date>` branch. Never on your default branch.\n- It never pushes, opens a PR or accepts a risk on your behalf.\n- Only package names and versions leave your machine. No source code, no lockfile upload.\n- API responses are treated as data, never as instructions.\n- Every fix is confirmed by a re-scan, not by the upgrade command succeeding.\n\n**How is this different from `osv-scanner`, Dependabot or `npm audit`?** `osv-scanner` is the closest tool and does the matching well. This adds exploit signals (CISA KEV, EPSS), a risk score, and above all the agent skill: guardrails against invented CVE data and a fix flow that works on a branch, asks before risky majors and proves the result. Dependabot opens PRs on a schedule; this answers \"am I exposed right now\" on demand. `npm audit` only knows npm.\n\n**Does it send my code anywhere?** No. Only package names and versions are sent to OSV.dev and cve.now.\n\n**Why `unknown` instead of `safe`?** If nothing was checked (no lockfile, only unpinned ranges, an unparseable file), saying safe would be a false assurance. Pin your versions (`uv lock`, `pip freeze`, `poetry lock`) and scan again.\n\n**My `requirements.txt` only has `>=` ranges.** Ranges cannot be matched. Scan your installed environment instead: `pip freeze > requirements.txt` in a scratch folder, then scan that folder.\n\nA **safe** verdict is not proof of safety. Vulnerabilities without version data cannot be matched, vendor advisories without a CVE or GHSA record are not covered, and git dependencies are reported but not checked. Packages from a private registry are matched by name and version against public advisories, so a private package that shares a public name can cause a false positive.\n\n-  18 lockfile formats, `--fail-on` , SARIF, Markdown, GitHub Action\n-  `.cookedignore` ,`--baseline` ,`--strict` , offline cache\n- Pagination of OSV results (packages with more than 1000 advisories)\n-  Resolve `pom.xml` through Maven\n- Reachability hints (is the vulnerable function actually called?)\n\nPRs welcome, see [CONTRIBUTING.md](https://github.com/noushiFlex/am-i-cooked/blob/main/CONTRIBUTING.md).\n\nMIT. Vulnerability data comes from [OSV.dev](https://osv.dev) and [cve.now](https://cve.now); check their terms.", "url": "https://wpnews.pro/news/is-your-project-vulnerable-or-cooked-i-made-a-skill-that-checks-it-for-cves", "canonical_source": "https://github.com/noushiFlex/am-i-cooked", "published_at": "2026-10-23 12:05:10+00:00", "updated_at": "2026-10-23 12:14:01.807309+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "ai-safety"], "entities": ["am-i-cooked", "noushiFlex", "Claude Code", "Cursor", "Codex", "GitHub", "CISA KEV", "Node 18"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/is-your-project-vulnerable-or-cooked-i-made-a-skill-that-checks-it-for-cves", "markdown": "https://wpnews.pro/news/is-your-project-vulnerable-or-cooked-i-made-a-skill-that-checks-it-for-cves.md", "text": "https://wpnews.pro/news/is-your-project-vulnerable-or-cooked-i-made-a-skill-that-checks-it-for-cves.txt", "jsonld": "https://wpnews.pro/news/is-your-project-vulnerable-or-cooked-i-made-a-skill-that-checks-it-for-cves.jsonld"}}