github.com/uvu1/dotfiles の chezmoi-master(旧 master)を移行元正本として、
chezmoi 管理の設定を Nix、Home Manager、nix-darwin、mise dotfiles へ移行した構成です。
移植時に参照した正本コミットは
44ae8668a39989d0bfba1572ae869da3fb4b22f5 です。設定を更新するときは、
移行元を再確認する場合は chezmoi-master を参照します。移行後の正本は
このリポジトリの master です。
flake.nix: macOS の nix-darwin、WSL Arch の Home Manager standalone、mise 用 nixpkgs-unstable の固定nix/: Nix が管理する基盤と、グローバルに使う全ツール(LSP・リンタ・フォーマッタ・日常CLI・フォールバックランタイム)mise/: プロジェクト単位のバージョン切り替え、vendor CLI、OS 固有の toolset・mise dotfilesmise/dotfiles/: 通常配置へ移植した設定ファイルmise/dotfiles/ai/: Codex/Claude Codeの個人設定、共通skills、検証scriptAGENTS.md/CLAUDE.md: このrepository固有のagent向け指示bootstrap/wsl/: WSL の systemd、interop、既定ユーザー設定.config/configuration.winget: Windows のGUIアプリとbootstrap基盤scripts/: 初期構築と更新をまとめるスクリプトdocs/: 設計と移行計画
macOS と WSL は共通の unix toolset(mise 環境 unix)を利用します。macOS は
加えて darwin 環境で wezterm 設定を配置します。Windows は単一の windows
環境でNeovim、PowerShell profile、Windows用CLI、通常のdotfilesを管理します。
GUIアプリ、Git、mise、PowerShell、WezTermの導入はWinGet Configurationが担当します。
グローバルに使うツールは nix/home.nix が唯一の供給元です。言語サーバ、リンタ、
フォーマッタ、日常CLI、そしてプロジェクト外のファイル向けフォールバックランタイム
(node / python / go / ruby / rust)がここに入り、flake.lock で固定されます。
miseが担うのは次の2つだけです。
- プロジェクト単位のバージョン切り替え。 各プロジェクトの
mise.tomlや.node-version/.ruby-version/Gemfileが唯一の宣言元で、そのディレクトリ 以下でだけ nix のフォールバックより前に出ます。 gem製のLSPはインタプリタがビルド時のrubyに固定されるため、Gemfileが別のrubyを pinしているプロジェクトではmise.local.tomlにgem:ruby-lspを宣言します (詳細と症状はdocs/nvim-lsp-audit.mdの「既知の罠」)。 - vendor CLI。
claude/cloudflared/aqua:openai/codexはサービスに接続する クライアントで提供元の出荷に追従したいため、再現性より鮮度を取ってlatestの まま mise に残しています。
sheldonはmiseを mise activate zsh(PATH activation)で有効化します。--shims は
版が未解決のときPATHの後方へフォールスルーせず No version is set for shim: <tool>
で停止するため、フォールバックをnixに置く構成と両立しません。
同じツールを nix/home.nix とグローバルのmise toolsetの両方に宣言してはいけません。
miseはinstallディレクトリをNix profileより前に置くので、mise側が黙って勝ちます。
この分割は2026-07-31にmiseからnixへ移して成立したものです。nvimの設定を触る場合は
docs/nvim-tooling-migration.md に変更点と版の差分、lib/mise.lua の base_path() が
必須である理由がまとまっています。
bun と uv はグローバルtoolsetに含めません。必要なプロジェクトのルートで
それぞれ次を実行し、プロジェクトの mise.toml に追加します。
mise use bun@latest
mise use uv@latestこれにより、各toolはそのプロジェクト以下でだけ有効になります。チームで共有しない
個人用設定にする場合は、mise use --env local bun@latest または
mise use --env local uv@latest を使い、生成される .mise.local.toml をGitの
管理対象外にします。グローバル設定から削除しても、miseが既にダウンロードした
インストール実体は自動では削除されませんが、プロジェクト外では有効になりません。
macOSとWSLでは、mise dotfilesがCodexとClaude Codeの個人設定を個別file単位で
symlinkします。~/.codexや~/.claude全体は管理対象にせず、認証、履歴、session、
cache、生成memory、端末固有のtrust状態をローカルに残します。
- Codex:
~/.codex/AGENTS.md、~/.codex/config.toml内の管理block、~/.codex/rules/ - Claude Code:
~/.claude/CLAUDE.md、~/.claude/settings.json - 共通skills:
mise/dotfiles/ai/skills/common/を正本とし、Codex用とClaude用の viewから参照
CodexのMCP tokenはconfigへ直接書かず環境変数から渡します。Claude Codeのuser scope
MCPは認証状態を含む~/.claude.jsonへ保存されるため、このfile自体は管理しません。
project共有MCPは各projectの.mcp.jsonで管理します。
Codexのconfig.tomlはproject trustなどの端末固有状態も保持するため、file全体を
symlinkしません。scripts/sync-ai-config.shがmise/dotfiles/ai/codex/config.tomlの
既定値だけをmarker付きblockとして同期し、その他の設定は保持します。この同期は
dotflow updateのmacOS/WSL hookでも実行されます。
Codex rulesはdotfiles.rulesだけを共通baselineとして個別symlinkします。Codexが
approval時に更新するdefault.rulesは端末固有fileとして残るため、追加のapprovalを
行ってもrepositoryはdirtyになりません。
AI設定を変更した後は次を実行します。
mise/dotfiles/ai/scripts/check-ai-config.sh
mise -C mise -E unix dotfiles statusdotflow は WSL、macOS、Windows 共通の更新・編集
インターフェースです。このリポジトリでは GitHub release の 0.1.0 に固定しており、
latest へ自動追従しません。crates.io への公開は release asset の利用とは別の手動作業で、
このリポジトリの導入・更新手順には含みません。
日常の更新は任意のディレクトリから次を実行します。
dotflow updatedotflow update はリポジトリ、branch、origin、tracked/untracked を含む clean な
worktree を検証してから origin/master へ fast-forwardし、選択したOS profileの
Nix hook、mise tool install、mise dotfiles apply、status確認を順に実行します。
commit、push、stash、reset、rebase、ファイル削除は行わず、dirty treeではpull前に
停止します。実行予定を変更やnetwork accessなしで確認するには
dotflow update --dry-run を使います。
主なコマンドは次のとおりです。
dotflow add TARGET...: base mise環境へ対象を追加する。--profileを明示した場合は、 WSL=linux、macOS=darwin、Windows=windowsのprofile固有環境へ追加するdotflow edit TARGET: 選択profileの追加先環境で対象を編集するdotflow root: 登録済みリポジトリの絶対pathを表示するdotflow cd: shell integration経由でリポジトリへ移動するdotflow status/dotflow status --check: Gitとmiseの状態を表示・検査するdotflow apply: pullやtool installをせず、選択profileのdotfilesを適用するdotflow doctor: config、repository、依存command、選択環境を診断するdotflow completion SHELL: 静的completionを生成するdotflow shell-init SHELL:dotflow cd対応wrapperを生成する
zshと管理対象のPowerShell profileは、mise activation直後に shell-init を読み込みます。
互換command dotfiles-update も残してあり、引数なしで dotflow update を呼びます。
初回導入または旧更新scriptからの切り替えでは、cloneしたリポジトリでbase configを trustし、固定版をinstallしてからOS別cutoverを行います。
export MISE_EXPERIMENTAL=1
mise -C mise trust mise.toml
mise -C mise install github:uvu1/dotflow
mise -C mise x github:uvu1/dotflow@0.1.0 -- dotflow init "$PWD"
dotflow doctor
dotflow update --dry-run既に ~/dotfiles が既定pathならlocator登録は必須ではありません。init は既存cloneを
登録するだけで、cloneやGit初期化は行いません。過去のchezmoi移行経緯と対象の詳細は
下記の各OS手順および docs/dotfiles-migration-plan.md に残しています。
- macOS と Windows に 1Password があり、SSH signing が有効であること
- WSL から
/mnt/c/Users/uvu1/AppData/Local/Microsoft/WindowsApps/op-ssh-sign-wsl.exeを実行できること - Windows では OpenSSH Clientと、WinGet Configuration対応のwinget
(
1.6.2631以上)を利用できること
Nix を導入し、Command Line Tools の Git、または Nix の Git でこの リポジトリを clone します。リポジトリルートで次を実行します。
sudo nix --extra-experimental-features 'nix-command flakes' run nix-darwin/nix-darwin-26.05#darwin-rebuild -- switch --flake .#uvu1-mac
export MISE_EXPERIMENTAL=1
mise -C mise trust -a
# unix の toolset は ~/.config/mise/config.toml が正本で、cutover の apply が
# それを symlink する。install はその後に実行する。
bash scripts/cutover-unix.sh darwin
mise -C mise -E unix install
mise -C mise -E unix ls --current二回目以降の Nix 適用は次のとおりです。
sudo darwin-rebuild switch --flake .#uvu1-macこの適用では nix-homebrew が Apple Silicon 用 Homebrew を /opt/homebrew に導入し、
1Password、Adobe Creative Cloud、ATOK、Cloudflare One Client、Discord Canary、
Microsoft Office、Obsidian、Scroll Reverser、Slack、Spark、Spotify、WezTerm Nightly、
Zen Twilight、Zoom を
Homebrew Cask で導入・更新します。Nix の宣言にない Homebrew package は削除しません。
Adobe 製品本体は Creative Cloud から選択して導入します。1Password、Adobe、ATOK、 Cloudflare、Office などのアカウント・ライセンス認証、macOS の権限許可、Cloudflare Zero Trust への端末登録、ATOK の入力ソース選択は各アプリの初回起動後に行います。
Windows 側で公式 distro 一覧に ArchLinux があることを確認して導入します。
wsl --list --online
wsl --install -d ArchLinuxroot 初期セッションでユーザーと最小依存を作成します。
useradd -m -G wheel -s /bin/bash uvu1
passwd uvu1
pacman -Syu --needed sudo git curl ca-certificates/etc/sudoers の %wheel ALL=(ALL:ALL) ALL を有効化し、このリポジトリを
uvu1 所有の ~/dotfiles へ clone します。その後、次を実行します。
git clone https://github.com/uvu1/dotfiles ~/dotfiles
cd ~/dotfiles
sudo install -m 0644 bootstrap/wsl/wsl.conf /etc/wsl.conf
sudo install -Dm 0644 bootstrap/wsl/WSLInterop.conf /etc/binfmt.d/WSLInterop.confWindows 側で distro 名を確認し、利用可能なら既定ユーザーも明示します。
wsl -l -v
wsl --manage ArchLinux --set-default-user uvu1
wsl --shutdownWSL を再起動したら systemd を確認します。Nix が未導入の場合のみ、uvu1
ユーザーで multi-user インストールを実行します。
systemctl is-system-running
test -e /proc/sys/fs/binfmt_misc/WSLInterop
(cd /mnt/c && /mnt/c/Windows/System32/cmd.exe /d /c echo WSL-interop-ok)
curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install |
sh -s -- --daemoncmd.exe が Exec format error になり、WSLInterop が存在しない既存環境では、
bootstrap設定を配置して systemd-binfmt を再起動します。WSL全体のshutdownは
不要です。
cd ~/dotfiles
sudo install -m 0644 bootstrap/wsl/wsl.conf /etc/wsl.conf
sudo install -Dm 0644 bootstrap/wsl/WSLInterop.conf /etc/binfmt.d/WSLInterop.conf
sudo systemctl restart systemd-binfmt.service
(cd /mnt/c && /mnt/c/Windows/System32/cmd.exe /d /c echo WSL-interop-ok)新しいシェルを開くか、次のコマンドで Nix を読み込みます。nix-command と
flakes は Home Manager が内部で実行する Nix にも適用されるよう、ユーザー設定へ
恒久的に追加します。
. /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
mkdir -p ~/.config/nix
grep -qxF 'extra-experimental-features = nix-command flakes' ~/.config/nix/nix.conf 2>/dev/null || \
echo 'extra-experimental-features = nix-command flakes' >> ~/.config/nix/nix.conf
nix --version
systemctl is-active nix-daemon.socketその後、リポジトリルートで次を実行します。
nix run home-manager/release-26.05 -- switch --flake .#uvu1@arch-wsl
mise --version
grep -qxF /home/uvu1/.nix-profile/bin/zsh /etc/shells || \
echo /home/uvu1/.nix-profile/bin/zsh | sudo tee -a /etc/shells
chsh -s /home/uvu1/.nix-profile/bin/zsh uvu1
getent passwd uvu1
export MISE_EXPERIMENTAL=1
mise -C mise trust -a
# unix の toolset は ~/.config/mise/config.toml が正本で、cutover の apply が
# それを symlink する。install はその後に実行する。
bash scripts/cutover-unix.sh unix
mise -C mise -E unix install
mise -C mise -E unix ls --currentmise --version は 2026.6.14 以上を返す必要があります。通常の nixpkgs 26.05 に
含まれる古い mise ではなく、flake.lock で固定した nixpkgs-unstable 版を
macOS/WSL 共通で利用します。
WSL では blink.cmp の Rust fuzzy matcher をビルドするため、Home Manager が
GCC と linker も導入します。また、Neovim のクリップボード連携に必要な
wl-copy と wl-paste も導入します。linker cc not found が出た場合は
Nix 構成を再適用した後、Neovim で blink.cmp を再ビルドします。
初回切り替え後は、どのディレクトリからでも次の一コマンドで更新できます。
dotfiles-updatedotfiles-update は互換aliasとして dotflow update を実行します。WSL profileは
pull後に home-manager switch --flake ~/dotfiles#uvu1@arch-wsl を実行してから、
unix mise環境をinstall・applyします。
このリポジトリを $HOME\dotfiles へcloneし、Windows PowerShellまたはPowerShell 7で
bootstrapを実行します。Windows、WSLともに $HOME\dotfiles / ~/dotfiles を
適用元の正本とします。
./scripts/bootstrap-windows.ps1bootstrapはWinGet Configuration機能を有効化し、.config/configuration.winget を
検証・適用してから、単一の windows mise環境をinstallします。その後、dotfilesの
dry-run、apply、status、dotflow doctorを順に実行します。既存dotfileと競合した場合は
削除や強制上書きをせず停止します。
WinGet Configurationはbootstrap基盤、Windows環境、ブラウザ、日常利用するGUIアプリを 宣言し、bootstrap実行時に最新版へ更新します。YAMLからresourceを削除しても、既に 導入済みのアプリは自動ではアンインストールされません。OS component、runtime、ゲーム、 chezmoi、miseと重複するCLIは宣言対象外です。
- bootstrap基盤: 1Password、7-Zip、Git、mise、PowerShell、WezTerm
- Windows環境: WSL、Windows Terminal、PowerToys
- ブラウザ: Chrome、Firefox Developer Edition/Nightly、Zen Browser/Twilight
- 日常アプリ: Obsidian、Slack、Zoom、Spark、Spotify、Discord Canary
- その他: Adobe Creative Cloud、Claude、Cloudflare WARP、Gyazo、ExplorerPatcher、 TranslucentTB
PowerShell profile を含めて初回切り替えした後は、新しい PowerShell 7 を開き、 どのディレクトリからでも次の一コマンドで更新できます。
dotfiles-updatedotfiles-update は互換aliasとして dotflow update を実行します。Windows profileは
単一の windows mise環境をinstallし、Neovim、gitconfig、WezTerm、combined mise
config、starship、PowerShell profileをまとめてapplyします。通常更新では重い
winget configureを再実行しません。
Windows の Git と WezTerm は winget で導入し、mise では管理しません。Nvim と WezTerm の設定は、Windows の symlink 権限に依存しない copy 配置です。
nix --extra-experimental-features 'nix-command flakes' build .#darwinConfigurations.uvu1-mac.system
nix --extra-experimental-features 'nix-command flakes' build '.#homeConfigurations."uvu1@arch-wsl".activationPackage'
export MISE_EXPERIMENTAL=1
mise -C mise -E unix dotfiles status --missing
mise -C mise -E darwin dotfiles status --missing # macOS のみ (wezterm)Windows では次を実行します。
$env:MISE_EXPERIMENTAL = "1"
mise -C mise -E windows ls --current
mise -C mise -E windows dotfiles status --missing
winget configure validate -f .config/configuration.winget
winget configure test -f .config/configuration.winget --accept-configuration-agreements
dotflow doctor
Get-Command dotfiles-update