From 7a0a99e3120128e15bb74224886072fc1fb3f646 Mon Sep 17 00:00:00 2001 From: kunchenguid Date: Fri, 31 Jul 2026 20:12:29 -0700 Subject: [PATCH] Remove Pi directory migration --- home.nix | 26 +---------- tests/pi-home-manager.sh | 99 ---------------------------------------- 2 files changed, 1 insertion(+), 124 deletions(-) delete mode 100755 tests/pi-home-manager.sh diff --git a/home.nix b/home.nix index 3f7753f..540dc97 100644 --- a/home.nix +++ b/home.nix @@ -1,4 +1,4 @@ -{ config, lib, pkgs, user, ... }: +{ config, pkgs, user, ... }: let dotfiles = "${config.home.homeDirectory}/.dotfiles"; @@ -73,30 +73,6 @@ in home.file.".pi/agent/settings.json".source = config.lib.file.mkOutOfStoreSymlink "${dotfiles}/home/.pi/agent/settings.json"; - # Remove only the two legacy managed child links before Home Manager adopts their directories. - home.activation.migratePiAuthoredDirectories = lib.hm.dag.entryBefore [ "checkLinkTargets" ] '' - removeLegacyPiLink() { - local target="$1" - local source="$2" - local relativeTarget="''${target#"$HOME/"}" - local linkTarget - - [ -L "$target" ] || return 0 - linkTarget="$(readlink "$target")" - case "$linkTarget" in - /nix/store/*-home-manager-files/"$relativeTarget") ;; - *) return 0 ;; - esac - [ "$(readlink -f "$target")" = "$(readlink -f "$source")" ] || return 0 - $DRY_RUN_CMD rm "$target" - } - - removeLegacyPiLink "$HOME/.pi/agent/themes/rose-pine-moon.json" "${dotfiles}/home/.pi/agent/themes/rose-pine-moon.json" - removeLegacyPiLink "$HOME/.pi/agent/extensions/terminal-status-title.js" "${dotfiles}/home/.pi/agent/extensions/terminal-status-title.js" - $DRY_RUN_CMD rmdir "$HOME/.pi/agent/themes" 2>/dev/null || true - $DRY_RUN_CMD rmdir "$HOME/.pi/agent/extensions" 2>/dev/null || true - ''; - home.file.".claude/CLAUDE.md".source = config.lib.file.mkOutOfStoreSymlink "${dotfiles}/home/AGENTS.md"; home.file.".codex/AGENTS.md".source = diff --git a/tests/pi-home-manager.sh b/tests/pi-home-manager.sh deleted file mode 100755 index 192eaed..0000000 --- a/tests/pi-home-manager.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -repo_root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) - -python3 - "$repo_root" <<'PY' -import json -import sys -from pathlib import Path - -root = Path(sys.argv[1]) -settings = json.loads((root / "home/.pi/agent/settings.json").read_text()) -expected_packages = [ - "npm:@ryan_nookpi/pi-extension-codex-fast-mode@0.2.6", - "git:github.com/algal/pi-openai-server-compaction@c6d593087709e9481223dc6c6c2269b371b5e055", -] -assert settings.get("packages") == expected_packages, "Pi package declarations must be exactly the two audited pins" - -home_nix = (root / "home.nix").read_text() -required_links = { - '.pi/agent/themes': '${dotfiles}/home/.pi/agent/themes', - '.pi/agent/extensions': '${dotfiles}/home/.pi/agent/extensions', - '.pi/agent/models.json': '${dotfiles}/home/.pi/agent/models.json', - '.pi/agent/settings.json': '${dotfiles}/home/.pi/agent/settings.json', -} -for destination, source in required_links.items(): - declaration = f'home.file."{destination}".source =\n config.lib.file.mkOutOfStoreSymlink "{source}";' - assert declaration in home_nix, f"missing exact out-of-store link: {destination}" - -for old_child in [ - '.pi/agent/themes/rose-pine-moon.json', - '.pi/agent/extensions/terminal-status-title.js', -]: - assert f'home.file."{old_child}"' not in home_nix, f"legacy child link remains: {old_child}" - -for forbidden in [ - '.pi/agent', '.pi/agent/auth.json', '.pi/agent/sessions', '.pi/agent/trust.json', - '.pi/agent/npm', '.pi/agent/git', '.pi/agent/cache', -]: - assert f'home.file."{forbidden}"' not in home_nix, f"Pi runtime path became managed: {forbidden}" - -assert 'entryBefore [ "checkLinkTargets" ]' in home_nix, "migration must run before Home Manager collision checks" -assert 'removeLegacyPiLink "$HOME/.pi/agent/themes/rose-pine-moon.json"' in home_nix -assert 'removeLegacyPiLink "$HOME/.pi/agent/extensions/terminal-status-title.js"' in home_nix -assert (root / "home/.pi/agent/themes/rose-pine-moon.json").is_file() -assert (root / "home/.pi/agent/extensions/terminal-status-title.js").is_file() -assert [p.relative_to(root / "home/.pi/agent/themes").as_posix() for p in (root / "home/.pi/agent/themes").rglob("*") if p.is_file()] == ["rose-pine-moon.json"] -assert [p.relative_to(root / "home/.pi/agent/extensions").as_posix() for p in (root / "home/.pi/agent/extensions").rglob("*") if p.is_file()] == ["terminal-status-title.js"] -PY - -# Build only the Home Manager activation package. This never activates the captain's configuration. -activation=$(nix build --no-link --print-out-paths \ - .#darwinConfigurations.mac.config.home-manager.users.kunchen.home.activationPackage) - -probe=$(mktemp -d) -trap 'rm -rf "$probe"' EXIT -fake_home="$probe/home" -mkdir -p "$fake_home/.pi/agent/themes" "$fake_home/.pi/agent/extensions" -legacy_tree="$probe/home-manager-files" -mkdir -p "$legacy_tree/.pi/agent/themes" "$legacy_tree/.pi/agent/extensions" -ln -s "$repo_root/home/.pi/agent/themes/rose-pine-moon.json" \ - "$legacy_tree/.pi/agent/themes/rose-pine-moon.json" -ln -s "$repo_root/home/.pi/agent/extensions/terminal-status-title.js" \ - "$legacy_tree/.pi/agent/extensions/terminal-status-title.js" -legacy_home_manager_files=$(nix store add-path "$legacy_tree") -ln -s "$legacy_home_manager_files/.pi/agent/themes/rose-pine-moon.json" \ - "$fake_home/.pi/agent/themes/rose-pine-moon.json" -ln -s "$legacy_home_manager_files/.pi/agent/extensions/terminal-status-title.js" \ - "$fake_home/.pi/agent/extensions/terminal-status-title.js" - -test "$(readlink -f "$fake_home/.pi/agent/themes/rose-pine-moon.json")" = \ - "$repo_root/home/.pi/agent/themes/rose-pine-moon.json" - -# Execute only the generated pre-check migration block against a disposable HOME. -awk ' - /_iNote "Activating %s" "migratePiAuthoredDirectories"/ { enabled = 1; next } - /_iNote "Activating %s" "checkLinkTargets"/ { exit } - enabled { print } -' "$activation/activate" | \ - sed "s|/Users/kunchen/.dotfiles|$repo_root|g" > "$probe/migrate.sh" -HOME="$fake_home" DRY_RUN_CMD='' bash -e "$probe/migrate.sh" - -test ! -e "$fake_home/.pi/agent/themes" -test ! -e "$fake_home/.pi/agent/extensions" -ln -s "$repo_root/home/.pi/agent/themes" "$fake_home/.pi/agent/themes" -ln -s "$repo_root/home/.pi/agent/extensions" "$fake_home/.pi/agent/extensions" -test -L "$fake_home/.pi/agent/themes" -test -L "$fake_home/.pi/agent/extensions" - -# Safe skip paths must succeed and leave unrelated user state untouched. -mkdir -p "$probe/unmanaged/.pi/agent/themes" "$probe/unmanaged/.pi/agent/extensions" -touch "$probe/unmanaged/.pi/agent/themes/user-theme.json" -ln -s "$repo_root/home/.pi/agent/extensions/terminal-status-title.js" \ - "$probe/unmanaged/.pi/agent/extensions/user-extension.js" -HOME="$probe/unmanaged" DRY_RUN_CMD='' bash -e "$probe/migrate.sh" -test -f "$probe/unmanaged/.pi/agent/themes/user-theme.json" -test -L "$probe/unmanaged/.pi/agent/extensions/user-extension.js" - -echo "Pi package declarations, runtime boundary, link shape, and child-to-parent migration passed."