Skip to content

feat(nix): per-host 構成を追加 (DOT-39)#32

Merged
gotomts merged 8 commits into
mainfrom
feat/dot-39-per-host-role
May 23, 2026
Merged

feat(nix): per-host 構成を追加 (DOT-39)#32
gotomts merged 8 commits into
mainfrom
feat/dot-39-per-host-role

Conversation

@gotomts

@gotomts gotomts commented May 20, 2026

Copy link
Copy Markdown
Owner

Summary

DOT-39 で導入した per-host role の運用問題への対応と Dock / cask の実態同期。

Changes

  • fix(nix): role 解決の silent fail 防止 (0b3fb4c)
    sudo の env_reset で HOME が root home に書き換わり default に silent fallback する問題を修正。関連ドキュメントの sudo コマンドも HOME=$HOME 必須に統一。
  • feat(nix): Dock 並びを実態に同期 (248d04d)
    defaults.nix の persistent-apps を 19→17 件に更新。Nani.app と MS Teams/Outlook を追加し、Dock から外れていたアプリを削除。coreCasks に nani を追加。
  • refactor(nix): role file を /etc/dotfiles-role に移行 (60b061c)
    Nix の HOME ownership fallback (root として走るプロセスがユーザー所有 HOME を信頼しない security 機構) により HOME ベースの解決は構造的に成立しないため、/etc/ 配下の machine-wide 設定に移行。sudo USER=\$USER ... の運用に戻す。.dotfiles-role.example.gitignore を削除。
  • chore(nix): cask linear-linear を rename 後の linear に追従 (f424b7b)
    Homebrew の rename warning に対応。
  • fix(nix/scripts): migrate-symlinks.zsh に対応漏れと nix store 判定を追加 (d675d8e)
    ~/.claude/skills (dir-symlink) と .zshrc / .zshenv / .config/yazi/keymap.toml (file-symlink) を migrate 対象に追加。migrate_dir_symlink 側にも nix store 判定を入れて migrate_file_symlink と対称化。

Test plan

  • `nix build` (副作用なし) 通過
  • `nix eval` で role に応じた `cleanup` 値を確認 (sub-1 で `"none"`)
  • sub-1 として実機 `darwin-rebuild switch` を完走
  • `brew bundle complete! 36 Brewfile dependencies now installed.` を確認
  • home-manager activation 完走、`~/.aliase/get-gke-credentials.sh` 等が nix store 経由 symlink になることを確認
  • `migrate-symlinks.zsh --dry-run` で全エントリが SKIP に揃うことを確認

Notes

既存 PC では `migrate-symlinks.zsh` を `darwin-rebuild switch` の 前に実行する。新規 PC では `nix/README.md` の sub-1 セットアップ手順を参照。

@gotomts gotomts closed this May 20, 2026
@gotomts gotomts deleted the feat/dot-39-per-host-role branch May 20, 2026 17:58
@gotomts gotomts restored the feat/dot-39-per-host-role branch May 20, 2026 18:04
@gotomts gotomts reopened this May 20, 2026
@gotomts gotomts changed the title feat(nix): per-host (personal/work1) 構成を追加 (DOT-39) feat(nix): per-host 構成を追加 (DOT-39) May 20, 2026
@gotomts gotomts force-pushed the feat/dot-39-per-host-role branch 2 times, most recently from 6b64e83 to 5985cbd Compare May 21, 2026 16:27
gotomts and others added 3 commits May 22, 2026 02:16
複数 Mac で dotfiles を運用するため、role 別の Homebrew profile を導入する。
.dotfiles-role ファイル (gitignored) で profile を切り替え、Homebrew
パッケージを core (両 role 共通) と default-only (role == "default"
のみ) に分割する。

- flake.nix: builtins.readFile で .dotfiles-role を解決。# コメント行・
  空行を無視して最初の content 行を採用。未知の値は throw で停止。
  flakes は store にコピーされるため path リテラル は使えず、既存の
  builtins.getEnv "USER" 同様 HOME 相対の絶対パスで解決する
- darwin.nix: specialArgs から role を受け取り後段モジュールへ流す
- homebrew.nix: casks / masApps / brews を core + default-only に分割。
  docker-desktop は orbstack で代替済みのため両 role で削除
- .dotfiles-role.example: tracked。コピーして使う。コメント行と空行は
  parser が無視する
