Arol

Getting started

Arol catches deprecated third-party APIs, SDKs, and model ids in your code — exact file and line — before their sunset dates. It's two commands: npx arol-ai scan audits the repo you're standing in right now, and npx arol-ai init makes it continuous: a gate on every PR plus a weekly scheduled scan, so the next deprecation finds you before its shutdown date does. One is the audition, the other is the point.

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

GitHub Actions: one command

npx arol-ai init

This writes .github/workflows/arol.yml — review it in your diff, commit, and push. The generated workflow scans every pull request and push to main/master, and runs a weekly scheduled scan. The schedule matters more than it looks: deprecations land on repos where nobody is pushing, and GitHub emails you when a scheduled run fails — that email is your early warning.

init is deliberately cautious: it never overwrites an existing workflow (use --force to regenerate), it recognizes a hand-written arol workflow under any other filename and leaves it alone, and it writes nothing when the repo's remotes aren't GitHub.

After writing the workflow, init offers to finish monitoring setup in the same breath: paste a token from arol.ai/dashboard/tokens and it does two things. First, it saves the token for this repo only — into .git/arol-token, which git can never commit or push — so local scans of this repo report to your dashboard immediately (rm .git/arol-token turns that off). Second, if you have the GitHub CLI installed, it sets the AROL_REPORT_TOKEN repo secret on the spot so CI scans report too; without gh, it prints your repo's exact secrets-settings link instead. The prompt only appears in interactive terminals (CI runs skip it), Enter skips it, --token <token> supplies it non-interactively, and re-running arol-ai init later brings the offer back.

The scope rule is deliberate: only the repo you configured reports — from your laptop or from CI. Every other repo you scan stays fully local. There is no global token and no machine-wide state; scanning a repo you never ran init in uploads nothing, ever.

Everywhere else: one line

npx arol-ai scan is the only line that matters — it works identically in GitLab CI, CircleCI, Jenkins, or a cron job. GitLab, for instance:

arol:
  image: node:20
  script: npx arol-ai scan

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

npx arol-ai scan --report <token>

Opt-in reporting for the Arol dashboard: each scan uploads results and your dependency inventory so new deprecations can alert you without a re-scan. Full setup, payload details, and findings vs notifications: Continuous monitoring. Privacy of what gets sent: Privacy & network.

In CI, set AROL_REPORT_TOKEN as a repo secret (the arol-ai init workflow already reads it). --report-name <name> overrides the dashboard repo name. No token means nothing is ever sent; an unreachable endpoint never affects the scan or its exit code.

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.