ubon
Version:
Security scanner for AI-generated apps (Cursor, Lovable, Windsurf, v0). Catches hardcoded secrets, prompt injection, hallucinated imports, Server Actions / Edge runtime mistakes, and the vibe-coded vulnerabilities traditional linters miss.
120 lines (92 loc) • 5.82 kB
Markdown
# Upgrading to Ubon v3.0.0
v3 is a single, focused release that modernizes the toolchain, ships
the AI-era rule pack, and adds first-class MCP / Cursor hooks. It is
breaking on purpose — the surface area is smaller, the signal is
higher, and the JSON output schema is now versioned (`2.0.0`).
This page is the short list of things you need to change. The release
notes in [`CHANGELOG.md`](./CHANGELOG.md) cover everything else.
## Hard requirements
- **Node.js 20 or newer.** Ubon v3 drops Node 16 and 18 (both EOL).
Run `ubon doctor` to verify.
- **npm 10+** for provenance and overrides; older npm still installs
but you'll see a peer warning.
## Removed
| Removed | Replacement |
| ------------------------------------ | ---------------------------------------------------------- |
| `ubon guide` command | `ubon --help`, README, and `docs/` |
| Random "show guide" suggestion | Gone — the human reporter is fully deterministic now |
| `chalk` dependency | Internal `picocolors` shim (no API change in user output) |
| `.eslintrc.json` (project's own) | `eslint.config.js` (flat config, ESLint 9) |
| `src/rules/registry.ts` (empty stub) | The real registry was already in `src/rules/index.ts` |
## Removed profiles and scanners
v3 narrows Ubon's scope to modern JS/TS web stacks. The following
profiles, scanners, and rule families are **gone** in v3.0.0. Selecting
them via `--profile` exits with status `2` and prints the suggested
replacement:
| Removed | Why | Use instead |
| -------------------------------------- | -------------------------------------------- | ---------------------------------------------------- |
| `--profile python`, `PYSEC*`, `PYNET*` | Python is a different ecosystem with mature, dedicated tooling | [Bandit](https://bandit.readthedocs.io/), [Semgrep](https://semgrep.dev), or [pip-audit](https://pypi.org/project/pip-audit/) |
| `--profile rails`, all `RAILS*` rules | Same story for Ruby; we never reached parity with Brakeman | [Brakeman](https://brakemanscanner.org) |
| `--profile vue`, `VUE001` | Vue/Nuxt patterns differ enough to dilute focus | [`eslint-plugin-vue`](https://eslint.vuejs.org) plus your existing Supabase/Pinia audits |
| `.py` auto-detection in `auto` | Tied to the Python profile that no longer exists | n/a — `auto` now only flips between `lovable` and the JS baseline |
Existing `ubon.config.json` files that pin one of these profiles need a
single edit:
```diff
- "profile": "python"
+ "profile": "auto"
```
## Deprecated (will be removed in v3.1)
| Deprecated | Use instead |
| --------------------------------------- | ----------------------------------------------------------- |
| `--crawl-internal` (Puppeteer crawler) | Use Playwright-based external tools; flag still works under `UBON_ALLOW_REMOTE_CRAWL=1` for now |
| Loading `ubon.config.js` by default | Pass `--allow-config-js` or set `UBON_ALLOW_CONFIG_JS=1` |
When a deprecated flag is observed, Ubon prints a one-line warning and
keeps working.
## New behaviour worth knowing
- **JSON output schema is now `2.0.0`.** Sorted keys, sorted results,
no `undefined` fields. If you parse Ubon JSON in CI, expect a
byte-stable diff per scan. The schema is published at
`docs/schema/ubon-finding.schema.json` and reachable via
`ubon check --schema`.
- **`--ndjson`** is the new agent-friendly format: one finding per line.
- **`--quiet`** suppresses banners, summaries, and contextual
guidance — keep errors visible. `--json` and `--ndjson` imply quiet.
- **`ubon mcp`** runs Ubon as a Model Context Protocol server. The
required SDK ships as an `optionalDependency` of `ubon`, so most
installs pick it up automatically. If your install flags skipped it,
add `@modelcontextprotocol/sdk` to the same scope as `ubon` (global or
project-local). Full guide: [`docs/MCP.md`](docs/MCP.md).
- **`ubon hooks install --cursor`** writes `.cursor/hooks.json` and
shell scripts for `afterFileEdit` and `beforeSubmitPrompt`.
- **`ubon doctor`** reports Node version, optional deps, and config
health.
- **Crawler SSRF guard:** `--crawl-start-url` is restricted to
`localhost`-class addresses by default. Override with
`UBON_ALLOW_REMOTE_CRAWL=1`.
- **`maxFileSize` guard:** files over 1 MiB are skipped by default to
avoid pathological regex backtracking. Configure via the
`maxFileSize` config key.
## Programmatic API
`UbonScan` constructor now takes an optional fourth argument:
```ts
new UbonScan(verbose, silent, colorMode, quiet);
```
`quiet` is additive — existing 3-arg call sites keep working.
## Output stability
If you have a baseline file from v2.x:
```bash
# Re-generate it once with v3 to pick up the deterministic ordering
ubon check --baseline .ubon-baseline.json --update-baseline
```
Fingerprints are stable across runs but were re-keyed slightly between
2.x and 3.0 to include the canonical `ruleId` ordering.
## Smallest possible upgrade
```bash
nvm use 20
npm install -g ubon@latest
ubon doctor
ubon check --json --schema # confirm new schema
ubon check --baseline .ubon-baseline.json --update-baseline
```
If anything regresses, file an issue with the output of `ubon doctor`
and the failing command.