- .gitignore: \`.dotfiles-role\` のみ ignore (\`.example\` は除外)
- 認める role: "default" | "sub-1"
- ファイル不在時は default フォールバック (CI もこの経路)

検証: USER=ciuser nix build .#darwinConfigurations.default.system --no-link --impure
- default     -> brews 6 / casks 29 / masApps 6
- sub-1       -> brews 4 / casks 25 / masApps 2
- 未知値      -> throw で停止

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
DOT-39 で導入した role 別構成を活用し、sub-1 role では手動 brew install や
手動の Mac App Store インストールを switch 時に削除しないようにする。
default role は従来通り cleanup = "zap" で declarative 厳格管理を維持。

- nix/modules/darwin/homebrew.nix: cleanup = if role == "sub-1" then "none"
  else "zap" に変更。コメントで role 別ポリシーを明示
- AGENTS.md: Homebrew section の policy を role 別記述に更新。sub-1 で手動
  install したものは別 PC で復元されない注意を明記

検証:
- USER=ciuser nix build .#darwinConfigurations.default.system 通過 (default 経路)
- .dotfiles-role=sub-1 で別 derivation hash の build 成功

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
home-manager 製の ~/.zshrc は shellAliases (zsh.nix) で alias を直接定義し
ており、~/.aliases は source されないまま symlink だけ残っていた dead
file 状態だった。aliases ファイル内 23 entries は全て shellAliases /
initContent に移植済みであることを audit で確認したので、互換層を畳む。

- aliases (repo root): git rm で削除
- nix/modules/home/zsh.nix: home.file.".aliases" 宣言とそのコメント (旧
  zshrc 互換性のため残してあった部分) を削除
- AGENTS.md: リポジトリ構造の `- aliases` 行を削除

memory feedback_aliases_to_home_manager_phase_a.md に従い、今後の新規
alias は引き続き nix/modules/home/zsh.nix に追加する運用。

検証: USER=ciuser nix build .#darwinConfigurations.default.system 通過

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@gotomts gotomts force-pushed the feat/dot-39-per-host-role branch from 5985cbd to 5d98975 Compare May 22, 2026 01:56
gotomts added 5 commits May 23, 2026 17:01
sudo USER=$USER で darwin-rebuild を呼ぶと sudo の env_reset で HOME=/var/root
に書き換わり、role file (~/.dotfiles/.dotfiles-role) を見失って default に
silent fallback してしまう問題があった。HOME が root home の場合に明示的に
throw して silent fail を防ぐ。

運用ドキュメント (ルート README / nix/README / install-nix.zsh / AGENTS.md)
の sudo コマンド例も sudo USER=$USER HOME=$HOME に統一する。

ルート README には新規 Mac セットアップで role 宣言を行うステップを追加し、
fallback で意図せず default が選択される事故を防ぐ。
defaults.nix の persistent-apps を実 Dock 並びに合わせて更新 (19→17 件)。
- 追加: Nani.app / Microsoft Teams.app / Microsoft Outlook.app
- 削除: Linear.app / Cursor.app / Xcode.app / Simulator.app / Transporter.app

Nani は気に入ったため両 role でインストールしたく coreCasks に追加。
Microsoft Teams / Outlook は MDM など別経路で配布される前提のため
homebrew.nix には宣言しないが Dock の宣言には含める。
sudo darwin-rebuild 実行時に Nix の security 機構が HOME を passwd の
root home (/var/root) にフォールバックさせるため、HOME ベースで role を
解決するアプローチは構造的に機能しない。

role は machine-wide な identity でありユーザー単位の設定ではないので
/etc/ 配下が semantically 正しい。/etc/dotfiles-role に root 所有の
ファイルとして置く方式に変更する。

初回セットアップ: echo sub-1 | sudo tee /etc/dotfiles-role

副次的に sudo USER=$USER HOME=$HOME を sudo USER=$USER に戻す。
不要になった .dotfiles-role.example と .gitignore (.dotfiles-role
関連のみだった) を削除。
Homebrew が linear-linear -> linear に rename したことを brew bundle の
警告で検出 (Warning: linear-linear was renamed to linear)。
alias が消える前に宣言を新名に追従する。
dotfiles を home-manager 管理に移行した後の対応漏れだった symlink を追加:
- ~/.claude/skills (dir-symlink)
- ~/.zshrc, ~/.zshenv (file-symlink)
- ~/.config/yazi/keymap.toml (file-symlink)

これらは古い setup.zsh で作られた symlink で、未 migrate のまま
darwin-rebuild switch を実行すると clobber エラーで activation が
止まる (backupFileExtension は target 違いの symlink には効かない)。

同時に migrate_dir_symlink に nix store 判定を追加し、既に
home-manager 管理済みの dir-symlink を warning ではなく SKIP として
扱うようにする (migrate_file_symlink と対称化)。

nix/README.md の対応表も更新。
@gotomts gotomts marked this pull request as ready for review May 23, 2026 14:32
@gotomts gotomts merged commit f6ce696 into main May 23, 2026
1 check passed
@gotomts gotomts deleted the feat/dot-39-per-host-role branch May 23, 2026 14:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant