港 minato
localhost のポートを、どのプロジェクトのどの開発サーバーかで一覧する CLI。
設定ファイルからポートの台帳を作り、別のアプリが同じ番号を宣言していたら知らせ、空いている番号を提案する。依存ゼロ。
$ minato conflicts ⚠ 衝突 5 件 — 同じポートを別のアプリが宣言している 5380 - maai ~/ranzo_project/maai/vite.config.js:4 - sora-shirabe ~/ranzo_project/sora-shirabe/package.json:7 5410 - kemuri-ate ~/ranzo_project/kemuri-ate/vite.config.js:4 strictPort なし→黙ってずれる - kemuri-so ~/ranzo_project/kemuri-so/vite.config.js:4 strictPort なし→黙ってずれる 5730 - denpa-scope ~/ranzo_project/denpa-scope/server.js:12 既定値 - sokomi ~/ranzo_project/sokomi/vite.config.js:4 $ minato suggest --next 5970 範囲 5000-5999・10 刻み。台帳の番号、strictPort なしの宣言の +1〜+2、5000/7000(AirPlay)、5173/4173(Vite 既定)を避けた 127.0.0.1 と :: で実際に bind できることを確かめた
なぜ
アプリを何十本も作っていると、ポート番号はいつのまにか重なる。実際、手元の 130 あまりのプロジェクトを走査したら 5 か所で重複していた。
片方が strictPort なしだと Vite は黙って次の番号にずれるので、気づかないまま「開いたら別のアプリだった」が起きる。
港は、各リポジトリの vite.config・package.json・.env・サーバーのコードから台帳を作り、lsof で今の待ち受けと突き合わせる。
つかいかた
git clone https://github.com/Jinshin2534/minato && cd minato && npm link minato # 台帳 + 稼働状況 + 衝突 + 空き候補 minato conflicts # 衝突だけ(あれば終了コード 1) minato suggest # 空いているポートを3つ(bind して確かめる) minato suggest --next # いちばん大きい番号の次の区切り minato who 5173 # 宣言しているアプリと、いま使っているプロセス minato live --all # いま待ち受けているポート # 走査するフォルダ(既定 ~/ranzo_project:~/orca/workspaces) MINATO_ROOTS=~/code:~/work minato
何を拾うか
| 場所 | 例 | 確度 |
|---|---|---|
vite.config.* | server: { port: 5410 }・preview・strictPort | 宣言 |
package.json の scripts | vite --port 5380・-p 3020・PORT=3030 | 宣言 |
.env | PORT=3000・API_PORT=8080 | 宣言 |
| サーバーのコード | process.env.PORT ?? 5460 | 既定値 |
| 同上 | .listen(4000) | 推定 |
| どこにも書いていない Vite アプリ | — | 暗黙(5173) |
正直さのための作り
- 測れないときは測れないと言う。
lsofが無い・走査対象が見つからないときに、空の結果で「衝突なし」「全部空き」とは言わない。 - lsof は自分のプロセスしか見えないことがある。 だから提案する番号は実際に bind して確かめ、できなかった番号は理由つきで外す。
- 同じアプリの別ワークツリーは衝突にしない。 同じ git リポジトリかつ同じ package 名なら同じアプリ。
- 確度を隠さない。 設定に書かれた宣言・環境変数の既定値・コードからの推定・Vite 既定(暗黙)を分けて見せる。暗黙どうしは衝突に数えず、別枠で注意する。
- どの宣言も
ファイル:行で示すので、その場で直せる。
しくみ
- Node だけで動く(実行時の依存ゼロ)。設定ファイルは実行せずに文字列として読み、中かっこの入れ子を数えて
portがserver・preview・hmrのどこにあるかを決める。 lsof +c 0 -nP -iTCP -sTCP:LISTEN -Fpcnの機械向け出力を読む。プロセスの所属はcwdとコマンドライン中のパスで決める。- 台帳づくり・衝突検出・lsof の読み取りは純粋関数で、Vitest 100 件で固めている。