Merge PR #8776: fix(nix): install writable home-manager config instead of store symlink (@roboomp)

This commit is contained in:
can1357
2026-08-19 01:36:57 +02:00
3 changed files with 26 additions and 6 deletions
+2 -2
View File
@@ -125,7 +125,7 @@
type = pkgs.lib.types.listOf pkgs.lib.types.package;
default = [ ];
};
options.home.file = pkgs.lib.mkOption {
options.home.activation = pkgs.lib.mkOption {
type = pkgs.lib.types.attrsOf pkgs.lib.types.anything;
default = { };
};
@@ -152,7 +152,7 @@
};
modulesEvaluate =
assert builtins.elem self.packages.${system}.default homeManagerEvaluation.config.home.packages;
assert homeManagerEvaluation.config.home.file ? ".omp/agent/config.yml";
assert homeManagerEvaluation.config.home.activation ? ompConfig;
assert builtins.elem self.packages.${system}.default
nixosEvaluation.config.environment.systemPackages;
pkgs.runCommand "omp-module-evaluation" { } "touch $out";
+21 -4
View File
@@ -8,6 +8,7 @@
let
cfg = config.programs.omp;
yaml = pkgs.formats.yaml { };
configFile = yaml.generate "omp-config.yml" cfg.settings;
in
{
options.programs.omp = {
@@ -25,8 +26,11 @@ in
default = null;
description = ''
Settings written declaratively to {file}`~/.omp/agent/config.yml`.
The file is a read-only store symlink: changes made from inside OMP
(`/settings`, onboarding) replace it but revert on the next
On each `home-manager switch` the declared settings are copied into
place as a writable regular file (not a read-only store symlink), so
OMP can acquire its config lock and rewrite the file when persisting
runtime changes (`/settings`, onboarding). Those runtime changes are
overwritten by the declared values again on the next
`home-manager switch`.
'';
example = {
@@ -38,8 +42,21 @@ in
config = lib.mkIf cfg.enable {
home.packages = [ cfg.package ];
home.file.".omp/agent/config.yml" = lib.mkIf (cfg.settings != null) {
source = yaml.generate "omp-config.yml" cfg.settings;
# OMP rewrites its config at runtime and acquires an advisory lock on it
# first; on macOS the lock backend creates an flock sidecar next to the
# target file. A `home.file` store symlink is read-only and lives under
# /nix/store, so both the lock and the atomic rewrite fail with EACCES and
# break every launch. Copy a writable regular file instead. The DAG entry
# is written literally (rather than via `lib.hm.dag.entryAfter`) so the
# home-manager-free module evaluation in `flake.nix` keeps working.
home.activation.ompConfig = lib.mkIf (cfg.settings != null) {
before = [ ];
after = [ "writeBoundary" ];
data = ''
run mkdir -p "$HOME/.omp/agent"
run install -m 600 ${configFile} "$HOME/.omp/agent/config.yml"
'';
};
};
}
+3
View File
@@ -75,6 +75,9 @@
### Fixed
- Fixed the clipboard image-paste keybind attaching Finder's generated file icon instead of the copied image on macOS. Current Finder `Cmd+C` pasteboards advertise both a `public.file-url` and a generated 1024x1024 icon bitmap, so `arboard::get_image()` succeeded with the icon and `InputController.handleImagePaste` attached it before the file-URL branch was ever reached. The handler now probes `readMacFileUrlsFromClipboard()` before the bitmap representation, so an image file URL wins over the co-advertised icon; pure bitmap pasteboards (screenshots, browser copies) and non-image file URLs still fall through to the image/text paths ([#8769](https://github.com/can1357/oh-my-pi/issues/8769)).
### Fixed
- Fixed the Home Manager module (`programs.omp.settings`) breaking every launch on macOS with `Failed to acquire native file lock … Permission denied (os error 13)`. The declared config is now copied into `~/.omp/agent/config.yml` as a writable file via `home.activation` instead of a read-only `/nix/store` symlink, so OMP can acquire its config lock and persist runtime changes; `home-manager switch` still reapplies the declared settings ([#8775](https://github.com/can1357/oh-my-pi/issues/8775)).
## [17.3.5] - 2026-08-16