macOS · Node, Bun, Deno, pnpm, yarn
どのプロジェクトがサポート終了のランタイムで動いていますか。
どのバージョンマネージャも、いま使っているバージョンは教えてくれます。runtly はさらに、どのバージョンがセキュリティパッチを受け取らなくなったか、どのプロジェクトがその上にあるか、そのうちどれに今も手が入っているかを教えます。
またはコマンドラインのみ
$curl -fsSL https://runtly.flatium.com/download | sh$ rt auditruntly audit7 projects, 1 runtime versions examined · data fetched 3 minutes agoactive project, unsupported runtime node 18.20.4 EOL 502d ago medium medium CVE-2025-23085 GOAWAY HTTP/2 frames cause memory leak outside heap https://nodejs.org/en/blog/vulnerability/january-2025-security-releases/ /Users/you/code/billing-worker /Users/you/code/checkout-api /Users/you/code/docs-site and 4 more 4 of 7 committed to in the last 90 days, 4 inherit the global default → rt install node@18.20.6 → rt use node@18.20.6 (4 project(s) inherit the default and are fixed by this alone)runtly audit examines the runtime, not your dependency tree. It does not replace `npm audit`.01課題
バージョンマネージャは番号を知っています。リスクは知りません。
nvm use とその仲間が答えるのは一つの問いだけです。いまどのバージョンが有効か。その問いは尋ねた瞬間に片付きますが、そのバージョンがまだパッチを受け取っているかについては何も語りません。
だから答えはたいてい外側からやって来ます。コンプライアンスの質問票、顧客のセキュリティレビュー、本番で動いている Node のバージョンを尋ねるベンダー調査票。その時点で一覧は手作業で作るしかありません。リポジトリを一つずつ開き、.nvmrc を一つずつ読み、バージョンを一つずつサポート期限表と突き合わせる。
runtly はその一覧を保持しています。どのバージョンが入っているか、どのプロジェクトがそれに解決されるか、各プロジェクトが最後にコミットされたのはいつか、公開されたアドバイザリが各バージョンについて何と言っているか。
02監査
監査
rt audit はスキャン済みのすべてのプロジェクトを見て、その背後にあるランタイムのバージョンを報告します。
検出結果は、先に見るべきものから順に並びます
これはツールが実際に出力するラベルを、出力される順に並べたものです。
- 01
active project, known vulnerability
直近 90 日以内にコミットされたプロジェクトが、公開アドバイザリのあるバージョンで動いている状態。
- 02
active project, unsupported runtime
いまも作業中のプロジェクトが、セキュリティパッチを受け取らなくなったバージョンで動いている状態。
- 03
critical vulnerability
プロジェクトが動いているかどうかに関わらず、マシン上のどこかにある critical のアドバイザリ。
- 04
losing security support soon
サポート終了が近いバージョン。まだ移行を計画する時間が残っているうちに。
- 05
dormant project on an old runtime
90 日以上触れられていないもの。報告はしますが、既定では折りたたまれます。今日の午後に直すべきものではありません。
すべてのアドバイザリを解消する最小のアップグレード
推奨されるのはメジャーではなく、具体的なバージョンです。2025 年 1 月のアドバイザリが未解消の Node 18.20.4 なら、それは 18.20.6 であって「22 に上げろ」ではありません。顧客との契約で Node 18 に留められている人に後者は実行できませんが、前者なら今日の午後に実行できます。
バージョンを固定せずグローバル既定を継承しているプロジェクトについては、runtly はそのことを明示し、まとめて直せる一つのコマンドを添えます。
終了コードが 0 以外になるので、CI に置けます
rt audit --fail-on=critical は検出がしきい値に達したとき失敗の終了コードを返します。--fail-on は high、medium、low、eol、never も受け付けます。--json は読み取りたい何かのために、レポート全体を出力します。
$ rt audit --fail-on=eol$ echo $?1オフラインで動き、そのことを隠しません
アドバイザリのデータは 24 時間キャッシュされるので、機内でも監査は動きます。どのレポートも 2 行目に、そのデータがどれだけ古いかを書きます — data fetched 3 minutes ago、あるいは 9 hours ago。
データの出どころ
- endoflife.date
- サポート期間とサポート終了日のカレンダー。
- Node.js Security WG
- Node.js Security Working Group の脆弱性データベース。
- OSV.dev
- オープンソース脆弱性データベース。
03解決
解決
runtly は作業ディレクトリから上へたどり、最初に見つかった答えを採用します。規則は「近さが勝つ」です。優先度の低い近くのファイルが、優先度の高い遠くのファイルに勝つので、ワークスペースのメンバーがモノレポのルートを上書きします。逆ではありません。
| # | ファイル | 備考 |
|---|---|---|
| 1 | 1.runtlyrc | runtly 自身のファイル。rt pin が書き出します。 |
| 2 | 2.nvmrc | そのまま読むので、既存のリポジトリに変更は要りません。 |
| 3 | 3.node-version / .bun-version | 単一ランタイム向けの慣習。 |
| 4 | 4.tool-versions | asdf と mise のプロジェクト。 |
| 5 | 5package.json → packageManager | Corepack のフィールド。pnpm と yarn 用。 |
| 6 | 6package.json → engines | 範囲指定はインストール済みのバージョンに対して解決され、最も高い一致が勝ちます。 |
満たせない制約はエラーであり、フォールバックではありません
プロジェクトがインストールされていないバージョンを要求した場合、runtly は止まってそう伝えます。PATH にたまたま載っているものを黙って実行することはありません。その静かなすり替えこそ、一週間後に「手元では通るのに CI で落ちる」になる失敗そのものです。
$ node --versionerror: this directory requires node `20.99.0`, and no installed version satisfies it. Declared in: /Users/you/code/bad/.nvmrc (.nvmrc) Install one: rt install node@20.99.0rt current は、決定したファイルの名前を出します
「なぜ間違ったバージョンになっているのか」の答えはパスであり、ツールはそのパスを出力します。
$ rt current/Users/you/code/mono/packages/web runtime version source node 18.20.4 /Users/you/code/mono/packages/web/.nvmrc (.nvmrc)04速度
速度
shim は node を呼ぶたびに先に走るので、コストはゼロでなければなりません。hyperfine で 500 回計測。
exec を呼ぶだけの、何もしない Rust バイナリ | 1.9 ms |
|---|---|
runtly の shim、解決してから exec を呼ぶ | 1.9 ms |
解決の処理は無料です。残っているのはプロセスを起動するために macOS 自身が要求する代金で、これは誰にも取り除けません。
05アプリ
アプリ
CLI と GUI の下に共通のコアが一つあるので、何が入っていて何が危ういかについて両者が食い違うことはありません。メニューバーの項目から、ウィンドウを開かずにバージョンを切り替えられます。

