@nuwel-dev/setup
v1.0.3
Published
figma-kit のセットアップウィザード(公開 npm・秘密ゼロ)。GitHub Packages のトークンを ~/.npmrc に置き、@nuwel-dev/figma-kit の init へ橋渡しする。
Readme
@nuwel-dev/setup
figma-kit のセットアップウィザード(公開 npm・秘密ゼロ・依存ゼロ)。
npx @nuwel-dev/setup2 回目以降の実行(ウィザードが
~/.npmrcに@nuwel-dev:registry=https://npm.pkg.github.comを書いた後)は、 この橋自身は公開 npm 側に在るため scope registry を明示して実行する:npx --@nuwel-dev:registry=https://registry.npmjs.org @nuwel-dev/setup
動作環境(始める前に)
| | 要件 | 満たさない時 |
|---|---|---|
| OS | macOS / Linux(Windows は WSL2 の Linux 側で) | トークンを尋ねる前に停止します |
| Node | 22.18 以上 / 24.11 以上 / 26 以上(23・25 は不可) | 同上(nvm / Volta で切り替えてから再実行) |
どちらもウィザードの起動直後に検査します。発行済みのトークンが宙に浮かないよう、
秘密を尋ねる前に落とす設計です(旧版は .npmrc を書き終えた最後の 1 手で英語のエラーになりました)。
これは何をするか
- 前提(OS / Node 版・
~/.npmrcに安全に置けるか)を検査する — 満たさなければここで停止 - GitHub のトークン作成ページ URL を表示する(
read:packagesにチェック済みの URL) - 貼り付けられたトークンを受け取る(画面には表示しない)
- 先に接続確認する(
~/.npmrcはまだ触りません)。401 / 403 / 404 を平語で説明します(「招待をまだ Accept していない」等) - 通った時だけ
~/.npmrcにスコープ行と authToken を書く(権限 600・他の行は壊さない・原子的に置き換え) @nuwel-dev/figma-kitの latest を解決してメジャー(1)を検査し、その正確な版でinitへ委譲する(^1のようなレンジは prerelease〈1.4.0-alpha.x〉に一致しないため使いません)
失敗しても
~/.npmrcは 1 バイトも変わりません。 順序が 4 → 5 なのはそのためです。 誤入力・期限切れ・権限不足のトークンを 1 回貼っただけで、それまで動いていた別のトークン (//npm.pkg.github.com/:_authToken)が消えては困るからです。書き込みは新しいファイルを作ってrenameで置き換えるので、「途中まで書けた壊れた.npmrc」も残りません。
接続確認の経路(企業 proxy 下でも止まらないように)
第一手は npm そのもの(npm view @nuwel-dev/figma-kit version --registry=https://npm.pkg.github.com)です。
キットを実際に落とすのも npm なので、~/.npmrc の proxy / https-proxy / cafile / strict-ssl が
そのまま効きます。トークンは npm の引数には渡さず環境変数だけで渡します(引数は同じマシンの
他のユーザーから ps で読めるため)。問い合わせ先はコマンドラインで固定するので、~/.npmrc に
古い @nuwel-dev:registry= が残っていても、そちらへ問い合わせて「接続できました」と誤表示することは
ありません。
npm が無い・時間内に終わらない・HTTP として判定できない場合だけ、直接 HTTPS で確かめます(その旨を表示)。
どちらか一方でも通れば合格にします — proxy 下は npm だけが通り、配布物が prerelease だけの時は
直接接続だけが通るので、片方の失敗で買い手を止めないためです。
残っているリスク(正直に)
版は固定しますが、受け取った tarball が発行元の物かの検証はローカルでは行っていません
(npm が lockfile の integrity で tarball のハッシュは検証しますが、それは「レジストリが返した物と
lockfile が一致する」ことであって「発行元が出した物である」ことではありません)。
発行元の同一性は、figma-kit diagnose の「配布物同一性」が出す pkg-merkle を、
リリース告知に載る値と照合して確認してください。
なぜ公開 npm にあるのか
キット本体 @nuwel-dev/figma-kit は GitHub Packages の限定配布で、トークンを設定しないと落とせない。
その手順自体を限定配布側に置くと鶏と卵になる。この橋だけを公開側に置いて解く。
橋は攻撃面でもあるので、秘密を 1 バイトも含まず・依存を 1 つも持たない。 publish は provenance 付き(公開レジストリでのみ効く)。
トークンの扱い(設計)
- 書き込み先は
~/.npmrcだけ。案件ディレクトリの.npmrcにはスコープ行しか書かない(figma-kit initが書く・.gitignore済み) - stdout・ログ・エラーメッセージにトークンを出す経路を持たない(表示は
redact()のマスクのみ) - 例外は種別(
e.code)だけを表示する(例外メッセージにトークンが載る事故を構造で防ぐ) - 子プロセス(接続確認の
npm)へは環境変数だけで渡す。コマンドライン引数には載せません - 接続確認に失敗したら
~/.npmrcは一切変更しません(成功した時だけ、新しいファイルを作ってrenameで原子的に置き換えます)
マスク表示の仕様: 登録の成功行に abcd…yz(40 文字) の形で 先頭 4 文字・末尾 2 文字・全体の文字数だけを
表示します(それ以外は 1 文字も出しません)。これは「貼り付けが途中で切れていないか」「別の値を貼っていないか」を
買い手が自分で確かめられるようにするためで、意図的な仕様です。全部を隠すと、失敗時に何が起きたか誰も分かりません。
非対話フラグ(テスト・CI 用)
| flag | 意味 |
|---|---|
| --no-verify | 接続確認を行わない(確認せずに書く唯一の経路。ネットワークが無い環境での明示指定) |
| --no-init | figma-kit init へ委譲しない |
| --home=<dir> | ~/.npmrc の代わりに <dir>/.npmrc を書く |
| --dir=<dir> | init を実行する案件ディレクトリ(既定は cwd) |
