macOS環境の設定ファイルを管理するリポジトリです。シンボリックリンク方式で、実ファイルをこのリポジトリ内に置き、ホームディレクトリからリンクを張ります。
dotfiles/
├── setup.sh # セットアップスクリプト(シンボリックリンク作成)
├── macos.sh # macOS設定の自動適用スクリプト
├── Brewfile # Homebrewパッケージ一覧
├── zsh/
│ ├── .zshrc # シェル設定(mise, direnv, PATH)
│ ├── .zprofile # ログインシェル設定(Homebrew)
│ └── .zshenv # 全シェル共通の環境変数
├── git/
│ └── .gitconfig # Gitのグローバル設定
├── mise/
│ └── config.toml # miseで管理する言語ランタイム・ツール定義
├── gh/
│ └── extensions # gh拡張機能一覧
├── claude/
│ ├── CLAUDE.md # グローバル指示
│ ├── settings.json # Claude Code設定
│ ├── skills/ # カスタムスキル
│ └── hooks/ # フック設定
└── docs/
└── tools/ # 開発ツールのドキュメント
調子が悪い場合や、新しいMacへ移行する前の既存Macの整理時に実施します。初期化後は「新しいマシンでのセットアップ」に従います。
参考: Macを消去して出荷時の設定にリセットする - Apple公式
- PCのデータをバックアップします(Time Machineまたは外付けディスクへコピー)
- クラウドで管理できないアプリの設定をエクスポートします
- Raycast — Advanced → ExportでDropboxに設定ファイルをエクスポートします
- デバイス台数に上限があるアプリのライセンス認証を解除します。Adobe・Microsoft Officeなどのサブスクリプション製品や、1Passwordなどのセキュリティ系アプリが対象になることがあります。管理者に確認してから進めます
- システム設定 → 一般 → 転送またはリセット → すべてのコンテンツと設定を消去
- ウィザードにしたがって進めます。次が自動で処理されます
- Apple IDのサインアウトとアクティベーションロックの解除
- 「Macを探す」の解除
- Bluetoothデバイスのペアリング解除
- Touch IDの指紋情報の削除
macOSのセットアップウィザードにしたがって、Wi-Fiへ接続し、Apple IDでサインインします。
各種情報を参照するため、最初に開いておきます。
キーマップやペアリング情報はキーボード本体に保存されるため、新しいMacで必要な作業はペアリングだけです。キー操作の詳細は取扱説明書(PDF)を参照してください。
- キーボードの電源スイッチを長押し(1秒以上)して電源を入れます
Fn + Qを押してペアリング待機モードにしますFn + Control + 数字キー(1〜4)を押して登録先のスロットを指定します。スロット1を自宅用のMac、スロット2以降を案件用のマシンに割り当てます- Mac側のBluetooth設定で「HHKB-Hybrid_n」(nはスロット番号)を選び、表示されたペアリング用の数字を入力します
- 「キーボードの種類を選択」が出たら「JIS(日本語)」を選びます
次はセットアップ手順では不要ですが、定期的に必要になる操作です(設定はキーボード本体に保存されます)。
- 接続先の切り替え:
Fn + Control + 数字キー(1〜4)で登録済みのスロットを切り替えます - USB Type-C接続への切り替え:
Fn + Control + 0で切り替えます。ファームウェア更新時はBluetoothではなくUSB接続が必要なため、先にこの操作をします - ファームウェアの更新: HHKBキーマップ変更ツールのメニュー「ヘルプ → 更新プログラムの確認 → HHKBファームウェア」で最新版が出たら
.hfbファイルをダウンロードし、「キーボードファームウェア更新」から適用します
Macの詳細設定は後の手順で行うため、ここでは作業しやすくするための最小限の設定にとどめます。
- システム設定 → ディスプレイ → 配置で外部モニターを主ディスプレイに設定します
- 解像度を変更します(27インチ4Kの場合は3008×1692)
- マウスを接続し、システム設定 → マウスで速度を最大に設定します
xcode-select --installmise管理下には置かず、公式ネイティブインストーラーで導入します(npm版は非推奨です。自動更新がmiseのshimsと競合するため)。curlだけで入り、Homebrewやmiseに依存しません。先に入れておくと、以降の手順でClaudeに相談しながら進められます。
curl -fsSL https://claude.ai/install.sh | bashインストーラーは本体バイナリ(約200MB)を進捗表示なしでダウンロードします。実行後しばらく無反応に見えますが、これは正常な挙動なのでCtrl+Cで中断しないでください。回線次第で数分かかります。完了を待つ間は別のターミナルタブでステップ6(Homebrew)以降を進めて構いません。進捗を確認したい場合は、別タブで次のコマンドを繰り返します(サイズが増えていればダウンロード中です)。
ls -l ~/.claude/downloads/完了すると~/.local/bin/claudeに配置されます。この時点ではPATH優先設定がまだ効かないため、フルパスで動作確認します(旧版が残っている場合のシャドウ回避のため、初回は必ずフルパスで叩きます)。
~/.local/bin/claude --version
~/.local/bin/claude doctorステップ7のdotfiles適用後は.zshrc/.zshenvで~/.local/binがmiseのshimsより前に来るため、ネイティブ版が優先されます。ネイティブ版が自動更新を担うため、DISABLE_AUTOUPDATER等は設定しません。
6. Homebrewをインストールする
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Apple Siliconの場合、インストール完了時にPATHを通すコマンドの案内が表示されます。案内にしたがって次を実行します(.zprofileへの追記はステップ7でdotfilesのsymlinkに置き換わりますが、現在のシェルへ反映するためここで実行します)。
echo >> ~/.zprofile
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"作業ディレクトリはホーム直下に作ります。MYは個人リポジトリ、PROJECTは案件リポジトリ、Screenshotはスクリーンショットの保存先です。~/Documents配下は避けます(iCloud同期の対象だとコピーが遅くなったり、rebase実行時に不要なファイルが生成されたりするため)。クローンはSSH設定前のためHTTPSを使います。
mkdir -p ~/MY ~/PROJECT ~/Screenshot
git clone https://github.com/manabuyasuda/dotfiles ~/MY/dotfiles
brew bundle install --file=~/MY/dotfiles/Brewfile --verboseインストールの途中で、アプリ(cask)によってはパスワードを求められる場合があります。brew bundle installが完了すると、次のように表示されます。
Homebrew Bundle complete! XX Brewfile dependencies now installed.
brew bundle installの完了後、続けて次を実行します(setup.shはインストール完了直後に実行できます)。
cd ~/MY/dotfiles && ./setup.sh
mise trust ~/.config/mise/config.toml
mise install node
mise install
mise exec -- npm ci
mise exec -- npx lefthook installbrew bundle installとmise installはどちらも時間がかかります。完了を待つ間、依存関係のないステップ8(SSH鍵)・9(フォント)・11(macOS設定)を並行して進められます。
setup.shは次を実行します。何度実行しても安全です(冪等)。
- 既存ファイルを
~/.dotfiles_backup/にバックアップしてからシンボリックリンクを作成します gh/extensionsに記載されたgh拡張機能をインストールしますnode_modulesがある場合はlefthookのpre-commitフックを配置します(npm ciより前に実行するとスキップされるため、後述のnpx lefthook installで別途配置します)
mise installの各行は次の理由によります。
mise trustは、カレントディレクトリのリポジトリ内にあるmise/config.tomlがローカル設定として検出され、未信頼のままでは読み込めないために実行します。nodeを先に単体で導入するのは、npm:バックエンドのツール(mermaid-cliなど)がバージョン解決にnpmを必要とするためです。nodeがない状態でmise installを実行するとnpm:*の解決がNo such file or directoryで失敗します。pnpmはmiseのバックエンドがGitHubのリリースから取得するため、回線によっては取得に数分かかります。無反応に見えても中断せず完走させてください。
Important
このセットアップは~/.npmrcにignore-scripts=trueとmin-release-age=5(サプライチェーン対策)が設定されている前提です。これにより次の2点に注意が必要です。
mise installが公開直後の新版で失敗することがあります。min-release-age=5は公開から5日未満の版を拒否するため、npm:ツールのlatestがそうした版を解決するとNo matching version found ... with a date before ...(npmのETARGET)で失敗します。バージョンは固定せずlatestのままにし、失敗したときは後述の「mise installがETARGETで失敗する場合」の手順で対応します。npm ciでprepareスクリプトが走りません。ignore-scripts=trueによりprepare(lefthook install)が実行されないため、pre-commitフックは自動配置されません。上記コマンド列のmise exec -- npx lefthook installで明示的に配置します(setup.shもnode_modulesがあれば配置します)。詳細は「textlintとpre-commitフック」を参照してください。
mise installが次のように失敗するときは、対象ツールのlatestが公開5日未満で、~/.npmrcのmin-release-age=5に拒否されています。
mise ERROR npm failed
npm error code ETARGET
npm error notarget No matching version found for vercel@54.7.1 with a date before ...
サプライチェーン対策(公開直後の版を避ける)を維持して対応する場合は、公開から5日経過してからmise installを再実行します。その間、当該ツールが無くても他のセットアップは進められます。
急いで導入する必要があり、対象リリースを信頼できると判断できる場合に限り、その実行のときだけmin-release-ageを無効化します(~/.npmrcは書き換えません)。対象ツールを名指しして上書き範囲を最小化します。
NPM_CONFIG_MIN_RELEASE_AGE=0 mise install npm:vercel@latest複数のツールがまとめて失敗するときは、引数を付けずに実行すると未導入分をまとめて取得します。
NPM_CONFIG_MIN_RELEASE_AGE=0 mise installGitHubアカウントごとに鍵とホストエイリアスを分けて管理します。個人アカウントはmy、案件・会社アカウントは案件名など任意のプレフィックスをホスト名に付けます。
鍵を生成し、macOSキーチェーンに登録します(再起動後もパスフレーズ入力が不要になります)。続けて公開鍵をクリップボードにコピーし、開いたページで個人GitHubアカウントに登録します。
ssh-keygen -t ed25519 -f ~/.ssh/my_id_ed25519
ssh-add --apple-use-keychain ~/.ssh/my_id_ed25519
pbcopy < ~/.ssh/my_id_ed25519.pub
open https://github.com/settings/ssh/new次はテンプレートです。<prefix>を案件名や会社名(acmeなど。ホスト名はacme.github.comになります)に置き換えてから実行します。
ssh-keygen -t ed25519 -f ~/.ssh/<prefix>_id_ed25519
ssh-add --apple-use-keychain ~/.ssh/<prefix>_id_ed25519
pbcopy < ~/.ssh/<prefix>_id_ed25519.pub
open https://github.com/settings/ssh/new個人アカウント分は固定なので、次のコマンドで作成します。
mkdir -p ~/.ssh && chmod 700 ~/.ssh
cat >> ~/.ssh/config <<'EOF'
# 個人アカウント
Host my.github.com
HostName github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/my_id_ed25519
IdentitiesOnly yes
EOF
chmod 600 ~/.ssh/config案件・会社アカウントを使う場合は、~/.ssh/configに次のブロックをプレフィックスごとに追記します。
# 案件・会社アカウント(アカウントごとに追加する)
Host <prefix>.github.com
HostName github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/<prefix>_id_ed25519
IdentitiesOnly yes
IdentitiesOnly yesはSSHエージェントに他の鍵が読み込まれていても、指定した鍵のみを使うようにする設定です。複数アカウントの混線を防ぐために必須です。
ssh -T git@my.github.comHi <個人アカウント名>! You've successfully authenticated...と表示されれば成功です。案件アカウントはssh -T git@<prefix>.github.com(<prefix>は設定したホスト名)で同様に確認します。
SSHが使えるようになったので、次を実行します。
git -C ~/MY/dotfiles remote set-url origin git@my.github.com:manabuyasuda/dotfiles.git
git clone git@my.github.com:manabuyasuda/manabuyasuda ~/MY/manabuyasuda
git clone git@my.github.com:manabuyasuda/knowledge-base.git ~/MY/knowledge-base<prefix>・<org-or-user>・<repo>を実際の値に置き換えて実行します。
git clone git@<prefix>.github.com:<org-or-user>/<repo>.git ~/PROJECT/<repo>Homebrew・dotfiles・SSHまでの手動セットアップはここまでです。シェルを読み込み直すとmiseが有効になり、~/.local/binがshimsより前に来るのでwhich claudeはネイティブ版を指します。あとはVS Codeでdotfilesを開き、ステップ5で入れたClaude Codeに「ステップ9以降を進めて」と依頼すれば、残りのセットアップを任せられます。
exec $SHELL -l
which claude
code ~/MY/dotfiles
claudeNoto Sans JPはBrewfileからインストール済みです。Source Code Proはコマンドで手動インストールします。
curl -LO https://github.com/adobe-fonts/source-code-pro/archive/release.zip
unzip release.zip
cp -a source-code-pro-release/TTF/* ~/Library/Fonts
rm -rf release.zip source-code-pro-releasebrewでインストールしたアプリはFinderから1つずつ起動して設定を進めます。アクセシビリティやファイルアクセスなど、セキュリティに関する許可を求められるため、1つずつ確認しながら進めるとわかりやすくなります。
~/MY/dotfiles/macos.sh次は手動で設定します。
- BetterTouchTool、CotEditor、DeepL、Dropbox、Google Chrome、MeetingBar、Notion、PopClip、Raycast、Slack、Sourcetree、Visual Studio Code
- MeetingBar、ターミナル、Slack
- Spotlight:メニューバーに表示しません
- Spotlight:すべてオフ(Raycastを使用するため)
- 入力ソース(前の入力ソースを選択):オフ
- 「次のウィンドウを操作対象にする…」を選択し、ショートカットの表示をクリックしてから設定したいショートカットを入力します
- 入力モード:英字にチェックを入れます
- タイプミスを修正:オフ
- Windows風のキー操作:オン
- 数字を全角入力:オフ
- 写真:クリックして「このMacを同期」のチェックを外し、「Macから削除」を選びます
ひととおりの設定が完了したら再起動します。システム設定の変更が反映され、アプリの許可ダイアログなどが表示されます。
シンボリックリンク経由なので、~/.zshrcなどを直接編集すればリポジトリ内のファイルが更新されます。
cd ~/MY/dotfiles
git diff
git add -A && git commit -m "chore: 変更内容"brew bundle dump --file=~/MY/dotfiles/Brewfile --forceclaude/ディレクトリ(skills/, hooks/)はディレクトリごとシンボリックリンクされているため、中にファイルを追加すると自動的にリポジトリに反映されます。
keybindings.jsonなど新しい個別ファイルを追加する場合は、claude/に作成してから./setup.shを再実行します。
Claude Codeの新バージョンを日次で検知し、このリポジトリの設定への取り込み提案をIssueに投稿するワークフロー(.github/workflows/claude-code-update-watch.yml)です。
- 実行タイミング: 毎日JST 14:00(UTC 05:00)
- 仕組み:
anthropics/claude-codeのCHANGELOG.mdを取得し、前回処理済みバージョンとの差分をAIが要約してclaude-code-updateラベル付きIssueを作成します - 認証: リポジトリSecretの
CLAUDE_CODE_OAUTH_TOKEN(claude setup-tokenで発行したOAuthトークン)を使用します
claude setup-tokenで発行されるトークンの有効期限は1年間です。Maxサブスクリプションが有効である限り使えます。
トークンが失効するとワークフローの「Generate proposal」ステップが認証エラーで失敗します。claude setup-tokenで出力された文字列をコピーし、gh secret setでリポジトリSecretを更新します(「? Paste your secret:」と表示されたら貼り付けます)。
claude setup-token
gh secret set CLAUDE_CODE_OAUTH_TOKEN --repo manabuyasuda/dotfiles.mdファイルの文章品質はtextlintで検証します。検知は3層で行います。
- ローカルの
git commit時(lefthookによるpre-commit) - CI(
.github/workflows/textlint.yml、PR時) - Claude Codeの編集時(PostToolUseフックで実行される
format.sh)
通常はnpm ciまたはnpm install時にpackage.jsonのprepareスクリプトがlefthook installを呼び、.git/hooks/pre-commitが配置されます。ただし~/.npmrcにignore-scripts=trueがある環境ではprepareが走らないため、npx lefthook installを実行して配置します(setup.shもnode_modulesがあれば配置します)。
- ステージ済みの
.mdファイルに違反があると、コミットがexit code 1で止まります - 違反がない場合、通常どおりコミットが完了します
lefthook.ymlのglob: "*.md"(basename match)で対象を絞っているため、.md以外のファイルだけをコミットするときtextlintは走りません
CIや別レビューで品質を担保できる、あるいは違反検知に明らかな誤りがある場合に限り、--no-verifyでフックをスキップできます。
git commit --no-verify -m "..."CIのtextlintジョブは依然として走るため、--no-verifyでローカルをすり抜けてもPRで再検知されます。常用しないでください。
npm run lint:fix修正できない違反(半角カナの混入など)は手動で直します。
次はdotfilesでは管理していません。新しいマシンでは手動インストールが必要です。
- HHKB — キーマップ変更ツールを手動インストールします。設定はステップ2を参照してください
- OpenVPN Connect — 公式サイトからインストールします。設定はNotionを参照してください
- Automator(FFmpeg/ImageMagick連携)— 設定手順を参照してください。FFmpegとImageMagickはBrewfileからインストール済みです
- VS Code拡張機能 — GitHubアカウント同期で管理します
.zprofileのHomebrewパス(/opt/homebrew)はApple Silicon専用です。Intel Macでは異なります.gitconfigが参照する.gitignore_globalと.stCommitMsgは管理対象外です