セキュリティ
使用中のすべてのバージョン、そのサポート状態、そしてその背後にあるプロジェクト。

ランタイム
Node、Bun、Deno、pnpm、yarn のインストール済みバージョンと、上流で利用できるもの。

プロジェクト
スキャンした各プロジェクトが何に解決されるか、そしてどのファイルが決めたか。
06限界
これができないこと
セキュリティの守備範囲を大きく言うのは、何も言わないより悪い結果になります。根拠のない安心を作るからです。限界は三つ、そのまま書きます。
監査するのはランタイムであって、依存関係ツリーではありません
runtly が報告するのは、プロジェクトが動いている Node、Bun、Deno のバージョンです。
node_modulesの中のパッケージについては何も言いません。npm auditの代わりにはならず、これを走らせることがそれを走らせる代わりにもなりません。Bun と Deno では、「検出なし」は「誰もそのデータを公開していない」という意味です
どちらのプロジェクトも、Node にあるような公開アドバイザリデータベースを持っていません。runtly はそれらのサポート終了状態は報告し、きれいなレポートが知りようのないことをほのめかさないよう、この警告を自分で出力します。
macOS のみ
Apple Silicon と Intel、macOS 10.15 以降。Windows 版も Linux 版もなく、約束もしていません。
07無料
無料、そしてクローズドソース
無料でクローズドソースの開発者ツールには、すぐに一つ疑問が湧きます。ですから、このソフトウェアが実際に何をするかを書きます。
- アカウントなし、サインアップなし、ライセンスキーなし
- ダウンロードして使うだけです。登録するものも、有効化するものもありません。
- テレメトリなし、いかなる解析もなし
- アプリはあなたについても、あなたのマシンについても、一切報告しません。
- shim はネットワークに触れません
- `node` を呼ぶたびに先に走る部分は、ネットワークリクエストを一切行いません。
- ダウンロードは展開前に検証されます
- すべてのランタイムは、配布元自身が公開している SHA256 と照合されます。アプリ自体は Apple による署名と公証を受け、ユニバーサルバイナリとして配布されます。
行うネットワークリクエストの全部
- nodejs.org/distNode のリリース配布
- api.github.comBun と Deno のリリース情報
- GitHub release downloadsBun と Deno のバイナリ
- registry.npmjs.orgpnpm と yarn
- endoflife.dateサポート期間のカレンダー
- raw.githubusercontent.com/nodejs/security-wgNode.js のアドバイザリデータベース
- api.osv.devオープンソースの脆弱性データ
あなたが手で取りに行くのと同じ場所です。ほかには、どこへも行きません。
08インストール
インストール
三つの経路があり、マシンに入るものは同じではありません。
アプリをダウンロード
アプリとコマンドラインApplications にドラッグして開き、Set up now を押します。アプリが shim をインストールし、シェルの設定も自分で行います — どの段階でもターミナルは不要です。
Homebrew
どちらの行を実行するかによりますアプリと CLI
$brew install --cask hieuhuynh93/tap/runtly-appCLI のみ
$brew install hieuhuynh93/tap/runtlyシェルインストーラ
コマンドラインのみ — ウィンドウが意味を持たないサーバーと CI 向けCLI
$curl -fsSL https://runtly.flatium.com/download | shCLI とアプリ
$curl -fsSL https://runtly.flatium.com/download | RUNTLY_WITH_APP=1 sh同じ署名済みバイナリをダウンロードし、展開前に公開された SHA256 と照合し、runtly setup まで実行します。
実際に実行されるスクリプトです。先に読んでおきたい場合は: https://dl.runtly.flatium.com/install.sh
どの経路を選んでも最終状態は同じです。PATH に ~/.runtly/bin が載り、rt doctor が緑を返します。


