Getting started
Arol scans a repository for usage of third-party APIs, SDKs, and model ids that are deprecated or scheduled to be retired — cited by exact file and line. This page takes you from nothing installed to a tuned CI gate.
Install
No install needed — npx runs the latest version:
npx arol-ai scan
Prefer a global install (Node 18+):
npm install -g arol-ai
arol-ai scan
Your first scan
Run it from the root of any repository:
npx arol-ai scan
This scans the directory you're standing in: it walks your source files
(.js .ts .jsx .tsx .py .go and friends), checks real usage against the deprecation
dataset, and prints a report — typically in a few seconds. Everything runs locally; your
code is never uploaded.
To scan somewhere else without changing directories, pass a path:
npx arol-ai scan ./my-repo
Useful when you keep several repos side by side, or in scripts that scan a checkout at a known location. Everything else on this page works identically with or without the path argument.
Reading the report
● OpenAI · Assistants API (beta) HIGH
references a deprecated API · sunsets 2026-08-26 (in 40 days)
found in:
src/agents/run.ts:42 → beta.assistants
→ migrate: https://platform.openai.com/docs/assistants/migration
Top to bottom: what's deprecated and how severe · when it breaks · the exact lines in
your code · the vendor's migration guide. A clean scan prints
✓ No upcoming deprecations detected. For what to do with a finding, see
Handling scan failures.
Everyday options
Skipping paths: --ignore and .arolignore
npx arol-ai scan --ignore 'docs/**' --ignore '**/*.gen.ts'
Dependency and build directories (node_modules, dist, .venv, vendor, …) are
skipped automatically — --ignore is for your paths: generated code, vendored examples,
fixture folders, anything you can't or won't fix. The flag is repeatable and takes
gitignore-style globs.
For permanent exclusions, put the same globs in a .arolignore file at the repo root so
every scan (local and CI) agrees:
# generated SDK examples we never run
examples/
**/*.gen.ts
Comments (#), leading / anchoring, and trailing / for directories all work like
.gitignore. --ignore flags and .arolignore combine — you never need to choose.
Machine-readable output: --json
npx arol-ai scan --json
Emits the full scan as JSON instead of the report: file counts, dataset provenance
(origin, fetchedAt), severity counts, and every finding with its id, severity, status,
dates, vendor source URL, confidence, and exact file/line matches. Exit codes behave
identically, so you can keep the CI gate and feed dashboards or custom tooling:
# e.g. list finding ids with their sunset dates
npx arol-ai scan --json | jq -r '.findings[] | "\(.id) \(.sunset_date)"'
The schema is treated as a public interface: fields get added over time, never renamed or removed — safe to build scripts against.
Plain text: --no-color
npx arol-ai scan --no-color
Disables ANSI colors for log archives and text diffs. You rarely need it explicitly:
colors already auto-disable when output isn't a terminal (piped or redirected), and the
standard NO_COLOR environment variable is respected. The inverse exists too —
FORCE_COLOR=1 keeps colors on in CI systems that render them.
Adding it to CI
One line in any CI system. GitHub Actions:
name: arol deprecation scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20 }
- run: npx arol-ai scan
npx arol-ai scan is the only line that matters — it works identically in GitLab CI,
CircleCI, Jenkins, or a cron job.
Tuning the CI gate
Exit codes are designed so a red build always means something real:
| Code | Meaning |
|---|---|
0 |
Clean, or warn-only findings (printed, not build-breaking). |
1 |
An actionable finding — see below. |
2 |
Misconfiguration: bad path, unreadable dataset, or zero scannable files (a mis-pointed scan must not go green). |
A finding is actionable when it is high severity and not yet retired, or scheduled
to sunset within the window (--within <days>, default 30). Medium/low findings outside
the window, dateless deprecations, and already-retired items are warn-only. Findings whose
only evidence is in test files never fail the build.
npx arol-ai scan --within 7 # only fail when a sunset is < 1 week out
npx arol-ai scan --fail-on-retired # also fail on already-past high-severity sunsets
Advanced: dataset freshness & restricted environments
Before scanning, the CLI refreshes its deprecation dataset (one public JSON file, at most
once per 24h, cached in ~/.cache/arol). This is fail-soft: network trouble means the
cached/bundled dataset is used and the scan proceeds — a build can never break because a
download did. The report header shows which was used (dataset: updated today /
dataset: bundled).
Forcing a refresh: arol-ai update
arol-ai update
Fetches the latest dataset right now, ignoring the 24-hour window. The download is
validated before it replaces your cache — a truncated or corrupt file can never
overwrite a good one. Unlike scan, this command is deliberately loud: it exits 2 on
failure so you know the refresh didn't happen. Use it when a new deprecation was just
announced and you want to scan for it immediately, or in CI setups that pre-warm caches.
Going fully offline: --offline
npx arol-ai scan --offline
Disables all network use for this run — behavior identical to versions before
auto-refresh existed. The scan uses the cached dataset if one exists, otherwise the copy
bundled with the CLI, and the report header says so (· offline). For CI runners and
air-gapped machines, set it environment-wide instead:
AROL_OFFLINE=1 npx arol-ai scan
AROL_CACHE_DIR relocates the cache directory when ~/.cache isn't writable or you want
the dataset vendored alongside your pipeline.
Continuous monitoring: --report (early access)
npx arol-ai scan --report <token>
Create a token at arol.ai/dashboard/tokens (sign-in creates your account; free during early access). With a monitoring token, each scan also uploads its results and dependency inventory to your Arol dashboard — so new deprecations that land after your scan can be matched against what your repo depends on, and you get alerted without re-scanning. In CI, set the token as a secret instead of a flag:
AROL_REPORT_TOKEN=<token> npx arol-ai scan
--report-name <name> overrides the repo name shown in the dashboard (default: the
scanned directory's name). Reporting is strictly opt-in and fail-soft — no token means
nothing is ever sent, and an unreachable endpoint never affects the scan or its exit
code. Exactly what gets uploaded is documented in
Privacy & network.
Bringing your own dataset: --data
npx arol-ai scan --data ./our-deprecations.json
Scans against your own file — same schema as the bundled dataset, so you can track
deprecations of internal APIs, or pin an exact reviewed dataset snapshot in regulated
environments. --data replaces the public dataset rather than merging with it, and
auto-refresh is skipped entirely: you control that file's freshness. Schema details:
Dataset reference.
Rendered from docs/ci.md in the arol repository — edits there ship here.